]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/pm: Use gpu metrics 1.9 for SMUv13.0.12
authorLijo Lazar <lijo.lazar@amd.com>
Thu, 14 Aug 2025 11:05:39 +0000 (16:35 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 4 Nov 2025 16:53:21 +0000 (11:53 -0500)
Fill and publish GPU metrics in v1.9 format for SMUv13.0.12 SOCs

Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Asad Kamal <asad.kamal@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.h

index a0c844bf852cc16c403b087cb992b971c8bff1cd..f4bf0b558d868acc37a1865ad889342a150a5577 100644 (file)
@@ -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),
@@ -772,22 +772,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 */
@@ -877,57 +872,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 = {
index 6d39b02a325717c3e69650779c6d66b6529140ea..5561167121714d0f7bc9b900b3a5591c96c161b7 100644 (file)
@@ -549,7 +549,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;
@@ -580,12 +579,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;
@@ -608,7 +601,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);
 
@@ -2792,16 +2784,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 */
@@ -2974,6 +2970,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);
index 3f57e2a33fb4a4397e40f6a016d21f4c6714facc..86d82044a255d3670aa4fb72f6e53fbfce1b5e22 100644 (file)
@@ -94,7 +94,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);
@@ -216,6 +215,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 */