drm/amd/display: fix invalid reg access on DCN35 FPGA
authorEric Yang <eric.yang@amd.com>
Tue, 16 Jan 2024 19:50:55 +0000 (14:50 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 29 Jan 2024 20:42:52 +0000 (15:42 -0500)
[Why]
Unguarded SMU and CLK IP access cause issue on FPGA

[How]
Guard them for FPGA environment

Reviewed-by: Sung joon Kim <sungjoon.kim@amd.com>
Acked-by: Tom Chung <chiahsuan.chung@amd.com>
Signed-off-by: Eric Yang <eric.yang@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_clk_mgr.c
drivers/gpu/drm/amd/display/dc/clk_mgr/dcn35/dcn35_smu.c

index 3d1a60c..e1b0353 100644 (file)
@@ -408,13 +408,12 @@ static void dcn35_dump_clk_registers(struct clk_state_registers_and_bypass *regs
                struct clk_mgr_dcn35 *clk_mgr)
 {
 }
-void dcn35_init_clocks(struct clk_mgr *clk_mgr)
+
+static void init_clk_states(struct clk_mgr *clk_mgr)
 {
        uint32_t ref_dtbclk = clk_mgr->clks.ref_dtbclk_khz;
-
        memset(&(clk_mgr->clks), 0, sizeof(struct dc_clocks));
 
-       // Assumption is that boot state always supports pstate
        clk_mgr->clks.dtbclk_en = true;
        clk_mgr->clks.ref_dtbclk_khz = ref_dtbclk;      // restore ref_dtbclk
        clk_mgr->clks.p_state_change_support = true;
@@ -422,6 +421,11 @@ void dcn35_init_clocks(struct clk_mgr *clk_mgr)
        clk_mgr->clks.pwr_state = DCN_PWR_STATE_UNKNOWN;
        clk_mgr->clks.zstate_support = DCN_ZSTATE_SUPPORT_UNKNOWN;
 }
+
+void dcn35_init_clocks(struct clk_mgr *clk_mgr)
+{
+       init_clk_states(clk_mgr);
+}
 static struct clk_bw_params dcn35_bw_params = {
        .vram_type = Ddr4MemType,
        .num_channels = 1,
@@ -883,7 +887,7 @@ static uint32_t dcn35_get_idle_state(struct clk_mgr *clk_mgr_base)
 
 static void dcn35_init_clocks_fpga(struct clk_mgr *clk_mgr)
 {
-       dcn35_init_clocks(clk_mgr);
+       init_clk_states(clk_mgr);
 
 /* TODO: Implement the functions and remove the ifndef guard */
 }
index 6d4a1ff..a07f7e6 100644 (file)
@@ -447,6 +447,9 @@ void dcn35_smu_set_dtbclk(struct clk_mgr_internal *clk_mgr, bool enable)
 
 void dcn35_vbios_smu_enable_48mhz_tmdp_refclk_pwrdwn(struct clk_mgr_internal *clk_mgr, bool enable)
 {
+       if (!clk_mgr->smu_present)
+               return;
+
        dcn35_smu_send_msg_with_param(
                        clk_mgr,
                        VBIOSSMC_MSG_EnableTmdp48MHzRefclkPwrDown,
@@ -458,6 +461,9 @@ int dcn35_smu_exit_low_power_state(struct clk_mgr_internal *clk_mgr)
 {
        int retv;
 
+       if (!clk_mgr->smu_present)
+               return 0;
+
        retv = dcn35_smu_send_msg_with_param(
                clk_mgr,
                VBIOSSMC_MSG_DispPsrExit,
@@ -470,6 +476,9 @@ int dcn35_smu_get_ips_supported(struct clk_mgr_internal *clk_mgr)
 {
        int retv;
 
+       if (!clk_mgr->smu_present)
+               return 0;
+
        retv = dcn35_smu_send_msg_with_param(
                        clk_mgr,
                        VBIOSSMC_MSG_QueryIPS2Support,
@@ -481,6 +490,9 @@ int dcn35_smu_get_ips_supported(struct clk_mgr_internal *clk_mgr)
 
 void dcn35_smu_write_ips_scratch(struct clk_mgr_internal *clk_mgr, uint32_t param)
 {
+       if (!clk_mgr->smu_present)
+               return;
+
        REG_WRITE(MP1_SMN_C2PMSG_71, param);
        //smu_print("%s: write_ips_scratch = %x\n", __func__, param);
 }
@@ -489,6 +501,9 @@ uint32_t dcn35_smu_read_ips_scratch(struct clk_mgr_internal *clk_mgr)
 {
        uint32_t retv;
 
+       if (!clk_mgr->smu_present)
+               return 0;
+
        retv = REG_READ(MP1_SMN_C2PMSG_71);
        //smu_print("%s: dcn35_smu_read_ips_scratch = %x\n",  __func__, retv);
        return retv;