diff options
| author | Lijo Lazar <lijo.lazar@amd.com> | 2025-07-12 12:10:48 +0530 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2025-07-16 16:14:37 -0400 | 
| commit | 9ad73536f8758e53e266c81f6f0fcbb90b349b6b (patch) | |
| tree | 78598e0cb655886fff33862b3a9233f07f4ca7df /drivers/gpu/drm/amd/pm | |
| parent | ec8fbb44b51ef5cf82ef09043387879276e9ba6b (diff) | |
drm/amd/pm: Get max/min frequency on aldebaran VF
PMFW interface to get max/min frequencies is not available on aldebaran
VFs. Use data, if available, in DPM tables to get the max/min
frequencies.
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>
Diffstat (limited to 'drivers/gpu/drm/amd/pm')
| -rw-r--r-- | drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c | 57 | 
1 files changed, 56 insertions, 1 deletions
| diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c index 6de653d2ed62..c63d2e28954d 100644 --- a/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c +++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c @@ -342,6 +342,61 @@ static int aldebaran_get_allowed_feature_mask(struct smu_context *smu,  	return 0;  } +static int aldebaran_get_dpm_ultimate_freq(struct smu_context *smu, +					   enum smu_clk_type clk_type, +					   uint32_t *min, uint32_t *max) +{ +	struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context; +	struct smu_13_0_dpm_table *dpm_table; +	uint32_t min_clk, max_clk; + +	if (amdgpu_sriov_vf(smu->adev)) { +		switch (clk_type) { +		case SMU_MCLK: +		case SMU_UCLK: +			dpm_table = &dpm_context->dpm_tables.uclk_table; +			break; +		case SMU_GFXCLK: +		case SMU_SCLK: +			dpm_table = &dpm_context->dpm_tables.gfx_table; +			break; +		case SMU_SOCCLK: +			dpm_table = &dpm_context->dpm_tables.soc_table; +			break; +		case SMU_FCLK: +			dpm_table = &dpm_context->dpm_tables.fclk_table; +			break; +		case SMU_VCLK: +			dpm_table = &dpm_context->dpm_tables.vclk_table; +			break; +		case SMU_DCLK: +			dpm_table = &dpm_context->dpm_tables.dclk_table; +			break; +		default: +			return -EINVAL; +		} + +		min_clk = dpm_table->min; +		max_clk = dpm_table->max; + +		if (min) { +			if (!min_clk) +				return -ENODATA; +			*min = min_clk; +		} +		if (max) { +			if (!max_clk) +				return -ENODATA; +			*max = max_clk; +		} + +	} else { +		return smu_v13_0_get_dpm_ultimate_freq(smu, clk_type, min, max); +	} + +	return 0; +} +  static int aldebaran_set_default_dpm_table(struct smu_context *smu)  {  	struct smu_13_0_dpm_context *dpm_context = smu->smu_dpm.dpm_context; @@ -2081,7 +2136,7 @@ static const struct pptable_funcs aldebaran_ppt_funcs = {  	.set_azalia_d3_pme = smu_v13_0_set_azalia_d3_pme,  	.get_max_sustainable_clocks_by_dc = smu_v13_0_get_max_sustainable_clocks_by_dc,  	.get_bamaco_support = aldebaran_get_bamaco_support, -	.get_dpm_ultimate_freq = smu_v13_0_get_dpm_ultimate_freq, +	.get_dpm_ultimate_freq = aldebaran_get_dpm_ultimate_freq,  	.set_soft_freq_limited_range = aldebaran_set_soft_freq_limited_range,  	.od_edit_dpm_table = aldebaran_usr_edit_dpm_table,  	.set_df_cstate = aldebaran_set_df_cstate, | 
