Commit 1bec2f27 authored by Lijo Lazar's avatar Lijo Lazar Committed by Alex Deucher
Browse files

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: default avatarLijo Lazar <lijo.lazar@amd.com>
Reviewed-by: default avatarAsad Kamal <asad.kamal@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent a29e067b
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -187,6 +187,31 @@ int smu_v13_0_12_get_max_metrics_size(void)
	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)
{
	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)
			smu->adev->firmware.pldm_version =
				static_metrics->pldmVersion[0];
		smu_v13_0_12_init_xgmi_data(smu, static_metrics);
		pptable->Init = true;
	}

+2 −2
Original line number Diff line number Diff line
@@ -690,8 +690,8 @@ static int smu_v13_0_6_get_allowed_feature_mask(struct smu_context *smu,
	return 0;
}

static int smu_v13_0_6_get_metrics_table(struct smu_context *smu,
					 void *metrics_table, bool bypass_cache)
int smu_v13_0_6_get_metrics_table(struct smu_context *smu, void *metrics_table,
				  bool bypass_cache)
{
	struct smu_table_context *smu_table = &smu->smu_table;
	uint32_t table_size = smu_table->tables[SMU_TABLE_SMU_METRICS].size;
+2 −0
Original line number Diff line number Diff line
@@ -74,6 +74,8 @@ enum smu_v13_0_6_caps {
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);
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);
int smu_v13_0_12_get_max_metrics_size(void);