Fetch static metrics table for smu_v13_0_6

v2: Add static metrics caps check to fetch static metrics table

v3: Update version having all fixes for static metrics support

Signed-off-by: Asad Kamal <asad.ka...@amd.com>
Reviewed-by: Lijo Lazar <lijo.la...@amd.com>
---
 .../drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c  | 28 +++++++++++++++++++
 1 file changed, 28 insertions(+)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
index 177c55f457f4..06bfe2488d4e 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
@@ -177,6 +177,7 @@ static const struct cmn2asic_msg_mapping 
smu_v13_0_6_message_map[SMU_MSG_MAX_COU
        MSG_MAP(SetThrottlingPolicy,                 
PPSMC_MSG_SetThrottlingPolicy,             0),
        MSG_MAP(ResetSDMA,                           PPSMC_MSG_ResetSDMA,       
                0),
        MSG_MAP(ResetVCN,                            PPSMC_MSG_ResetVCN,        
               0),
+       MSG_MAP(GetStaticMetricsTable,               
PPSMC_MSG_GetStaticMetricsTable,           0),
 };
 
 // clang-format on
@@ -391,6 +392,8 @@ static void smu_v13_0_6_init_caps(struct smu_context *smu)
                if ((pgm == 7 && fw_ver >= 0x7550E00) ||
                    (pgm == 0 && fw_ver >= 0x00557E00))
                        smu_v13_0_6_cap_set(smu, SMU_CAP(HST_LIMIT_METRICS));
+               if (fw_ver >= 0x00557F00)
+                       smu_v13_0_6_cap_set(smu, SMU_CAP(STATIC_METRICS));
        }
        if (((pgm == 7) && (fw_ver >= 0x7550700)) ||
            ((pgm == 0) && (fw_ver >= 0x00557900)) ||
@@ -736,6 +739,26 @@ static ssize_t smu_v13_0_6_get_pm_metrics(struct 
smu_context *smu,
        return pm_metrics->common_header.structure_size;
 }
 
+static int smu_v13_0_6_get_static_metrics_table(struct smu_context *smu)
+{
+       struct smu_table_context *smu_table = &smu->smu_table;
+       uint32_t table_size = smu_table->tables[SMU_TABLE_SMU_METRICS].size;
+       struct smu_table *table = &smu_table->driver_table;
+       int ret;
+
+       ret = smu_cmn_send_smc_msg(smu, SMU_MSG_GetStaticMetricsTable, NULL);
+       if (ret) {
+               dev_info(smu->adev->dev,
+                               "Failed to export static metrics table!\n");
+               return ret;
+       }
+
+       amdgpu_asic_invalidate_hdp(smu->adev, NULL);
+       memcpy(smu_table->metrics_table, table->cpu_addr, table_size);
+
+       return 0;
+}
+
 static int smu_v13_0_6_setup_driver_pptable(struct smu_context *smu)
 {
        struct smu_table_context *smu_table = &smu->smu_table;
@@ -803,6 +826,11 @@ static int smu_v13_0_6_setup_driver_pptable(struct 
smu_context *smu)
                        GET_METRIC_FIELD(PublicSerialNumber_AID, version)[0];
 
                pptable->Init = true;
+               if (smu_v13_0_6_cap_supported(smu, SMU_CAP(STATIC_METRICS))) {
+                       ret = smu_v13_0_6_get_static_metrics_table(smu);
+                       if (ret)
+                               return ret;
+               }
        }
 
        return 0;
-- 
2.46.0

Reply via email to