mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 00:22:00 +02:00
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>
This commit is contained in:
parent
a29e067bd3
commit
1bec2f2707
|
|
@ -187,6 +187,31 @@ int smu_v13_0_12_get_max_metrics_size(void)
|
||||||
return max(sizeof(StaticMetricsTable_t), sizeof(MetricsTable_t));
|
return max(sizeof(StaticMetricsTable_t), sizeof(MetricsTable_t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void smu_v13_0_12_init_xgmi_data(struct smu_context *smu,
|
||||||
|
StaticMetricsTable_t *static_metrics)
|
||||||
|
{
|
||||||
|
struct smu_table_context *smu_table = &smu->smu_table;
|
||||||
|
uint16_t max_speed;
|
||||||
|
uint8_t max_width;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (smu_table->tables[SMU_TABLE_SMU_METRICS].version >= 0x13) {
|
||||||
|
max_width = (uint8_t)static_metrics->MaxXgmiWidth;
|
||||||
|
max_speed = (uint16_t)static_metrics->MaxXgmiBitrate;
|
||||||
|
ret = 0;
|
||||||
|
} else {
|
||||||
|
MetricsTable_t *metrics = (MetricsTable_t *)smu_table->metrics_table;
|
||||||
|
|
||||||
|
ret = smu_v13_0_6_get_metrics_table(smu, NULL, true);
|
||||||
|
if (!ret) {
|
||||||
|
max_width = (uint8_t)metrics->XgmiWidth;
|
||||||
|
max_speed = (uint16_t)metrics->XgmiBitrate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!ret)
|
||||||
|
amgpu_xgmi_set_max_speed_width(smu->adev, max_speed, max_width);
|
||||||
|
}
|
||||||
|
|
||||||
int smu_v13_0_12_setup_driver_pptable(struct smu_context *smu)
|
int smu_v13_0_12_setup_driver_pptable(struct smu_context *smu)
|
||||||
{
|
{
|
||||||
struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
|
struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context;
|
||||||
|
|
@ -249,6 +274,7 @@ int smu_v13_0_12_setup_driver_pptable(struct smu_context *smu)
|
||||||
static_metrics->pldmVersion[0] != 0xFFFFFFFF)
|
static_metrics->pldmVersion[0] != 0xFFFFFFFF)
|
||||||
smu->adev->firmware.pldm_version =
|
smu->adev->firmware.pldm_version =
|
||||||
static_metrics->pldmVersion[0];
|
static_metrics->pldmVersion[0];
|
||||||
|
smu_v13_0_12_init_xgmi_data(smu, static_metrics);
|
||||||
pptable->Init = true;
|
pptable->Init = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -690,8 +690,8 @@ static int smu_v13_0_6_get_allowed_feature_mask(struct smu_context *smu,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int smu_v13_0_6_get_metrics_table(struct smu_context *smu,
|
int smu_v13_0_6_get_metrics_table(struct smu_context *smu, void *metrics_table,
|
||||||
void *metrics_table, bool bypass_cache)
|
bool bypass_cache)
|
||||||
{
|
{
|
||||||
struct smu_table_context *smu_table = &smu->smu_table;
|
struct smu_table_context *smu_table = &smu->smu_table;
|
||||||
uint32_t table_size = smu_table->tables[SMU_TABLE_SMU_METRICS].size;
|
uint32_t table_size = smu_table->tables[SMU_TABLE_SMU_METRICS].size;
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,8 @@ enum smu_v13_0_6_caps {
|
||||||
extern void smu_v13_0_6_set_ppt_funcs(struct smu_context *smu);
|
extern void smu_v13_0_6_set_ppt_funcs(struct smu_context *smu);
|
||||||
bool smu_v13_0_6_cap_supported(struct smu_context *smu, enum smu_v13_0_6_caps cap);
|
bool smu_v13_0_6_cap_supported(struct smu_context *smu, enum smu_v13_0_6_caps cap);
|
||||||
int smu_v13_0_6_get_static_metrics_table(struct smu_context *smu);
|
int smu_v13_0_6_get_static_metrics_table(struct smu_context *smu);
|
||||||
|
int smu_v13_0_6_get_metrics_table(struct smu_context *smu, void *metrics_table,
|
||||||
|
bool bypass_cache);
|
||||||
|
|
||||||
bool smu_v13_0_12_is_dpm_running(struct smu_context *smu);
|
bool smu_v13_0_12_is_dpm_running(struct smu_context *smu);
|
||||||
int smu_v13_0_12_get_max_metrics_size(void);
|
int smu_v13_0_12_get_max_metrics_size(void);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user