Commit 47f1724d authored by Mario Limonciello's avatar Mario Limonciello Committed by Alex Deucher

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/2746Signed-off-by: default avatarMario Limonciello <mario.limonciello@amd.com>
Reviewed-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent e94e787e
...@@ -133,6 +133,7 @@ enum amd_pp_sensors { ...@@ -133,6 +133,7 @@ enum amd_pp_sensors {
AMDGPU_PP_SENSOR_VCE_POWER, AMDGPU_PP_SENSOR_VCE_POWER,
AMDGPU_PP_SENSOR_UVD_POWER, AMDGPU_PP_SENSOR_UVD_POWER,
AMDGPU_PP_SENSOR_GPU_POWER, AMDGPU_PP_SENSOR_GPU_POWER,
AMDGPU_PP_SENSOR_GPU_INPUT_POWER,
AMDGPU_PP_SENSOR_SS_APU_SHARE, AMDGPU_PP_SENSOR_SS_APU_SHARE,
AMDGPU_PP_SENSOR_SS_DGPU_SHARE, AMDGPU_PP_SENSOR_SS_DGPU_SHARE,
AMDGPU_PP_SENSOR_STABLE_PSTATE_SCLK, AMDGPU_PP_SENSOR_STABLE_PSTATE_SCLK,
......
...@@ -2809,7 +2809,7 @@ static ssize_t amdgpu_hwmon_show_power_input(struct device *dev, ...@@ -2809,7 +2809,7 @@ static ssize_t amdgpu_hwmon_show_power_input(struct device *dev,
{ {
unsigned int val; 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) if (val < 0)
return val; return val;
......
...@@ -4039,7 +4039,7 @@ static int smu7_read_sensor(struct pp_hwmgr *hwmgr, int idx, ...@@ -4039,7 +4039,7 @@ static int smu7_read_sensor(struct pp_hwmgr *hwmgr, int idx,
*((uint32_t *)value) = data->vce_power_gated ? 0 : 1; *((uint32_t *)value) = data->vce_power_gated ? 0 : 1;
*size = 4; *size = 4;
return 0; return 0;
case AMDGPU_PP_SENSOR_GPU_POWER: case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
return smu7_get_gpu_power(hwmgr, (uint32_t *)value); return smu7_get_gpu_power(hwmgr, (uint32_t *)value);
case AMDGPU_PP_SENSOR_VDDGFX: case AMDGPU_PP_SENSOR_VDDGFX:
if ((data->vr_config & VRCONF_VDDGFX_MASK) == if ((data->vr_config & VRCONF_VDDGFX_MASK) ==
......
...@@ -3966,7 +3966,7 @@ static int vega10_read_sensor(struct pp_hwmgr *hwmgr, int idx, ...@@ -3966,7 +3966,7 @@ static int vega10_read_sensor(struct pp_hwmgr *hwmgr, int idx,
*((uint32_t *)value) = data->vce_power_gated ? 0 : 1; *((uint32_t *)value) = data->vce_power_gated ? 0 : 1;
*size = 4; *size = 4;
break; break;
case AMDGPU_PP_SENSOR_GPU_POWER: case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
ret = vega10_get_gpu_power(hwmgr, (uint32_t *)value); ret = vega10_get_gpu_power(hwmgr, (uint32_t *)value);
break; break;
case AMDGPU_PP_SENSOR_VDDGFX: case AMDGPU_PP_SENSOR_VDDGFX:
......
...@@ -1529,7 +1529,7 @@ static int vega12_read_sensor(struct pp_hwmgr *hwmgr, int idx, ...@@ -1529,7 +1529,7 @@ static int vega12_read_sensor(struct pp_hwmgr *hwmgr, int idx,
*((uint32_t *)value) = data->vce_power_gated ? 0 : 1; *((uint32_t *)value) = data->vce_power_gated ? 0 : 1;
*size = 4; *size = 4;
break; break;
case AMDGPU_PP_SENSOR_GPU_POWER: case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
ret = vega12_get_gpu_power(hwmgr, (uint32_t *)value); ret = vega12_get_gpu_power(hwmgr, (uint32_t *)value);
if (!ret) if (!ret)
*size = 4; *size = 4;
......
...@@ -2253,7 +2253,7 @@ static int vega20_read_sensor(struct pp_hwmgr *hwmgr, int idx, ...@@ -2253,7 +2253,7 @@ static int vega20_read_sensor(struct pp_hwmgr *hwmgr, int idx,
*((uint32_t *)value) = data->vce_power_gated ? 0 : 1; *((uint32_t *)value) = data->vce_power_gated ? 0 : 1;
*size = 4; *size = 4;
break; break;
case AMDGPU_PP_SENSOR_GPU_POWER: case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
*size = 16; *size = 16;
ret = vega20_get_gpu_power(hwmgr, (uint32_t *)value); ret = vega20_get_gpu_power(hwmgr, (uint32_t *)value);
break; break;
......
...@@ -1398,6 +1398,7 @@ typedef enum { ...@@ -1398,6 +1398,7 @@ typedef enum {
METRICS_PCIE_RATE, METRICS_PCIE_RATE,
METRICS_PCIE_WIDTH, METRICS_PCIE_WIDTH,
METRICS_CURR_FANPWM, METRICS_CURR_FANPWM,
METRICS_CURR_SOCKETPOWER,
} MetricsMember_t; } MetricsMember_t;
enum smu_cmn2asic_mapping_type { enum smu_cmn2asic_mapping_type {
......
...@@ -1169,6 +1169,7 @@ static int arcturus_read_sensor(struct smu_context *smu, ...@@ -1169,6 +1169,7 @@ static int arcturus_read_sensor(struct smu_context *smu,
ret = smu_v11_0_get_gfx_vdd(smu, (uint32_t *)data); ret = smu_v11_0_get_gfx_vdd(smu, (uint32_t *)data);
*size = 4; *size = 4;
break; break;
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
default: default:
ret = -EOPNOTSUPP; ret = -EOPNOTSUPP;
break; break;
......
...@@ -154,10 +154,14 @@ cyan_skillfish_get_smu_metrics_data(struct smu_context *smu, ...@@ -154,10 +154,14 @@ cyan_skillfish_get_smu_metrics_data(struct smu_context *smu,
case METRICS_CURR_UCLK: case METRICS_CURR_UCLK:
*value = metrics->Current.MemclkFrequency; *value = metrics->Current.MemclkFrequency;
break; break;
case METRICS_AVERAGE_SOCKETPOWER: case METRICS_CURR_SOCKETPOWER:
*value = (metrics->Current.CurrentSocketPower << 8) / *value = (metrics->Current.CurrentSocketPower << 8) /
1000; 1000;
break; break;
case METRICS_AVERAGE_SOCKETPOWER:
*value = (metrics->Average.CurrentSocketPower << 8) /
1000;
break;
case METRICS_TEMPERATURE_EDGE: case METRICS_TEMPERATURE_EDGE:
*value = metrics->Current.GfxTemperature / 100 * *value = metrics->Current.GfxTemperature / 100 *
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES; SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
...@@ -214,6 +218,12 @@ static int cyan_skillfish_read_sensor(struct smu_context *smu, ...@@ -214,6 +218,12 @@ static int cyan_skillfish_read_sensor(struct smu_context *smu,
(uint32_t *)data); (uint32_t *)data);
*size = 4; *size = 4;
break; 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: case AMDGPU_PP_SENSOR_HOTSPOT_TEMP:
ret = cyan_skillfish_get_smu_metrics_data(smu, ret = cyan_skillfish_get_smu_metrics_data(smu,
METRICS_TEMPERATURE_HOTSPOT, METRICS_TEMPERATURE_HOTSPOT,
......
...@@ -2240,6 +2240,7 @@ static int navi10_read_sensor(struct smu_context *smu, ...@@ -2240,6 +2240,7 @@ static int navi10_read_sensor(struct smu_context *smu,
ret = smu_v11_0_get_gfx_vdd(smu, (uint32_t *)data); ret = smu_v11_0_get_gfx_vdd(smu, (uint32_t *)data);
*size = 4; *size = 4;
break; break;
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
default: default:
ret = -EOPNOTSUPP; ret = -EOPNOTSUPP;
break; break;
......
...@@ -1962,6 +1962,7 @@ static int sienna_cichlid_read_sensor(struct smu_context *smu, ...@@ -1962,6 +1962,7 @@ static int sienna_cichlid_read_sensor(struct smu_context *smu,
ret = -EOPNOTSUPP; ret = -EOPNOTSUPP;
} }
break; break;
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
default: default:
ret = -EOPNOTSUPP; ret = -EOPNOTSUPP;
break; break;
......
...@@ -390,6 +390,10 @@ static int vangogh_get_smu_metrics_data(struct smu_context *smu, ...@@ -390,6 +390,10 @@ static int vangogh_get_smu_metrics_data(struct smu_context *smu,
*value = metrics->Current.UvdActivity; *value = metrics->Current.UvdActivity;
break; break;
case METRICS_AVERAGE_SOCKETPOWER: case METRICS_AVERAGE_SOCKETPOWER:
*value = (metrics->Average.CurrentSocketPower << 8) /
1000;
break;
case METRICS_CURR_SOCKETPOWER:
*value = (metrics->Current.CurrentSocketPower << 8) / *value = (metrics->Current.CurrentSocketPower << 8) /
1000; 1000;
break; break;
...@@ -1542,6 +1546,12 @@ static int vangogh_read_sensor(struct smu_context *smu, ...@@ -1542,6 +1546,12 @@ static int vangogh_read_sensor(struct smu_context *smu,
(uint32_t *)data); (uint32_t *)data);
*size = 4; *size = 4;
break; 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: case AMDGPU_PP_SENSOR_EDGE_TEMP:
ret = vangogh_common_get_smu_metrics_data(smu, ret = vangogh_common_get_smu_metrics_data(smu,
METRICS_TEMPERATURE_EDGE, METRICS_TEMPERATURE_EDGE,
......
...@@ -1197,7 +1197,7 @@ static int renoir_get_smu_metrics_data(struct smu_context *smu, ...@@ -1197,7 +1197,7 @@ static int renoir_get_smu_metrics_data(struct smu_context *smu,
case METRICS_AVERAGE_VCNACTIVITY: case METRICS_AVERAGE_VCNACTIVITY:
*value = metrics->AverageUvdActivity / 100; *value = metrics->AverageUvdActivity / 100;
break; 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)) || 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))) ((adev->ip_versions[MP1_HWIP][0] == IP_VERSION(12, 0, 0)) && (adev->pm.fw_version >= 0x373200)))
*value = metrics->CurrentSocketPower << 8; *value = metrics->CurrentSocketPower << 8;
...@@ -1297,9 +1297,9 @@ static int renoir_read_sensor(struct smu_context *smu, ...@@ -1297,9 +1297,9 @@ static int renoir_read_sensor(struct smu_context *smu,
(uint32_t *)data); (uint32_t *)data);
*size = 4; *size = 4;
break; break;
case AMDGPU_PP_SENSOR_GPU_POWER: case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
ret = renoir_get_smu_metrics_data(smu, ret = renoir_get_smu_metrics_data(smu,
METRICS_AVERAGE_SOCKETPOWER, METRICS_CURR_SOCKETPOWER,
(uint32_t *)data); (uint32_t *)data);
*size = 4; *size = 4;
break; break;
......
...@@ -1183,6 +1183,7 @@ static int aldebaran_read_sensor(struct smu_context *smu, ...@@ -1183,6 +1183,7 @@ static int aldebaran_read_sensor(struct smu_context *smu,
ret = smu_v13_0_get_gfx_vdd(smu, (uint32_t *)data); ret = smu_v13_0_get_gfx_vdd(smu, (uint32_t *)data);
*size = 4; *size = 4;
break; break;
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
default: default:
ret = -EOPNOTSUPP; ret = -EOPNOTSUPP;
break; break;
......
...@@ -997,6 +997,7 @@ static int smu_v13_0_0_read_sensor(struct smu_context *smu, ...@@ -997,6 +997,7 @@ static int smu_v13_0_0_read_sensor(struct smu_context *smu,
(uint32_t *)data); (uint32_t *)data);
*size = 4; *size = 4;
break; break;
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
default: default:
ret = -EOPNOTSUPP; ret = -EOPNOTSUPP;
break; break;
......
...@@ -321,6 +321,9 @@ static int smu_v13_0_4_get_smu_metrics_data(struct smu_context *smu, ...@@ -321,6 +321,9 @@ static int smu_v13_0_4_get_smu_metrics_data(struct smu_context *smu,
*value = metrics->UvdActivity; *value = metrics->UvdActivity;
break; break;
case METRICS_AVERAGE_SOCKETPOWER: case METRICS_AVERAGE_SOCKETPOWER:
*value = (metrics->AverageSocketPower << 8) / 1000;
break;
case METRICS_CURR_SOCKETPOWER:
*value = (metrics->CurrentSocketPower << 8) / 1000; *value = (metrics->CurrentSocketPower << 8) / 1000;
break; break;
case METRICS_TEMPERATURE_EDGE: case METRICS_TEMPERATURE_EDGE:
...@@ -575,6 +578,12 @@ static int smu_v13_0_4_read_sensor(struct smu_context *smu, ...@@ -575,6 +578,12 @@ static int smu_v13_0_4_read_sensor(struct smu_context *smu,
(uint32_t *)data); (uint32_t *)data);
*size = 4; *size = 4;
break; 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: case AMDGPU_PP_SENSOR_EDGE_TEMP:
ret = smu_v13_0_4_get_smu_metrics_data(smu, ret = smu_v13_0_4_get_smu_metrics_data(smu,
METRICS_TEMPERATURE_EDGE, METRICS_TEMPERATURE_EDGE,
......
...@@ -288,7 +288,7 @@ static int smu_v13_0_5_get_smu_metrics_data(struct smu_context *smu, ...@@ -288,7 +288,7 @@ static int smu_v13_0_5_get_smu_metrics_data(struct smu_context *smu,
case METRICS_AVERAGE_VCNACTIVITY: case METRICS_AVERAGE_VCNACTIVITY:
*value = metrics->UvdActivity; *value = metrics->UvdActivity;
break; break;
case METRICS_AVERAGE_SOCKETPOWER: case METRICS_CURR_SOCKETPOWER:
*value = (metrics->CurrentSocketPower << 8) / 1000; *value = (metrics->CurrentSocketPower << 8) / 1000;
break; break;
case METRICS_TEMPERATURE_EDGE: case METRICS_TEMPERATURE_EDGE:
...@@ -332,9 +332,9 @@ static int smu_v13_0_5_read_sensor(struct smu_context *smu, ...@@ -332,9 +332,9 @@ static int smu_v13_0_5_read_sensor(struct smu_context *smu,
(uint32_t *)data); (uint32_t *)data);
*size = 4; *size = 4;
break; break;
case AMDGPU_PP_SENSOR_GPU_POWER: case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
ret = smu_v13_0_5_get_smu_metrics_data(smu, ret = smu_v13_0_5_get_smu_metrics_data(smu,
METRICS_AVERAGE_SOCKETPOWER, METRICS_CURR_SOCKETPOWER,
(uint32_t *)data); (uint32_t *)data);
*size = 4; *size = 4;
break; break;
......
...@@ -714,7 +714,7 @@ static int smu_v13_0_6_get_smu_metrics_data(struct smu_context *smu, ...@@ -714,7 +714,7 @@ static int smu_v13_0_6_get_smu_metrics_data(struct smu_context *smu,
case METRICS_AVERAGE_MEMACTIVITY: case METRICS_AVERAGE_MEMACTIVITY:
*value = SMUQ10_TO_UINT(metrics->DramBandwidthUtilization); *value = SMUQ10_TO_UINT(metrics->DramBandwidthUtilization);
break; break;
case METRICS_AVERAGE_SOCKETPOWER: case METRICS_CURR_SOCKETPOWER:
*value = SMUQ10_TO_UINT(metrics->SocketPower) << 8; *value = SMUQ10_TO_UINT(metrics->SocketPower) << 8;
break; break;
case METRICS_TEMPERATURE_HOTSPOT: case METRICS_TEMPERATURE_HOTSPOT:
...@@ -1139,15 +1139,6 @@ static int smu_v13_0_6_get_current_activity_percent(struct smu_context *smu, ...@@ -1139,15 +1139,6 @@ static int smu_v13_0_6_get_current_activity_percent(struct smu_context *smu,
return ret; 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, static int smu_v13_0_6_thermal_get_temperature(struct smu_context *smu,
enum amd_pp_sensors sensor, enum amd_pp_sensors sensor,
uint32_t *value) uint32_t *value)
...@@ -1193,8 +1184,10 @@ static int smu_v13_0_6_read_sensor(struct smu_context *smu, ...@@ -1193,8 +1184,10 @@ static int smu_v13_0_6_read_sensor(struct smu_context *smu,
(uint32_t *)data); (uint32_t *)data);
*size = 4; *size = 4;
break; break;
case AMDGPU_PP_SENSOR_GPU_POWER: case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
ret = smu_v13_0_6_get_gpu_power(smu, (uint32_t *)data); ret = smu_v13_0_6_get_smu_metrics_data(smu,
METRICS_CURR_SOCKETPOWER,
(uint32_t *)data);
*size = 4; *size = 4;
break; break;
case AMDGPU_PP_SENSOR_HOTSPOT_TEMP: case AMDGPU_PP_SENSOR_HOTSPOT_TEMP:
......
...@@ -978,6 +978,7 @@ static int smu_v13_0_7_read_sensor(struct smu_context *smu, ...@@ -978,6 +978,7 @@ static int smu_v13_0_7_read_sensor(struct smu_context *smu,
(uint32_t *)data); (uint32_t *)data);
*size = 4; *size = 4;
break; break;
case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
default: default:
ret = -EOPNOTSUPP; ret = -EOPNOTSUPP;
break; break;
......
...@@ -365,7 +365,7 @@ static int yellow_carp_get_smu_metrics_data(struct smu_context *smu, ...@@ -365,7 +365,7 @@ static int yellow_carp_get_smu_metrics_data(struct smu_context *smu,
case METRICS_AVERAGE_VCNACTIVITY: case METRICS_AVERAGE_VCNACTIVITY:
*value = metrics->UvdActivity; *value = metrics->UvdActivity;
break; break;
case METRICS_AVERAGE_SOCKETPOWER: case METRICS_CURR_SOCKETPOWER:
*value = (metrics->CurrentSocketPower << 8) / 1000; *value = (metrics->CurrentSocketPower << 8) / 1000;
break; break;
case METRICS_TEMPERATURE_EDGE: case METRICS_TEMPERATURE_EDGE:
...@@ -423,9 +423,9 @@ static int yellow_carp_read_sensor(struct smu_context *smu, ...@@ -423,9 +423,9 @@ static int yellow_carp_read_sensor(struct smu_context *smu,
(uint32_t *)data); (uint32_t *)data);
*size = 4; *size = 4;
break; break;
case AMDGPU_PP_SENSOR_GPU_POWER: case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
ret = yellow_carp_get_smu_metrics_data(smu, ret = yellow_carp_get_smu_metrics_data(smu,
METRICS_AVERAGE_SOCKETPOWER, METRICS_CURR_SOCKETPOWER,
(uint32_t *)data); (uint32_t *)data);
*size = 4; *size = 4;
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment