drm/amd/pm: Use gpu metrics 1.9 for SMUv13.0.12

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>
This commit is contained in:
Lijo Lazar 2025-08-14 16:35:39 +05:30 committed by Alex Deucher
parent cd6250f3ae
commit b480f573a8
3 changed files with 50 additions and 66 deletions

View File

@ -58,7 +58,7 @@
#define NUM_JPEG_RINGS_FW 10 #define NUM_JPEG_RINGS_FW 10
#define NUM_JPEG_RINGS_GPU_METRICS(gpu_metrics) \ #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] = { 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), 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); 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; struct amdgpu_device *adev = smu->adev;
int ret = 0, xcc_id, inst, i, j;
u8 num_jpeg_rings_gpu_metrics; u8 num_jpeg_rings_gpu_metrics;
MetricsTable_t *metrics; MetricsTable_t *metrics;
struct amdgpu_xcp *xcp;
u32 inst_mask;
metrics = (MetricsTable_t *)smu_metrics; metrics = (MetricsTable_t *)smu_metrics;
smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 8);
gpu_metrics->temperature_hotspot = gpu_metrics->temperature_hotspot =
SMUQ10_ROUND(metrics->MaxSocketTemperature); SMUQ10_ROUND(metrics->MaxSocketTemperature);
/* Individual HBM stack temperature is not reported */ /* 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->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); num_jpeg_rings_gpu_metrics = NUM_JPEG_RINGS_GPU_METRICS(gpu_metrics);
for_each_xcp(adev->xcp_mgr, xcp, i) { for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {
amdgpu_xcp_get_inst_details(xcp, AMDGPU_XCP_VCN, &inst_mask); inst = GET_INST(VCN, i);
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) { for (j = 0; j < num_jpeg_rings_gpu_metrics; ++j) {
gpu_metrics->xcp_stats[i].jpeg_busy gpu_metrics->jpeg_busy[(i * num_jpeg_rings_gpu_metrics) +
[(idx * num_jpeg_rings_gpu_metrics) + j] = j] =
SMUQ10_ROUND(metrics->JpegBusy SMUQ10_ROUND(
[(inst * NUM_JPEG_RINGS_FW) + j]); metrics->JpegBusy[(inst *
NUM_JPEG_RINGS_FW) +
j]);
} }
gpu_metrics->xcp_stats[i].vcn_busy[idx] = gpu_metrics->vcn_busy[i] = SMUQ10_ROUND(metrics->VcnBusy[inst]);
SMUQ10_ROUND(metrics->VcnBusy[inst]);
idx++;
} }
amdgpu_xcp_get_inst_details(xcp, AMDGPU_XCP_GFX, &inst_mask); for (i = 0; i < NUM_XCC(adev->gfx.xcc_mask); ++i) {
idx = 0; inst = GET_INST(GC, i);
for_each_inst(k, inst_mask) { gpu_metrics->gfx_busy_inst[i] =
inst = GET_INST(GC, k);
gpu_metrics->xcp_stats[i].gfx_busy_inst[idx] =
SMUQ10_ROUND(metrics->GfxBusy[inst]); SMUQ10_ROUND(metrics->GfxBusy[inst]);
gpu_metrics->xcp_stats[i].gfx_busy_acc[idx] = gpu_metrics->gfx_busy_acc[i] =
SMUQ10_ROUND(metrics->GfxBusyAcc[inst]); SMUQ10_ROUND(metrics->GfxBusyAcc[inst]);
if (smu_v13_0_6_cap_supported(smu, SMU_CAP(HST_LIMIT_METRICS))) { if (smu_v13_0_6_cap_supported(smu,
gpu_metrics->xcp_stats[i].gfx_below_host_limit_ppt_acc[idx] = SMU_CAP(HST_LIMIT_METRICS))) {
SMUQ10_ROUND(metrics->GfxclkBelowHostLimitPptAcc[inst]); gpu_metrics
gpu_metrics->xcp_stats[i].gfx_below_host_limit_thm_acc[idx] = ->gfx_below_host_limit_ppt_acc[i] = SMUQ10_ROUND(
SMUQ10_ROUND(metrics->GfxclkBelowHostLimitThmAcc[inst]); metrics->GfxclkBelowHostLimitPptAcc[inst]);
gpu_metrics->xcp_stats[i].gfx_low_utilization_acc[idx] = gpu_metrics
SMUQ10_ROUND(metrics->GfxclkLowUtilizationAcc[inst]); ->gfx_below_host_limit_thm_acc[i] = SMUQ10_ROUND(
gpu_metrics->xcp_stats[i].gfx_below_host_limit_total_acc[idx] = metrics->GfxclkBelowHostLimitThmAcc[inst]);
SMUQ10_ROUND(metrics->GfxclkBelowHostLimitTotalAcc[inst]); gpu_metrics->gfx_low_utilization_acc[i] = SMUQ10_ROUND(
} metrics->GfxclkLowUtilizationAcc[inst]);
idx++; 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_width = metrics->XgmiWidth;
gpu_metrics->xgmi_link_speed = metrics->XgmiBitrate; gpu_metrics->xgmi_link_speed = metrics->XgmiBitrate;
gpu_metrics->firmware_timestamp = metrics->Timestamp; 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 = { const struct smu_temp_funcs smu_v13_0_12_temp_funcs = {

View 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_context *smu_table = &smu->smu_table;
struct smu_table *tables = smu_table->tables; struct smu_table *tables = smu_table->tables;
void *gpu_metrics_table __free(kfree) = NULL;
struct smu_v13_0_6_gpu_metrics *gpu_metrics; struct smu_v13_0_6_gpu_metrics *gpu_metrics;
void *driver_pptable __free(kfree) = NULL; void *driver_pptable __free(kfree) = NULL;
void *metrics_table __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; return -ENOMEM;
smu_table->metrics_time = 0; 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); driver_pptable = kzalloc(sizeof(struct PPTable_t), GFP_KERNEL);
if (!driver_pptable) if (!driver_pptable)
return -ENOMEM; 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->metrics_table = no_free_ptr(metrics_table);
smu_table->driver_pptable = no_free_ptr(driver_pptable); 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) if (ret)
return 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; metrics_v2 = (MetricsTableV2_t *)metrics_v0;
gpu_metrics = (struct smu_v13_0_6_gpu_metrics gpu_metrics = (struct smu_v13_0_6_gpu_metrics
*)(tables[SMU_TABLE_SMU_METRICS].cache.buffer); *)(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 = gpu_metrics->temperature_hotspot =
SMUQ10_ROUND(GET_METRIC_FIELD(MaxSocketTemperature, version)); SMUQ10_ROUND(GET_METRIC_FIELD(MaxSocketTemperature, version));
/* Individual HBM stack temperature is not reported */ /* 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); gpu_metrics->firmware_timestamp = GET_METRIC_FIELD(Timestamp, version);
fill:
*table = tables[SMU_TABLE_SMU_METRICS].cache.buffer; *table = tables[SMU_TABLE_SMU_METRICS].cache.buffer;
return sizeof(*gpu_metrics); return sizeof(*gpu_metrics);

View 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_setup_driver_pptable(struct smu_context *smu);
int smu_v13_0_12_get_smu_metrics_data(struct smu_context *smu, int smu_v13_0_12_get_smu_metrics_data(struct smu_context *smu,
MetricsMember_t member, uint32_t *value); 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, ssize_t smu_v13_0_12_get_xcp_metrics(struct smu_context *smu,
struct amdgpu_xcp *xcp, void *table, struct amdgpu_xcp *xcp, void *table,
void *smu_metrics); 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); SMU_13_0_6_MAX_XCC);
DECLARE_SMU_METRICS_CLASS(smu_v13_0_6_gpu_metrics, SMU_13_0_6_METRICS_FIELDS); 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 */ #endif /* SWSMU_CODE_LAYER_L2 */