Only reapply UCLK soft limits during PP_OD_RESTORE_DEFAULT when the
current max differs from the DPM table max. This avoids redundant
SMC updates and prevents -EINVAL on restore when no change is needed.

Fixes: b7a900344546 ("drm/amd/pm: Allow setting max UCLK on SMU v13.0.6")

Signed-off-by: Asad Kamal <[email protected]>
Reviewed-by: Lijo Lazar <[email protected]>
---
 .../drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c  | 19 +++++++++++--------
 1 file changed, 11 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
index 5b9580034641..dcc447e5044f 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
@@ -2125,6 +2125,7 @@ static int smu_v13_0_6_usr_edit_dpm_table(struct 
smu_context *smu,
 {
        struct smu_dpm_context *smu_dpm = &(smu->smu_dpm);
        struct smu_13_0_dpm_context *dpm_context = smu_dpm->dpm_context;
+       struct smu_dpm_table *uclk_table = &dpm_context->dpm_tables.uclk_table;
        struct smu_umd_pstate_table *pstate_table = &smu->pstate_table;
        uint32_t min_clk;
        uint32_t max_clk;
@@ -2224,14 +2225,16 @@ static int smu_v13_0_6_usr_edit_dpm_table(struct 
smu_context *smu,
                        if (ret)
                                return ret;
 
-                       min_clk = SMU_DPM_TABLE_MIN(
-                               &dpm_context->dpm_tables.uclk_table);
-                       max_clk = SMU_DPM_TABLE_MAX(
-                               &dpm_context->dpm_tables.uclk_table);
-                       ret = smu_v13_0_6_set_soft_freq_limited_range(
-                               smu, SMU_UCLK, min_clk, max_clk, false);
-                       if (ret)
-                               return ret;
+                       if (SMU_DPM_TABLE_MAX(uclk_table) !=
+                           pstate_table->uclk_pstate.curr.max) {
+                               min_clk = 
SMU_DPM_TABLE_MIN(&dpm_context->dpm_tables.uclk_table);
+                               max_clk = 
SMU_DPM_TABLE_MAX(&dpm_context->dpm_tables.uclk_table);
+                               ret = 
smu_v13_0_6_set_soft_freq_limited_range(smu,
+                                                                             
SMU_UCLK, min_clk,
+                                                                             
max_clk, false);
+                               if (ret)
+                                       return ret;
+                       }
                        smu_v13_0_reset_custom_level(smu);
                }
                break;
-- 
2.46.0

Reply via email to