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

Reply via email to