mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 17:13:52 +02:00
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:
parent
cd6250f3ae
commit
b480f573a8
|
|
@ -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 = {
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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 */
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user