[PATCH 5/6] drm/radeon: Fix si_upload_smc_data
Timur Kristóf
timur.kristof at gmail.com
Mon Aug 4 13:41:53 UTC 2025
Backport of the fix to the same amdgpu issue.
The si_upload_smc_data function uses si_write_smc_soft_register
to set some register values in the SMC, and expects the result
to be PPSMC_Result_OK which is 1.
The PPSMC_Result_OK / PPSMC_Result_Failed values are used for
checking the result of a command sent to the SMC.
However, the si_write_smc_soft_register actually doesn't send
any commands to the SMC and returns zero on success,
so this check was incorrect.
Fix that by correctly interpreting zero as success.
This seems to fix an SMC hang that happens in si_set_sw_state.
Fixes: a9e61410921b ("drm/radeon/kms: add dpm support for SI (v7)")
Signed-off-by: Timur Kristóf <timur.kristof at gmail.com>
---
drivers/gpu/drm/radeon/si_dpm.c | 31 +++++++++++++++++++------------
1 file changed, 19 insertions(+), 12 deletions(-)
diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c
index 47fba85436a7..8bda1e655468 100644
--- a/drivers/gpu/drm/radeon/si_dpm.c
+++ b/drivers/gpu/drm/radeon/si_dpm.c
@@ -5257,6 +5257,7 @@ static int si_upload_smc_data(struct radeon_device *rdev)
{
struct radeon_crtc *radeon_crtc = NULL;
int i;
+ int ret;
if (rdev->pm.dpm.new_active_crtc_count == 0)
return 0;
@@ -5274,20 +5275,26 @@ static int si_upload_smc_data(struct radeon_device *rdev)
if (radeon_crtc->line_time <= 0)
return 0;
- if (si_write_smc_soft_register(rdev,
- SI_SMC_SOFT_REGISTER_crtc_index,
- radeon_crtc->crtc_id) != PPSMC_Result_OK)
- return 0;
+ ret = si_write_smc_soft_register(
+ rdev,
+ SI_SMC_SOFT_REGISTER_crtc_index,
+ radeon_crtc->crtc_id);
+ if (ret)
+ return ret;
- if (si_write_smc_soft_register(rdev,
- SI_SMC_SOFT_REGISTER_mclk_change_block_cp_min,
- radeon_crtc->wm_high / radeon_crtc->line_time) != PPSMC_Result_OK)
- return 0;
+ ret = si_write_smc_soft_register(
+ rdev,
+ SI_SMC_SOFT_REGISTER_mclk_change_block_cp_min,
+ radeon_crtc->wm_high / radeon_crtc->line_time);
+ if (ret)
+ return ret;
- if (si_write_smc_soft_register(rdev,
- SI_SMC_SOFT_REGISTER_mclk_change_block_cp_max,
- radeon_crtc->wm_low / radeon_crtc->line_time) != PPSMC_Result_OK)
- return 0;
+ ret = si_write_smc_soft_register(
+ rdev,
+ SI_SMC_SOFT_REGISTER_mclk_change_block_cp_max,
+ radeon_crtc->wm_low / radeon_crtc->line_time);
+ if (ret)
+ return ret;
return 0;
}
--
2.50.1
More information about the amd-gfx
mailing list