RE: [PATCH] amdgpu/pm: support gpu_metrics sysfs interface for smu v14.0.2/3

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



[AMD Official Use Only - AMD Internal Distribution Only]

Reviewed-by: Yang Wang <kevinyang.wang@xxxxxxx>

It is better to change the patch tile prefix to 'drm/amd/pm' .

Best Regards,
Kevin

-----Original Message-----
From: Kenneth Feng <kenneth.feng@xxxxxxx>
Sent: Thursday, July 4, 2024 8:17 AM
To: amd-gfx@xxxxxxxxxxxxxxxxxxxxx
Cc: Wang, Yang(Kevin) <KevinYang.Wang@xxxxxxx>; Feng, Kenneth <Kenneth.Feng@xxxxxxx>
Subject: [PATCH] amdgpu/pm: support gpu_metrics sysfs interface for smu v14.0.2/3

support gpu_metrics sysfs interface for smu v14.0.2/3

Signed-off-by: Kenneth Feng <kenneth.feng@xxxxxxx>
---
 .../drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c  | 86 ++++++++++++++++++-
 1 file changed, 84 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
index 98ea58d792ca..e1a27903c80a 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
@@ -66,6 +66,7 @@

 #define MP0_MP1_DATA_REGION_SIZE_COMBOPPTABLE  0x4000
 #define DEBUGSMC_MSG_Mode1Reset        2
+#define LINK_SPEED_MAX                                 3

 static struct cmn2asic_msg_mapping smu_v14_0_2_message_map[SMU_MSG_MAX_COUNT] = {
        MSG_MAP(TestMessage,                    PPSMC_MSG_TestMessage,                 1),
@@ -221,7 +222,6 @@ static struct cmn2asic_mapping smu_v14_0_2_workload_map[PP_SMC_POWER_PROFILE_COU
        WORKLOAD_MAP(PP_SMC_POWER_PROFILE_WINDOW3D,             WORKLOAD_PPLIB_WINDOW_3D_BIT),
 };

-#if 0
 static const uint8_t smu_v14_0_2_throttler_map[] = {
        [THROTTLER_PPT0_BIT]            = (SMU_THROTTLER_PPT0_BIT),
        [THROTTLER_PPT1_BIT]            = (SMU_THROTTLER_PPT1_BIT),
@@ -241,7 +241,6 @@ static const uint8_t smu_v14_0_2_throttler_map[] = {
        [THROTTLER_GFX_APCC_PLUS_BIT]   = (SMU_THROTTLER_APCC_BIT),
        [THROTTLER_FIT_BIT]             = (SMU_THROTTLER_FIT_BIT),
 };
-#endif

 static int
 smu_v14_0_2_get_allowed_feature_mask(struct smu_context *smu, @@ -1869,6 +1868,88 @@ static ssize_t smu_v14_0_2_get_ecc_info(struct smu_context *smu,
        return ret;
 }

+static ssize_t smu_v14_0_2_get_gpu_metrics(struct smu_context *smu,
+                                          void **table)
+{
+       struct smu_table_context *smu_table = &smu->smu_table;
+       struct gpu_metrics_v1_3 *gpu_metrics =
+               (struct gpu_metrics_v1_3 *)smu_table->gpu_metrics_table;
+       SmuMetricsExternal_t metrics_ext;
+       SmuMetrics_t *metrics = &metrics_ext.SmuMetrics;
+       int ret = 0;
+
+       ret = smu_cmn_get_metrics_table(smu,
+                                       &metrics_ext,
+                                       true);
+       if (ret)
+               return ret;
+
+       smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 3);
+
+       gpu_metrics->temperature_edge = metrics->AvgTemperature[TEMP_EDGE];
+       gpu_metrics->temperature_hotspot = metrics->AvgTemperature[TEMP_HOTSPOT];
+       gpu_metrics->temperature_mem = metrics->AvgTemperature[TEMP_MEM];
+       gpu_metrics->temperature_vrgfx = metrics->AvgTemperature[TEMP_VR_GFX];
+       gpu_metrics->temperature_vrsoc = metrics->AvgTemperature[TEMP_VR_SOC];
+       gpu_metrics->temperature_vrmem = max(metrics->AvgTemperature[TEMP_VR_MEM0],
+                                            metrics->AvgTemperature[TEMP_VR_MEM1]);
+
+       gpu_metrics->average_gfx_activity = metrics->AverageGfxActivity;
+       gpu_metrics->average_umc_activity = metrics->AverageUclkActivity;
+       gpu_metrics->average_mm_activity = max(metrics->Vcn0ActivityPercentage,
+                                              metrics->Vcn1ActivityPercentage);
+
+       gpu_metrics->average_socket_power = metrics->AverageSocketPower;
+       gpu_metrics->energy_accumulator = metrics->EnergyAccumulator;
+
+       if (metrics->AverageGfxActivity <= SMU_14_0_2_BUSY_THRESHOLD)
+               gpu_metrics->average_gfxclk_frequency = metrics->AverageGfxclkFrequencyPostDs;
+       else
+               gpu_metrics->average_gfxclk_frequency =
+metrics->AverageGfxclkFrequencyPreDs;
+
+       if (metrics->AverageUclkActivity <= SMU_14_0_2_BUSY_THRESHOLD)
+               gpu_metrics->average_uclk_frequency = metrics->AverageMemclkFrequencyPostDs;
+       else
+               gpu_metrics->average_uclk_frequency =
+metrics->AverageMemclkFrequencyPreDs;
+
+       gpu_metrics->average_vclk0_frequency = metrics->AverageVclk0Frequency;
+       gpu_metrics->average_dclk0_frequency = metrics->AverageDclk0Frequency;
+       gpu_metrics->average_vclk1_frequency = metrics->AverageVclk1Frequency;
+       gpu_metrics->average_dclk1_frequency = metrics->AverageDclk1Frequency;
+
+       gpu_metrics->current_gfxclk = gpu_metrics->average_gfxclk_frequency;
+       gpu_metrics->current_socclk = metrics->CurrClock[PPCLK_SOCCLK];
+       gpu_metrics->current_uclk = metrics->CurrClock[PPCLK_UCLK];
+       gpu_metrics->current_vclk0 = metrics->CurrClock[PPCLK_VCLK_0];
+       gpu_metrics->current_dclk0 = metrics->CurrClock[PPCLK_DCLK_0];
+       gpu_metrics->current_vclk1 = metrics->CurrClock[PPCLK_VCLK_0];
+       gpu_metrics->current_dclk1 = metrics->CurrClock[PPCLK_DCLK_0];
+
+       gpu_metrics->throttle_status =
+                       smu_v14_0_2_get_throttler_status(metrics);
+       gpu_metrics->indep_throttle_status =
+                       smu_cmn_get_indep_throttler_status(gpu_metrics->throttle_status,
+                                                          smu_v14_0_2_throttler_map);
+
+       gpu_metrics->current_fan_speed = metrics->AvgFanRpm;
+
+       gpu_metrics->pcie_link_width = metrics->PcieWidth;
+       if ((metrics->PcieRate - 1) > LINK_SPEED_MAX)
+               gpu_metrics->pcie_link_speed = pcie_gen_to_speed(1);
+       else
+               gpu_metrics->pcie_link_speed = pcie_gen_to_speed(metrics->PcieRate);
+
+       gpu_metrics->system_clock_counter = ktime_get_boottime_ns();
+
+       gpu_metrics->voltage_gfx = metrics->AvgVoltage[SVI_PLANE_VDD_GFX];
+       gpu_metrics->voltage_soc = metrics->AvgVoltage[SVI_PLANE_VDD_SOC];
+       gpu_metrics->voltage_mem = metrics->AvgVoltage[SVI_PLANE_VDDIO_MEM];
+
+       *table = (void *)gpu_metrics;
+
+       return sizeof(struct gpu_metrics_v1_3); }
+
 static const struct pptable_funcs smu_v14_0_2_ppt_funcs = {
        .get_allowed_feature_mask = smu_v14_0_2_get_allowed_feature_mask,
        .set_default_dpm_table = smu_v14_0_2_set_default_dpm_table,
@@ -1905,6 +1986,7 @@ static const struct pptable_funcs smu_v14_0_2_ppt_funcs = {
        .enable_thermal_alert = smu_v14_0_enable_thermal_alert,
        .disable_thermal_alert = smu_v14_0_disable_thermal_alert,
        .notify_memory_pool_location = smu_v14_0_notify_memory_pool_location,
+       .get_gpu_metrics = smu_v14_0_2_get_gpu_metrics,
        .set_soft_freq_limited_range = smu_v14_0_set_soft_freq_limited_range,
        .init_pptable_microcode = smu_v14_0_init_pptable_microcode,
        .populate_umd_state_clk = smu_v14_0_2_populate_umd_state_clk,
--
2.34.1





[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux