mirror of
https://github.com/torvalds/linux.git
synced 2026-06-03 12:03:54 +02:00
drm/amd/display: fix invalid reg access on DCN35 FPGA
[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>
This commit is contained in:
parent
7fc0d111ba
commit
f2a905b01c
|
|
@ -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 */
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user