AMD General Reviewed-by: Kenneth Feng <[email protected]>
-----Original Message----- From: amd-gfx <[email protected]> On Behalf Of Kevin Wang Sent: Wednesday, September 23, 2026 4:44 PM To: [email protected] Cc: Deucher, Alexander <[email protected]>; Zhang, Hawking <[email protected]>; Feng, Kenneth <[email protected]> Subject: [PATCH] drm/amd/pm: align smu 13.0.7 activity-monitor power profile output smu 13.0.7 uses a transposed table layout for activity-monitor coefficients, unlike smu 13.0.0 / 13.0.10 which list per-profile gfxclk/fclk entries. this mismatch forces userspace to implement special case handling for smu 13.0.7. adjust output formatting to align with other smu13 variants. Format change: Before: <profile 0> <profile 1> ... <profile 7> Gfx_FPS value ... value Fclk_FPS value ... value After: PROFILE_INDEX(NAME) CLOCK_TYPE(NAME) ... 0 BOOTUP_DEFAULT*: 0(GFXCLK) ... 1(FCLK) ... Signed-off-by: Kevin Wang <[email protected]> --- .../drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c | 92 ++++++++++++------- 1 file changed, 61 insertions(+), 31 deletions(-) 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 64590965fe56..5e445ce857b1 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 @@ -2445,7 +2445,21 @@ static int smu_v13_0_7_init_ppt_limits(struct smu_context *smu) static int smu_v13_0_7_get_power_profile_mode(struct smu_context *smu, char *buf) { DpmActivityMonitorCoeffIntExternal_t *activity_monitor_external; - uint32_t i, j, size = 0; + DpmActivityMonitorCoeffInt_t *activity_monitor; + static const char * const title[] = { + "PROFILE_INDEX(NAME)", + "CLOCK_TYPE(NAME)", + "ActiveHystLimit", + "IdleHystLimit", + "FPS", + "MinActiveFreqType", + "MinActiveFreq", + "BoosterFreqType", + "BoosterFreq", + "PD_Data_limit_c", + "PD_Data_error_coeff", + "PD_Data_error_rate_coeff"}; + u32 i, size = 0; int16_t workload_type = 0; int result = 0; @@ -2457,12 +2471,9 @@ static int smu_v13_0_7_get_power_profile_mode(struct smu_context *smu, char *buf if (!activity_monitor_external) return -ENOMEM; - size += sysfs_emit_at(buf, size, " "); - for (i = 0; i <= PP_SMC_POWER_PROFILE_WINDOW3D; i++) - size += sysfs_emit_at(buf, size, "%d %-14s%s", i, amdgpu_pp_profile_name[i], - (i == smu->power_profile_mode) ? "* " : " "); - - size += sysfs_emit_at(buf, size, "\n"); + size += sysfs_emit_at(buf, size, "%16s %s %s %s %s %s %s %s %s %s %s %s\n", + title[0], title[1], title[2], title[3], title[4], title[5], + title[6], title[7], title[8], title[9], title[10], title[11]); for (i = 0; i <= PP_SMC_POWER_PROFILE_WINDOW3D; i++) { /* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ @@ -2483,32 +2494,51 @@ static int smu_v13_0_7_get_power_profile_mode(struct smu_context *smu, char *buf dev_err(smu->adev->dev, "[%s] Failed to get activity monitor!", __func__); goto out; } + + activity_monitor = + &activity_monitor_external[i].DpmActivityMonitorCoeffInt; + + size += sysfs_emit_at(buf, size, "%2d %14s%s:\n", + i, amdgpu_pp_profile_name[i], + (i == smu->power_profile_mode) ? "*" : " "); + + size += sysfs_emit_at(buf, size, + "%19s %d(%13s) %7d %7d %7d %7d %7d", + " ", + 0, + "GFXCLK", + activity_monitor->Gfx_ActiveHystLimit, + activity_monitor->Gfx_IdleHystLimit, + activity_monitor->Gfx_FPS, + activity_monitor->Gfx_MinActiveFreqType, + activity_monitor->Gfx_MinActiveFreq); + + size += sysfs_emit_at(buf, size, "%7d %7d %7d %7d %7d\n", + activity_monitor->Gfx_BoosterFreqType, + activity_monitor->Gfx_BoosterFreq, + activity_monitor->Gfx_PD_Data_limit_c, + activity_monitor->Gfx_PD_Data_error_coeff, + activity_monitor->Gfx_PD_Data_error_rate_coeff); + + size += sysfs_emit_at(buf, size, + "%19s %d(%13s) %7d %7d %7d %7d %7d", + " ", + 1, + "FCLK", + activity_monitor->Fclk_ActiveHystLimit, + activity_monitor->Fclk_IdleHystLimit, + activity_monitor->Fclk_FPS, + activity_monitor->Fclk_MinActiveFreqType, + activity_monitor->Fclk_MinActiveFreq); + + size += sysfs_emit_at(buf, size, "%7d %7d %7d %7d %7d\n", + activity_monitor->Fclk_BoosterFreqType, + activity_monitor->Fclk_BoosterFreq, + activity_monitor->Fclk_PD_Data_limit_c, + activity_monitor->Fclk_PD_Data_error_coeff, + activity_monitor->Fclk_PD_Data_error_rate_coeff); } -#define PRINT_DPM_MONITOR(field) \ -do { \ - size += sysfs_emit_at(buf, size, "%-30s", #field); \ - for (j = 0; j <= PP_SMC_POWER_PROFILE_WINDOW3D; j++) \ - size += sysfs_emit_at(buf, size, "%-18d", activity_monitor_external[j].DpmActivityMonitorCoeffInt.field); \ - size += sysfs_emit_at(buf, size, "\n"); \ -} while (0) - - PRINT_DPM_MONITOR(Gfx_ActiveHystLimit); - PRINT_DPM_MONITOR(Gfx_IdleHystLimit); - PRINT_DPM_MONITOR(Gfx_FPS); - PRINT_DPM_MONITOR(Gfx_MinActiveFreqType); - PRINT_DPM_MONITOR(Gfx_BoosterFreqType); - PRINT_DPM_MONITOR(Gfx_MinActiveFreq); - PRINT_DPM_MONITOR(Gfx_BoosterFreq); - PRINT_DPM_MONITOR(Fclk_ActiveHystLimit); - PRINT_DPM_MONITOR(Fclk_IdleHystLimit); - PRINT_DPM_MONITOR(Fclk_FPS); - PRINT_DPM_MONITOR(Fclk_MinActiveFreqType); - PRINT_DPM_MONITOR(Fclk_BoosterFreqType); - PRINT_DPM_MONITOR(Fclk_MinActiveFreq); - PRINT_DPM_MONITOR(Fclk_BoosterFreq); -#undef PRINT_DPM_MONITOR - result = size; out: kfree(activity_monitor_external); -- 2.55.0
