| .. | .. |
|---|
| 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, |
|---|