ThrottlingPercentage for TEMP_HOTSPOT on SMU v13.0.0/7 is almost always
greater then or equal to 1, so we set the threshold value.

Link: https://gitlab.freedesktop.org/drm/amd/-/issues/3251

Signed-off-by: Umio Yasuno <coelacanth_dr...@protonmail.com>
---
 .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c    | 13 ++++++++++---
 .../gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c    | 13 ++++++++++---
 2 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
index 5a9711e8c..f708f0ccd 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c
@@ -744,14 +744,21 @@ static int smu_v13_0_0_system_features_control(struct 
smu_context *smu,
        return smu_v13_0_system_features_control(smu, en);
 }
 
+#define SMU_13_0_0_TEMP_HOTSPOT_THRESHOLD      90
 static uint32_t smu_v13_0_get_throttler_status(SmuMetrics_t *metrics)
 {
        uint32_t throttler_status = 0;
        int i;
 
-       for (i = 0; i < THROTTLER_COUNT; i++)
-               throttler_status |=
-                       (metrics->ThrottlingPercentage[i] ? 1U << i : 0);
+       for (i = 0; i < THROTTLER_COUNT; i++) {
+               if(i == THROTTLER_TEMP_HOTSPOT_BIT) {
+                       throttler_status |=
+                               ((metrics->ThrottlingPercentage[i] >= 
SMU_13_0_0_TEMP_HOTSPOT_THRESHOLD) ? 1U << i : 0);
+               } else {
+                       throttler_status |=
+                               (metrics->ThrottlingPercentage[i] ? 1U << i : 
0);
+               }
+       }
 
        return throttler_status;
 }
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
index c8f4f6fb4..ff49b835b 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c
@@ -736,14 +736,21 @@ static bool smu_v13_0_7_is_dpm_running(struct smu_context 
*smu)
        return !!(feature_enabled & SMC_DPM_FEATURE);
 }
 
+#define SMU_13_0_7_TEMP_HOTSPOT_THRESHOLD      90
 static uint32_t smu_v13_0_7_get_throttler_status(SmuMetrics_t *metrics)
 {
        uint32_t throttler_status = 0;
        int i;
 
-       for (i = 0; i < THROTTLER_COUNT; i++)
-               throttler_status |=
-                       (metrics->ThrottlingPercentage[i] ? 1U << i : 0);
+       for (i = 0; i < THROTTLER_COUNT; i++) {
+               if(i == THROTTLER_TEMP_HOTSPOT_BIT) {
+                       throttler_status |=
+                               ((metrics->ThrottlingPercentage[i] >= 
SMU_13_0_7_TEMP_HOTSPOT_THRESHOLD) ? 1U << i : 0);
+               } else {
+                       throttler_status |=
+                               (metrics->ThrottlingPercentage[i] ? 1U << i : 
0);
+               }
+       }
 
        return throttler_status;
 }
-- 
2.39.5


Reply via email to