Commit d6f19a99 authored by Lijo Lazar's avatar Lijo Lazar Committed by Alex Deucher
Browse files

drm/amd/pm: Fix power limit query on aldebaran



Aldebaran doesn't have AC/DC power limits. Separate the implementation
from SMU13. Max power limit is queried from PPTable.

Signed-off-by: default avatarLijo Lazar <lijo.lazar@amd.com>
Reviewed-by: default avatarKevin Wang <kevin1.wang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 4ac5617c
Loading
Loading
Loading
Loading
+13 −15
Original line number Diff line number Diff line
@@ -1066,30 +1066,28 @@ static int aldebaran_read_sensor(struct smu_context *smu,

static int aldebaran_get_power_limit(struct smu_context *smu)
{
	struct smu_13_0_powerplay_table *powerplay_table =
		(struct smu_13_0_powerplay_table *)smu->smu_table.power_play_table;
	PPTable_t *pptable = smu->smu_table.driver_pptable;
	uint32_t power_limit, od_percent;
	uint32_t power_limit = 0;
	int ret;

	if (!smu_cmn_feature_is_enabled(smu, SMU_FEATURE_PPT_BIT))
		return -EINVAL;

	ret = smu_cmn_send_smc_msg(smu, SMU_MSG_GetPptLimit, &power_limit);

	if (smu_v13_0_get_current_power_limit(smu, &power_limit)) {
	if (!ret) {
		/* the last hope to figure out the ppt limit */
		if (!pptable) {
			dev_err(smu->adev->dev, "Cannot get PPT limit due to pptable missing!");
			return -EINVAL;
		}
	}
	smu->current_power_limit = power_limit;

	if (smu->od_enabled) {
		od_percent = le32_to_cpu(powerplay_table->overdrive_table.max[SMU_13_0_ODSETTING_POWERPERCENTAGE]);


		dev_dbg(smu->adev->dev, "ODSETTING_POWERPERCENTAGE: %d (default: %d)\n", od_percent, power_limit);

		power_limit *= (100 + od_percent);
		power_limit /= 100;
		power_limit = pptable->PptLimit;
	}
	smu->max_power_limit = power_limit;

	smu->current_power_limit = power_limit;
	if (pptable)
		smu->max_power_limit = pptable->PptLimit;

	return 0;
}