Fill and publish GPU metrics in v1.9 format for SMUv13.0.12 SOCs

Signed-off-by: Lijo Lazar <lijo.la...@amd.com>
---
v2: Keep return type of smu_v13_0_12_get_gpu_metrics as void (Asad)

 .../drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c | 89 ++++++++-----------
 .../drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c  | 25 +++---
 .../drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.h  |  4 +-
 3 files changed, 51 insertions(+), 67 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
index 0bec12b348ce..09f1e4072db6 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
@@ -58,7 +58,7 @@
 
 #define NUM_JPEG_RINGS_FW      10
 #define NUM_JPEG_RINGS_GPU_METRICS(gpu_metrics) \
-       (ARRAY_SIZE(gpu_metrics->xcp_stats[0].jpeg_busy) / 4)
+       (ARRAY_SIZE(gpu_metrics->jpeg_busy) / 4)
 
 const struct cmn2asic_mapping smu_v13_0_12_feature_mask_map[SMU_FEATURE_COUNT] 
= {
        SMU_13_0_12_FEA_MAP(SMU_FEATURE_DATA_CALCULATIONS_BIT,          
FEATURE_DATA_CALCULATION),
@@ -724,22 +724,17 @@ ssize_t smu_v13_0_12_get_xcp_metrics(struct smu_context 
*smu, struct amdgpu_xcp
        return sizeof(*xcp_metrics);
 }
 
-ssize_t smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table, 
void *smu_metrics)
+void smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table,
+                                 void *smu_metrics,
+                                 struct smu_v13_0_6_gpu_metrics *gpu_metrics)
 {
-       struct smu_table_context *smu_table = &smu->smu_table;
-       struct gpu_metrics_v1_8 *gpu_metrics =
-               (struct gpu_metrics_v1_8 *)smu_table->gpu_metrics_table;
-       int ret = 0, xcc_id, inst, i, j, k, idx;
        struct amdgpu_device *adev = smu->adev;
+       int ret = 0, xcc_id, inst, i, j;
        u8 num_jpeg_rings_gpu_metrics;
        MetricsTable_t *metrics;
-       struct amdgpu_xcp *xcp;
-       u32 inst_mask;
 
        metrics = (MetricsTable_t *)smu_metrics;
 
-       smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 8);
-
        gpu_metrics->temperature_hotspot =
                SMUQ10_ROUND(metrics->MaxSocketTemperature);
        /* Individual HBM stack temperature is not reported */
@@ -829,57 +824,47 @@ ssize_t smu_v13_0_12_get_gpu_metrics(struct smu_context 
*smu, void **table, void
                        gpu_metrics->xgmi_link_status[j] = ret;
        }
 
-       gpu_metrics->num_partition = adev->xcp_mgr->num_xcps;
-
        num_jpeg_rings_gpu_metrics = NUM_JPEG_RINGS_GPU_METRICS(gpu_metrics);
-       for_each_xcp(adev->xcp_mgr, xcp, i) {
-               amdgpu_xcp_get_inst_details(xcp, AMDGPU_XCP_VCN, &inst_mask);
-               idx = 0;
-               for_each_inst(k, inst_mask) {
-                       /* Both JPEG and VCN has same instances */
-                       inst = GET_INST(VCN, k);
-
-                       for (j = 0; j < num_jpeg_rings_gpu_metrics; ++j) {
-                               gpu_metrics->xcp_stats[i].jpeg_busy
-                                       [(idx * num_jpeg_rings_gpu_metrics) + 
j] =
-                                       SMUQ10_ROUND(metrics->JpegBusy
-                                                       [(inst * 
NUM_JPEG_RINGS_FW) + j]);
-                       }
-                       gpu_metrics->xcp_stats[i].vcn_busy[idx] =
-                              SMUQ10_ROUND(metrics->VcnBusy[inst]);
-                       idx++;
+       for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
+               inst = GET_INST(VCN, i);
+
+               for (j = 0; j < num_jpeg_rings_gpu_metrics; ++j) {
+                       gpu_metrics->jpeg_busy[(i * num_jpeg_rings_gpu_metrics) 
+
+                                              j] =
+                               SMUQ10_ROUND(
+                                       metrics->JpegBusy[(inst *
+                                                          NUM_JPEG_RINGS_FW) +
+                                                         j]);
                }
+               gpu_metrics->vcn_busy[i] = SMUQ10_ROUND(metrics->VcnBusy[inst]);
+       }
 
-               amdgpu_xcp_get_inst_details(xcp, AMDGPU_XCP_GFX, &inst_mask);
-               idx = 0;
-               for_each_inst(k, inst_mask) {
-                       inst = GET_INST(GC, k);
-                       gpu_metrics->xcp_stats[i].gfx_busy_inst[idx] =
-                               SMUQ10_ROUND(metrics->GfxBusy[inst]);
-                       gpu_metrics->xcp_stats[i].gfx_busy_acc[idx] =
-                               SMUQ10_ROUND(metrics->GfxBusyAcc[inst]);
-                       if (smu_v13_0_6_cap_supported(smu, 
SMU_CAP(HST_LIMIT_METRICS))) {
-                               
gpu_metrics->xcp_stats[i].gfx_below_host_limit_ppt_acc[idx] =
-                                       
SMUQ10_ROUND(metrics->GfxclkBelowHostLimitPptAcc[inst]);
-                               
gpu_metrics->xcp_stats[i].gfx_below_host_limit_thm_acc[idx] =
-                                       
SMUQ10_ROUND(metrics->GfxclkBelowHostLimitThmAcc[inst]);
-                               
gpu_metrics->xcp_stats[i].gfx_low_utilization_acc[idx] =
-                                       
SMUQ10_ROUND(metrics->GfxclkLowUtilizationAcc[inst]);
-                               
gpu_metrics->xcp_stats[i].gfx_below_host_limit_total_acc[idx] =
-                                       
SMUQ10_ROUND(metrics->GfxclkBelowHostLimitTotalAcc[inst]);
-                       }
-                       idx++;
-               }
+       for (i = 0; i < NUM_XCC(adev->gfx.xcc_mask); ++i) {
+               inst = GET_INST(GC, i);
+               gpu_metrics->gfx_busy_inst[i] =
+                       SMUQ10_ROUND(metrics->GfxBusy[inst]);
+               gpu_metrics->gfx_busy_acc[i] =
+                       SMUQ10_ROUND(metrics->GfxBusyAcc[inst]);
+               if (smu_v13_0_6_cap_supported(smu,
+                                             SMU_CAP(HST_LIMIT_METRICS))) {
+                       gpu_metrics
+                               ->gfx_below_host_limit_ppt_acc[i] = 
SMUQ10_ROUND(
+                               metrics->GfxclkBelowHostLimitPptAcc[inst]);
+                       gpu_metrics
+                               ->gfx_below_host_limit_thm_acc[i] = 
SMUQ10_ROUND(
+                               metrics->GfxclkBelowHostLimitThmAcc[inst]);
+                       gpu_metrics->gfx_low_utilization_acc[i] = SMUQ10_ROUND(
+                               metrics->GfxclkLowUtilizationAcc[inst]);
+                       gpu_metrics->gfx_below_host_limit_total_acc
+                               [i] = SMUQ10_ROUND(
+                               metrics->GfxclkBelowHostLimitTotalAcc[inst]);
+               };
        }
 
        gpu_metrics->xgmi_link_width = metrics->XgmiWidth;
        gpu_metrics->xgmi_link_speed = metrics->XgmiBitrate;
 
        gpu_metrics->firmware_timestamp = metrics->Timestamp;
-
-       *table = (void *)gpu_metrics;
-
-       return sizeof(*gpu_metrics);
 }
 
 const struct smu_temp_funcs smu_v13_0_12_temp_funcs = {
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 654612623341..8eaa81dd7f0e 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
@@ -538,7 +538,6 @@ static int smu_v13_0_6_tables_init(struct smu_context *smu)
 {
        struct smu_table_context *smu_table = &smu->smu_table;
        struct smu_table *tables = smu_table->tables;
-       void *gpu_metrics_table __free(kfree) = NULL;
        struct smu_v13_0_6_gpu_metrics *gpu_metrics;
        void *driver_pptable __free(kfree) = NULL;
        void *metrics_table __free(kfree) = NULL;
@@ -569,12 +568,6 @@ static int smu_v13_0_6_tables_init(struct smu_context *smu)
                return -ENOMEM;
        smu_table->metrics_time = 0;
 
-       smu_table->gpu_metrics_table_size = sizeof(struct gpu_metrics_v1_8);
-       gpu_metrics_table =
-               kzalloc(smu_table->gpu_metrics_table_size, GFP_KERNEL);
-       if (!gpu_metrics_table)
-               return -ENOMEM;
-
        driver_pptable = kzalloc(sizeof(struct PPTable_t), GFP_KERNEL);
        if (!driver_pptable)
                return -ENOMEM;
@@ -597,7 +590,6 @@ static int smu_v13_0_6_tables_init(struct smu_context *smu)
                }
        }
 
-       smu_table->gpu_metrics_table = no_free_ptr(gpu_metrics_table);
        smu_table->metrics_table = no_free_ptr(metrics_table);
        smu_table->driver_pptable = no_free_ptr(driver_pptable);
 
@@ -2766,16 +2758,20 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct 
smu_context *smu, void **table
        if (ret)
                return ret;
 
-       if (amdgpu_ip_version(smu->adev, MP1_HWIP, 0) ==
-                   IP_VERSION(13, 0, 12) &&
-           smu_v13_0_6_cap_supported(smu, SMU_CAP(STATIC_METRICS)))
-               return smu_v13_0_12_get_gpu_metrics(smu, table, metrics_v0);
-
-       metrics_v1 = (MetricsTableV1_t *)metrics_v0;
        metrics_v2 = (MetricsTableV2_t *)metrics_v0;
        gpu_metrics = (struct smu_v13_0_6_gpu_metrics
                               *)(tables[SMU_TABLE_SMU_METRICS].cache.buffer);
 
+       if (amdgpu_ip_version(smu->adev, MP1_HWIP, 0) == IP_VERSION(13, 0, 12) 
&&
+           smu_v13_0_6_cap_supported(smu, SMU_CAP(STATIC_METRICS))) {
+               smu_v13_0_12_get_gpu_metrics(smu, table, metrics_v0,
+                                            gpu_metrics);
+               goto fill;
+       }
+
+       metrics_v1 = (MetricsTableV1_t *)metrics_v0;
+       metrics_v2 = (MetricsTableV2_t *)metrics_v0;
+
        gpu_metrics->temperature_hotspot =
                SMUQ10_ROUND(GET_METRIC_FIELD(MaxSocketTemperature, version));
        /* Individual HBM stack temperature is not reported */
@@ -2948,6 +2944,7 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct 
smu_context *smu, void **table
 
        gpu_metrics->firmware_timestamp = GET_METRIC_FIELD(Timestamp, version);
 
+fill:
        *table = tables[SMU_TABLE_SMU_METRICS].cache.buffer;
 
        return sizeof(*gpu_metrics);
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.h 
b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.h
index 0e336cd5e8cc..1b449ab2d89f 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.h
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.h
@@ -93,7 +93,6 @@ size_t smu_v13_0_12_get_system_metrics_size(void);
 int smu_v13_0_12_setup_driver_pptable(struct smu_context *smu);
 int smu_v13_0_12_get_smu_metrics_data(struct smu_context *smu,
                                      MetricsMember_t member, uint32_t *value);
-ssize_t smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table, 
void *smu_metrics);
 ssize_t smu_v13_0_12_get_xcp_metrics(struct smu_context *smu,
                                     struct amdgpu_xcp *xcp, void *table,
                                     void *smu_metrics);
@@ -210,6 +209,9 @@ extern const struct smu_temp_funcs smu_v13_0_12_temp_funcs;
                  SMU_13_0_6_MAX_XCC)
 
 DECLARE_SMU_METRICS_CLASS(smu_v13_0_6_gpu_metrics, SMU_13_0_6_METRICS_FIELDS);
+void smu_v13_0_12_get_gpu_metrics(struct smu_context *smu, void **table,
+                                 void *smu_metrics,
+                                 struct smu_v13_0_6_gpu_metrics *gpu_metrics);
 
 #endif /* SWSMU_CODE_LAYER_L2 */
 
-- 
2.49.0

Reply via email to