Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 95868b8

Browse files
Evan Quanalexdeucher
authored andcommitted
drm/amd/powerplay: add Renoir support for gpu metrics export(V2)
Add Renoir gpu metrics export interface. V2: use memcpy to make code more compact Signed-off-by: Evan Quan <[email protected]> Reviewed-by: Alex Deucher <[email protected]> Acked-by: Nirmoy Das <[email protected]> Signed-off-by: Alex Deucher <[email protected]>
1 parent 8ca78a0 commit 95868b8

File tree

3 files changed

+91
-3
lines changed

3 files changed

+91
-3
lines changed

drivers/gpu/drm/amd/powerplay/inc/smu_v12_0.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,5 +60,7 @@ int smu_v12_0_set_soft_freq_limited_range(struct smu_context *smu, enum smu_clk_
6060

6161
int smu_v12_0_set_driver_table_location(struct smu_context *smu);
6262

63+
void smu_v12_0_init_gpu_metrics_v2_0(struct gpu_metrics_v2_0 *gpu_metrics);
64+
6365
#endif
6466
#endif

drivers/gpu/drm/amd/powerplay/renoir_ppt.c

Lines changed: 77 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,18 +166,32 @@ static int renoir_init_smc_tables(struct smu_context *smu)
166166

167167
smu_table->clocks_table = kzalloc(sizeof(DpmClocks_t), GFP_KERNEL);
168168
if (!smu_table->clocks_table)
169-
return -ENOMEM;
169+
goto err0_out;
170170

171171
smu_table->metrics_table = kzalloc(sizeof(SmuMetrics_t), GFP_KERNEL);
172172
if (!smu_table->metrics_table)
173-
return -ENOMEM;
173+
goto err1_out;
174174
smu_table->metrics_time = 0;
175175

176176
smu_table->watermarks_table = kzalloc(sizeof(Watermarks_t), GFP_KERNEL);
177177
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;
179184

180185
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;
181195
}
182196

183197
/**
@@ -995,6 +1009,65 @@ static bool renoir_is_dpm_running(struct smu_context *smu)
9951009

9961010
}
9971011

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+
9981071
static const struct pptable_funcs renoir_ppt_funcs = {
9991072
.set_power_state = NULL,
10001073
.print_clk_levels = renoir_print_clk_levels,
@@ -1029,6 +1102,7 @@ static const struct pptable_funcs renoir_ppt_funcs = {
10291102
.is_dpm_running = renoir_is_dpm_running,
10301103
.get_pp_feature_mask = smu_cmn_get_pp_feature_mask,
10311104
.set_pp_feature_mask = smu_cmn_set_pp_feature_mask,
1105+
.get_gpu_metrics = renoir_get_gpu_metrics,
10321106
};
10331107

10341108
void renoir_set_ppt_funcs(struct smu_context *smu)

drivers/gpu/drm/amd/powerplay/smu_v12_0.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,3 +274,15 @@ int smu_v12_0_set_driver_table_location(struct smu_context *smu)
274274

275275
return ret;
276276
}
277+
278+
void smu_v12_0_init_gpu_metrics_v2_0(struct gpu_metrics_v2_0 *gpu_metrics)
279+
{
280+
memset(gpu_metrics, 0xFF, sizeof(struct gpu_metrics_v2_0));
281+
282+
gpu_metrics->common_header.structure_size =
283+
sizeof(struct gpu_metrics_v2_0);
284+
gpu_metrics->common_header.format_revision = 2;
285+
gpu_metrics->common_header.content_revision = 0;
286+
287+
gpu_metrics->system_clock_counter = ktime_get_boottime_ns();
288+
}

0 commit comments

Comments
 (0)