[PATCH 2/2] drm/amd/pm: modify the fine grain tuning function for vangogh

Huang Rui ray.huang at amd.com
Thu Jan 14 02:57:34 UTC 2021


On Wed, Jan 13, 2021 at 07:22:04PM +0800, Du, Xiaojian wrote:
> This patch is to modify the fine grain tuning function for vangogh.
> It is risky to add two new flags to common smu struct.
> So this patch uses the existing old flag to make the two sysfs files
> work separately -- "power_dpm_force_performance_level" and
> "pp_od_clk_voltage".
> Only the power_dpm_force_performance_level is switched to "manual"
> mode, the fine grain tuning function will be started.
> In other mode, including "high","low","min_sclk","min_mclk",
> "standard" and "peak", the fine grain tuning function will be shut down,
> and the frequency range of gfx and cpu clock will be restored the
> default values.
> 
> Signed-off-by: Xiaojian Du <Xiaojian.Du at amd.com>

Series are Reviewed-by: Huang Rui <ray.huang at amd.com>

> ---
>  drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h       |  3 --
>  drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c     |  2 -
>  .../gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c  | 52 +++++++++++++++++--
>  3 files changed, 48 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h
> index 277559e80961..25ee9f51813b 100644
> --- a/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h
> +++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_smu.h
> @@ -466,9 +466,6 @@ struct smu_context
>  	uint32_t gfx_actual_hard_min_freq;
>  	uint32_t gfx_actual_soft_max_freq;
>  
> -	bool fine_grain_enabled;
> -	bool fine_grain_started;
> -
>  	uint32_t cpu_default_soft_min_freq;
>  	uint32_t cpu_default_soft_max_freq;
>  	uint32_t cpu_actual_soft_min_freq;
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
> index 976a9105aecc..7fe61ad3ed10 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
> +++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
> @@ -419,8 +419,6 @@ static int smu_set_funcs(struct amdgpu_device *adev)
>  		break;
>  	case CHIP_VANGOGH:
>  		vangogh_set_ppt_funcs(smu);
> -		/* enable the OD by default to allow the fine grain tuning function */
> -		smu->od_enabled = true;
>  		break;
>  	default:
>  		return -EINVAL;
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
> index b49044825680..3e32b223d47b 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
> +++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c
> @@ -438,6 +438,7 @@ static int vangogh_print_fine_grain_clk(struct smu_context *smu,
>  {
>  	DpmClocks_t *clk_table = smu->smu_table.clocks_table;
>  	SmuMetrics_t metrics;
> +	struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);
>  	int i, size = 0, ret = 0;
>  	uint32_t cur_value = 0, value = 0, count = 0;
>  	bool cur_value_match_level = false;
> @@ -450,7 +451,7 @@ static int vangogh_print_fine_grain_clk(struct smu_context *smu,
>  
>  	switch (clk_type) {
>  	case SMU_OD_SCLK:
> -		if (smu->od_enabled) {
> +		if (smu_dpm_ctx->dpm_level == AMD_DPM_FORCED_LEVEL_MANUAL) {
>  			size = sprintf(buf, "%s:\n", "OD_SCLK");
>  			size += sprintf(buf + size, "0: %10uMhz\n",
>  			(smu->gfx_actual_hard_min_freq > 0) ? smu->gfx_actual_hard_min_freq : smu->gfx_default_hard_min_freq);
> @@ -459,7 +460,7 @@ static int vangogh_print_fine_grain_clk(struct smu_context *smu,
>  		}
>  		break;
>  	case SMU_OD_CCLK:
> -		if (smu->od_enabled) {
> +		if (smu_dpm_ctx->dpm_level == AMD_DPM_FORCED_LEVEL_MANUAL) {
>  			size = sprintf(buf, "CCLK_RANGE in Core%d:\n",  smu->cpu_core_id_select);
>  			size += sprintf(buf + size, "0: %10uMhz\n",
>  			(smu->cpu_actual_soft_min_freq > 0) ? smu->cpu_actual_soft_min_freq : smu->cpu_default_soft_min_freq);
> @@ -468,7 +469,7 @@ static int vangogh_print_fine_grain_clk(struct smu_context *smu,
>  		}
>  		break;
>  	case SMU_OD_RANGE:
> -		if (smu->od_enabled) {
> +		if (smu_dpm_ctx->dpm_level == AMD_DPM_FORCED_LEVEL_MANUAL) {
>  			size = sprintf(buf, "%s:\n", "OD_RANGE");
>  			size += sprintf(buf + size, "SCLK: %7uMhz %10uMhz\n",
>  				smu->gfx_default_hard_min_freq, smu->gfx_default_soft_max_freq);
> @@ -1127,15 +1128,39 @@ static int vangogh_set_performance_level(struct smu_context *smu,
>  
>  	switch (level) {
>  	case AMD_DPM_FORCED_LEVEL_HIGH:
> +		smu->gfx_actual_hard_min_freq = smu->gfx_default_hard_min_freq;
> +		smu->gfx_actual_soft_max_freq = smu->gfx_default_soft_max_freq;
> +
> +		smu->cpu_actual_soft_min_freq = smu->cpu_default_soft_min_freq;
> +		smu->cpu_actual_soft_max_freq = smu->cpu_default_soft_max_freq;
> +
>  		ret = vangogh_force_dpm_limit_value(smu, true);
>  		break;
>  	case AMD_DPM_FORCED_LEVEL_LOW:
> +		smu->gfx_actual_hard_min_freq = smu->gfx_default_hard_min_freq;
> +		smu->gfx_actual_soft_max_freq = smu->gfx_default_soft_max_freq;
> +
> +		smu->cpu_actual_soft_min_freq = smu->cpu_default_soft_min_freq;
> +		smu->cpu_actual_soft_max_freq = smu->cpu_default_soft_max_freq;
> +
>  		ret = vangogh_force_dpm_limit_value(smu, false);
>  		break;
>  	case AMD_DPM_FORCED_LEVEL_AUTO:
> +		smu->gfx_actual_hard_min_freq = smu->gfx_default_hard_min_freq;
> +		smu->gfx_actual_soft_max_freq = smu->gfx_default_soft_max_freq;
> +
> +		smu->cpu_actual_soft_min_freq = smu->cpu_default_soft_min_freq;
> +		smu->cpu_actual_soft_max_freq = smu->cpu_default_soft_max_freq;
> +
>  		ret = vangogh_unforce_dpm_levels(smu);
>  		break;
>  	case AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD:
> +		smu->gfx_actual_hard_min_freq = smu->gfx_default_hard_min_freq;
> +		smu->gfx_actual_soft_max_freq = smu->gfx_default_soft_max_freq;
> +
> +		smu->cpu_actual_soft_min_freq = smu->cpu_default_soft_min_freq;
> +		smu->cpu_actual_soft_max_freq = smu->cpu_default_soft_max_freq;
> +
>  		ret = smu_cmn_send_smc_msg_with_param(smu,
>  					SMU_MSG_SetHardMinGfxClk,
>  					VANGOGH_UMD_PSTATE_STANDARD_GFXCLK, NULL);
> @@ -1165,6 +1190,12 @@ static int vangogh_set_performance_level(struct smu_context *smu,
>  
>  		break;
>  	case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK:
> +		smu->gfx_actual_hard_min_freq = smu->gfx_default_hard_min_freq;
> +		smu->gfx_actual_soft_max_freq = smu->gfx_default_soft_max_freq;
> +
> +		smu->cpu_actual_soft_min_freq = smu->cpu_default_soft_min_freq;
> +		smu->cpu_actual_soft_max_freq = smu->cpu_default_soft_max_freq;
> +
>  		ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetHardMinVcn,
>  								VANGOGH_UMD_PSTATE_PEAK_DCLK, NULL);
>  		if (ret)
> @@ -1176,6 +1207,12 @@ static int vangogh_set_performance_level(struct smu_context *smu,
>  			return ret;
>  		break;
>  	case AMD_DPM_FORCED_LEVEL_PROFILE_MIN_MCLK:
> +		smu->gfx_actual_hard_min_freq = smu->gfx_default_hard_min_freq;
> +		smu->gfx_actual_soft_max_freq = smu->gfx_default_soft_max_freq;
> +
> +		smu->cpu_actual_soft_min_freq = smu->cpu_default_soft_min_freq;
> +		smu->cpu_actual_soft_max_freq = smu->cpu_default_soft_max_freq;
> +
>  		ret = vangogh_get_profiling_clk_mask(smu, level,
>  							NULL,
>  							NULL,
> @@ -1189,6 +1226,12 @@ static int vangogh_set_performance_level(struct smu_context *smu,
>  		vangogh_force_clk_levels(smu, SMU_FCLK, 1 << fclk_mask);
>  		break;
>  	case AMD_DPM_FORCED_LEVEL_PROFILE_PEAK:
> +		smu->gfx_actual_hard_min_freq = smu->gfx_default_hard_min_freq;
> +		smu->gfx_actual_soft_max_freq = smu->gfx_default_soft_max_freq;
> +
> +		smu->cpu_actual_soft_min_freq = smu->cpu_default_soft_min_freq;
> +		smu->cpu_actual_soft_max_freq = smu->cpu_default_soft_max_freq;
> +
>  		ret = smu_cmn_send_smc_msg_with_param(smu, SMU_MSG_SetHardMinGfxClk,
>  				VANGOGH_UMD_PSTATE_PEAK_GFXCLK, NULL);
>  		if (ret)
> @@ -1401,8 +1444,9 @@ static int vangogh_od_edit_dpm_table(struct smu_context *smu, enum PP_OD_DPM_TAB
>  {
>  	int ret = 0;
>  	int i;
> +	struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);
>  
> -	if (!smu->od_enabled) {
> +	if (!(smu_dpm_ctx->dpm_level == AMD_DPM_FORCED_LEVEL_MANUAL)) {
>  		dev_warn(smu->adev->dev, "Fine grain is not enabled!\n");
>  		return -EINVAL;
>  	}
> -- 
> 2.17.1
> 


More information about the amd-gfx mailing list