Vangogh has separate limits for default PPT and fast PPT. Add infrastructure
to save both of these limits and restore both of them.

Signed-off-by: Mario Limonciello <[email protected]>
---
v2:
 * split from previous patch
---
 drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c     | 23 ++++++++++++-------
 drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h |  3 ++-
 2 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c 
b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
index c4459dc553f0..e87e729b230b 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
@@ -508,11 +508,16 @@ static void smu_restore_dpm_user_profile(struct 
smu_context *smu)
        /* Enable restore flag */
        smu->user_dpm_profile.flags |= SMU_DPM_USER_PROFILE_RESTORE;
 
-       /* set the user dpm power limit */
-       if (smu->user_dpm_profile.power_limit) {
-               ret = smu_set_power_limit(smu, 
smu->user_dpm_profile.power_limit);
+       /* set the user dpm power limits */
+       for (int limit_type = SMU_DEFAULT_PPT_LIMIT; limit_type < 
SMU_LIMIT_TYPE_COUNT; limit_type++) {
+               if (!smu->user_dpm_profile.power_limits[limit_type])
+                       continue;
+               ret = smu_set_power_limit(smu, limit_type,
+                                         
smu->user_dpm_profile.power_limits[limit_type]);
                if (ret)
-                       dev_err(smu->adev->dev, "Failed to set power limit 
value\n");
+                       dev_err(smu->adev->dev, "Failed to set %d power limit 
value\n",
+                               limit_type);
+
        }
 
        /* set the user dpm clock configurations */
@@ -2258,7 +2263,7 @@ static int smu_resume(struct amdgpu_ip_block *ip_block)
        adev->pm.dpm_enabled = true;
 
        if (smu->current_power_limit) {
-               ret = smu_set_power_limit(smu, smu->current_power_limit);
+               ret = smu_set_power_limit(smu, SMU_DEFAULT_PPT_LIMIT, 
smu->current_power_limit);
                if (ret && ret != -EOPNOTSUPP)
                        return ret;
        }
@@ -2982,11 +2987,13 @@ static int smu_set_power_limit(void *handle, uint32_t 
limit_type, uint32_t limit
 
        if (smu->ppt_funcs->set_power_limit) {
                ret = smu->ppt_funcs->set_power_limit(smu, limit_type, limit);
-               if (!ret && !(smu->user_dpm_profile.flags & 
SMU_DPM_USER_PROFILE_RESTORE))
-                       smu->user_dpm_profile.power_limit = limit;
+               if (ret)
+                       return ret;
+               if (!(smu->user_dpm_profile.flags & 
SMU_DPM_USER_PROFILE_RESTORE))
+                       smu->user_dpm_profile.power_limits[limit_type] = limit;
        }
 
-       return ret;
+       return 0;
 }
 
 static int smu_print_smuclk_levels(struct smu_context *smu, enum smu_clk_type 
clk_type, char *buf)
diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h 
b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
index 582c186d8b62..32387e8c138b 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
@@ -212,6 +212,7 @@ enum smu_power_src_type {
 enum smu_ppt_limit_type {
        SMU_DEFAULT_PPT_LIMIT = 0,
        SMU_FAST_PPT_LIMIT,
+       SMU_LIMIT_TYPE_COUNT,
 };
 
 enum smu_ppt_limit_level {
@@ -231,7 +232,7 @@ enum smu_memory_pool_size {
 
 struct smu_user_dpm_profile {
        uint32_t fan_mode;
-       uint32_t power_limit;
+       uint32_t power_limits[SMU_LIMIT_TYPE_COUNT];
        uint32_t fan_speed_pwm;
        uint32_t fan_speed_rpm;
        uint32_t flags;
-- 
2.51.0

Reply via email to