@@ -245,6 +245,8 @@ struct PPTable_t {
245
245
#define SMUQ10_TO_UINT (x ) ((x) >> 10)
246
246
#define SMUQ10_FRAC (x ) ((x) & 0x3ff)
247
247
#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))
248
250
249
251
struct smu_v13_0_6_dpm_map {
250
252
enum smu_clk_type clk_type ;
@@ -327,15 +329,17 @@ static int smu_v13_0_6_tables_init(struct smu_context *smu)
327
329
SMU_TABLE_INIT (tables , SMU_TABLE_PMSTATUSLOG , SMU13_TOOL_SIZE ,
328
330
PAGE_SIZE , AMDGPU_GEM_DOMAIN_VRAM );
329
331
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 )),
331
334
PAGE_SIZE ,
332
335
AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT );
333
336
334
337
SMU_TABLE_INIT (tables , SMU_TABLE_I2C_COMMANDS , sizeof (SwI2cRequest_t ),
335
338
PAGE_SIZE ,
336
339
AMDGPU_GEM_DOMAIN_VRAM | AMDGPU_GEM_DOMAIN_GTT );
337
340
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 );
339
343
if (!smu_table -> metrics_table )
340
344
return - ENOMEM ;
341
345
smu_table -> metrics_time = 0 ;
@@ -431,9 +435,11 @@ static int smu_v13_0_6_get_metrics_table(struct smu_context *smu,
431
435
static int smu_v13_0_6_setup_driver_pptable (struct smu_context * smu )
432
436
{
433
437
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 ;
435
440
struct PPTable_t * pptable =
436
441
(struct PPTable_t * )smu_table -> driver_pptable ;
442
+ struct amdgpu_device * adev = smu -> adev ;
437
443
int ret , i , retry = 100 ;
438
444
439
445
/* Store one-time values in driver PPTable */
@@ -444,7 +450,7 @@ static int smu_v13_0_6_setup_driver_pptable(struct smu_context *smu)
444
450
return ret ;
445
451
446
452
/* Ensure that metrics have been updated */
447
- if (metrics -> AccumulationCounter )
453
+ if (GET_METRIC_FIELD ( AccumulationCounter ) )
448
454
break ;
449
455
450
456
usleep_range (1000 , 1100 );
@@ -454,29 +460,29 @@ static int smu_v13_0_6_setup_driver_pptable(struct smu_context *smu)
454
460
return - ETIME ;
455
461
456
462
pptable -> MaxSocketPowerLimit =
457
- SMUQ10_ROUND (metrics -> MaxSocketPowerLimit );
463
+ SMUQ10_ROUND (GET_METRIC_FIELD ( MaxSocketPowerLimit ) );
458
464
pptable -> MaxGfxclkFrequency =
459
- SMUQ10_ROUND (metrics -> MaxGfxclkFrequency );
465
+ SMUQ10_ROUND (GET_METRIC_FIELD ( MaxGfxclkFrequency ) );
460
466
pptable -> MinGfxclkFrequency =
461
- SMUQ10_ROUND (metrics -> MinGfxclkFrequency );
467
+ SMUQ10_ROUND (GET_METRIC_FIELD ( MinGfxclkFrequency ) );
462
468
463
469
for (i = 0 ; i < 4 ; ++ i ) {
464
470
pptable -> FclkFrequencyTable [i ] =
465
- SMUQ10_ROUND (metrics -> FclkFrequencyTable [i ]);
471
+ SMUQ10_ROUND (GET_METRIC_FIELD ( FclkFrequencyTable ) [i ]);
466
472
pptable -> UclkFrequencyTable [i ] =
467
- SMUQ10_ROUND (metrics -> UclkFrequencyTable [i ]);
473
+ SMUQ10_ROUND (GET_METRIC_FIELD ( UclkFrequencyTable ) [i ]);
468
474
pptable -> SocclkFrequencyTable [i ] = SMUQ10_ROUND (
469
- metrics -> SocclkFrequencyTable [i ]);
475
+ GET_METRIC_FIELD ( SocclkFrequencyTable ) [i ]);
470
476
pptable -> VclkFrequencyTable [i ] =
471
- SMUQ10_ROUND (metrics -> VclkFrequencyTable [i ]);
477
+ SMUQ10_ROUND (GET_METRIC_FIELD ( VclkFrequencyTable ) [i ]);
472
478
pptable -> DclkFrequencyTable [i ] =
473
- SMUQ10_ROUND (metrics -> DclkFrequencyTable [i ]);
479
+ SMUQ10_ROUND (GET_METRIC_FIELD ( DclkFrequencyTable ) [i ]);
474
480
pptable -> LclkFrequencyTable [i ] =
475
- SMUQ10_ROUND (metrics -> LclkFrequencyTable [i ]);
481
+ SMUQ10_ROUND (GET_METRIC_FIELD ( LclkFrequencyTable ) [i ]);
476
482
}
477
483
478
484
/* use AID0 serial number by default */
479
- pptable -> PublicSerialNumber_AID = metrics -> PublicSerialNumber_AID [0 ];
485
+ pptable -> PublicSerialNumber_AID = GET_METRIC_FIELD ( PublicSerialNumber_AID ) [0 ];
480
486
481
487
pptable -> Init = true;
482
488
}
@@ -778,7 +784,8 @@ static int smu_v13_0_6_get_smu_metrics_data(struct smu_context *smu,
778
784
uint32_t * value )
779
785
{
780
786
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 ;
782
789
struct amdgpu_device * adev = smu -> adev ;
783
790
int ret = 0 ;
784
791
int xcc_id ;
@@ -793,50 +800,50 @@ static int smu_v13_0_6_get_smu_metrics_data(struct smu_context *smu,
793
800
case METRICS_AVERAGE_GFXCLK :
794
801
if (smu -> smc_fw_version >= 0x552F00 ) {
795
802
xcc_id = GET_INST (GC , 0 );
796
- * value = SMUQ10_ROUND (metrics -> GfxclkFrequency [xcc_id ]);
803
+ * value = SMUQ10_ROUND (GET_METRIC_FIELD ( GfxclkFrequency ) [xcc_id ]);
797
804
} else {
798
805
* value = 0 ;
799
806
}
800
807
break ;
801
808
case METRICS_CURR_SOCCLK :
802
809
case METRICS_AVERAGE_SOCCLK :
803
- * value = SMUQ10_ROUND (metrics -> SocclkFrequency [0 ]);
810
+ * value = SMUQ10_ROUND (GET_METRIC_FIELD ( SocclkFrequency ) [0 ]);
804
811
break ;
805
812
case METRICS_CURR_UCLK :
806
813
case METRICS_AVERAGE_UCLK :
807
- * value = SMUQ10_ROUND (metrics -> UclkFrequency );
814
+ * value = SMUQ10_ROUND (GET_METRIC_FIELD ( UclkFrequency ) );
808
815
break ;
809
816
case METRICS_CURR_VCLK :
810
- * value = SMUQ10_ROUND (metrics -> VclkFrequency [0 ]);
817
+ * value = SMUQ10_ROUND (GET_METRIC_FIELD ( VclkFrequency ) [0 ]);
811
818
break ;
812
819
case METRICS_CURR_DCLK :
813
- * value = SMUQ10_ROUND (metrics -> DclkFrequency [0 ]);
820
+ * value = SMUQ10_ROUND (GET_METRIC_FIELD ( DclkFrequency ) [0 ]);
814
821
break ;
815
822
case METRICS_CURR_FCLK :
816
- * value = SMUQ10_ROUND (metrics -> FclkFrequency );
823
+ * value = SMUQ10_ROUND (GET_METRIC_FIELD ( FclkFrequency ) );
817
824
break ;
818
825
case METRICS_AVERAGE_GFXACTIVITY :
819
- * value = SMUQ10_ROUND (metrics -> SocketGfxBusy );
826
+ * value = SMUQ10_ROUND (GET_METRIC_FIELD ( SocketGfxBusy ) );
820
827
break ;
821
828
case METRICS_AVERAGE_MEMACTIVITY :
822
- * value = SMUQ10_ROUND (metrics -> DramBandwidthUtilization );
829
+ * value = SMUQ10_ROUND (GET_METRIC_FIELD ( DramBandwidthUtilization ) );
823
830
break ;
824
831
case METRICS_CURR_SOCKETPOWER :
825
- * value = SMUQ10_ROUND (metrics -> SocketPower ) << 8 ;
832
+ * value = SMUQ10_ROUND (GET_METRIC_FIELD ( SocketPower ) ) << 8 ;
826
833
break ;
827
834
case METRICS_TEMPERATURE_HOTSPOT :
828
- * value = SMUQ10_ROUND (metrics -> MaxSocketTemperature ) *
835
+ * value = SMUQ10_ROUND (GET_METRIC_FIELD ( MaxSocketTemperature ) ) *
829
836
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES ;
830
837
break ;
831
838
case METRICS_TEMPERATURE_MEM :
832
- * value = SMUQ10_ROUND (metrics -> MaxHbmTemperature ) *
839
+ * value = SMUQ10_ROUND (GET_METRIC_FIELD ( MaxHbmTemperature ) ) *
833
840
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES ;
834
841
break ;
835
842
/* This is the max of all VRs and not just SOC VR.
836
843
* No need to define another data type for the same.
837
844
*/
838
845
case METRICS_TEMPERATURE_VRSOC :
839
- * value = SMUQ10_ROUND (metrics -> MaxVrTemperature ) *
846
+ * value = SMUQ10_ROUND (GET_METRIC_FIELD ( MaxVrTemperature ) ) *
840
847
SMU_TEMPERATURE_UNITS_PER_CENTIGRADES ;
841
848
break ;
842
849
default :
@@ -2026,63 +2033,66 @@ static ssize_t smu_v13_0_6_get_gpu_metrics(struct smu_context *smu, void **table
2026
2033
(struct gpu_metrics_v1_4 * )smu_table -> gpu_metrics_table ;
2027
2034
struct amdgpu_device * adev = smu -> adev ;
2028
2035
int ret = 0 , xcc_id , inst , i ;
2029
- MetricsTable_t * metrics ;
2036
+ MetricsTableX_t * metrics_x ;
2037
+ MetricsTableA_t * metrics_a ;
2030
2038
u16 link_width_level ;
2031
2039
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);
2034
2042
if (ret ) {
2035
- kfree (metrics );
2043
+ kfree (metrics_x );
2036
2044
return ret ;
2037
2045
}
2038
2046
2047
+ metrics_a = (MetricsTableA_t * )metrics_x ;
2048
+
2039
2049
smu_cmn_init_soft_gpu_metrics (gpu_metrics , 1 , 4 );
2040
2050
2041
2051
gpu_metrics -> temperature_hotspot =
2042
- SMUQ10_ROUND (metrics -> MaxSocketTemperature );
2052
+ SMUQ10_ROUND (GET_METRIC_FIELD ( MaxSocketTemperature ) );
2043
2053
/* Individual HBM stack temperature is not reported */
2044
2054
gpu_metrics -> temperature_mem =
2045
- SMUQ10_ROUND (metrics -> MaxHbmTemperature );
2055
+ SMUQ10_ROUND (GET_METRIC_FIELD ( MaxHbmTemperature ) );
2046
2056
/* Reports max temperature of all voltage rails */
2047
2057
gpu_metrics -> temperature_vrsoc =
2048
- SMUQ10_ROUND (metrics -> MaxVrTemperature );
2058
+ SMUQ10_ROUND (GET_METRIC_FIELD ( MaxVrTemperature ) );
2049
2059
2050
2060
gpu_metrics -> average_gfx_activity =
2051
- SMUQ10_ROUND (metrics -> SocketGfxBusy );
2061
+ SMUQ10_ROUND (GET_METRIC_FIELD ( SocketGfxBusy ) );
2052
2062
gpu_metrics -> average_umc_activity =
2053
- SMUQ10_ROUND (metrics -> DramBandwidthUtilization );
2063
+ SMUQ10_ROUND (GET_METRIC_FIELD ( DramBandwidthUtilization ) );
2054
2064
2055
2065
gpu_metrics -> curr_socket_power =
2056
- SMUQ10_ROUND (metrics -> SocketPower );
2066
+ SMUQ10_ROUND (GET_METRIC_FIELD ( SocketPower ) );
2057
2067
/* 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 ) ;
2059
2069
2060
2070
for (i = 0 ; i < MAX_GFX_CLKS ; i ++ ) {
2061
2071
xcc_id = GET_INST (GC , i );
2062
2072
if (xcc_id >= 0 )
2063
2073
gpu_metrics -> current_gfxclk [i ] =
2064
- SMUQ10_ROUND (metrics -> GfxclkFrequency [xcc_id ]);
2074
+ SMUQ10_ROUND (GET_METRIC_FIELD ( GfxclkFrequency ) [xcc_id ]);
2065
2075
2066
2076
if (i < MAX_CLKS ) {
2067
2077
gpu_metrics -> current_socclk [i ] =
2068
- SMUQ10_ROUND (metrics -> SocclkFrequency [i ]);
2078
+ SMUQ10_ROUND (GET_METRIC_FIELD ( SocclkFrequency ) [i ]);
2069
2079
inst = GET_INST (VCN , i );
2070
2080
if (inst >= 0 ) {
2071
2081
gpu_metrics -> current_vclk0 [i ] =
2072
- SMUQ10_ROUND (metrics -> VclkFrequency [inst ]);
2082
+ SMUQ10_ROUND (GET_METRIC_FIELD ( VclkFrequency ) [inst ]);
2073
2083
gpu_metrics -> current_dclk0 [i ] =
2074
- SMUQ10_ROUND (metrics -> DclkFrequency [inst ]);
2084
+ SMUQ10_ROUND (GET_METRIC_FIELD ( DclkFrequency ) [inst ]);
2075
2085
}
2076
2086
}
2077
2087
}
2078
2088
2079
- gpu_metrics -> current_uclk = SMUQ10_ROUND (metrics -> UclkFrequency );
2089
+ gpu_metrics -> current_uclk = SMUQ10_ROUND (GET_METRIC_FIELD ( UclkFrequency ) );
2080
2090
2081
2091
/* Throttle status is not reported through metrics now */
2082
2092
gpu_metrics -> throttle_status = 0 ;
2083
2093
2084
2094
/* 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 );
2086
2096
2087
2097
if (!(adev -> flags & AMD_IS_APU )) {
2088
2098
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
2094
2104
gpu_metrics -> pcie_link_speed =
2095
2105
smu_v13_0_6_get_current_pcie_link_speed (smu );
2096
2106
gpu_metrics -> pcie_bandwidth_acc =
2097
- SMUQ10_ROUND (metrics -> PcieBandwidthAcc [0 ]);
2107
+ SMUQ10_ROUND (metrics_x -> PcieBandwidthAcc [0 ]);
2098
2108
gpu_metrics -> pcie_bandwidth_inst =
2099
- SMUQ10_ROUND (metrics -> PcieBandwidth [0 ]);
2109
+ SMUQ10_ROUND (metrics_x -> PcieBandwidth [0 ]);
2100
2110
gpu_metrics -> pcie_l0_to_recov_count_acc =
2101
- metrics -> PCIeL0ToRecoveryCountAcc ;
2111
+ metrics_x -> PCIeL0ToRecoveryCountAcc ;
2102
2112
gpu_metrics -> pcie_replay_count_acc =
2103
- metrics -> PCIenReplayAAcc ;
2113
+ metrics_x -> PCIenReplayAAcc ;
2104
2114
gpu_metrics -> pcie_replay_rover_count_acc =
2105
- metrics -> PCIenReplayARolloverCountAcc ;
2115
+ metrics_x -> PCIenReplayARolloverCountAcc ;
2106
2116
}
2107
2117
2108
2118
gpu_metrics -> system_clock_counter = ktime_get_boottime_ns ();
2109
2119
2110
2120
gpu_metrics -> gfx_activity_acc =
2111
- SMUQ10_ROUND (metrics -> SocketGfxBusyAcc );
2121
+ SMUQ10_ROUND (GET_METRIC_FIELD ( SocketGfxBusyAcc ) );
2112
2122
gpu_metrics -> mem_activity_acc =
2113
- SMUQ10_ROUND (metrics -> DramBandwidthUtilizationAcc );
2123
+ SMUQ10_ROUND (GET_METRIC_FIELD ( DramBandwidthUtilizationAcc ) );
2114
2124
2115
2125
for (i = 0 ; i < NUM_XGMI_LINKS ; i ++ ) {
2116
2126
gpu_metrics -> xgmi_read_data_acc [i ] =
2117
- SMUQ10_ROUND (metrics -> XgmiReadDataSizeAcc [i ]);
2127
+ SMUQ10_ROUND (GET_METRIC_FIELD ( XgmiReadDataSizeAcc ) [i ]);
2118
2128
gpu_metrics -> xgmi_write_data_acc [i ] =
2119
- SMUQ10_ROUND (metrics -> XgmiWriteDataSizeAcc [i ]);
2129
+ SMUQ10_ROUND (GET_METRIC_FIELD ( XgmiWriteDataSizeAcc ) [i ]);
2120
2130
}
2121
2131
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 ) );
2124
2134
2125
- gpu_metrics -> firmware_timestamp = metrics -> Timestamp ;
2135
+ gpu_metrics -> firmware_timestamp = GET_METRIC_FIELD ( Timestamp ) ;
2126
2136
2127
2137
* table = (void * )gpu_metrics ;
2128
- kfree (metrics );
2138
+ kfree (metrics_x );
2129
2139
2130
2140
return sizeof (* gpu_metrics );
2131
2141
}
0 commit comments