aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMikita Lipski <mikita.lipski@amd.com>2018-02-27 16:22:29 -0500
committerAlex Deucher <alexander.deucher@amd.com>2018-03-14 16:08:46 -0400
commitd54ee946032be661b7645f30f7fa6ae10caa9bc3 (patch)
tree425b48e1edc4d60f1ecc36c5db5ae3c243127e31
parenta4056c2a6344c64bd62234458a314e6aecce226f (diff)
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>
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.h35
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c50
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c87
3 files changed, 172 insertions, 0 deletions
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.h b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.h
index 1d4546f23135..c24c0e5ea44e 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.h
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.h
@@ -46,6 +46,23 @@
46 SR(SMU_INTERRUPT_CONTROL), \ 46 SR(SMU_INTERRUPT_CONTROL), \
47 SR(DC_DMCU_SCRATCH) 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#define DMCU_DCE110_COMMON_REG_LIST() \ 66#define DMCU_DCE110_COMMON_REG_LIST() \
50 DMCU_COMMON_REG_LIST_DCE_BASE(), \ 67 DMCU_COMMON_REG_LIST_DCE_BASE(), \
51 SR(DCI_MEM_PWR_STATUS) 68 SR(DCI_MEM_PWR_STATUS)
@@ -83,6 +100,24 @@
83 STATIC_SCREEN4_INT_TO_UC_EN, mask_sh), \ 100 STATIC_SCREEN4_INT_TO_UC_EN, mask_sh), \
84 DMCU_SF(SMU_INTERRUPT_CONTROL, DC_SMU_INT_ENABLE, mask_sh) 101 DMCU_SF(SMU_INTERRUPT_CONTROL, DC_SMU_INT_ENABLE, mask_sh)
85 102
103#define DMCU_MASK_SH_LIST_DCE80(mask_sh) \
104 DMCU_SF(DMCU_CTRL, \
105 DMCU_ENABLE, mask_sh), \
106 DMCU_SF(DMCU_STATUS, \
107 UC_IN_STOP_MODE, mask_sh), \
108 DMCU_SF(DMCU_STATUS, \
109 UC_IN_RESET, mask_sh), \
110 DMCU_SF(DMCU_RAM_ACCESS_CTRL, \
111 IRAM_HOST_ACCESS_EN, mask_sh), \
112 DMCU_SF(DMCU_RAM_ACCESS_CTRL, \
113 IRAM_WR_ADDR_AUTO_INC, mask_sh), \
114 DMCU_SF(DMCU_RAM_ACCESS_CTRL, \
115 IRAM_RD_ADDR_AUTO_INC, mask_sh), \
116 DMCU_SF(MASTER_COMM_CMD_REG, \
117 MASTER_COMM_CMD_REG_BYTE0, mask_sh), \
118 DMCU_SF(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, mask_sh), \
119 DMCU_SF(SMU_INTERRUPT_CONTROL, DC_SMU_INT_ENABLE, mask_sh)
120
86#define DMCU_MASK_SH_LIST_DCE110(mask_sh) \ 121#define DMCU_MASK_SH_LIST_DCE110(mask_sh) \
87 DMCU_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(mask_sh), \ 122 DMCU_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(mask_sh), \
88 DMCU_SF(DCI_MEM_PWR_STATUS, \ 123 DMCU_SF(DCI_MEM_PWR_STATUS, \
diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
index 3bdbed80f7f8..3092f76bdb75 100644
--- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
@@ -51,6 +51,9 @@
51#include "dce/dce_10_0_d.h" 51#include "dce/dce_10_0_d.h"
52#include "dce/dce_10_0_sh_mask.h" 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#ifndef mmMC_HUB_RDREQ_DMIF_LIMIT 57#ifndef mmMC_HUB_RDREQ_DMIF_LIMIT
55#include "gmc/gmc_8_2_d.h" 58#include "gmc/gmc_8_2_d.h"
56#include "gmc/gmc_8_2_sh_mask.h" 59#include "gmc/gmc_8_2_sh_mask.h"
@@ -320,7 +323,29 @@ static const struct dce110_clk_src_mask cs_mask = {
320 CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK) 323 CS_COMMON_MASK_SH_LIST_DCE_COMMON_BASE(_MASK)
321}; 324};
322 325
326static const struct dce_dmcu_registers dmcu_regs = {
327 DMCU_DCE110_COMMON_REG_LIST()
328};
329
330static const struct dce_dmcu_shift dmcu_shift = {
331 DMCU_MASK_SH_LIST_DCE110(__SHIFT)
332};
333
334static const struct dce_dmcu_mask dmcu_mask = {
335 DMCU_MASK_SH_LIST_DCE110(_MASK)
336};
337
338static const struct dce_abm_registers abm_regs = {
339 ABM_DCE110_COMMON_REG_LIST()
340};
341
342static const struct dce_abm_shift abm_shift = {
343 ABM_MASK_SH_LIST_DCE110(__SHIFT)
344};
323 345
346static const struct dce_abm_mask abm_mask = {
347 ABM_MASK_SH_LIST_DCE110(_MASK)
348};
324 349
325#define DCFE_MEM_PWR_CTRL_REG_BASE 0x1b03 350#define DCFE_MEM_PWR_CTRL_REG_BASE 0x1b03
326 351
@@ -622,6 +647,12 @@ static void destruct(struct dce110_resource_pool *pool)
622 if (pool->base.display_clock != NULL) 647 if (pool->base.display_clock != NULL)
623 dce_disp_clk_destroy(&pool->base.display_clock); 648 dce_disp_clk_destroy(&pool->base.display_clock);
624 649
650 if (pool->base.abm != NULL)
651 dce_abm_destroy(&pool->base.abm);
652
653 if (pool->base.dmcu != NULL)
654 dce_dmcu_destroy(&pool->base.dmcu);
655
625 if (pool->base.irqs != NULL) 656 if (pool->base.irqs != NULL)
626 dal_irq_service_destroy(&pool->base.irqs); 657 dal_irq_service_destroy(&pool->base.irqs);
627} 658}
@@ -829,6 +860,25 @@ static bool construct(
829 goto res_create_fail; 860 goto res_create_fail;
830 } 861 }
831 862
863 pool->base.dmcu = dce_dmcu_create(ctx,
864 &dmcu_regs,
865 &dmcu_shift,
866 &dmcu_mask);
867 if (pool->base.dmcu == NULL) {
868 dm_error("DC: failed to create dmcu!\n");
869 BREAK_TO_DEBUGGER();
870 goto res_create_fail;
871 }
872
873 pool->base.abm = dce_abm_create(ctx,
874 &abm_regs,
875 &abm_shift,
876 &abm_mask);
877 if (pool->base.abm == NULL) {
878 dm_error("DC: failed to create abm!\n");
879 BREAK_TO_DEBUGGER();
880 goto res_create_fail;
881 }
832 882
833 /* get static clock information for PPLIB or firmware, save 883 /* get static clock information for PPLIB or firmware, save
834 * max_clock_state 884 * max_clock_state
diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
index a36c14d3d9a8..5d854a37a978 100644
--- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
@@ -53,6 +53,8 @@
53 53
54#include "reg_helper.h" 54#include "reg_helper.h"
55 55
56#include "dce/dce_dmcu.h"
57#include "dce/dce_abm.h"
56/* TODO remove this include */ 58/* TODO remove this include */
57 59
58#ifndef mmMC_HUB_RDREQ_DMIF_LIMIT 60#ifndef mmMC_HUB_RDREQ_DMIF_LIMIT
@@ -364,6 +366,29 @@ static const struct resource_caps res_cap_83 = {
364 .num_pll = 2, 366 .num_pll = 2,
365}; 367};
366 368
369static const struct dce_dmcu_registers dmcu_regs = {
370 DMCU_DCE80_REG_LIST()
371};
372
373static const struct dce_dmcu_shift dmcu_shift = {
374 DMCU_MASK_SH_LIST_DCE80(__SHIFT)
375};
376
377static const struct dce_dmcu_mask dmcu_mask = {
378 DMCU_MASK_SH_LIST_DCE80(_MASK)
379};
380static const struct dce_abm_registers abm_regs = {
381 ABM_DCE110_COMMON_REG_LIST()
382};
383
384static const struct dce_abm_shift abm_shift = {
385 ABM_MASK_SH_LIST_DCE110(__SHIFT)
386};
387
388static const struct dce_abm_mask abm_mask = {
389 ABM_MASK_SH_LIST_DCE110(_MASK)
390};
391
367#define CTX ctx 392#define CTX ctx
368#define REG(reg) mm ## reg 393#define REG(reg) mm ## reg
369 394
@@ -643,6 +668,12 @@ static void destruct(struct dce110_resource_pool *pool)
643 } 668 }
644 } 669 }
645 670
671 if (pool->base.abm != NULL)
672 dce_abm_destroy(&pool->base.abm);
673
674 if (pool->base.dmcu != NULL)
675 dce_dmcu_destroy(&pool->base.dmcu);
676
646 if (pool->base.dp_clock_source != NULL) 677 if (pool->base.dp_clock_source != NULL)
647 dce80_clock_source_destroy(&pool->base.dp_clock_source); 678 dce80_clock_source_destroy(&pool->base.dp_clock_source);
648 679
@@ -850,7 +881,25 @@ static bool dce80_construct(
850 goto res_create_fail; 881 goto res_create_fail;
851 } 882 }
852 883
884 pool->base.dmcu = dce_dmcu_create(ctx,
885 &dmcu_regs,
886 &dmcu_shift,
887 &dmcu_mask);
888 if (pool->base.dmcu == NULL) {
889 dm_error("DC: failed to create dmcu!\n");
890 BREAK_TO_DEBUGGER();
891 goto res_create_fail;
892 }
853 893
894 pool->base.abm = dce_abm_create(ctx,
895 &abm_regs,
896 &abm_shift,
897 &abm_mask);
898 if (pool->base.abm == NULL) {
899 dm_error("DC: failed to create abm!\n");
900 BREAK_TO_DEBUGGER();
901 goto res_create_fail;
902 }
854 if (dm_pp_get_static_clocks(ctx, &static_clk_info)) 903 if (dm_pp_get_static_clocks(ctx, &static_clk_info))
855 pool->base.display_clock->max_clks_state = 904 pool->base.display_clock->max_clks_state =
856 static_clk_info.max_clocks_state; 905 static_clk_info.max_clocks_state;
@@ -1016,6 +1065,25 @@ static bool dce81_construct(
1016 goto res_create_fail; 1065 goto res_create_fail;
1017 } 1066 }
1018 1067
1068 pool->base.dmcu = dce_dmcu_create(ctx,
1069 &dmcu_regs,
1070 &dmcu_shift,
1071 &dmcu_mask);
1072 if (pool->base.dmcu == NULL) {
1073 dm_error("DC: failed to create dmcu!\n");
1074 BREAK_TO_DEBUGGER();
1075 goto res_create_fail;
1076 }
1077
1078 pool->base.abm = dce_abm_create(ctx,
1079 &abm_regs,
1080 &abm_shift,
1081 &abm_mask);
1082 if (pool->base.abm == NULL) {
1083 dm_error("DC: failed to create abm!\n");
1084 BREAK_TO_DEBUGGER();
1085 goto res_create_fail;
1086 }
1019 1087
1020 if (dm_pp_get_static_clocks(ctx, &static_clk_info)) 1088 if (dm_pp_get_static_clocks(ctx, &static_clk_info))
1021 pool->base.display_clock->max_clks_state = 1089 pool->base.display_clock->max_clks_state =
@@ -1178,6 +1246,25 @@ static bool dce83_construct(
1178 goto res_create_fail; 1246 goto res_create_fail;
1179 } 1247 }
1180 1248
1249 pool->base.dmcu = dce_dmcu_create(ctx,
1250 &dmcu_regs,
1251 &dmcu_shift,
1252 &dmcu_mask);
1253 if (pool->base.dmcu == NULL) {
1254 dm_error("DC: failed to create dmcu!\n");
1255 BREAK_TO_DEBUGGER();
1256 goto res_create_fail;
1257 }
1258
1259 pool->base.abm = dce_abm_create(ctx,
1260 &abm_regs,
1261 &abm_shift,
1262 &abm_mask);
1263 if (pool->base.abm == NULL) {
1264 dm_error("DC: failed to create abm!\n");
1265 BREAK_TO_DEBUGGER();
1266 goto res_create_fail;
1267 }
1181 1268
1182 if (dm_pp_get_static_clocks(ctx, &static_clk_info)) 1269 if (dm_pp_get_static_clocks(ctx, &static_clk_info))
1183 pool->base.display_clock->max_clks_state = 1270 pool->base.display_clock->max_clks_state =