@@ -166,18 +166,32 @@ static int renoir_init_smc_tables(struct smu_context *smu)
166
166
167
167
smu_table -> clocks_table = kzalloc (sizeof (DpmClocks_t ), GFP_KERNEL );
168
168
if (!smu_table -> clocks_table )
169
- return - ENOMEM ;
169
+ goto err0_out ;
170
170
171
171
smu_table -> metrics_table = kzalloc (sizeof (SmuMetrics_t ), GFP_KERNEL );
172
172
if (!smu_table -> metrics_table )
173
- return - ENOMEM ;
173
+ goto err1_out ;
174
174
smu_table -> metrics_time = 0 ;
175
175
176
176
smu_table -> watermarks_table = kzalloc (sizeof (Watermarks_t ), GFP_KERNEL );
177
177
if (!smu_table -> watermarks_table )
178
- return - ENOMEM ;
178
+ goto err2_out ;
179
+
180
+ smu_table -> gpu_metrics_table_size = sizeof (struct gpu_metrics_v2_0 );
181
+ smu_table -> gpu_metrics_table = kzalloc (smu_table -> gpu_metrics_table_size , GFP_KERNEL );
182
+ if (!smu_table -> gpu_metrics_table )
183
+ goto err3_out ;
179
184
180
185
return 0 ;
186
+
187
+ err3_out :
188
+ kfree (smu_table -> watermarks_table );
189
+ err2_out :
190
+ kfree (smu_table -> metrics_table );
191
+ err1_out :
192
+ kfree (smu_table -> clocks_table );
193
+ err0_out :
194
+ return - ENOMEM ;
181
195
}
182
196
183
197
/**
@@ -995,6 +1009,65 @@ static bool renoir_is_dpm_running(struct smu_context *smu)
995
1009
996
1010
}
997
1011
1012
+ static ssize_t renoir_get_gpu_metrics (struct smu_context * smu ,
1013
+ void * * table )
1014
+ {
1015
+ struct smu_table_context * smu_table = & smu -> smu_table ;
1016
+ struct gpu_metrics_v2_0 * gpu_metrics =
1017
+ (struct gpu_metrics_v2_0 * )smu_table -> gpu_metrics_table ;
1018
+ SmuMetrics_t metrics ;
1019
+ int ret = 0 ;
1020
+
1021
+ ret = renoir_get_metrics_table (smu , & metrics );
1022
+ if (ret )
1023
+ return ret ;
1024
+
1025
+ smu_v12_0_init_gpu_metrics_v2_0 (gpu_metrics );
1026
+
1027
+ gpu_metrics -> temperature_gfx = metrics .GfxTemperature ;
1028
+ gpu_metrics -> temperature_soc = metrics .SocTemperature ;
1029
+ memcpy (& gpu_metrics -> temperature_core [0 ],
1030
+ & metrics .CoreTemperature [0 ],
1031
+ sizeof (uint16_t ) * 8 );
1032
+ gpu_metrics -> temperature_l3 [0 ] = metrics .L3Temperature [0 ];
1033
+ gpu_metrics -> temperature_l3 [1 ] = metrics .L3Temperature [1 ];
1034
+
1035
+ gpu_metrics -> average_gfx_activity = metrics .AverageGfxActivity ;
1036
+ gpu_metrics -> average_mm_activity = metrics .AverageUvdActivity ;
1037
+
1038
+ gpu_metrics -> average_socket_power = metrics .CurrentSocketPower ;
1039
+ gpu_metrics -> average_cpu_power = metrics .Power [0 ];
1040
+ gpu_metrics -> average_soc_power = metrics .Power [1 ];
1041
+ memcpy (& gpu_metrics -> average_core_power [0 ],
1042
+ & metrics .CorePower [0 ],
1043
+ sizeof (uint16_t ) * 8 );
1044
+
1045
+ gpu_metrics -> average_gfxclk_frequency = metrics .AverageGfxclkFrequency ;
1046
+ gpu_metrics -> average_socclk_frequency = metrics .AverageSocclkFrequency ;
1047
+ gpu_metrics -> average_fclk_frequency = metrics .AverageFclkFrequency ;
1048
+ gpu_metrics -> average_vclk_frequency = metrics .AverageVclkFrequency ;
1049
+
1050
+ gpu_metrics -> current_gfxclk = metrics .ClockFrequency [CLOCK_GFXCLK ];
1051
+ gpu_metrics -> current_socclk = metrics .ClockFrequency [CLOCK_SOCCLK ];
1052
+ gpu_metrics -> current_uclk = metrics .ClockFrequency [CLOCK_UMCCLK ];
1053
+ gpu_metrics -> current_fclk = metrics .ClockFrequency [CLOCK_FCLK ];
1054
+ gpu_metrics -> current_vclk = metrics .ClockFrequency [CLOCK_VCLK ];
1055
+ gpu_metrics -> current_dclk = metrics .ClockFrequency [CLOCK_DCLK ];
1056
+ memcpy (& gpu_metrics -> current_coreclk [0 ],
1057
+ & metrics .CoreFrequency [0 ],
1058
+ sizeof (uint16_t ) * 8 );
1059
+ gpu_metrics -> current_l3clk [0 ] = metrics .L3Frequency [0 ];
1060
+ gpu_metrics -> current_l3clk [1 ] = metrics .L3Frequency [1 ];
1061
+
1062
+ gpu_metrics -> throttle_status = metrics .ThrottlerStatus ;
1063
+
1064
+ gpu_metrics -> fan_pwm = metrics .FanPwm ;
1065
+
1066
+ * table = (void * )gpu_metrics ;
1067
+
1068
+ return sizeof (struct gpu_metrics_v2_0 );
1069
+ }
1070
+
998
1071
static const struct pptable_funcs renoir_ppt_funcs = {
999
1072
.set_power_state = NULL ,
1000
1073
.print_clk_levels = renoir_print_clk_levels ,
@@ -1029,6 +1102,7 @@ static const struct pptable_funcs renoir_ppt_funcs = {
1029
1102
.is_dpm_running = renoir_is_dpm_running ,
1030
1103
.get_pp_feature_mask = smu_cmn_get_pp_feature_mask ,
1031
1104
.set_pp_feature_mask = smu_cmn_set_pp_feature_mask ,
1105
+ .get_gpu_metrics = renoir_get_gpu_metrics ,
1032
1106
};
1033
1107
1034
1108
void renoir_set_ppt_funcs (struct smu_context * smu )
0 commit comments