.. | .. |
---|
148 | 148 | pte->min_pte_before_flip_horiz_scan; |
---|
149 | 149 | |
---|
150 | 150 | REG_UPDATE(GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT, |
---|
151 | | - GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT, 0xff); |
---|
| 151 | + GRPH_PIPE_OUTSTANDING_REQUEST_LIMIT, 0x7f); |
---|
152 | 152 | |
---|
153 | 153 | REG_UPDATE_3(DVMM_PTE_CONTROL, |
---|
154 | 154 | DVMM_PAGE_WIDTH, page_width, |
---|
.. | .. |
---|
157 | 157 | |
---|
158 | 158 | REG_UPDATE_2(DVMM_PTE_ARB_CONTROL, |
---|
159 | 159 | DVMM_PTE_REQ_PER_CHUNK, pte->pte_req_per_chunk, |
---|
160 | | - DVMM_MAX_PTE_REQ_OUTSTANDING, 0xff); |
---|
| 160 | + DVMM_MAX_PTE_REQ_OUTSTANDING, 0x7f); |
---|
161 | 161 | } |
---|
162 | 162 | |
---|
163 | 163 | static void program_urgency_watermark( |
---|
.. | .. |
---|
173 | 173 | URGENCY_LOW_WATERMARK, urgency_low_wm, |
---|
174 | 174 | URGENCY_HIGH_WATERMARK, urgency_high_wm); |
---|
175 | 175 | } |
---|
| 176 | + |
---|
| 177 | +#if defined(CONFIG_DRM_AMD_DC_SI) |
---|
| 178 | +static void dce60_program_urgency_watermark( |
---|
| 179 | + struct dce_mem_input *dce_mi, |
---|
| 180 | + uint32_t wm_select, |
---|
| 181 | + uint32_t urgency_low_wm, |
---|
| 182 | + uint32_t urgency_high_wm) |
---|
| 183 | +{ |
---|
| 184 | + REG_UPDATE(DPG_PIPE_ARBITRATION_CONTROL3, |
---|
| 185 | + URGENCY_WATERMARK_MASK, wm_select); |
---|
| 186 | + |
---|
| 187 | + REG_SET_2(DPG_PIPE_URGENCY_CONTROL, 0, |
---|
| 188 | + URGENCY_LOW_WATERMARK, urgency_low_wm, |
---|
| 189 | + URGENCY_HIGH_WATERMARK, urgency_high_wm); |
---|
| 190 | +} |
---|
| 191 | +#endif |
---|
176 | 192 | |
---|
177 | 193 | static void dce120_program_urgency_watermark( |
---|
178 | 194 | struct dce_mem_input *dce_mi, |
---|
.. | .. |
---|
192 | 208 | URGENT_LEVEL_HIGH_WATERMARK, urgency_high_wm); |
---|
193 | 209 | |
---|
194 | 210 | } |
---|
| 211 | + |
---|
| 212 | +#if defined(CONFIG_DRM_AMD_DC_SI) |
---|
| 213 | +static void dce60_program_nbp_watermark( |
---|
| 214 | + struct dce_mem_input *dce_mi, |
---|
| 215 | + uint32_t wm_select, |
---|
| 216 | + uint32_t nbp_wm) |
---|
| 217 | +{ |
---|
| 218 | + REG_UPDATE(DPG_PIPE_NB_PSTATE_CHANGE_CONTROL, |
---|
| 219 | + NB_PSTATE_CHANGE_WATERMARK_MASK, wm_select); |
---|
| 220 | + |
---|
| 221 | + REG_UPDATE_3(DPG_PIPE_NB_PSTATE_CHANGE_CONTROL, |
---|
| 222 | + NB_PSTATE_CHANGE_ENABLE, 1, |
---|
| 223 | + NB_PSTATE_CHANGE_URGENT_DURING_REQUEST, 1, |
---|
| 224 | + NB_PSTATE_CHANGE_NOT_SELF_REFRESH_DURING_REQUEST, 1); |
---|
| 225 | + |
---|
| 226 | + REG_UPDATE(DPG_PIPE_NB_PSTATE_CHANGE_CONTROL, |
---|
| 227 | + NB_PSTATE_CHANGE_WATERMARK, nbp_wm); |
---|
| 228 | +} |
---|
| 229 | +#endif |
---|
195 | 230 | |
---|
196 | 231 | static void program_nbp_watermark( |
---|
197 | 232 | struct dce_mem_input *dce_mi, |
---|
.. | .. |
---|
224 | 259 | PSTATE_CHANGE_WATERMARK, nbp_wm); |
---|
225 | 260 | } |
---|
226 | 261 | } |
---|
| 262 | + |
---|
| 263 | +#if defined(CONFIG_DRM_AMD_DC_SI) |
---|
| 264 | +static void dce60_program_stutter_watermark( |
---|
| 265 | + struct dce_mem_input *dce_mi, |
---|
| 266 | + uint32_t wm_select, |
---|
| 267 | + uint32_t stutter_mark) |
---|
| 268 | +{ |
---|
| 269 | + REG_UPDATE(DPG_PIPE_STUTTER_CONTROL, |
---|
| 270 | + STUTTER_EXIT_SELF_REFRESH_WATERMARK_MASK, wm_select); |
---|
| 271 | + |
---|
| 272 | + REG_UPDATE(DPG_PIPE_STUTTER_CONTROL, |
---|
| 273 | + STUTTER_EXIT_SELF_REFRESH_WATERMARK, stutter_mark); |
---|
| 274 | +} |
---|
| 275 | +#endif |
---|
227 | 276 | |
---|
228 | 277 | static void dce120_program_stutter_watermark( |
---|
229 | 278 | struct dce_mem_input *dce_mi, |
---|
.. | .. |
---|
285 | 334 | program_stutter_watermark(dce_mi, 2, stutter_exit.a_mark); /* set a */ |
---|
286 | 335 | program_stutter_watermark(dce_mi, 1, stutter_exit.d_mark); /* set d */ |
---|
287 | 336 | } |
---|
| 337 | + |
---|
| 338 | +#if defined(CONFIG_DRM_AMD_DC_SI) |
---|
| 339 | +static void dce60_mi_program_display_marks( |
---|
| 340 | + struct mem_input *mi, |
---|
| 341 | + struct dce_watermarks nbp, |
---|
| 342 | + struct dce_watermarks stutter_exit, |
---|
| 343 | + struct dce_watermarks stutter_enter, |
---|
| 344 | + struct dce_watermarks urgent, |
---|
| 345 | + uint32_t total_dest_line_time_ns) |
---|
| 346 | +{ |
---|
| 347 | + struct dce_mem_input *dce_mi = TO_DCE_MEM_INPUT(mi); |
---|
| 348 | + uint32_t stutter_en = mi->ctx->dc->debug.disable_stutter ? 0 : 1; |
---|
| 349 | + |
---|
| 350 | + dce60_program_urgency_watermark(dce_mi, 2, /* set a */ |
---|
| 351 | + urgent.a_mark, total_dest_line_time_ns); |
---|
| 352 | + dce60_program_urgency_watermark(dce_mi, 1, /* set d */ |
---|
| 353 | + urgent.d_mark, total_dest_line_time_ns); |
---|
| 354 | + |
---|
| 355 | + REG_UPDATE_2(DPG_PIPE_STUTTER_CONTROL, |
---|
| 356 | + STUTTER_ENABLE, stutter_en, |
---|
| 357 | + STUTTER_IGNORE_FBC, 1); |
---|
| 358 | + dce60_program_nbp_watermark(dce_mi, 2, nbp.a_mark); /* set a */ |
---|
| 359 | + dce60_program_nbp_watermark(dce_mi, 1, nbp.d_mark); /* set d */ |
---|
| 360 | + |
---|
| 361 | + dce60_program_stutter_watermark(dce_mi, 2, stutter_exit.a_mark); /* set a */ |
---|
| 362 | + dce60_program_stutter_watermark(dce_mi, 1, stutter_exit.d_mark); /* set d */ |
---|
| 363 | +} |
---|
| 364 | +#endif |
---|
288 | 365 | |
---|
289 | 366 | static void dce112_mi_program_display_marks(struct mem_input *mi, |
---|
290 | 367 | struct dce_watermarks nbp, |
---|
.. | .. |
---|
369 | 446 | */ |
---|
370 | 447 | } |
---|
371 | 448 | |
---|
372 | | - if (dce_mi->masks->GRPH_ARRAY_MODE) { /* GFX8 */ |
---|
| 449 | + if (dce_mi->masks->GRPH_MICRO_TILE_MODE) { /* GFX8 */ |
---|
373 | 450 | REG_UPDATE_9(GRPH_CONTROL, |
---|
374 | 451 | GRPH_NUM_BANKS, info->gfx8.num_banks, |
---|
375 | 452 | GRPH_BANK_WIDTH, info->gfx8.bank_width, |
---|
.. | .. |
---|
385 | 462 | GRPH_Z, 0); |
---|
386 | 463 | */ |
---|
387 | 464 | } |
---|
| 465 | + |
---|
| 466 | + if (dce_mi->masks->GRPH_ARRAY_MODE) { /* GFX6 but reuses gfx8 struct */ |
---|
| 467 | + REG_UPDATE_8(GRPH_CONTROL, |
---|
| 468 | + GRPH_NUM_BANKS, info->gfx8.num_banks, |
---|
| 469 | + GRPH_BANK_WIDTH, info->gfx8.bank_width, |
---|
| 470 | + GRPH_BANK_HEIGHT, info->gfx8.bank_height, |
---|
| 471 | + GRPH_MACRO_TILE_ASPECT, info->gfx8.tile_aspect, |
---|
| 472 | + GRPH_TILE_SPLIT, info->gfx8.tile_split, |
---|
| 473 | + /* DCE6 has no GRPH_MICRO_TILE_MODE mask */ |
---|
| 474 | + GRPH_PIPE_CONFIG, info->gfx8.pipe_config, |
---|
| 475 | + GRPH_ARRAY_MODE, info->gfx8.array_mode, |
---|
| 476 | + GRPH_COLOR_EXPANSION_MODE, 1); |
---|
| 477 | + /* 01 - DCP_GRPH_COLOR_EXPANSION_MODE_ZEXP: zero expansion for YCbCr */ |
---|
| 478 | + /* |
---|
| 479 | + GRPH_Z, 0); |
---|
| 480 | + */ |
---|
| 481 | + } |
---|
388 | 482 | } |
---|
389 | 483 | |
---|
390 | 484 | |
---|
391 | 485 | static void program_size_and_rotation( |
---|
392 | 486 | struct dce_mem_input *dce_mi, |
---|
393 | 487 | enum dc_rotation_angle rotation, |
---|
394 | | - const union plane_size *plane_size) |
---|
| 488 | + const struct plane_size *plane_size) |
---|
395 | 489 | { |
---|
396 | | - const struct rect *in_rect = &plane_size->grph.surface_size; |
---|
397 | | - struct rect hw_rect = plane_size->grph.surface_size; |
---|
| 490 | + const struct rect *in_rect = &plane_size->surface_size; |
---|
| 491 | + struct rect hw_rect = plane_size->surface_size; |
---|
398 | 492 | const uint32_t rotation_angles[ROTATION_ANGLE_COUNT] = { |
---|
399 | 493 | [ROTATION_ANGLE_0] = 0, |
---|
400 | 494 | [ROTATION_ANGLE_90] = 1, |
---|
.. | .. |
---|
423 | 517 | GRPH_Y_END, hw_rect.height); |
---|
424 | 518 | |
---|
425 | 519 | REG_SET(GRPH_PITCH, 0, |
---|
426 | | - GRPH_PITCH, plane_size->grph.surface_pitch); |
---|
| 520 | + GRPH_PITCH, plane_size->surface_pitch); |
---|
427 | 521 | |
---|
428 | 522 | REG_SET(HW_ROTATION, 0, |
---|
429 | 523 | GRPH_ROTATION_ANGLE, rotation_angles[rotation]); |
---|
430 | 524 | } |
---|
| 525 | + |
---|
| 526 | +#if defined(CONFIG_DRM_AMD_DC_SI) |
---|
| 527 | +static void dce60_program_size( |
---|
| 528 | + struct dce_mem_input *dce_mi, |
---|
| 529 | + enum dc_rotation_angle rotation, /* not used in DCE6 */ |
---|
| 530 | + const struct plane_size *plane_size) |
---|
| 531 | +{ |
---|
| 532 | + struct rect hw_rect = plane_size->surface_size; |
---|
| 533 | + /* DCE6 has no HW rotation, skip rotation_angles declaration */ |
---|
| 534 | + |
---|
| 535 | + /* DCE6 has no HW rotation, skip ROTATION_ANGLE_* processing */ |
---|
| 536 | + |
---|
| 537 | + REG_SET(GRPH_X_START, 0, |
---|
| 538 | + GRPH_X_START, hw_rect.x); |
---|
| 539 | + |
---|
| 540 | + REG_SET(GRPH_Y_START, 0, |
---|
| 541 | + GRPH_Y_START, hw_rect.y); |
---|
| 542 | + |
---|
| 543 | + REG_SET(GRPH_X_END, 0, |
---|
| 544 | + GRPH_X_END, hw_rect.width); |
---|
| 545 | + |
---|
| 546 | + REG_SET(GRPH_Y_END, 0, |
---|
| 547 | + GRPH_Y_END, hw_rect.height); |
---|
| 548 | + |
---|
| 549 | + REG_SET(GRPH_PITCH, 0, |
---|
| 550 | + GRPH_PITCH, plane_size->surface_pitch); |
---|
| 551 | + |
---|
| 552 | + /* DCE6 has no HW_ROTATION register, skip setting rotation_angles */ |
---|
| 553 | +} |
---|
| 554 | +#endif |
---|
431 | 555 | |
---|
432 | 556 | static void program_grph_pixel_format( |
---|
433 | 557 | struct dce_mem_input *dce_mi, |
---|
.. | .. |
---|
479 | 603 | case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: |
---|
480 | 604 | sign = 1; |
---|
481 | 605 | floating = 1; |
---|
482 | | - /* no break */ |
---|
| 606 | + fallthrough; |
---|
483 | 607 | case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: /* shouldn't this get float too? */ |
---|
484 | 608 | case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: |
---|
485 | 609 | grph_depth = 3; |
---|
.. | .. |
---|
505 | 629 | struct mem_input *mi, |
---|
506 | 630 | enum surface_pixel_format format, |
---|
507 | 631 | union dc_tiling_info *tiling_info, |
---|
508 | | - union plane_size *plane_size, |
---|
| 632 | + struct plane_size *plane_size, |
---|
509 | 633 | enum dc_rotation_angle rotation, |
---|
510 | 634 | struct dc_plane_dcc_param *dcc, |
---|
511 | 635 | bool horizontal_mirror) |
---|
.. | .. |
---|
520 | 644 | format < SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) |
---|
521 | 645 | program_grph_pixel_format(dce_mi, format); |
---|
522 | 646 | } |
---|
| 647 | + |
---|
| 648 | +#if defined(CONFIG_DRM_AMD_DC_SI) |
---|
| 649 | +static void dce60_mi_program_surface_config( |
---|
| 650 | + struct mem_input *mi, |
---|
| 651 | + enum surface_pixel_format format, |
---|
| 652 | + union dc_tiling_info *tiling_info, |
---|
| 653 | + struct plane_size *plane_size, |
---|
| 654 | + enum dc_rotation_angle rotation, /* not used in DCE6 */ |
---|
| 655 | + struct dc_plane_dcc_param *dcc, |
---|
| 656 | + bool horizontal_mirror) |
---|
| 657 | +{ |
---|
| 658 | + struct dce_mem_input *dce_mi = TO_DCE_MEM_INPUT(mi); |
---|
| 659 | + REG_UPDATE(GRPH_ENABLE, GRPH_ENABLE, 1); |
---|
| 660 | + |
---|
| 661 | + program_tiling(dce_mi, tiling_info); |
---|
| 662 | + dce60_program_size(dce_mi, rotation, plane_size); |
---|
| 663 | + |
---|
| 664 | + if (format >= SURFACE_PIXEL_FORMAT_GRPH_BEGIN && |
---|
| 665 | + format < SURFACE_PIXEL_FORMAT_VIDEO_BEGIN) |
---|
| 666 | + program_grph_pixel_format(dce_mi, format); |
---|
| 667 | +} |
---|
| 668 | +#endif |
---|
523 | 669 | |
---|
524 | 670 | static uint32_t get_dmif_switch_time_us( |
---|
525 | 671 | uint32_t h_total, |
---|
.. | .. |
---|
606 | 752 | } |
---|
607 | 753 | |
---|
608 | 754 | if (dce_mi->wa.single_head_rdreq_dmif_limit) { |
---|
609 | | - uint32_t eanble = (total_stream_num > 1) ? 0 : |
---|
| 755 | + uint32_t enable = (total_stream_num > 1) ? 0 : |
---|
610 | 756 | dce_mi->wa.single_head_rdreq_dmif_limit; |
---|
611 | 757 | |
---|
612 | 758 | REG_UPDATE(MC_HUB_RDREQ_DMIF_LIMIT, |
---|
613 | | - ENABLE, eanble); |
---|
| 759 | + ENABLE, enable); |
---|
614 | 760 | } |
---|
615 | 761 | } |
---|
616 | 762 | |
---|
.. | .. |
---|
636 | 782 | 10, 3500); |
---|
637 | 783 | |
---|
638 | 784 | if (dce_mi->wa.single_head_rdreq_dmif_limit) { |
---|
639 | | - uint32_t eanble = (total_stream_num > 1) ? 0 : |
---|
| 785 | + uint32_t enable = (total_stream_num > 1) ? 0 : |
---|
640 | 786 | dce_mi->wa.single_head_rdreq_dmif_limit; |
---|
641 | 787 | |
---|
642 | 788 | REG_UPDATE(MC_HUB_RDREQ_DMIF_LIMIT, |
---|
643 | | - ENABLE, eanble); |
---|
| 789 | + ENABLE, enable); |
---|
644 | 790 | } |
---|
645 | 791 | } |
---|
646 | 792 | |
---|
.. | .. |
---|
741 | 887 | .mem_input_is_flip_pending = dce_mi_is_flip_pending |
---|
742 | 888 | }; |
---|
743 | 889 | |
---|
| 890 | +#if defined(CONFIG_DRM_AMD_DC_SI) |
---|
| 891 | +static const struct mem_input_funcs dce60_mi_funcs = { |
---|
| 892 | + .mem_input_program_display_marks = dce60_mi_program_display_marks, |
---|
| 893 | + .allocate_mem_input = dce_mi_allocate_dmif, |
---|
| 894 | + .free_mem_input = dce_mi_free_dmif, |
---|
| 895 | + .mem_input_program_surface_flip_and_addr = |
---|
| 896 | + dce_mi_program_surface_flip_and_addr, |
---|
| 897 | + .mem_input_program_pte_vm = dce_mi_program_pte_vm, |
---|
| 898 | + .mem_input_program_surface_config = |
---|
| 899 | + dce60_mi_program_surface_config, |
---|
| 900 | + .mem_input_is_flip_pending = dce_mi_is_flip_pending |
---|
| 901 | +}; |
---|
| 902 | +#endif |
---|
| 903 | + |
---|
744 | 904 | static const struct mem_input_funcs dce112_mi_funcs = { |
---|
745 | 905 | .mem_input_program_display_marks = dce112_mi_program_display_marks, |
---|
746 | 906 | .allocate_mem_input = dce_mi_allocate_dmif, |
---|
.. | .. |
---|
783 | 943 | dce_mi->masks = mi_mask; |
---|
784 | 944 | } |
---|
785 | 945 | |
---|
| 946 | +#if defined(CONFIG_DRM_AMD_DC_SI) |
---|
| 947 | +void dce60_mem_input_construct( |
---|
| 948 | + struct dce_mem_input *dce_mi, |
---|
| 949 | + struct dc_context *ctx, |
---|
| 950 | + int inst, |
---|
| 951 | + const struct dce_mem_input_registers *regs, |
---|
| 952 | + const struct dce_mem_input_shift *mi_shift, |
---|
| 953 | + const struct dce_mem_input_mask *mi_mask) |
---|
| 954 | +{ |
---|
| 955 | + dce_mem_input_construct(dce_mi, ctx, inst, regs, mi_shift, mi_mask); |
---|
| 956 | + dce_mi->base.funcs = &dce60_mi_funcs; |
---|
| 957 | +} |
---|
| 958 | +#endif |
---|
| 959 | + |
---|
786 | 960 | void dce112_mem_input_construct( |
---|
787 | 961 | struct dce_mem_input *dce_mi, |
---|
788 | 962 | struct dc_context *ctx, |
---|