]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
drm/amdgpu/swm14: Update power limit logic
authorAlex Deucher <alexander.deucher@amd.com>
Fri, 8 Aug 2025 17:12:07 +0000 (13:12 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 18 Aug 2025 21:41:43 +0000 (17:41 -0400)
Take into account the limits from the vbios.  Ported
from the SMU13 code.

Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4352
Reviewed-by: Jesse Zhang <Jesse.Zhang@amd.com>
Reviewed-by: Kenneth Feng <kenneth.feng@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 203cc7f1dd86f2c8de5c3c6182f19adac7c9c206)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c

index 3aea32baea3da244d0d47088f726b969cd0f2b97..f32474af90b340e5669b9b138cd14b433083a729 100644 (file)
@@ -1697,9 +1697,11 @@ static int smu_v14_0_2_get_power_limit(struct smu_context *smu,
                                       uint32_t *min_power_limit)
 {
        struct smu_table_context *table_context = &smu->smu_table;
+       struct smu_14_0_2_powerplay_table *powerplay_table =
+               table_context->power_play_table;
        PPTable_t *pptable = table_context->driver_pptable;
        CustomSkuTable_t *skutable = &pptable->CustomSkuTable;
-       uint32_t power_limit;
+       uint32_t power_limit, od_percent_upper = 0, od_percent_lower = 0;
        uint32_t msg_limit = pptable->SkuTable.MsgLimits.Power[PPT_THROTTLER_PPT0][POWER_SOURCE_AC];
 
        if (smu_v14_0_get_current_power_limit(smu, &power_limit))
@@ -1712,11 +1714,29 @@ static int smu_v14_0_2_get_power_limit(struct smu_context *smu,
        if (default_power_limit)
                *default_power_limit = power_limit;
 
-       if (max_power_limit)
-               *max_power_limit = msg_limit;
+       if (powerplay_table) {
+               if (smu->od_enabled &&
+                   smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_PPT_BIT)) {
+                       od_percent_upper = pptable->SkuTable.OverDriveLimitsBasicMax.Ppt;
+                       od_percent_lower = pptable->SkuTable.OverDriveLimitsBasicMin.Ppt;
+               } else if (smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_PPT_BIT)) {
+                       od_percent_upper = 0;
+                       od_percent_lower = pptable->SkuTable.OverDriveLimitsBasicMin.Ppt;
+               }
+       }
+
+       dev_dbg(smu->adev->dev, "od percent upper:%d, od percent lower:%d (default power: %d)\n",
+                                       od_percent_upper, od_percent_lower, power_limit);
+
+       if (max_power_limit) {
+               *max_power_limit = msg_limit * (100 + od_percent_upper);
+               *max_power_limit /= 100;
+       }
 
-       if (min_power_limit)
-               *min_power_limit = 0;
+       if (min_power_limit) {
+               *min_power_limit = power_limit * (100 + od_percent_lower);
+               *min_power_limit /= 100;
+       }
 
        return 0;
 }