drm/amd: Introduce AMDGPU_PP_SENSOR_GPU_INPUT_POWER
Some GPUs have been overloading average power values and input power values. To disambiguate these, introduce a new `AMDGPU_PP_SENSOR_GPU_INPUT_POWER` and the GPUs that share input power update to use this instead of average power. Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2746 Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
e94e787e37
commit
47f1724db4
@ -133,6 +133,7 @@ enum amd_pp_sensors {
|
||||
AMDGPU_PP_SENSOR_VCE_POWER,
|
||||
AMDGPU_PP_SENSOR_UVD_POWER,
|
||||
AMDGPU_PP_SENSOR_GPU_POWER,
|
||||
AMDGPU_PP_SENSOR_GPU_INPUT_POWER,
|
||||
AMDGPU_PP_SENSOR_SS_APU_SHARE,
|
||||
AMDGPU_PP_SENSOR_SS_DGPU_SHARE,
|
||||
AMDGPU_PP_SENSOR_STABLE_PSTATE_SCLK,
|
||||
|
@ -2809,7 +2809,7 @@ static ssize_t amdgpu_hwmon_show_power_input(struct device *dev,
|
||||
{
|
||||
unsigned int val;
|
||||
|
||||
val = amdgpu_hwmon_get_power(dev, AMDGPU_PP_SENSOR_GPU_POWER);
|
||||
val = amdgpu_hwmon_get_power(dev, AMDGPU_PP_SENSOR_GPU_INPUT_POWER);
|
||||
if (val < 0)
|
||||
return val;
|
||||
|
||||
|
@ -4039,7 +4039,7 @@ static int smu7_read_sensor(struct pp_hwmgr *hwmgr, int idx,
|
||||
*((uint32_t *)value) = data->vce_power_gated ? 0 : 1;
|
||||
*size = 4;
|
||||
return 0;
|
||||
case AMDGPU_PP_SENSOR_GPU_POWER:
|
||||
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
|
||||
return smu7_get_gpu_power(hwmgr, (uint32_t *)value);
|
||||
case AMDGPU_PP_SENSOR_VDDGFX:
|
||||
if ((data->vr_config & VRCONF_VDDGFX_MASK) ==
|
||||
|
@ -3966,7 +3966,7 @@ static int vega10_read_sensor(struct pp_hwmgr *hwmgr, int idx,
|
||||
*((uint32_t *)value) = data->vce_power_gated ? 0 : 1;
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GPU_POWER:
|
||||
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
|
||||
ret = vega10_get_gpu_power(hwmgr, (uint32_t *)value);
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_VDDGFX:
|
||||
|
@ -1529,7 +1529,7 @@ static int vega12_read_sensor(struct pp_hwmgr *hwmgr, int idx,
|
||||
*((uint32_t *)value) = data->vce_power_gated ? 0 : 1;
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GPU_POWER:
|
||||
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
|
||||
ret = vega12_get_gpu_power(hwmgr, (uint32_t *)value);
|
||||
if (!ret)
|
||||
*size = 4;
|
||||
|
@ -2253,7 +2253,7 @@ static int vega20_read_sensor(struct pp_hwmgr *hwmgr, int idx,
|
||||
*((uint32_t *)value) = data->vce_power_gated ? 0 : 1;
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GPU_POWER:
|
||||
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
|
||||
*size = 16;
|
||||
ret = vega20_get_gpu_power(hwmgr, (uint32_t *)value);
|
||||
break;
|
||||
|
@ -1398,6 +1398,7 @@ typedef enum {
|
||||
METRICS_PCIE_RATE,
|
||||
METRICS_PCIE_WIDTH,
|
||||
METRICS_CURR_FANPWM,
|
||||
METRICS_CURR_SOCKETPOWER,
|
||||
} MetricsMember_t;
|
||||
|
||||
enum smu_cmn2asic_mapping_type {
|
||||
|
@ -1169,6 +1169,7 @@ static int arcturus_read_sensor(struct smu_context *smu,
|
||||
ret = smu_v11_0_get_gfx_vdd(smu, (uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
|
||||
default:
|
||||
ret = -EOPNOTSUPP;
|
||||
break;
|
||||
|
@ -154,10 +154,14 @@ cyan_skillfish_get_smu_metrics_data(struct smu_context *smu,
|
||||
case METRICS_CURR_UCLK:
|
||||
*value = metrics->Current.MemclkFrequency;
|
||||
break;
|
||||
case METRICS_AVERAGE_SOCKETPOWER:
|
||||
case METRICS_CURR_SOCKETPOWER:
|
||||
*value = (metrics->Current.CurrentSocketPower << 8) /
|
||||
1000;
|
||||
break;
|
||||
case METRICS_AVERAGE_SOCKETPOWER:
|
||||
*value = (metrics->Average.CurrentSocketPower << 8) /
|
||||
1000;
|
||||
break;
|
||||
case METRICS_TEMPERATURE_EDGE:
|
||||
*value = metrics->Current.GfxTemperature / 100 *
|
||||
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
|
||||
@ -214,6 +218,12 @@ static int cyan_skillfish_read_sensor(struct smu_context *smu,
|
||||
(uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
|
||||
ret = cyan_skillfish_get_smu_metrics_data(smu,
|
||||
METRICS_CURR_SOCKETPOWER,
|
||||
(uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_HOTSPOT_TEMP:
|
||||
ret = cyan_skillfish_get_smu_metrics_data(smu,
|
||||
METRICS_TEMPERATURE_HOTSPOT,
|
||||
|
@ -2240,6 +2240,7 @@ static int navi10_read_sensor(struct smu_context *smu,
|
||||
ret = smu_v11_0_get_gfx_vdd(smu, (uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
|
||||
default:
|
||||
ret = -EOPNOTSUPP;
|
||||
break;
|
||||
|
@ -1962,6 +1962,7 @@ static int sienna_cichlid_read_sensor(struct smu_context *smu,
|
||||
ret = -EOPNOTSUPP;
|
||||
}
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
|
||||
default:
|
||||
ret = -EOPNOTSUPP;
|
||||
break;
|
||||
|
@ -390,6 +390,10 @@ static int vangogh_get_smu_metrics_data(struct smu_context *smu,
|
||||
*value = metrics->Current.UvdActivity;
|
||||
break;
|
||||
case METRICS_AVERAGE_SOCKETPOWER:
|
||||
*value = (metrics->Average.CurrentSocketPower << 8) /
|
||||
1000;
|
||||
break;
|
||||
case METRICS_CURR_SOCKETPOWER:
|
||||
*value = (metrics->Current.CurrentSocketPower << 8) /
|
||||
1000;
|
||||
break;
|
||||
@ -1542,6 +1546,12 @@ static int vangogh_read_sensor(struct smu_context *smu,
|
||||
(uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
|
||||
ret = vangogh_common_get_smu_metrics_data(smu,
|
||||
METRICS_CURR_SOCKETPOWER,
|
||||
(uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_EDGE_TEMP:
|
||||
ret = vangogh_common_get_smu_metrics_data(smu,
|
||||
METRICS_TEMPERATURE_EDGE,
|
||||
|
@ -1197,7 +1197,7 @@ static int renoir_get_smu_metrics_data(struct smu_context *smu,
|
||||
case METRICS_AVERAGE_VCNACTIVITY:
|
||||
*value = metrics->AverageUvdActivity / 100;
|
||||
break;
|
||||
case METRICS_AVERAGE_SOCKETPOWER:
|
||||
case METRICS_CURR_SOCKETPOWER:
|
||||
if (((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(12, 0, 1)) && (adev->pm.fw_version >= 0x40000f)) ||
|
||||
((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(12, 0, 0)) && (adev->pm.fw_version >= 0x373200)))
|
||||
*value = metrics->CurrentSocketPower << 8;
|
||||
@ -1297,9 +1297,9 @@ static int renoir_read_sensor(struct smu_context *smu,
|
||||
(uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GPU_POWER:
|
||||
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
|
||||
ret = renoir_get_smu_metrics_data(smu,
|
||||
METRICS_AVERAGE_SOCKETPOWER,
|
||||
METRICS_CURR_SOCKETPOWER,
|
||||
(uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
|
@ -1183,6 +1183,7 @@ static int aldebaran_read_sensor(struct smu_context *smu,
|
||||
ret = smu_v13_0_get_gfx_vdd(smu, (uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
|
||||
default:
|
||||
ret = -EOPNOTSUPP;
|
||||
break;
|
||||
|
@ -997,6 +997,7 @@ static int smu_v13_0_0_read_sensor(struct smu_context *smu,
|
||||
(uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
|
||||
default:
|
||||
ret = -EOPNOTSUPP;
|
||||
break;
|
||||
|
@ -321,6 +321,9 @@ static int smu_v13_0_4_get_smu_metrics_data(struct smu_context *smu,
|
||||
*value = metrics->UvdActivity;
|
||||
break;
|
||||
case METRICS_AVERAGE_SOCKETPOWER:
|
||||
*value = (metrics->AverageSocketPower << 8) / 1000;
|
||||
break;
|
||||
case METRICS_CURR_SOCKETPOWER:
|
||||
*value = (metrics->CurrentSocketPower << 8) / 1000;
|
||||
break;
|
||||
case METRICS_TEMPERATURE_EDGE:
|
||||
@ -575,6 +578,12 @@ static int smu_v13_0_4_read_sensor(struct smu_context *smu,
|
||||
(uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
|
||||
ret = smu_v13_0_4_get_smu_metrics_data(smu,
|
||||
METRICS_CURR_SOCKETPOWER,
|
||||
(uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_EDGE_TEMP:
|
||||
ret = smu_v13_0_4_get_smu_metrics_data(smu,
|
||||
METRICS_TEMPERATURE_EDGE,
|
||||
|
@ -288,7 +288,7 @@ static int smu_v13_0_5_get_smu_metrics_data(struct smu_context *smu,
|
||||
case METRICS_AVERAGE_VCNACTIVITY:
|
||||
*value = metrics->UvdActivity;
|
||||
break;
|
||||
case METRICS_AVERAGE_SOCKETPOWER:
|
||||
case METRICS_CURR_SOCKETPOWER:
|
||||
*value = (metrics->CurrentSocketPower << 8) / 1000;
|
||||
break;
|
||||
case METRICS_TEMPERATURE_EDGE:
|
||||
@ -332,9 +332,9 @@ static int smu_v13_0_5_read_sensor(struct smu_context *smu,
|
||||
(uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GPU_POWER:
|
||||
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
|
||||
ret = smu_v13_0_5_get_smu_metrics_data(smu,
|
||||
METRICS_AVERAGE_SOCKETPOWER,
|
||||
METRICS_CURR_SOCKETPOWER,
|
||||
(uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
|
@ -714,7 +714,7 @@ static int smu_v13_0_6_get_smu_metrics_data(struct smu_context *smu,
|
||||
case METRICS_AVERAGE_MEMACTIVITY:
|
||||
*value = SMUQ10_TO_UINT(metrics->DramBandwidthUtilization);
|
||||
break;
|
||||
case METRICS_AVERAGE_SOCKETPOWER:
|
||||
case METRICS_CURR_SOCKETPOWER:
|
||||
*value = SMUQ10_TO_UINT(metrics->SocketPower) << 8;
|
||||
break;
|
||||
case METRICS_TEMPERATURE_HOTSPOT:
|
||||
@ -1139,15 +1139,6 @@ static int smu_v13_0_6_get_current_activity_percent(struct smu_context *smu,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int smu_v13_0_6_get_gpu_power(struct smu_context *smu, uint32_t *value)
|
||||
{
|
||||
if (!value)
|
||||
return -EINVAL;
|
||||
|
||||
return smu_v13_0_6_get_smu_metrics_data(smu, METRICS_AVERAGE_SOCKETPOWER,
|
||||
value);
|
||||
}
|
||||
|
||||
static int smu_v13_0_6_thermal_get_temperature(struct smu_context *smu,
|
||||
enum amd_pp_sensors sensor,
|
||||
uint32_t *value)
|
||||
@ -1193,8 +1184,10 @@ static int smu_v13_0_6_read_sensor(struct smu_context *smu,
|
||||
(uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GPU_POWER:
|
||||
ret = smu_v13_0_6_get_gpu_power(smu, (uint32_t *)data);
|
||||
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
|
||||
ret = smu_v13_0_6_get_smu_metrics_data(smu,
|
||||
METRICS_CURR_SOCKETPOWER,
|
||||
(uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_HOTSPOT_TEMP:
|
||||
|
@ -978,6 +978,7 @@ static int smu_v13_0_7_read_sensor(struct smu_context *smu,
|
||||
(uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
|
||||
default:
|
||||
ret = -EOPNOTSUPP;
|
||||
break;
|
||||
|
@ -365,7 +365,7 @@ static int yellow_carp_get_smu_metrics_data(struct smu_context *smu,
|
||||
case METRICS_AVERAGE_VCNACTIVITY:
|
||||
*value = metrics->UvdActivity;
|
||||
break;
|
||||
case METRICS_AVERAGE_SOCKETPOWER:
|
||||
case METRICS_CURR_SOCKETPOWER:
|
||||
*value = (metrics->CurrentSocketPower << 8) / 1000;
|
||||
break;
|
||||
case METRICS_TEMPERATURE_EDGE:
|
||||
@ -423,9 +423,9 @@ static int yellow_carp_read_sensor(struct smu_context *smu,
|
||||
(uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
case AMDGPU_PP_SENSOR_GPU_POWER:
|
||||
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
|
||||
ret = yellow_carp_get_smu_metrics_data(smu,
|
||||
METRICS_AVERAGE_SOCKETPOWER,
|
||||
METRICS_CURR_SOCKETPOWER,
|
||||
(uint32_t *)data);
|
||||
*size = 4;
|
||||
break;
|
||||
|
Loading…
x
Reference in New Issue
Block a user