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