Skip to content

Commit 0cc9e95

Browse files
Asad Kamalalexdeucher
authored andcommitted
drm/amd/pm: Use separate metric table for APU
Use separate metric table for APU and Non APU systems for smu_v_13_0_6 to get metric data Signed-off-by: Asad Kamal <[email protected]> Reviewed-by: Lijo Lazar <[email protected]> Reviewed-by: Le Ma <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 9cdef4f commit 0cc9e95

File tree

2 files changed

+156
-58
lines changed

2 files changed

+156
-58
lines changed

drivers/gpu/drm/amd/pm/swsmu/inc/pmfw_if/smu_v13_0_6_pmfw.h

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,95 @@ typedef struct __attribute__((packed, aligned(4))) {
219219
uint32_t PCIenReplayARolloverCountAcc; // The Pcie counter itself is accumulated
220220
uint32_t PCIeNAKSentCountAcc; // The Pcie counter itself is accumulated
221221
uint32_t PCIeNAKReceivedCountAcc; // The Pcie counter itself is accumulated
222-
} MetricsTable_t;
222+
} MetricsTableX_t;
223+
224+
typedef struct __attribute__((packed, aligned(4))) {
225+
uint32_t AccumulationCounter;
226+
227+
//TEMPERATURE
228+
uint32_t MaxSocketTemperature;
229+
uint32_t MaxVrTemperature;
230+
uint32_t MaxHbmTemperature;
231+
uint64_t MaxSocketTemperatureAcc;
232+
uint64_t MaxVrTemperatureAcc;
233+
uint64_t MaxHbmTemperatureAcc;
234+
235+
//POWER
236+
uint32_t SocketPowerLimit;
237+
uint32_t MaxSocketPowerLimit;
238+
uint32_t SocketPower;
239+
240+
//ENERGY
241+
uint64_t Timestamp;
242+
uint64_t SocketEnergyAcc;
243+
uint64_t CcdEnergyAcc;
244+
uint64_t XcdEnergyAcc;
245+
uint64_t AidEnergyAcc;
246+
uint64_t HbmEnergyAcc;
247+
248+
//FREQUENCY
249+
uint32_t CclkFrequencyLimit;
250+
uint32_t GfxclkFrequencyLimit;
251+
uint32_t FclkFrequency;
252+
uint32_t UclkFrequency;
253+
uint32_t SocclkFrequency[4];
254+
uint32_t VclkFrequency[4];
255+
uint32_t DclkFrequency[4];
256+
uint32_t LclkFrequency[4];
257+
uint64_t GfxclkFrequencyAcc[8];
258+
uint64_t CclkFrequencyAcc[96];
259+
260+
//FREQUENCY RANGE
261+
uint32_t MaxCclkFrequency;
262+
uint32_t MinCclkFrequency;
263+
uint32_t MaxGfxclkFrequency;
264+
uint32_t MinGfxclkFrequency;
265+
uint32_t FclkFrequencyTable[4];
266+
uint32_t UclkFrequencyTable[4];
267+
uint32_t SocclkFrequencyTable[4];
268+
uint32_t VclkFrequencyTable[4];
269+
uint32_t DclkFrequencyTable[4];
270+
uint32_t LclkFrequencyTable[4];
271+
uint32_t MaxLclkDpmRange;
272+
uint32_t MinLclkDpmRange;
273+
274+
//XGMI
275+
uint32_t XgmiWidth;
276+
uint32_t XgmiBitrate;
277+
uint64_t XgmiReadBandwidthAcc[8];
278+
uint64_t XgmiWriteBandwidthAcc[8];
279+
280+
//ACTIVITY
281+
uint32_t SocketC0Residency;
282+
uint32_t SocketGfxBusy;
283+
uint32_t DramBandwidthUtilization;
284+
uint64_t SocketC0ResidencyAcc;
285+
uint64_t SocketGfxBusyAcc;
286+
uint64_t DramBandwidthAcc;
287+
uint32_t MaxDramBandwidth;
288+
uint64_t DramBandwidthUtilizationAcc;
289+
uint64_t PcieBandwidthAcc[4];
290+
291+
//THROTTLERS
292+
uint32_t ProchotResidencyAcc;
293+
uint32_t PptResidencyAcc;
294+
uint32_t SocketThmResidencyAcc;
295+
uint32_t VrThmResidencyAcc;
296+
uint32_t HbmThmResidencyAcc;
297+
uint32_t GfxLockXCDMak;
298+
299+
// New Items at end to maintain driver compatibility
300+
uint32_t GfxclkFrequency[8];
301+
302+
//PSNs
303+
uint64_t PublicSerialNumber_AID[4];
304+
uint64_t PublicSerialNumber_XCD[8];
305+
uint64_t PublicSerialNumber_CCD[12];
306+
307+
//XGMI Data tranfser size
308+
uint64_t XgmiReadDataSizeAcc[8];//in KByte
309+
uint64_t XgmiWriteDataSizeAcc[8];//in KByte
310+
} MetricsTableA_t;
223311

224312
#define SMU_VF_METRICS_TABLE_VERSION 0x3
225313

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

Lines changed: 67 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,8 @@ struct PPTable_t {
245245
#define SMUQ10_TO_UINT(x) ((x) >> 10)
246246
#define SMUQ10_FRAC(x) ((x) & 0x3ff)
247247
#define SMUQ10_ROUND(x) ((SMUQ10_TO_UINT(x)) + ((SMUQ10_FRAC(x)) >= 0x200))
248+
#define GET_METRIC_FIELD(field) ((adev->flags & AMD_IS_APU) ?\
249+
(metrics_a->field) : (metrics_x->field))
248250

249251
struct smu_v13_0_6_dpm_map {
250252
enum smu_clk_type clk_type;
@@ -327,15 +329,17 @@ static int smu_v13_0_6_tables_init(struct smu_context *smu)
327329
SMU_TABLE_INIT(tables, SMU_TABLE_PMSTATUSLOG, SMU13_TOOL_SIZE,
328330
PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM);
329331

330-
SMU_TABLE_INIT(tables, SMU_TABLE_SMU_METRICS, sizeof(MetricsTable_t),
332+
SMU_TABLE_INIT(tables, SMU_TABLE_SMU_METRICS,
333+
max(sizeof(MetricsTableX_t), sizeof(MetricsTableA_t)),
331334
PAGE_SIZE,
332335
AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT);
333336

334337
SMU_TABLE_INIT(tables, SMU_TABLE_I2C_COMMANDS, sizeof(SwI2cRequest_t),
335338
PAGE_SIZE,
336339
AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT);
337340

338-
smu_table->metrics_table = kzalloc(sizeof(MetricsTable_t), GFP_KERNEL);
341+
smu_table->metrics_table = kzalloc(max(sizeof(MetricsTableX_t),
342+
sizeof(MetricsTableA_t)), GFP_KERNEL);
339343
if (!smu_table->metrics_table)
340344
return -ENOMEM;
341345
smu_table->metrics_time = 0;
@@ -431,9 +435,11 @@ static int smu_v13_0_6_get_metrics_table(struct smu_context *smu,
431435
static int smu_v13_0_6_setup_driver_pptable(struct smu_context *smu)
432436
{
433437
struct smu_table_context *smu_table = &smu->smu_table;
434-
MetricsTable_t *metrics = (MetricsTable_t *)smu_table->metrics_table;
438+
MetricsTableX_t *metrics_x = (MetricsTableX_t *)smu_table->metrics_table;
439+
MetricsTableA_t *metrics_a = (MetricsTableA_t *)smu_table->metrics_table;
435440
struct PPTable_t *pptable =
436441
(struct PPTable_t *)smu_table->driver_pptable;
442+
struct amdgpu_device *adev = smu->adev;
437443
int ret, i, retry = 100;
438444

439445
/* Store one-time values in driver PPTable */
@@ -444,7 +450,7 @@ static int smu_v13_0_6_setup_driver_pptable(struct smu_context *smu)
444450
return ret;
445451

446452
/* Ensure that metrics have been updated */
447-
if (metrics->AccumulationCounter)
453+
if (GET_METRIC_FIELD(AccumulationCounter))
448454
break;
449455

450456
usleep_range(1000, 1100);
@@ -454,29 +460,29 @@ static int smu_v13_0_6_setup_driver_pptable(struct smu_context *smu)
454460
return -ETIME;
455461

456462
pptable->MaxSocketPowerLimit =
457-
SMUQ10_ROUND(metrics->MaxSocketPowerLimit);
463+
SMUQ10_ROUND(GET_METRIC_FIELD(MaxSocketPowerLimit));
458464
pptable->MaxGfxclkFrequency =
459-
SMUQ10_ROUND(metrics->MaxGfxclkFrequency);
465+
SMUQ10_ROUND(GET_METRIC_FIELD(MaxGfxclkFrequency));
460466
pptable->MinGfxclkFrequency =
461-
SMUQ10_ROUND(metrics->MinGfxclkFrequency);
467+
SMUQ10_ROUND(GET_METRIC_FIELD(MinGfxclkFrequency));
462468

463469
for (i = 0; i < 4; ++i) {
464470
pptable->FclkFrequencyTable[i] =
465-
SMUQ10_ROUND(metrics->FclkFrequencyTable[i]);
471+
SMUQ10_ROUND(GET_METRIC_FIELD(FclkFrequencyTable)[i]);
466472
pptable->UclkFrequencyTable[i] =
467-
SMUQ10_ROUND(metrics->UclkFrequencyTable[i]);
473+
SMUQ10_ROUND(GET_METRIC_FIELD(UclkFrequencyTable)[i]);
468474
pptable->SocclkFrequencyTable[i] = SMUQ10_ROUND(
469-
metrics->SocclkFrequencyTable[i]);
475+
GET_METRIC_FIELD(SocclkFrequencyTable)[i]);
470476
pptable->VclkFrequencyTable[i] =
471-
SMUQ10_ROUND(metrics->VclkFrequencyTable[i]);
477+
SMUQ10_ROUND(GET_METRIC_FIELD(VclkFrequencyTable)[i]);
472478
pptable->DclkFrequencyTable[i] =
473-
SMUQ10_ROUND(metrics->DclkFrequencyTable[i]);
479+
SMUQ10_ROUND(GET_METRIC_FIELD(DclkFrequencyTable)[i]);
474480
pptable->LclkFrequencyTable[i] =
475-
SMUQ10_ROUND(metrics->LclkFrequencyTable[i]);
481+
SMUQ10_ROUND(GET_METRIC_FIELD(LclkFrequencyTable)[i]);
476482
}
477483

478484
/* use AID0 serial number by default */
479-
pptable->PublicSerialNumber_AID = metrics->PublicSerialNumber_AID[0];
485+
pptable->PublicSerialNumber_AID = GET_METRIC_FIELD(PublicSerialNumber_AID)[0];
480486

481487
pptable->Init = true;
482488
}
@@ -778,7 +784,8 @@ static int smu_v13_0_6_get_smu_metrics_data(struct smu_context *smu,
778784
uint32_t *value)
779785
{
780786
struct smu_table_context *smu_table = &smu->smu_table;
781-
MetricsTable_t *metrics = (MetricsTable_t *)smu_table->metrics_table;
787+
MetricsTableX_t *metrics_x = (MetricsTableX_t *)smu_table->metrics_table;
788+
MetricsTableA_t *metrics_a = (MetricsTableA_t *)smu_table->metrics_table;
782789
struct amdgpu_device *adev = smu->adev;
783790
int ret = 0;
784791
int xcc_id;
@@ -793,50 +800,50 @@ static int smu_v13_0_6_get_smu_metrics_data(struct smu_context *smu,
793800
case METRICS_AVERAGE_GFXCLK:
794801
if (smu->smc_fw_version >= 0x552F00) {
795802
xcc_id = GET_INST(GC, 0);
796-
*value = SMUQ10_ROUND(metrics->GfxclkFrequency[xcc_id]);
803+
*value = SMUQ10_ROUND(GET_METRIC_FIELD(GfxclkFrequency)[xcc_id]);
797804
} else {
798805
*value = 0;
799806
}
800807
break;
801808
case METRICS_CURR_SOCCLK:
802809
case METRICS_AVERAGE_SOCCLK:
803-
*value = SMUQ10_ROUND(metrics->SocclkFrequency[0]);
810+
*value = SMUQ10_ROUND(GET_METRIC_FIELD(SocclkFrequency)[0]);
804811
break;
805812
case METRICS_CURR_UCLK:
806813
case METRICS_AVERAGE_UCLK:
807-
*value = SMUQ10_ROUND(metrics->UclkFrequency);
814+
*value = SMUQ10_ROUND(GET_METRIC_FIELD(UclkFrequency));
808815
break;
809816
case METRICS_CURR_VCLK:
810-
*value = SMUQ10_ROUND(metrics->VclkFrequency[0]);
817+
*value = SMUQ10_ROUND(GET_METRIC_FIELD(VclkFrequency)[0]);
811818
break;
812819
case METRICS_CURR_DCLK:
813-
*value = SMUQ10_ROUND(metrics->DclkFrequency[0]);
820+
*value = SMUQ10_ROUND(GET_METRIC_FIELD(DclkFrequency)[0]);
814821
break;
815822
case METRICS_CURR_FCLK:
816-
*value = SMUQ10_ROUND(metrics->FclkFrequency);
823+
*value = SMUQ10_ROUND(GET_METRIC_FIELD(FclkFrequency));
817824
break;
818825
case METRICS_AVERAGE_GFXACTIVITY:
819-
*value = SMUQ10_ROUND(metrics->SocketGfxBusy);
826+
*value = SMUQ10_ROUND(GET_METRIC_FIELD(SocketGfxBusy));
820827
break;
821828
case METRICS_AVERAGE_MEMACTIVITY:
822-
*value = SMUQ10_ROUND(metrics->DramBandwidthUtilization);
829+
*value = SMUQ10_ROUND(GET_METRIC_FIELD(DramBandwidthUtilization));
823830
break;
824831
case METRICS_CURR_SOCKETPOWER:
825-
*value = SMUQ10_ROUND(metrics->SocketPower) << 8;
832+
*value = SMUQ10_ROUND(GET_METRIC_FIELD(SocketPower)) << 8;
826833
break;
827834
case METRICS_TEMPERATURE_HOTSPOT:
828-
*value = SMUQ10_ROUND(metrics->MaxSocketTemperature) *
835+
*value = SMUQ10_ROUND(GET_METRIC_FIELD(MaxSocketTemperature)) *
829836
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
830837
break;
831838
case METRICS_TEMPERATURE_MEM:
832-
*value = SMUQ10_ROUND(metrics->MaxHbmTemperature) *
839+
*value = SMUQ10_ROUND(GET_METRIC_FIELD(MaxHbmTemperature)) *
833840
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
834841
break;
835842
/* This is the max of all VRs and not just SOC VR.
836843
* No need to define another data type for the same.
837844
*/
838845
case METRICS_TEMPERATURE_VRSOC:
839-
*value = SMUQ10_ROUND(metrics->MaxVrTemperature) *
846+
*value = SMUQ10_ROUND(GET_METRIC_FIELD(MaxVrTemperature)) *
840847
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
841848
break;
842849
default:
@@ -2026,63 +2033,66 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table
20262033
(struct gpu_metrics_v1_4 *)smu_table->gpu_metrics_table;
20272034
struct amdgpu_device *adev = smu->adev;
20282035
int ret = 0, xcc_id, inst, i;
2029-
MetricsTable_t *metrics;
2036+
MetricsTableX_t *metrics_x;
2037+
MetricsTableA_t *metrics_a;
20302038
u16 link_width_level;
20312039

2032-
metrics = kzalloc(sizeof(MetricsTable_t), GFP_KERNEL);
2033-
ret = smu_v13_0_6_get_metrics_table(smu, metrics, true);
2040+
metrics_x = kzalloc(max(sizeof(MetricsTableX_t), sizeof(MetricsTableA_t)), GFP_KERNEL);
2041+
ret = smu_v13_0_6_get_metrics_table(smu, metrics_x, true);
20342042
if (ret) {
2035-
kfree(metrics);
2043+
kfree(metrics_x);
20362044
return ret;
20372045
}
20382046

2047+
metrics_a = (MetricsTableA_t *)metrics_x;
2048+
20392049
smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 4);
20402050

20412051
gpu_metrics->temperature_hotspot =
2042-
SMUQ10_ROUND(metrics->MaxSocketTemperature);
2052+
SMUQ10_ROUND(GET_METRIC_FIELD(MaxSocketTemperature));
20432053
/* Individual HBM stack temperature is not reported */
20442054
gpu_metrics->temperature_mem =
2045-
SMUQ10_ROUND(metrics->MaxHbmTemperature);
2055+
SMUQ10_ROUND(GET_METRIC_FIELD(MaxHbmTemperature));
20462056
/* Reports max temperature of all voltage rails */
20472057
gpu_metrics->temperature_vrsoc =
2048-
SMUQ10_ROUND(metrics->MaxVrTemperature);
2058+
SMUQ10_ROUND(GET_METRIC_FIELD(MaxVrTemperature));
20492059

20502060
gpu_metrics->average_gfx_activity =
2051-
SMUQ10_ROUND(metrics->SocketGfxBusy);
2061+
SMUQ10_ROUND(GET_METRIC_FIELD(SocketGfxBusy));
20522062
gpu_metrics->average_umc_activity =
2053-
SMUQ10_ROUND(metrics->DramBandwidthUtilization);
2063+
SMUQ10_ROUND(GET_METRIC_FIELD(DramBandwidthUtilization));
20542064

20552065
gpu_metrics->curr_socket_power =
2056-
SMUQ10_ROUND(metrics->SocketPower);
2066+
SMUQ10_ROUND(GET_METRIC_FIELD(SocketPower));
20572067
/* Energy counter reported in 15.259uJ (2^-16) units */
2058-
gpu_metrics->energy_accumulator = metrics->SocketEnergyAcc;
2068+
gpu_metrics->energy_accumulator = GET_METRIC_FIELD(SocketEnergyAcc);
20592069

20602070
for (i = 0; i < MAX_GFX_CLKS; i++) {
20612071
xcc_id = GET_INST(GC, i);
20622072
if (xcc_id >= 0)
20632073
gpu_metrics->current_gfxclk[i] =
2064-
SMUQ10_ROUND(metrics->GfxclkFrequency[xcc_id]);
2074+
SMUQ10_ROUND(GET_METRIC_FIELD(GfxclkFrequency)[xcc_id]);
20652075

20662076
if (i < MAX_CLKS) {
20672077
gpu_metrics->current_socclk[i] =
2068-
SMUQ10_ROUND(metrics->SocclkFrequency[i]);
2078+
SMUQ10_ROUND(GET_METRIC_FIELD(SocclkFrequency)[i]);
20692079
inst = GET_INST(VCN, i);
20702080
if (inst >= 0) {
20712081
gpu_metrics->current_vclk0[i] =
2072-
SMUQ10_ROUND(metrics->VclkFrequency[inst]);
2082+
SMUQ10_ROUND(GET_METRIC_FIELD(VclkFrequency)[inst]);
20732083
gpu_metrics->current_dclk0[i] =
2074-
SMUQ10_ROUND(metrics->DclkFrequency[inst]);
2084+
SMUQ10_ROUND(GET_METRIC_FIELD(DclkFrequency)[inst]);
20752085
}
20762086
}
20772087
}
20782088

2079-
gpu_metrics->current_uclk = SMUQ10_ROUND(metrics->UclkFrequency);
2089+
gpu_metrics->current_uclk = SMUQ10_ROUND(GET_METRIC_FIELD(UclkFrequency));
20802090

20812091
/* Throttle status is not reported through metrics now */
20822092
gpu_metrics->throttle_status = 0;
20832093

20842094
/* Clock Lock Status. Each bit corresponds to each GFXCLK instance */
2085-
gpu_metrics->gfxclk_lock_status = metrics->GfxLockXCDMak >> GET_INST(GC, 0);
2095+
gpu_metrics->gfxclk_lock_status = GET_METRIC_FIELD(GfxLockXCDMak) >> GET_INST(GC, 0);
20862096

20872097
if (!(adev->flags & AMD_IS_APU)) {
20882098
link_width_level = smu_v13_0_6_get_current_pcie_link_width_level(smu);
@@ -2094,38 +2104,38 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table
20942104
gpu_metrics->pcie_link_speed =
20952105
smu_v13_0_6_get_current_pcie_link_speed(smu);
20962106
gpu_metrics->pcie_bandwidth_acc =
2097-
SMUQ10_ROUND(metrics->PcieBandwidthAcc[0]);
2107+
SMUQ10_ROUND(metrics_x->PcieBandwidthAcc[0]);
20982108
gpu_metrics->pcie_bandwidth_inst =
2099-
SMUQ10_ROUND(metrics->PcieBandwidth[0]);
2109+
SMUQ10_ROUND(metrics_x->PcieBandwidth[0]);
21002110
gpu_metrics->pcie_l0_to_recov_count_acc =
2101-
metrics->PCIeL0ToRecoveryCountAcc;
2111+
metrics_x->PCIeL0ToRecoveryCountAcc;
21022112
gpu_metrics->pcie_replay_count_acc =
2103-
metrics->PCIenReplayAAcc;
2113+
metrics_x->PCIenReplayAAcc;
21042114
gpu_metrics->pcie_replay_rover_count_acc =
2105-
metrics->PCIenReplayARolloverCountAcc;
2115+
metrics_x->PCIenReplayARolloverCountAcc;
21062116
}
21072117

21082118
gpu_metrics->system_clock_counter = ktime_get_boottime_ns();
21092119

21102120
gpu_metrics->gfx_activity_acc =
2111-
SMUQ10_ROUND(metrics->SocketGfxBusyAcc);
2121+
SMUQ10_ROUND(GET_METRIC_FIELD(SocketGfxBusyAcc));
21122122
gpu_metrics->mem_activity_acc =
2113-
SMUQ10_ROUND(metrics->DramBandwidthUtilizationAcc);
2123+
SMUQ10_ROUND(GET_METRIC_FIELD(DramBandwidthUtilizationAcc));
21142124

21152125
for (i = 0; i < NUM_XGMI_LINKS; i++) {
21162126
gpu_metrics->xgmi_read_data_acc[i] =
2117-
SMUQ10_ROUND(metrics->XgmiReadDataSizeAcc[i]);
2127+
SMUQ10_ROUND(GET_METRIC_FIELD(XgmiReadDataSizeAcc)[i]);
21182128
gpu_metrics->xgmi_write_data_acc[i] =
2119-
SMUQ10_ROUND(metrics->XgmiWriteDataSizeAcc[i]);
2129+
SMUQ10_ROUND(GET_METRIC_FIELD(XgmiWriteDataSizeAcc)[i]);
21202130
}
21212131

2122-
gpu_metrics->xgmi_link_width = SMUQ10_ROUND(metrics->XgmiWidth);
2123-
gpu_metrics->xgmi_link_speed = SMUQ10_ROUND(metrics->XgmiBitrate);
2132+
gpu_metrics->xgmi_link_width = SMUQ10_ROUND(GET_METRIC_FIELD(XgmiWidth));
2133+
gpu_metrics->xgmi_link_speed = SMUQ10_ROUND(GET_METRIC_FIELD(XgmiBitrate));
21242134

2125-
gpu_metrics->firmware_timestamp = metrics->Timestamp;
2135+
gpu_metrics->firmware_timestamp = GET_METRIC_FIELD(Timestamp);
21262136

21272137
*table = (void *)gpu_metrics;
2128-
kfree(metrics);
2138+
kfree(metrics_x);
21292139

21302140
return sizeof(*gpu_metrics);
21312141
}

0 commit comments

Comments
 (0)