]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amd/pm: use milliwatts for GPU power sensors
authorYang Wang <kevinyang.wang@amd.com>
Mon, 27 Jul 2026 04:23:17 +0000 (12:23 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 29 Jul 2026 00:01:06 +0000 (20:01 -0400)
GPU average and input power backends report a mix of whole watts,
milliwatts, Q24.8 watts and decimal-packed fractions. Q24.8 is inherited
from the legacy PowerPlay sensor format. Milliwatts are a more natural unit
for the hwmon and pm_info consumers in amdgpu_pm.c. A common decoder cannot
distinguish these formats, and converting native milliwatts through Q24.8
also loses precision.

Use milliwatts as the internal unit across all PPT and PowerPlay backends.
Decode Q24.8 only at the legacy smu7 input boundary and encode it only for
the raw amdgpu_sensors debugfs interface. This gives hwmon, pm_info and the
sensor ioctl one unambiguous unit while preserving the format used by UMR.

Fixes: 5b79d0482f3c ("drm/amd/pp: Remove struct pp_gpu_power")
Fixes: 01992b121fb6 ("drm/amd/pm: fix amdgpu_pm_info power display units")
Signed-off-by: Yang Wang <kevinyang.wang@amd.com>
Reviewed-by: Kenneth Feng <kenneth.feng@amd.com>
Reported-by: Lars Nieradzik <l.nieradzik@gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit 757ba0790bafec47a507e9662bf380f2e027d420)
Cc: stable@vger.kernel.org
27 files changed:
drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
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/powerplay/inc/hwmgr.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_12_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
drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_0_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_0_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_8_ppt.c

index 662ec01961f47fe3cc445cca22071df5bf23f65f..df25886428174f976393d3598b1b0dd77ad7e55e 100644 (file)
 
 #if defined(CONFIG_DEBUG_FS)
 
+/* Encode milliwatts in the raw Q24.8 sensor report format used by UMR. */
+#define AMDGPU_DEBUGFS_PWR_MW_TO_Q24_8(power_mw) \
+       DIV_ROUND_CLOSEST_ULL((u64)(power_mw) * BIT(8), \
+                             MILLIWATT_PER_WATT)
+
 /**
  * amdgpu_debugfs_process_reg_op - Handle MMIO register reads/writes
  *
@@ -1104,6 +1109,10 @@ static ssize_t amdgpu_debugfs_sensor_read(struct file *f, char __user *buf,
                return r;
        }
 
+       if (idx == AMDGPU_PP_SENSOR_GPU_AVG_POWER ||
+           idx == AMDGPU_PP_SENSOR_GPU_INPUT_POWER)
+               values[0] = AMDGPU_DEBUGFS_PWR_MW_TO_Q24_8(values[0]);
+
        if (size > valuesize) {
                amdgpu_virt_disable_access_debugfs(adev);
                return -EINVAL;
index 71272f40feef8376fd4e4b3e61879d71629f6732..8bb9c198ddec13bf0fcb91e3fd523da519aa3712 100644 (file)
@@ -1210,7 +1210,7 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
                                        return -EINVAL;
                                }
                        }
-                       ui32 >>= 8;
+                       ui32 /= MILLIWATT_PER_WATT;
                        break;
                case AMDGPU_INFO_SENSOR_GPU_INPUT_POWER:
                        /* get input GPU power */
@@ -1219,7 +1219,7 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
                                                   (void *)&ui32, &ui32_size)) {
                                return -EINVAL;
                        }
-                       ui32 >>= 8;
+                       ui32 /= MILLIWATT_PER_WATT;
                        break;
                case AMDGPU_INFO_SENSOR_VDDNB:
                        /* get VDDNB in millivolts */
index 6371f292f2d80a35f3087f3152ebf400f2404c7d..606d48115301994442ab80f29b6c48955af38bd9 100644 (file)
@@ -24,6 +24,8 @@
 #ifndef __KGD_PP_INTERFACE_H__
 #define __KGD_PP_INTERFACE_H__
 
+#include <linux/units.h>
+
 extern const struct amdgpu_ip_block_version pp_smu_ip_block;
 extern const struct amdgpu_ip_block_version smu_v11_0_ip_block;
 extern const struct amdgpu_ip_block_version smu_v12_0_ip_block;
@@ -150,8 +152,8 @@ enum amd_pp_sensors {
        AMDGPU_PP_SENSOR_MEM_TEMP,
        AMDGPU_PP_SENSOR_VCE_POWER,
        AMDGPU_PP_SENSOR_UVD_POWER,
-       AMDGPU_PP_SENSOR_GPU_AVG_POWER,
-       AMDGPU_PP_SENSOR_GPU_INPUT_POWER,
+       AMDGPU_PP_SENSOR_GPU_AVG_POWER, /* milliwatts */
+       AMDGPU_PP_SENSOR_GPU_INPUT_POWER, /* milliwatts */
        AMDGPU_PP_SENSOR_SS_APU_SHARE,
        AMDGPU_PP_SENSOR_SS_DGPU_SHARE,
        AMDGPU_PP_SENSOR_STABLE_PSTATE_SCLK,
index 763947fbf16f65239a70efe7d0f31d2fb72a5226..85b089a3dc4141db994abadf9f58ecb1323fd18b 100644 (file)
@@ -41,8 +41,6 @@
 
 #define DEVICE_ATTR_IS(_name)          (attr_id == device_attr_id__##_name)
 
-#define power_2_mwatt(power)   (((power) >> 8) * 1000 + ((power) & 0xff))
-
 struct od_attribute {
        struct kobj_attribute   attribute;
        struct list_head        entry;
@@ -3351,7 +3349,7 @@ static int amdgpu_hwmon_get_power(struct device *dev,
                return r;
 
        /* convert to microwatts */
-       return power_2_mwatt(query) * 1000;
+       return query * 1000;
 }
 
 static ssize_t amdgpu_hwmon_show_power_avg(struct device *dev,
@@ -4919,7 +4917,7 @@ static int amdgpu_debugfs_pm_info_pp(struct seq_file *m, struct amdgpu_device *a
                seq_printf(m, "\t%u mV (VDDNB)\n", value);
        size = sizeof(uint32_t);
        if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GPU_AVG_POWER, (void *)&query, &size)) {
-               mwatt = power_2_mwatt(query);
+               mwatt = query;
                centiwatt = DIV_ROUND_CLOSEST(mwatt, 10);
                if (adev->flags & AMD_IS_APU)
                        seq_printf(m, "\t%u.%02u W (average SoC including CPU)\n", centiwatt / 100, centiwatt % 100);
@@ -4928,7 +4926,7 @@ static int amdgpu_debugfs_pm_info_pp(struct seq_file *m, struct amdgpu_device *a
        }
        size = sizeof(uint32_t);
        if (!amdgpu_dpm_read_sensor(adev, AMDGPU_PP_SENSOR_GPU_INPUT_POWER, (void *)&query, &size)) {
-               mwatt = power_2_mwatt(query);
+               mwatt = query;
                centiwatt = DIV_ROUND_CLOSEST(mwatt, 10);
                if (adev->flags & AMD_IS_APU)
                        seq_printf(m, "\t%u.%02u W (current SoC including CPU)\n", centiwatt / 100, centiwatt % 100);
index bc82ba2e4c9bae9a0f299f4c08d36766c98657c8..f8a5648095d17a78aef3466f23b636d198671eaf 100644 (file)
@@ -4062,7 +4062,7 @@ static int smu7_get_gpu_power(struct pp_hwmgr *hwmgr, u32 *query)
            (adev->asic_type != CHIP_FIJI) &&
            (adev->asic_type != CHIP_TONGA)) {
                smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_GetCurrPkgPwr, 0, &tmp);
-               *query = tmp;
+               *query = PP_PWR_Q24_8_TO_MW(tmp);
 
                if (tmp != 0)
                        return 0;
@@ -4081,7 +4081,7 @@ static int smu7_get_gpu_power(struct pp_hwmgr *hwmgr, u32 *query)
                if (tmp != 0)
                        break;
        }
-       *query = tmp;
+       *query = PP_PWR_Q24_8_TO_MW(tmp);
 
        return 0;
 }
index 4b92b52aba2b8298f26f638596dbcfbf221f4e7c..c283309efe87f54beac47e3ee8543b71b84c5dc1 100644 (file)
@@ -3934,8 +3934,8 @@ static int vega10_get_gpu_power(struct pp_hwmgr *hwmgr,
        if (ret)
                return ret;
 
-       /* SMC returning actual watts, keep consistent with legacy asics, low 8 bit as 8 fractional bits */
-       *query = value << 8;
+       /* SMC returns whole Watts, while power sensors use milliwatts. */
+       *query = value * MILLIWATT_PER_WATT;
 
        return 0;
 }
index 69a9074058ceba97a25c79e023048a3c86f67f1f..b466b08e4a67f6410daa015425cafdeb57f04fb4 100644 (file)
@@ -1419,7 +1419,7 @@ static int vega12_get_gpu_power(struct pp_hwmgr *hwmgr, uint32_t *query)
        if (ret)
                return ret;
 
-       *query = metrics_table.CurrSocketPower << 8;
+       *query = metrics_table.CurrSocketPower * MILLIWATT_PER_WATT;
 
        return ret;
 }
index 7b8f4c1b80eb0fb5e084e547e2a7236bd42566c1..e9c194056e32592e1488f390c9c819e741070d7c 100644 (file)
@@ -2154,12 +2154,13 @@ static int vega20_get_gpu_power(struct pp_hwmgr *hwmgr, int idx,
        switch (idx) {
        case AMDGPU_PP_SENSOR_GPU_AVG_POWER:
                if (hwmgr->smu_version == 0x282e00)
-                       *query = metrics_table.AverageSocketPower << 8;
+                       *query = metrics_table.AverageSocketPower *
+                                MILLIWATT_PER_WATT;
                else
                        ret = -EOPNOTSUPP;
                break;
        case AMDGPU_PP_SENSOR_GPU_INPUT_POWER:
-               *query = metrics_table.CurrSocketPower << 8;
+               *query = metrics_table.CurrSocketPower * MILLIWATT_PER_WATT;
                break;
        }
 
index ca71efaa1656149a60236b0bf49a0c88f1259604..368200f7cf16778aecb53e1d9c91cc3c44ef12f9 100644 (file)
@@ -35,6 +35,11 @@ struct pp_hwmgr;
 struct phm_fan_speed_info;
 struct pp_atomctrl_voltage_table;
 
+/* Decode legacy unsigned Q24.8 watts to internal milliwatts. */
+#define PP_PWR_Q24_8_TO_MW(power) \
+       DIV_ROUND_CLOSEST_ULL((u64)(power) * MILLIWATT_PER_WATT, \
+                             BIT(8))
+
 #define VOLTAGE_SCALE 4
 #define VOLTAGE_VID_OFFSET_SCALE1   625
 #define VOLTAGE_VID_OFFSET_SCALE2   100
index 54d3dba7d3549604a1379ac6899e136f02dfce72..cfad8cd74773ca9e3155d3cfd91b8b1c72f613c3 100644 (file)
@@ -658,7 +658,7 @@ static int arcturus_get_smu_metrics_data(struct smu_context *smu,
                *value = metrics->VcnActivityPercentage;
                break;
        case METRICS_AVERAGE_SOCKETPOWER:
-               *value = metrics->AverageSocketPower << 8;
+               *value = metrics->AverageSocketPower * MILLIWATT_PER_WATT;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = metrics->TemperatureEdge *
index e6e009df98407dcf9b50d3aab843f3b8a9918807..bb9620666dae69d652c88f3cf3d9e8cbf13c57d5 100644 (file)
@@ -158,12 +158,10 @@ cyan_skillfish_get_smu_metrics_data(struct smu_context *smu,
                *value = metrics->Current.MemclkFrequency;
                break;
        case METRICS_CURR_SOCKETPOWER:
-               *value = (metrics->Current.CurrentSocketPower << 8) /
-                               1000;
+               *value = metrics->Current.CurrentSocketPower;
                break;
        case METRICS_AVERAGE_SOCKETPOWER:
-               *value = (metrics->Average.CurrentSocketPower << 8) /
-                               1000;
+               *value = metrics->Average.CurrentSocketPower;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = metrics->Current.GfxTemperature / 100 *
index cd0457e13f54c40cf6e7d31518d9b8da0b623e7e..6dfc3b585c6b4b0786b7f7565f944a0dadf17f59 100644 (file)
@@ -602,7 +602,7 @@ static int navi10_get_legacy_smu_metrics_data(struct smu_context *smu,
                *value = metrics->AverageUclkActivity;
                break;
        case METRICS_AVERAGE_SOCKETPOWER:
-               *value = metrics->AverageSocketPower << 8;
+               *value = metrics->AverageSocketPower * MILLIWATT_PER_WATT;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = metrics->TemperatureEdge *
@@ -691,7 +691,7 @@ static int navi10_get_smu_metrics_data(struct smu_context *smu,
                *value = metrics->AverageUclkActivity;
                break;
        case METRICS_AVERAGE_SOCKETPOWER:
-               *value = metrics->AverageSocketPower << 8;
+               *value = metrics->AverageSocketPower * MILLIWATT_PER_WATT;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = metrics->TemperatureEdge *
@@ -777,7 +777,7 @@ static int navi12_get_legacy_smu_metrics_data(struct smu_context *smu,
                *value = metrics->AverageUclkActivity;
                break;
        case METRICS_AVERAGE_SOCKETPOWER:
-               *value = metrics->AverageSocketPower << 8;
+               *value = metrics->AverageSocketPower * MILLIWATT_PER_WATT;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = metrics->TemperatureEdge *
@@ -866,7 +866,7 @@ static int navi12_get_smu_metrics_data(struct smu_context *smu,
                *value = metrics->AverageUclkActivity;
                break;
        case METRICS_AVERAGE_SOCKETPOWER:
-               *value = metrics->AverageSocketPower << 8;
+               *value = metrics->AverageSocketPower * MILLIWATT_PER_WATT;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = metrics->TemperatureEdge *
index f799e489b4817dba3b4a9d0ea47f5229b70a9c04..dccca6ddd5ad724d9bc180a6d56c06b0b4567c7b 100644 (file)
@@ -855,9 +855,10 @@ static int sienna_cichlid_get_smu_metrics_data(struct smu_context *smu,
                        metrics->AverageUclkActivity;
                break;
        case METRICS_AVERAGE_SOCKETPOWER:
-               *value = use_metrics_v3 ? metrics_v3->AverageSocketPower << 8 :
-                       use_metrics_v2 ? metrics_v2->AverageSocketPower << 8 :
-                       metrics->AverageSocketPower << 8;
+               *value = use_metrics_v3 ? metrics_v3->AverageSocketPower :
+                       use_metrics_v2 ? metrics_v2->AverageSocketPower :
+                       metrics->AverageSocketPower;
+               *value *= MILLIWATT_PER_WATT;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = (use_metrics_v3 ? metrics_v3->TemperatureEdge :
index c54675b00a96869be667306dfd00c67d5207fe40..3e3c68448ba9d319befd2a7b571511eb6b5c56a2 100644 (file)
@@ -318,8 +318,7 @@ static int vangogh_get_legacy_smu_metrics_data(struct smu_context *smu,
                *value = metrics->UvdActivity / 100;
                break;
        case METRICS_AVERAGE_SOCKETPOWER:
-               *value = (metrics->CurrentSocketPower << 8) /
-               1000 ;
+               *value = metrics->CurrentSocketPower;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = metrics->GfxTemperature / 100 *
@@ -387,12 +386,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;
+               *value = metrics->Average.CurrentSocketPower;
                break;
        case METRICS_CURR_SOCKETPOWER:
-               *value = (metrics->Current.CurrentSocketPower << 8) /
-               1000;
+               *value = metrics->Current.CurrentSocketPower;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = metrics->Current.GfxTemperature / 100 *
index 75335da224c7a117911068f4412180e5c1d32f4c..175c44190caa0e0cef6a5fc40dc7a0f0ec828400 100644 (file)
@@ -1215,9 +1215,10 @@ static int renoir_get_smu_metrics_data(struct smu_context *smu,
                    ((amdgpu_ip_version(adev, MP1_HWIP, 0) ==
                      IP_VERSION(12, 0, 0)) &&
                     (adev->pm.fw_version >= 0x373200)))
-                       *value = metrics->CurrentSocketPower << 8;
+                       *value = metrics->CurrentSocketPower *
+                                MILLIWATT_PER_WATT;
                else
-                       *value = (metrics->CurrentSocketPower << 8) / 1000;
+                       *value = metrics->CurrentSocketPower;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = (metrics->GfxTemperature / 100) *
index 9d8b1227388fad9d60d89c8f423219a4e51cd608..18c0b43b93b95036d4fb015cfbd6ca0199145449 100644 (file)
@@ -677,7 +677,8 @@ static int aldebaran_get_smu_metrics_data(struct smu_context *smu,
        case METRICS_AVERAGE_SOCKETPOWER:
                /* Valid power data is available only from primary die */
                if (aldebaran_is_primary(smu))
-                       *value = metrics->AverageSocketPower << 8;
+                       *value = metrics->AverageSocketPower *
+                                MILLIWATT_PER_WATT;
                else
                        ret = -EOPNOTSUPP;
                break;
index acbd7046d8a50b494c29917714a3f46122871a15..0be34fbdac266d1eb538ab75b0ed2105fec86d4b 100644 (file)
@@ -807,7 +807,7 @@ static int smu_v13_0_0_get_smu_metrics_data(struct smu_context *smu,
                             metrics->Vcn1ActivityPercentage);
                break;
        case METRICS_AVERAGE_SOCKETPOWER:
-               *value = metrics->AverageSocketPower << 8;
+               *value = metrics->AverageSocketPower * MILLIWATT_PER_WATT;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = metrics->AvgTemperature[TEMP_EDGE] *
index fe929bd89058ad2fcecb655b51163f59db2811e0..8d476a60d62fd5208eff7a5e0a611db3f187e1ba 100644 (file)
@@ -434,7 +434,8 @@ int smu_v13_0_12_get_smu_metrics_data(struct smu_context *smu,
                *value = SMUQ10_ROUND(metrics->DramBandwidthUtilization);
                break;
        case METRICS_CURR_SOCKETPOWER:
-               *value = SMUQ10_ROUND(metrics->SocketPower) << 8;
+               *value = SMUQ10_ROUND(metrics->SocketPower) *
+                        MILLIWATT_PER_WATT;
                break;
        case METRICS_TEMPERATURE_HOTSPOT:
                *value = SMUQ10_ROUND(metrics->MaxSocketTemperature) *
index ba91bf590eed6a8b9c0cb3d5662e604402cc528d..a9d558f5b73975d100700291ac34a648b2985f10 100644 (file)
@@ -338,10 +338,10 @@ static int smu_v13_0_4_get_smu_metrics_data(struct smu_context *smu,
                *value = metrics->UvdActivity / 100;
                break;
        case METRICS_AVERAGE_SOCKETPOWER:
-               *value = (metrics->AverageSocketPower << 8) / 1000;
+               *value = metrics->AverageSocketPower;
                break;
        case METRICS_CURR_SOCKETPOWER:
-               *value = (metrics->CurrentSocketPower << 8) / 1000;
+               *value = metrics->CurrentSocketPower;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = metrics->GfxTemperature / 100 *
index 27372a60e83d452abaa41db55763c1f539560068..f95b15af436d27ae4f742b1a7c47b97e1cf91789 100644 (file)
@@ -295,7 +295,7 @@ static int smu_v13_0_5_get_smu_metrics_data(struct smu_context *smu,
                *value = metrics->UvdActivity / 100;
                break;
        case METRICS_CURR_SOCKETPOWER:
-               *value = (metrics->CurrentSocketPower << 8) / 1000;
+               *value = metrics->CurrentSocketPower;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = metrics->GfxTemperature / 100 *
index b123881344890fc8ee06cdfeddf655e3a64a3df9..41608574bc61c7695738a9342989c7062502bf1f 100644 (file)
@@ -1321,7 +1321,8 @@ static int smu_v13_0_6_get_smu_metrics_data(struct smu_context *smu,
                *value = SMUQ10_ROUND(GET_METRIC_FIELD(DramBandwidthUtilization, version));
                break;
        case METRICS_CURR_SOCKETPOWER:
-               *value = SMUQ10_ROUND(GET_METRIC_FIELD(SocketPower, version)) << 8;
+               *value = SMUQ10_ROUND(GET_METRIC_FIELD(SocketPower, version)) *
+                        MILLIWATT_PER_WATT;
                break;
        case METRICS_TEMPERATURE_HOTSPOT:
                *value = SMUQ10_ROUND(GET_METRIC_FIELD(MaxSocketTemperature, version)) *
index 42c9ceeb4f7db3f9d4fb4703b12af4202ec704d6..5d11ed8be4c323dfac9d831c593095d09ee7b570 100644 (file)
@@ -817,7 +817,7 @@ static int smu_v13_0_7_get_smu_metrics_data(struct smu_context *smu,
                *value = smu_safe_u16_nn(metrics->AverageUclkActivity);
                break;
        case METRICS_AVERAGE_SOCKETPOWER:
-               *value = metrics->AverageSocketPower << 8;
+               *value = metrics->AverageSocketPower * MILLIWATT_PER_WATT;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = metrics->AvgTemperature[TEMP_EDGE] *
index 7bf88ffd311b67bd00c12b9ae7e6abf85e66b633..edc3fedca9f80586dba57b487a44eaea25dffb2a 100644 (file)
@@ -372,7 +372,7 @@ static int yellow_carp_get_smu_metrics_data(struct smu_context *smu,
                *value = metrics->UvdActivity / 100;
                break;
        case METRICS_CURR_SOCKETPOWER:
-               *value = (metrics->CurrentSocketPower << 8) / 1000;
+               *value = metrics->CurrentSocketPower;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = metrics->GfxTemperature / 100 *
index 3d73f2050bbef09523984f4c23c20e5dad4bf91b..568665265a13377e4339dc533113a95345a8b676 100644 (file)
@@ -312,8 +312,7 @@ static int smu_v14_0_0_get_smu_metrics_data(struct smu_context *smu,
                break;
        case METRICS_AVERAGE_SOCKETPOWER:
        case METRICS_CURR_SOCKETPOWER:
-               *value = (metrics->SocketPower / 1000 << 8) +
-               (metrics->SocketPower % 1000 / 10);
+               *value = metrics->SocketPower;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = metrics->GfxTemperature / 100 *
index a6a88e7b266857e8b9d6c1f3eeac3504ec43b5ee..bd054cbfbae08447f77e6b832a0b21237e537d4c 100644 (file)
@@ -695,7 +695,7 @@ static int smu_v14_0_2_get_smu_metrics_data(struct smu_context *smu,
                             metrics->Vcn1ActivityPercentage);
                break;
        case METRICS_AVERAGE_SOCKETPOWER:
-               *value = metrics->AverageSocketPower << 8;
+               *value = metrics->AverageSocketPower * MILLIWATT_PER_WATT;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = metrics->AvgTemperature[TEMP_EDGE] *
index faa7d661f3bf6612e637f0dcdc7535e27ff775d6..0da1ffb3a567856d329de7611022099d4288917c 100644 (file)
@@ -378,8 +378,7 @@ static int smu_v15_0_0_get_smu_metrics_data(struct smu_context *smu,
                break;
        case METRICS_AVERAGE_SOCKETPOWER:
        case METRICS_CURR_SOCKETPOWER:
-               *value = (metrics->SocketPower / 1000 << 8) +
-               (metrics->SocketPower % 1000 / 10);
+               *value = metrics->SocketPower;
                break;
        case METRICS_TEMPERATURE_EDGE:
                *value = metrics->GfxTemperature / 100 *
index 2105a1d7bb34ba74756ed7e46c7ef34c56097ef2..118eda5429ff730f0cdb9bc59589b88c99b92b91 100644 (file)
@@ -411,7 +411,8 @@ static int smu_v15_0_8_get_smu_metrics_data(struct smu_context *smu,
                *value = SMUQ10_ROUND(metrics->DramBandwidthUtilization);
                break;
        case METRICS_CURR_SOCKETPOWER:
-               *value = SMUQ10_ROUND(metrics->SocketPower) << 8;
+               *value = SMUQ10_ROUND(metrics->SocketPower) *
+                        MILLIWATT_PER_WATT;
                break;
        case METRICS_TEMPERATURE_HOTSPOT:
                *value = SMUQ10_ROUND(metrics->MaxSocketTemperature) *