Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/amd/pm: Fetch SMUv13.0.12 xgmi max speed/width

On SMU v13.0.12 SOCs, fetch the max values of xgmi speed/width from
firmware.

Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
Reviewed-by: Asad Kamal <asad.kamal@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Lijo Lazar and committed by
Alex Deucher
1bec2f27 a29e067b

+30 -2
+26
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
··· 187 187 return max(sizeof(StaticMetricsTable_t), sizeof(MetricsTable_t)); 188 188 } 189 189 190 + static void smu_v13_0_12_init_xgmi_data(struct smu_context *smu, 191 + StaticMetricsTable_t *static_metrics) 192 + { 193 + struct smu_table_context *smu_table = &smu->smu_table; 194 + uint16_t max_speed; 195 + uint8_t max_width; 196 + int ret; 197 + 198 + if (smu_table->tables[SMU_TABLE_SMU_METRICS].version >= 0x13) { 199 + max_width = (uint8_t)static_metrics->MaxXgmiWidth; 200 + max_speed = (uint16_t)static_metrics->MaxXgmiBitrate; 201 + ret = 0; 202 + } else { 203 + MetricsTable_t *metrics = (MetricsTable_t *)smu_table->metrics_table; 204 + 205 + ret = smu_v13_0_6_get_metrics_table(smu, NULL, true); 206 + if (!ret) { 207 + max_width = (uint8_t)metrics->XgmiWidth; 208 + max_speed = (uint16_t)metrics->XgmiBitrate; 209 + } 210 + } 211 + if (!ret) 212 + amgpu_xgmi_set_max_speed_width(smu->adev, max_speed, max_width); 213 + } 214 + 190 215 int smu_v13_0_12_setup_driver_pptable(struct smu_context *smu) 191 216 { 192 217 struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context; ··· 274 249 static_metrics->pldmVersion[0] != 0xFFFFFFFF) 275 250 smu->adev->firmware.pldm_version = 276 251 static_metrics->pldmVersion[0]; 252 + smu_v13_0_12_init_xgmi_data(smu, static_metrics); 277 253 pptable->Init = true; 278 254 } 279 255
+2 -2
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
··· 690 690 return 0; 691 691 } 692 692 693 - static int smu_v13_0_6_get_metrics_table(struct smu_context *smu, 694 - void *metrics_table, bool bypass_cache) 693 + int smu_v13_0_6_get_metrics_table(struct smu_context *smu, void *metrics_table, 694 + bool bypass_cache) 695 695 { 696 696 struct smu_table_context *smu_table = &smu->smu_table; 697 697 uint32_t table_size = smu_table->tables[SMU_TABLE_SMU_METRICS].size;
+2
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.h
··· 74 74 extern void smu_v13_0_6_set_ppt_funcs(struct smu_context *smu); 75 75 bool smu_v13_0_6_cap_supported(struct smu_context *smu, enum smu_v13_0_6_caps cap); 76 76 int smu_v13_0_6_get_static_metrics_table(struct smu_context *smu); 77 + int smu_v13_0_6_get_metrics_table(struct smu_context *smu, void *metrics_table, 78 + bool bypass_cache); 77 79 78 80 bool smu_v13_0_12_is_dpm_running(struct smu_context *smu); 79 81 int smu_v13_0_12_get_max_metrics_size(void);