| From 79e25cd06e85105c75701ef1773c6c64bb304091 Mon Sep 17 00:00:00 2001 |
| From: Alex Deucher <alexander.deucher@amd.com> |
| Date: Fri, 8 Aug 2025 13:12:07 -0400 |
| Subject: drm/amdgpu/swm14: Update power limit logic |
| |
| From: Alex Deucher <alexander.deucher@amd.com> |
| |
| commit 79e25cd06e85105c75701ef1773c6c64bb304091 upstream. |
| |
| 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 |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c | 30 +++++++++++++++---- |
| 1 file changed, 25 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c |
| +++ b/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c |
| @@ -1668,9 +1668,11 @@ static int smu_v14_0_2_get_power_limit(s |
| 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)) |
| @@ -1683,11 +1685,29 @@ static int smu_v14_0_2_get_power_limit(s |
| 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; |
| + } |
| + } |
| |
| - if (min_power_limit) |
| - *min_power_limit = 0; |
| + 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 = power_limit * (100 + od_percent_lower); |
| + *min_power_limit /= 100; |
| + } |
| |
| return 0; |
| } |