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