The Q10 socket power was rounded to whole watts before scaling to
milliwatts, so the reported value lost its sub-watt precision. Add
SMUQ10_TO_MILLIWATT to convert while keeping the fractional bits.

Signed-off-by: Lijo Lazar <[email protected]>
---
 drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h          | 3 +++
 drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c | 3 +--
 drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c  | 3 +--
 drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_8_ppt.c  | 6 ++++--
 4 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h 
b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h
index 5e7d80e8b26b..238dcc468557 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/inc/smu_v13_0.h
@@ -55,6 +55,9 @@
 #define SMUQ10_TO_UINT(x) ((x) >> 10)
 #define SMUQ10_FRAC(x) ((x) & 0x3ff)
 #define SMUQ10_ROUND(x) ((SMUQ10_TO_UINT(x)) + ((SMUQ10_FRAC(x)) >= 0x200))
+/* Convert Q10 watts to milliwatts, preserving the fractional part */
+#define SMUQ10_TO_MILLIWATT(x) (SMUQ10_TO_UINT(x) * MILLIWATT_PER_WATT + \
+                               ((SMUQ10_FRAC(x) * MILLIWATT_PER_WATT) >> 10))
 #define SMU_V13_SOFT_FREQ_ROUND(x)     ((x) + 1)
 
 extern const int pmfw_decoded_link_speed[5];
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
index 8c719fff754a..f0f789c4ff22 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
@@ -434,8 +434,7 @@ 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) *
-                        MILLIWATT_PER_WATT;
+               *value = SMUQ10_TO_MILLIWATT(metrics->SocketPower);
                break;
        case METRICS_TEMPERATURE_HOTSPOT:
                *value = SMUQ10_ROUND(metrics->MaxSocketTemperature) *
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
index 39f5ed5da58f..fe0443a07b4c 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
@@ -1303,8 +1303,7 @@ 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)) *
-                        MILLIWATT_PER_WATT;
+               *value = SMUQ10_TO_MILLIWATT(GET_METRIC_FIELD(SocketPower, 
version));
                break;
        case METRICS_TEMPERATURE_HOTSPOT:
                *value = SMUQ10_ROUND(GET_METRIC_FIELD(MaxSocketTemperature, 
version)) *
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_8_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_8_ppt.c
index 01b91c9e3c28..92897843be24 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_8_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_8_ppt.c
@@ -55,6 +55,9 @@
 #define SMUQ10_TO_UINT(x) ((x) >> 10)
 #define SMUQ10_FRAC(x) ((x) & 0x3ff)
 #define SMUQ10_ROUND(x) ((SMUQ10_TO_UINT(x)) + ((SMUQ10_FRAC(x)) >= 0x200))
+/* Convert Q10 watts to milliwatts, preserving the fractional part */
+#define SMUQ10_TO_MILLIWATT(x) (SMUQ10_TO_UINT(x) * MILLIWATT_PER_WATT + \
+                               ((SMUQ10_FRAC(x) * MILLIWATT_PER_WATT) >> 10))
 
 #define hbm_stack_mask_valid(umc_mask) \
        (((umc_mask) & 0xF) == 0xF)
@@ -413,8 +416,7 @@ 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) *
-                        MILLIWATT_PER_WATT;
+               *value = SMUQ10_TO_MILLIWATT(metrics->SocketPower);
                break;
        case METRICS_TEMPERATURE_HOTSPOT:
                *value = SMUQ10_ROUND(metrics->MaxSocketTemperature) *
-- 
2.49.0

Reply via email to