Skip to content

Commit acae8ad

Browse files
Asad Kamalalexdeucher
authored andcommitted
drm/amd/pm: Fetch npm data from system metrics table
Fetch npm data from system metrics table for smu_v13_0_12 v3: Remove intermittent type for npm data, remove node id check, move npm caps check to npm_get_data function (Lijo) Signed-off-by: Asad Kamal <asad.kamal@amd.com> Reviewed-by: Lijo Lazar <lijo.lazar@amd.com> Reviewed-by: Yang Wang <kevinyang.wang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent ef612f5 commit acae8ad

3 files changed

Lines changed: 61 additions & 0 deletions

File tree

drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,9 @@ int smu_v13_0_12_setup_driver_pptable(struct smu_context *smu)
341341
static_metrics->pldmVersion[0] != 0xFFFFFFFF)
342342
smu->adev->firmware.pldm_version =
343343
static_metrics->pldmVersion[0];
344+
if (smu_v13_0_6_cap_supported(smu, SMU_CAP(NPM_METRICS)))
345+
pptable->MaxNodePowerLimit =
346+
SMUQ10_ROUND(static_metrics->MaxNodePowerLimit);
344347
smu_v13_0_12_init_xgmi_data(smu, static_metrics);
345348
pptable->Init = true;
346349
}
@@ -580,6 +583,50 @@ static bool smu_v13_0_12_is_temp_metrics_supported(struct smu_context *smu,
580583
return false;
581584
}
582585

586+
int smu_v13_0_12_get_npm_data(struct smu_context *smu,
587+
enum amd_pp_sensors sensor,
588+
uint32_t *value)
589+
{
590+
struct smu_table_context *smu_table = &smu->smu_table;
591+
struct PPTable_t *pptable =
592+
(struct PPTable_t *)smu_table->driver_pptable;
593+
struct smu_table *tables = smu_table->tables;
594+
SystemMetricsTable_t *metrics;
595+
struct smu_table *sys_table;
596+
int ret;
597+
598+
if (!smu_v13_0_6_cap_supported(smu, SMU_CAP(NPM_METRICS)))
599+
return -EOPNOTSUPP;
600+
601+
if (sensor == AMDGPU_PP_SENSOR_MAXNODEPOWERLIMIT) {
602+
*value = pptable->MaxNodePowerLimit;
603+
return 0;
604+
}
605+
606+
ret = smu_v13_0_12_get_system_metrics_table(smu);
607+
if (ret)
608+
return ret;
609+
610+
sys_table = &tables[SMU_TABLE_PMFW_SYSTEM_METRICS];
611+
metrics = (SystemMetricsTable_t *)sys_table->cache.buffer;
612+
613+
switch (sensor) {
614+
case AMDGPU_PP_SENSOR_NODEPOWERLIMIT:
615+
*value = SMUQ10_ROUND(metrics->NodePowerLimit);
616+
break;
617+
case AMDGPU_PP_SENSOR_NODEPOWER:
618+
*value = SMUQ10_ROUND(metrics->NodePower);
619+
break;
620+
case AMDGPU_PP_SENSOR_GPPTRESIDENCY:
621+
*value = SMUQ10_ROUND(metrics->GlobalPPTResidencyAcc);
622+
break;
623+
default:
624+
return -EINVAL;
625+
}
626+
627+
return ret;
628+
}
629+
583630
static ssize_t smu_v13_0_12_get_temp_metrics(struct smu_context *smu,
584631
enum smu_temp_metric_type type, void *table)
585632
{

drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1801,6 +1801,15 @@ static int smu_v13_0_6_read_sensor(struct smu_context *smu,
18011801
ret = -EOPNOTSUPP;
18021802
break;
18031803
}
1804+
case AMDGPU_PP_SENSOR_NODEPOWERLIMIT:
1805+
case AMDGPU_PP_SENSOR_NODEPOWER:
1806+
case AMDGPU_PP_SENSOR_GPPTRESIDENCY:
1807+
case AMDGPU_PP_SENSOR_MAXNODEPOWERLIMIT:
1808+
ret = smu_v13_0_12_get_npm_data(smu, sensor, (uint32_t *)data);
1809+
if (ret)
1810+
return ret;
1811+
*size = 4;
1812+
break;
18041813
case AMDGPU_PP_SENSOR_GPU_AVG_POWER:
18051814
default:
18061815
ret = -EOPNOTSUPP;

drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ struct PPTable_t {
4949
uint32_t MaxLclkDpmRange;
5050
uint32_t MinLclkDpmRange;
5151
uint64_t PublicSerialNumber_AID;
52+
uint32_t MaxNodePowerLimit;
5253
bool Init;
5354
};
5455

@@ -70,6 +71,7 @@ enum smu_v13_0_6_caps {
7071
SMU_CAP(BOARD_VOLTAGE),
7172
SMU_CAP(PLDM_VERSION),
7273
SMU_CAP(TEMP_METRICS),
74+
SMU_CAP(NPM_METRICS),
7375
SMU_CAP(ALL),
7476
};
7577

@@ -91,6 +93,9 @@ ssize_t smu_v13_0_12_get_xcp_metrics(struct smu_context *smu,
9193
void *smu_metrics);
9294
int smu_v13_0_12_tables_init(struct smu_context *smu);
9395
void smu_v13_0_12_tables_fini(struct smu_context *smu);
96+
int smu_v13_0_12_get_npm_data(struct smu_context *smu,
97+
enum amd_pp_sensors sensor,
98+
uint32_t *value);
9499
extern const struct cmn2asic_mapping smu_v13_0_12_feature_mask_map[];
95100
extern const struct cmn2asic_msg_mapping smu_v13_0_12_message_map[];
96101
extern const struct smu_temp_funcs smu_v13_0_12_temp_funcs;

0 commit comments

Comments
 (0)