Commit 54f7f3ca authored by Alex Deucher's avatar Alex Deucher
Browse files

drm/amdgpu/swm14: Update power limit logic

Take into account the limits from the vbios.  Ported
from the SMU13 code.

Closes: https://gitlab.freedesktop.org/drm/amd/-/issues/4352


Reviewed-by: default avatarJesse Zhang <Jesse.Zhang@amd.com>
Reviewed-by: default avatarKenneth Feng <kenneth.feng@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 8a358aaa
Loading
Loading
Loading
Loading
+25 −5
Original line number Diff line number Diff line
@@ -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;
}