drm/amd: Introduce `AMDGPU_PP_SENSOR_GPU_INPUT_POWER`
authorMario Limonciello <mario.limonciello@amd.com>
Thu, 10 Aug 2023 10:31:56 +0000 (05:31 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 15 Aug 2023 22:08:29 +0000 (18:08 -0400)
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>
20 files changed:
drivers/gpu/drm/amd/include/kgd_pp_interface.h
drivers/gpu/drm/amd/pm/amdgpu_pm.c
drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_hwmgr.c
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_hwmgr.c
drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu11/cyan_skillfish_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_4_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_5_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/yellow_carp_ppt.c

index 90989405eddcf6ef3eea0fde4ee37e6cd9c29c64..6582cdf2736f31e783d8771a8068699c6c90eecd 100644 (file)
@@ -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,
index 816f034cfe3f1dfc65b338c6056d6f221774b6ac..bb4285159229173240dd78e7707fefd3dfd50b2c 100644 (file)
@@ -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;
 
index c91b2a3966cdb92058ebb6c5849bb75b5d66e3d4..5a2371484a58c551217a2fe4d1e4f2924e2a0756 100644 (file)
@@ -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) ==
index 52ae6fa2d2a6d0f6d7fe4bb2b484d5e5fb754b7a..6d6bc6a380b3659a56d610bb0790ff7d97b11f36 100644 (file)
@@ -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:
index 4bd573d815ff59269b644a99d99b63b8cf29a704..460067933de2efc79435b8ccf60490c7d7b0c743 100644 (file)
@@ -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;
index 492ca33637d6f6eb494ee974fa659086da1e908f..b6dd7f8daf725c76f12fd5ed8ec4daa625a4d2e1 100644 (file)
@@ -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;
index 6e2069dcb6b9d64b4d692d69d7469cd4827289f6..6b5e220affdf283061e153966a2384b8ffb0a14a 100644 (file)
@@ -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 {
index c49f770c97b38ff93798dda520ca15eb57f7adaa..e5f629a23db6b808a93b3348aeb6e85d577fed03 100644 (file)
@@ -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;
index ca4d97b7f576c14d174bc08e0fc43b6b25d5e043..4840e4d69b106db554b68bd748bf5b1fe5795c92 100644 (file)
@@ -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,
index e655071516b735e538592867257beb7a10a8588a..06474bbb73829968885743df36b293dc25f372c7 100644 (file)
@@ -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;
index f0800c0c5168c935be6fbd7af1a10282729fccc1..6dead62095bb1763dc200dcc22504f64f1660dd4 100644 (file)
@@ -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;
index 185d0b50ee8eabe8425d9a0e6e01a90cc68b204e..8a2c9c7abea6d4e21324b07607818f9688d3b7f0 100644 (file)
@@ -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,
index a7569354229deb2cfea9e44ee45a8754cafc89a7..7b5ccb935fc0154a2b6cffc0a69c38c68c76db0b 100644 (file)
@@ -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;
index 8f26123ac703147a66cdd00f8ecd19f80d34f916..4e5043b6ce40b53c049125c7f1ecf6feda8ad02a 100644 (file)
@@ -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;
index 48b03524a52d4aa75b098990f26b59805cdba3ae..203dc50c0fd588c5dc94ff970cd7d25c33bc6abe 100644 (file)
@@ -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;
index ef37dda9908fa7bee413bbe2241869e60785ff3d..a4e87984645ecfd62f15577fe5ebbd8d36c88053 100644 (file)
@@ -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,
index 87a79e6f983b5abda46efcd76be483a5a38ad94e..5f8e70d4c467e74a50810c4f7e1d124b9dc30743 100644 (file)
@@ -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;
index 362acbb242bbd149642b3cbe5aa6ddb9f650c0f3..aedf1c41d4a46dbbc30fec7aece098a83812b02d 100644 (file)
@@ -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:
index 690f89fcbbe3a44de4d7df895c30779cd8409f92..880a83e53882dfa8bd7641763d9f5b9f6be73ca9 100644 (file)
@@ -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;
index a1be2029ba4ab9e44d9a9a4e884806e2024a8fd0..14fe45d3b7b7df69b74e8d6d79228089303c75ea 100644 (file)
@@ -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;