Skip to content

Commit 80eddbd

Browse files
alexdeuchergregkh
authored andcommitted
drm/amdgpu/swm14: Update power limit logic
commit 79e25cd 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>
1 parent df64722 commit 80eddbd

File tree

1 file changed

+25
-5
lines changed

1 file changed

+25
-5
lines changed

drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1689,9 +1689,11 @@ static int smu_v14_0_2_get_power_limit(struct smu_context *smu,
16891689
uint32_t *min_power_limit)
16901690
{
16911691
struct smu_table_context *table_context = &smu->smu_table;
1692+
struct smu_14_0_2_powerplay_table *powerplay_table =
1693+
table_context->power_play_table;
16921694
PPTable_t *pptable = table_context->driver_pptable;
16931695
CustomSkuTable_t *skutable = &pptable->CustomSkuTable;
1694-
uint32_t power_limit;
1696+
uint32_t power_limit, od_percent_upper = 0, od_percent_lower = 0;
16951697
uint32_t msg_limit = pptable->SkuTable.MsgLimits.Power[PPT_THROTTLER_PPT0][POWER_SOURCE_AC];
16961698

16971699
if (smu_v14_0_get_current_power_limit(smu, &power_limit))
@@ -1704,11 +1706,29 @@ static int smu_v14_0_2_get_power_limit(struct smu_context *smu,
17041706
if (default_power_limit)
17051707
*default_power_limit = power_limit;
17061708

1707-
if (max_power_limit)
1708-
*max_power_limit = msg_limit;
1709+
if (powerplay_table) {
1710+
if (smu->od_enabled &&
1711+
smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_PPT_BIT)) {
1712+
od_percent_upper = pptable->SkuTable.OverDriveLimitsBasicMax.Ppt;
1713+
od_percent_lower = pptable->SkuTable.OverDriveLimitsBasicMin.Ppt;
1714+
} else if (smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_PPT_BIT)) {
1715+
od_percent_upper = 0;
1716+
od_percent_lower = pptable->SkuTable.OverDriveLimitsBasicMin.Ppt;
1717+
}
1718+
}
1719+
1720+
dev_dbg(smu->adev->dev, "od percent upper:%d, od percent lower:%d (default power: %d)\n",
1721+
od_percent_upper, od_percent_lower, power_limit);
1722+
1723+
if (max_power_limit) {
1724+
*max_power_limit = msg_limit * (100 + od_percent_upper);
1725+
*max_power_limit /= 100;
1726+
}
17091727

1710-
if (min_power_limit)
1711-
*min_power_limit = 0;
1728+
if (min_power_limit) {
1729+
*min_power_limit = power_limit * (100 + od_percent_lower);
1730+
*min_power_limit /= 100;
1731+
}
17121732

17131733
return 0;
17141734
}

0 commit comments

Comments
 (0)