drm/amd/pm: update smartshift powerboost calc for smu12
smartshift apu and dgpu power boost are reported as percentage with respect to their power limits. This value[0-100] reflects the boost for the respective device. Signed-off-by: Sathishkumar S <sathishkumar.sundararaju@amd.com> Reviewed-by: Lijo Lazar <lijo.lazar@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
Родитель
7226f40af6
Коммит
138292f1dc
|
@ -1119,6 +1119,39 @@ static int renoir_get_power_profile_mode(struct smu_context *smu,
|
|||
return size;
|
||||
}
|
||||
|
||||
static void renoir_get_ss_power_percent(SmuMetrics_t *metrics,
|
||||
uint32_t *apu_percent, uint32_t *dgpu_percent)
|
||||
{
|
||||
uint32_t apu_boost = 0;
|
||||
uint32_t dgpu_boost = 0;
|
||||
uint16_t apu_limit = 0;
|
||||
uint16_t dgpu_limit = 0;
|
||||
uint16_t apu_power = 0;
|
||||
uint16_t dgpu_power = 0;
|
||||
|
||||
apu_power = metrics->ApuPower;
|
||||
apu_limit = metrics->StapmOriginalLimit;
|
||||
if (apu_power > apu_limit && apu_limit != 0)
|
||||
apu_boost = ((apu_power - apu_limit) * 100) / apu_limit;
|
||||
apu_boost = (apu_boost > 100) ? 100 : apu_boost;
|
||||
|
||||
dgpu_power = metrics->dGpuPower;
|
||||
if (metrics->StapmCurrentLimit > metrics->StapmOriginalLimit)
|
||||
dgpu_limit = metrics->StapmCurrentLimit - metrics->StapmOriginalLimit;
|
||||
if (dgpu_power > dgpu_limit && dgpu_limit != 0)
|
||||
dgpu_boost = ((dgpu_power - dgpu_limit) * 100) / dgpu_limit;
|
||||
dgpu_boost = (dgpu_boost > 100) ? 100 : dgpu_boost;
|
||||
|
||||
if (dgpu_boost >= apu_boost)
|
||||
apu_boost = 0;
|
||||
else
|
||||
dgpu_boost = 0;
|
||||
|
||||
*apu_percent = apu_boost;
|
||||
*dgpu_percent = dgpu_boost;
|
||||
}
|
||||
|
||||
|
||||
static int renoir_get_smu_metrics_data(struct smu_context *smu,
|
||||
MetricsMember_t member,
|
||||
uint32_t *value)
|
||||
|
@ -1127,6 +1160,9 @@ static int renoir_get_smu_metrics_data(struct smu_context *smu,
|
|||
|
||||
SmuMetrics_t *metrics = (SmuMetrics_t *)smu_table->metrics_table;
|
||||
int ret = 0;
|
||||
uint32_t apu_percent = 0;
|
||||
uint32_t dgpu_percent = 0;
|
||||
|
||||
|
||||
ret = smu_cmn_get_metrics_table(smu,
|
||||
NULL,
|
||||
|
@ -1171,26 +1207,18 @@ static int renoir_get_smu_metrics_data(struct smu_context *smu,
|
|||
*value = metrics->Voltage[1];
|
||||
break;
|
||||
case METRICS_SS_APU_SHARE:
|
||||
/* return the percentage of APU power with respect to APU's power limit.
|
||||
* percentage is reported, this isn't boost value. Smartshift power
|
||||
* boost/shift is only when the percentage is more than 100.
|
||||
/* return the percentage of APU power boost
|
||||
* with respect to APU's power limit.
|
||||
*/
|
||||
if (metrics->StapmOriginalLimit > 0)
|
||||
*value = (metrics->ApuPower * 100) / metrics->StapmOriginalLimit;
|
||||
else
|
||||
*value = 0;
|
||||
renoir_get_ss_power_percent(metrics, &apu_percent, &dgpu_percent);
|
||||
*value = apu_percent;
|
||||
break;
|
||||
case METRICS_SS_DGPU_SHARE:
|
||||
/* return the percentage of dGPU power with respect to dGPU's power limit.
|
||||
* percentage is reported, this isn't boost value. Smartshift power
|
||||
* boost/shift is only when the percentage is more than 100.
|
||||
/* return the percentage of dGPU power boost
|
||||
* with respect to dGPU's power limit.
|
||||
*/
|
||||
if ((metrics->dGpuPower > 0) &&
|
||||
(metrics->StapmCurrentLimit > metrics->StapmOriginalLimit))
|
||||
*value = (metrics->dGpuPower * 100) /
|
||||
(metrics->StapmCurrentLimit - metrics->StapmOriginalLimit);
|
||||
else
|
||||
*value = 0;
|
||||
renoir_get_ss_power_percent(metrics, &apu_percent, &dgpu_percent);
|
||||
*value = dgpu_percent;
|
||||
break;
|
||||
default:
|
||||
*value = UINT_MAX;
|
||||
|
|
Загрузка…
Ссылка в новой задаче