[PATCH 4/4] drm/amd/powerplay: put dpm frequency setting common code in smu_v11_0.c
Alex Deucher
alexdeucher at gmail.com
Thu Jul 9 20:32:31 UTC 2020
On Thu, Jul 2, 2020 at 5:47 AM Evan Quan <evan.quan at amd.com> wrote:
>
> As designed the common code shared among all smu v11 ASCIs go to
> smu_v11_0.c. This helps to maintain clear code layers.
>
> Change-Id: I1f848eba0b6b56f8b5ef6f0888ee6955ba1d2070
> Signed-off-by: Evan Quan <evan.quan at amd.com>
Series is:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> drivers/gpu/drm/amd/powerplay/amdgpu_smu.c | 65 --------------
> .../gpu/drm/amd/powerplay/inc/amdgpu_smu.h | 6 --
> drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h | 14 ++++
> drivers/gpu/drm/amd/powerplay/navi10_ppt.c | 38 +++++----
> .../drm/amd/powerplay/sienna_cichlid_ppt.c | 18 ++--
> drivers/gpu/drm/amd/powerplay/smu_v11_0.c | 84 +++++++++++++++++++
> 6 files changed, 129 insertions(+), 96 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> index 95685bb9582a..6839faaab611 100644
> --- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> +++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> @@ -284,71 +284,6 @@ int smu_get_dpm_freq_range(struct smu_context *smu,
> return ret;
> }
>
> -int smu_get_dpm_freq_by_index(struct smu_context *smu, enum smu_clk_type clk_type,
> - uint16_t level, uint32_t *value)
> -{
> - int ret = 0, clk_id = 0;
> - uint32_t param;
> -
> - if (!value)
> - return -EINVAL;
> -
> - if (!smu_clk_dpm_is_enabled(smu, clk_type))
> - return 0;
> -
> - clk_id = smu_clk_get_index(smu, clk_type);
> - if (clk_id < 0)
> - return clk_id;
> -
> - param = (uint32_t)(((clk_id & 0xffff) << 16) | (level & 0xffff));
> -
> - ret = smu_send_smc_msg_with_param(smu, SMU_MSG_GetDpmFreqByIndex,
> - param, value);
> - if (ret)
> - return ret;
> -
> - /* BIT31: 0 - Fine grained DPM, 1 - Dicrete DPM
> - * now, we un-support it */
> - *value = *value & 0x7fffffff;
> -
> - return ret;
> -}
> -
> -int smu_get_dpm_level_count(struct smu_context *smu, enum smu_clk_type clk_type,
> - uint32_t *value)
> -{
> - return smu_get_dpm_freq_by_index(smu, clk_type, 0xff, value);
> -}
> -
> -int smu_get_dpm_level_range(struct smu_context *smu, enum smu_clk_type clk_type,
> - uint32_t *min_value, uint32_t *max_value)
> -{
> - int ret = 0;
> - uint32_t level_count = 0;
> -
> - if (!min_value && !max_value)
> - return -EINVAL;
> -
> - if (min_value) {
> - /* by default, level 0 clock value as min value */
> - ret = smu_get_dpm_freq_by_index(smu, clk_type, 0, min_value);
> - if (ret)
> - return ret;
> - }
> -
> - if (max_value) {
> - ret = smu_get_dpm_level_count(smu, clk_type, &level_count);
> - if (ret)
> - return ret;
> -
> - ret = smu_get_dpm_freq_by_index(smu, clk_type, level_count - 1, max_value);
> - if (ret)
> - return ret;
> - }
> -
> - return ret;
> -}
> -
> bool smu_clk_dpm_is_enabled(struct smu_context *smu, enum smu_clk_type clk_type)
> {
> enum smu_feature_mask feature_id = 0;
> diff --git a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
> index ae16cc4c2b2d..66912884f093 100644
> --- a/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
> +++ b/drivers/gpu/drm/amd/powerplay/inc/amdgpu_smu.h
> @@ -715,16 +715,10 @@ int smu_switch_power_profile(struct smu_context *smu,
> enum PP_SMC_POWER_PROFILE type,
> bool en);
> int smu_get_smc_version(struct smu_context *smu, uint32_t *if_version, uint32_t *smu_version);
> -int smu_get_dpm_freq_by_index(struct smu_context *smu, enum smu_clk_type clk_type,
> - uint16_t level, uint32_t *value);
> -int smu_get_dpm_level_count(struct smu_context *smu, enum smu_clk_type clk_type,
> - uint32_t *value);
> int smu_get_dpm_freq_range(struct smu_context *smu, enum smu_clk_type clk_type,
> uint32_t *min, uint32_t *max);
> int smu_set_soft_freq_range(struct smu_context *smu, enum smu_clk_type clk_type,
> uint32_t min, uint32_t max);
> -int smu_get_dpm_level_range(struct smu_context *smu, enum smu_clk_type clk_type,
> - uint32_t *min_value, uint32_t *max_value);
> enum amd_dpm_forced_level smu_get_performance_level(struct smu_context *smu);
> int smu_force_performance_level(struct smu_context *smu, enum amd_dpm_forced_level level);
> int smu_set_display_count(struct smu_context *smu, uint32_t count);
> diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
> index 070f1f0f9926..3d746b75396e 100644
> --- a/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
> +++ b/drivers/gpu/drm/amd/powerplay/inc/smu_v11_0.h
> @@ -265,4 +265,18 @@ int smu_v11_0_set_performance_level(struct smu_context *smu,
> int smu_v11_0_set_power_source(struct smu_context *smu,
> enum smu_power_src_type power_src);
>
> +int smu_v11_0_get_dpm_freq_by_index(struct smu_context *smu,
> + enum smu_clk_type clk_type,
> + uint16_t level,
> + uint32_t *value);
> +
> +int smu_v11_0_get_dpm_level_count(struct smu_context *smu,
> + enum smu_clk_type clk_type,
> + uint32_t *value);
> +
> +int smu_v11_0_get_dpm_level_range(struct smu_context *smu,
> + enum smu_clk_type clk_type,
> + uint32_t *min_value,
> + uint32_t *max_value);
> +
> #endif
> diff --git a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
> index d88b2f200d94..d96e8334b5e2 100644
> --- a/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
> +++ b/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
> @@ -881,13 +881,13 @@ static int navi10_print_clk_levels(struct smu_context *smu,
> if (ret)
> return size;
>
> - ret = smu_get_dpm_level_count(smu, clk_type, &count);
> + ret = smu_v11_0_get_dpm_level_count(smu, clk_type, &count);
> if (ret)
> return size;
>
> if (!navi10_is_support_fine_grained_dpm(smu, clk_type)) {
> for (i = 0; i < count; i++) {
> - ret = smu_get_dpm_freq_by_index(smu, clk_type, i, &value);
> + ret = smu_v11_0_get_dpm_freq_by_index(smu, clk_type, i, &value);
> if (ret)
> return size;
>
> @@ -895,10 +895,10 @@ static int navi10_print_clk_levels(struct smu_context *smu,
> cur_value == value ? "*" : "");
> }
> } else {
> - ret = smu_get_dpm_freq_by_index(smu, clk_type, 0, &freq_values[0]);
> + ret = smu_v11_0_get_dpm_freq_by_index(smu, clk_type, 0, &freq_values[0]);
> if (ret)
> return size;
> - ret = smu_get_dpm_freq_by_index(smu, clk_type, count - 1, &freq_values[2]);
> + ret = smu_v11_0_get_dpm_freq_by_index(smu, clk_type, count - 1, &freq_values[2]);
> if (ret)
> return size;
>
> @@ -1058,11 +1058,11 @@ static int navi10_force_clk_levels(struct smu_context *smu,
> soft_min_level = (soft_min_level >= 1 ? 1 : 0);
> }
>
> - ret = smu_get_dpm_freq_by_index(smu, clk_type, soft_min_level, &min_freq);
> + ret = smu_v11_0_get_dpm_freq_by_index(smu, clk_type, soft_min_level, &min_freq);
> if (ret)
> return size;
>
> - ret = smu_get_dpm_freq_by_index(smu, clk_type, soft_max_level, &max_freq);
> + ret = smu_v11_0_get_dpm_freq_by_index(smu, clk_type, soft_max_level, &max_freq);
> if (ret)
> return size;
>
> @@ -1110,7 +1110,7 @@ static int navi10_get_clock_by_type_with_latency(struct smu_context *smu,
> case SMU_SOCCLK:
> case SMU_MCLK:
> case SMU_UCLK:
> - ret = smu_get_dpm_level_count(smu, clk_type, &level_count);
> + ret = smu_v11_0_get_dpm_level_count(smu, clk_type, &level_count);
> if (ret)
> return ret;
>
> @@ -1118,7 +1118,7 @@ static int navi10_get_clock_by_type_with_latency(struct smu_context *smu,
> clocks->num_levels = level_count;
>
> for (i = 0; i < level_count; i++) {
> - ret = smu_get_dpm_freq_by_index(smu, clk_type, i, &freq);
> + ret = smu_v11_0_get_dpm_freq_by_index(smu, clk_type, i, &freq);
> if (ret)
> return ret;
>
> @@ -1493,21 +1493,21 @@ static int navi10_get_profiling_clk_mask(struct smu_context *smu,
> *mclk_mask = 0;
> } else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) {
> if(sclk_mask) {
> - ret = smu_get_dpm_level_count(smu, SMU_SCLK, &level_count);
> + ret = smu_v11_0_get_dpm_level_count(smu, SMU_SCLK, &level_count);
> if (ret)
> return ret;
> *sclk_mask = level_count - 1;
> }
>
> if(mclk_mask) {
> - ret = smu_get_dpm_level_count(smu, SMU_MCLK, &level_count);
> + ret = smu_v11_0_get_dpm_level_count(smu, SMU_MCLK, &level_count);
> if (ret)
> return ret;
> *mclk_mask = level_count - 1;
> }
>
> if(soc_mask) {
> - ret = smu_get_dpm_level_count(smu, SMU_SOCCLK, &level_count);
> + ret = smu_v11_0_get_dpm_level_count(smu, SMU_SOCCLK, &level_count);
> if (ret)
> return ret;
> *soc_mask = level_count - 1;
> @@ -1831,12 +1831,18 @@ static int navi10_set_peak_performance_level(struct smu_context *smu)
> sclk_freq = NAVI12_UMD_PSTATE_PEAK_GFXCLK;
> break;
> default:
> - ret = smu_get_dpm_level_range(smu, SMU_SCLK, NULL, &sclk_freq);
> + ret = smu_v11_0_get_dpm_level_range(smu,
> + SMU_SCLK,
> + NULL,
> + &sclk_freq);
> if (ret)
> return ret;
> }
>
> - ret = smu_get_dpm_level_range(smu, SMU_UCLK, NULL, &uclk_freq);
> + ret = smu_v11_0_get_dpm_level_range(smu,
> + SMU_UCLK,
> + NULL,
> + &uclk_freq);
> if (ret)
> return ret;
>
> @@ -2331,15 +2337,15 @@ static int navi10_disable_umc_cdr_12gbps_workaround(struct smu_context *smu)
> if (smu_version < 0x2A3200)
> return 0;
>
> - ret = smu_get_dpm_level_count(smu, SMU_UCLK, &uclk_count);
> + ret = smu_v11_0_get_dpm_level_count(smu, SMU_UCLK, &uclk_count);
> if (ret)
> return ret;
>
> - ret = smu_get_dpm_freq_by_index(smu, SMU_UCLK, (uint16_t)0, &uclk_min);
> + ret = smu_v11_0_get_dpm_freq_by_index(smu, SMU_UCLK, (uint16_t)0, &uclk_min);
> if (ret)
> return ret;
>
> - ret = smu_get_dpm_freq_by_index(smu, SMU_UCLK, (uint16_t)(uclk_count - 1), &uclk_max);
> + ret = smu_v11_0_get_dpm_freq_by_index(smu, SMU_UCLK, (uint16_t)(uclk_count - 1), &uclk_max);
> if (ret)
> return ret;
>
> diff --git a/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
> index dfe192ce33ab..f2bbe56798d7 100644
> --- a/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
> +++ b/drivers/gpu/drm/amd/powerplay/sienna_cichlid_ppt.c
> @@ -789,13 +789,13 @@ static int sienna_cichlid_print_clk_levels(struct smu_context *smu,
> if ((clk_type == SMU_GFXCLK) || (clk_type == SMU_SCLK))
> amdgpu_gfx_off_ctrl(adev, false);
>
> - ret = smu_get_dpm_level_count(smu, clk_type, &count);
> + ret = smu_v11_0_get_dpm_level_count(smu, clk_type, &count);
> if (ret)
> goto print_clk_out;
>
> if (!sienna_cichlid_is_support_fine_grained_dpm(smu, clk_type)) {
> for (i = 0; i < count; i++) {
> - ret = smu_get_dpm_freq_by_index(smu, clk_type, i, &value);
> + ret = smu_v11_0_get_dpm_freq_by_index(smu, clk_type, i, &value);
> if (ret)
> goto print_clk_out;
>
> @@ -803,10 +803,10 @@ static int sienna_cichlid_print_clk_levels(struct smu_context *smu,
> cur_value == value ? "*" : "");
> }
> } else {
> - ret = smu_get_dpm_freq_by_index(smu, clk_type, 0, &freq_values[0]);
> + ret = smu_v11_0_get_dpm_freq_by_index(smu, clk_type, 0, &freq_values[0]);
> if (ret)
> goto print_clk_out;
> - ret = smu_get_dpm_freq_by_index(smu, clk_type, count - 1, &freq_values[2]);
> + ret = smu_v11_0_get_dpm_freq_by_index(smu, clk_type, count - 1, &freq_values[2]);
> if (ret)
> goto print_clk_out;
>
> @@ -901,11 +901,11 @@ static int sienna_cichlid_force_clk_levels(struct smu_context *smu,
> soft_min_level = (soft_min_level >= 1 ? 1 : 0);
> }
>
> - ret = smu_get_dpm_freq_by_index(smu, clk_type, soft_min_level, &min_freq);
> + ret = smu_v11_0_get_dpm_freq_by_index(smu, clk_type, soft_min_level, &min_freq);
> if (ret)
> goto forec_level_out;
>
> - ret = smu_get_dpm_freq_by_index(smu, clk_type, soft_max_level, &max_freq);
> + ret = smu_v11_0_get_dpm_freq_by_index(smu, clk_type, soft_max_level, &max_freq);
> if (ret)
> goto forec_level_out;
>
> @@ -1312,7 +1312,7 @@ static int sienna_cichlid_get_profiling_clk_mask(struct smu_context *smu,
> } else if (level == AMD_DPM_FORCED_LEVEL_PROFILE_PEAK) {
> if(sclk_mask) {
> amdgpu_gfx_off_ctrl(adev, false);
> - ret = smu_get_dpm_level_count(smu, SMU_SCLK, &level_count);
> + ret = smu_v11_0_get_dpm_level_count(smu, SMU_SCLK, &level_count);
> amdgpu_gfx_off_ctrl(adev, true);
> if (ret)
> return ret;
> @@ -1320,14 +1320,14 @@ static int sienna_cichlid_get_profiling_clk_mask(struct smu_context *smu,
> }
>
> if(mclk_mask) {
> - ret = smu_get_dpm_level_count(smu, SMU_MCLK, &level_count);
> + ret = smu_v11_0_get_dpm_level_count(smu, SMU_MCLK, &level_count);
> if (ret)
> return ret;
> *mclk_mask = level_count - 1;
> }
>
> if(soc_mask) {
> - ret = smu_get_dpm_level_count(smu, SMU_SOCCLK, &level_count);
> + ret = smu_v11_0_get_dpm_level_count(smu, SMU_SOCCLK, &level_count);
> if (ret)
> return ret;
> *soc_mask = level_count - 1;
> diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
> index 6c8b4230cbe2..03be59492af1 100644
> --- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
> +++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
> @@ -1905,3 +1905,87 @@ int smu_v11_0_set_power_source(struct smu_context *smu,
> NULL);
> }
>
> +int smu_v11_0_get_dpm_freq_by_index(struct smu_context *smu,
> + enum smu_clk_type clk_type,
> + uint16_t level,
> + uint32_t *value)
> +{
> + int ret = 0, clk_id = 0;
> + uint32_t param;
> +
> + if (!value)
> + return -EINVAL;
> +
> + if (!smu_clk_dpm_is_enabled(smu, clk_type))
> + return 0;
> +
> + clk_id = smu_clk_get_index(smu, clk_type);
> + if (clk_id < 0)
> + return clk_id;
> +
> + param = (uint32_t)(((clk_id & 0xffff) << 16) | (level & 0xffff));
> +
> + ret = smu_send_smc_msg_with_param(smu,
> + SMU_MSG_GetDpmFreqByIndex,
> + param,
> + value);
> + if (ret)
> + return ret;
> +
> + /*
> + * BIT31: 0 - Fine grained DPM, 1 - Dicrete DPM
> + * now, we un-support it
> + */
> + *value = *value & 0x7fffffff;
> +
> + return ret;
> +}
> +
> +int smu_v11_0_get_dpm_level_count(struct smu_context *smu,
> + enum smu_clk_type clk_type,
> + uint32_t *value)
> +{
> + return smu_v11_0_get_dpm_freq_by_index(smu,
> + clk_type,
> + 0xff,
> + value);
> +}
> +
> +int smu_v11_0_get_dpm_level_range(struct smu_context *smu,
> + enum smu_clk_type clk_type,
> + uint32_t *min_value,
> + uint32_t *max_value)
> +{
> + uint32_t level_count = 0;
> + int ret = 0;
> +
> + if (!min_value && !max_value)
> + return -EINVAL;
> +
> + if (min_value) {
> + /* by default, level 0 clock value as min value */
> + ret = smu_v11_0_get_dpm_freq_by_index(smu,
> + clk_type,
> + 0,
> + min_value);
> + if (ret)
> + return ret;
> + }
> +
> + if (max_value) {
> + ret = smu_v11_0_get_dpm_level_count(smu,
> + clk_type,
> + &level_count);
> + if (ret)
> + return ret;
> +
> + ret = smu_v11_0_get_dpm_freq_by_index(smu,
> + clk_type,
> + level_count - 1,
> + max_value);
> + if (ret)
> + return ret;
> + }
> +
> + return ret;
> +}
> --
> 2.27.0
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list