Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/display: Enable backlight support for pre-DCE11 ASICs

Initializing ABM and DMCU modules for dce 80/81/83/100 as in DCE110
Adding constructors and destructors for each module.
Adding register list for DMCU in dce80 as some registers are missing
in dce80 from the basic list. DMCU is never used, so it would not have
any functional impact.

Signed-off-by: Mikita Lipski <mikita.lipski@amd.com>
Reviewed-by: Harry Wentland <Harry.Wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Mikita Lipski and committed by
Alex Deucher
d54ee946 a4056c2a

+172
+35
drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.h
··· 46 46 SR(SMU_INTERRUPT_CONTROL), \ 47 47 SR(DC_DMCU_SCRATCH) 48 48 49 + #define DMCU_DCE80_REG_LIST() \ 50 + SR(DMCU_CTRL), \ 51 + SR(DMCU_STATUS), \ 52 + SR(DMCU_RAM_ACCESS_CTRL), \ 53 + SR(DMCU_IRAM_WR_CTRL), \ 54 + SR(DMCU_IRAM_WR_DATA), \ 55 + SR(MASTER_COMM_DATA_REG1), \ 56 + SR(MASTER_COMM_DATA_REG2), \ 57 + SR(MASTER_COMM_DATA_REG3), \ 58 + SR(MASTER_COMM_CMD_REG), \ 59 + SR(MASTER_COMM_CNTL_REG), \ 60 + SR(DMCU_IRAM_RD_CTRL), \ 61 + SR(DMCU_IRAM_RD_DATA), \ 62 + SR(DMCU_INTERRUPT_TO_UC_EN_MASK), \ 63 + SR(SMU_INTERRUPT_CONTROL), \ 64 + SR(DC_DMCU_SCRATCH) 65 + 49 66 #define DMCU_DCE110_COMMON_REG_LIST() \ 50 67 DMCU_COMMON_REG_LIST_DCE_BASE(), \ 51 68 SR(DCI_MEM_PWR_STATUS) ··· 98 81 STATIC_SCREEN3_INT_TO_UC_EN, mask_sh), \ 99 82 DMCU_SF(DMCU_INTERRUPT_TO_UC_EN_MASK, \ 100 83 STATIC_SCREEN4_INT_TO_UC_EN, mask_sh), \ 84 + DMCU_SF(SMU_INTERRUPT_CONTROL, DC_SMU_INT_ENABLE, mask_sh) 85 + 86 + #define DMCU_MASK_SH_LIST_DCE80(mask_sh) \ 87 + DMCU_SF(DMCU_CTRL, \ 88 + DMCU_ENABLE, mask_sh), \ 89 + DMCU_SF(DMCU_STATUS, \ 90 + UC_IN_STOP_MODE, mask_sh), \ 91 + DMCU_SF(DMCU_STATUS, \ 92 + UC_IN_RESET, mask_sh), \ 93 + DMCU_SF(DMCU_RAM_ACCESS_CTRL, \ 94 + IRAM_HOST_ACCESS_EN, mask_sh), \ 95 + DMCU_SF(DMCU_RAM_ACCESS_CTRL, \ 96 + IRAM_WR_ADDR_AUTO_INC, mask_sh), \ 97 + DMCU_SF(DMCU_RAM_ACCESS_CTRL, \ 98 + IRAM_RD_ADDR_AUTO_INC, mask_sh), \ 99 + DMCU_SF(MASTER_COMM_CMD_REG, \ 100 + MASTER_COMM_CMD_REG_BYTE0, mask_sh), \ 101 + DMCU_SF(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, mask_sh), \ 101 102 DMCU_SF(SMU_INTERRUPT_CONTROL, DC_SMU_INT_ENABLE, mask_sh) 102 103 103 104 #define DMCU_MASK_SH_LIST_DCE110(mask_sh) \
+50
drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
··· 51 51 #include "dce/dce_10_0_d.h" 52 52 #include "dce/dce_10_0_sh_mask.h" 53 53 54 + #include "dce/dce_dmcu.h" 55 + #include "dce/dce_abm.h" 56 + 54 57 #ifndef mmMC_HUB_RDREQ_DMIF_LIMIT 55 58 #include "gmc/gmc_8_2_d.h" 56 59 #include "gmc/gmc_8_2_sh_mask.h" ··· 323 320 CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK) 324 321 }; 325 322 323 + static const struct dce_dmcu_registers dmcu_regs = { 324 + DMCU_DCE110_COMMON_REG_LIST() 325 + }; 326 326 327 + static const struct dce_dmcu_shift dmcu_shift = { 328 + DMCU_MASK_SH_LIST_DCE110(__SHIFT) 329 + }; 330 + 331 + static const struct dce_dmcu_mask dmcu_mask = { 332 + DMCU_MASK_SH_LIST_DCE110(_MASK) 333 + }; 334 + 335 + static const struct dce_abm_registers abm_regs = { 336 + ABM_DCE110_COMMON_REG_LIST() 337 + }; 338 + 339 + static const struct dce_abm_shift abm_shift = { 340 + ABM_MASK_SH_LIST_DCE110(__SHIFT) 341 + }; 342 + 343 + static const struct dce_abm_mask abm_mask = { 344 + ABM_MASK_SH_LIST_DCE110(_MASK) 345 + }; 327 346 328 347 #define DCFE_MEM_PWR_CTRL_REG_BASE 0x1b03 329 348 ··· 647 622 if (pool->base.display_clock != NULL) 648 623 dce_disp_clk_destroy(&pool->base.display_clock); 649 624 625 + if (pool->base.abm != NULL) 626 + dce_abm_destroy(&pool->base.abm); 627 + 628 + if (pool->base.dmcu != NULL) 629 + dce_dmcu_destroy(&pool->base.dmcu); 630 + 650 631 if (pool->base.irqs != NULL) 651 632 dal_irq_service_destroy(&pool->base.irqs); 652 633 } ··· 860 829 goto res_create_fail; 861 830 } 862 831 832 + pool->base.dmcu = dce_dmcu_create(ctx, 833 + &dmcu_regs, 834 + &dmcu_shift, 835 + &dmcu_mask); 836 + if (pool->base.dmcu == NULL) { 837 + dm_error("DC: failed to create dmcu!\n"); 838 + BREAK_TO_DEBUGGER(); 839 + goto res_create_fail; 840 + } 841 + 842 + pool->base.abm = dce_abm_create(ctx, 843 + &abm_regs, 844 + &abm_shift, 845 + &abm_mask); 846 + if (pool->base.abm == NULL) { 847 + dm_error("DC: failed to create abm!\n"); 848 + BREAK_TO_DEBUGGER(); 849 + goto res_create_fail; 850 + } 863 851 864 852 /* get static clock information for PPLIB or firmware, save 865 853 * max_clock_state
+87
drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
··· 53 53 54 54 #include "reg_helper.h" 55 55 56 + #include "dce/dce_dmcu.h" 57 + #include "dce/dce_abm.h" 56 58 /* TODO remove this include */ 57 59 58 60 #ifndef mmMC_HUB_RDREQ_DMIF_LIMIT ··· 366 364 .num_pll = 2, 367 365 }; 368 366 367 + static const struct dce_dmcu_registers dmcu_regs = { 368 + DMCU_DCE80_REG_LIST() 369 + }; 370 + 371 + static const struct dce_dmcu_shift dmcu_shift = { 372 + DMCU_MASK_SH_LIST_DCE80(__SHIFT) 373 + }; 374 + 375 + static const struct dce_dmcu_mask dmcu_mask = { 376 + DMCU_MASK_SH_LIST_DCE80(_MASK) 377 + }; 378 + static const struct dce_abm_registers abm_regs = { 379 + ABM_DCE110_COMMON_REG_LIST() 380 + }; 381 + 382 + static const struct dce_abm_shift abm_shift = { 383 + ABM_MASK_SH_LIST_DCE110(__SHIFT) 384 + }; 385 + 386 + static const struct dce_abm_mask abm_mask = { 387 + ABM_MASK_SH_LIST_DCE110(_MASK) 388 + }; 389 + 369 390 #define CTX ctx 370 391 #define REG(reg) mm ## reg 371 392 ··· 668 643 } 669 644 } 670 645 646 + if (pool->base.abm != NULL) 647 + dce_abm_destroy(&pool->base.abm); 648 + 649 + if (pool->base.dmcu != NULL) 650 + dce_dmcu_destroy(&pool->base.dmcu); 651 + 671 652 if (pool->base.dp_clock_source != NULL) 672 653 dce80_clock_source_destroy(&pool->base.dp_clock_source); 673 654 ··· 881 850 goto res_create_fail; 882 851 } 883 852 853 + pool->base.dmcu = dce_dmcu_create(ctx, 854 + &dmcu_regs, 855 + &dmcu_shift, 856 + &dmcu_mask); 857 + if (pool->base.dmcu == NULL) { 858 + dm_error("DC: failed to create dmcu!\n"); 859 + BREAK_TO_DEBUGGER(); 860 + goto res_create_fail; 861 + } 884 862 863 + pool->base.abm = dce_abm_create(ctx, 864 + &abm_regs, 865 + &abm_shift, 866 + &abm_mask); 867 + if (pool->base.abm == NULL) { 868 + dm_error("DC: failed to create abm!\n"); 869 + BREAK_TO_DEBUGGER(); 870 + goto res_create_fail; 871 + } 885 872 if (dm_pp_get_static_clocks(ctx, &static_clk_info)) 886 873 pool->base.display_clock->max_clks_state = 887 874 static_clk_info.max_clocks_state; ··· 1065 1016 goto res_create_fail; 1066 1017 } 1067 1018 1019 + pool->base.dmcu = dce_dmcu_create(ctx, 1020 + &dmcu_regs, 1021 + &dmcu_shift, 1022 + &dmcu_mask); 1023 + if (pool->base.dmcu == NULL) { 1024 + dm_error("DC: failed to create dmcu!\n"); 1025 + BREAK_TO_DEBUGGER(); 1026 + goto res_create_fail; 1027 + } 1028 + 1029 + pool->base.abm = dce_abm_create(ctx, 1030 + &abm_regs, 1031 + &abm_shift, 1032 + &abm_mask); 1033 + if (pool->base.abm == NULL) { 1034 + dm_error("DC: failed to create abm!\n"); 1035 + BREAK_TO_DEBUGGER(); 1036 + goto res_create_fail; 1037 + } 1068 1038 1069 1039 if (dm_pp_get_static_clocks(ctx, &static_clk_info)) 1070 1040 pool->base.display_clock->max_clks_state = ··· 1246 1178 goto res_create_fail; 1247 1179 } 1248 1180 1181 + pool->base.dmcu = dce_dmcu_create(ctx, 1182 + &dmcu_regs, 1183 + &dmcu_shift, 1184 + &dmcu_mask); 1185 + if (pool->base.dmcu == NULL) { 1186 + dm_error("DC: failed to create dmcu!\n"); 1187 + BREAK_TO_DEBUGGER(); 1188 + goto res_create_fail; 1189 + } 1190 + 1191 + pool->base.abm = dce_abm_create(ctx, 1192 + &abm_regs, 1193 + &abm_shift, 1194 + &abm_mask); 1195 + if (pool->base.abm == NULL) { 1196 + dm_error("DC: failed to create abm!\n"); 1197 + BREAK_TO_DEBUGGER(); 1198 + goto res_create_fail; 1199 + } 1249 1200 1250 1201 if (dm_pp_get_static_clocks(ctx, &static_clk_info)) 1251 1202 pool->base.display_clock->max_clks_state =