@@ -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
249251struct 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,
431435static 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