[PATCH] drm/amd/powerplay: retrieve the enabled feature mask from cache

Alex Deucher alexdeucher at gmail.com
Mon Dec 30 14:46:27 UTC 2019


On Mon, Dec 30, 2019 at 5:41 AM Evan Quan <evan.quan at amd.com> wrote:
>
> This is why those feature mask members designed for. And this
> can reduce the SMU workload.
>
> Change-Id: I2c6e12e945508f7b2fd79bc172efa68bc6150d05
> Signed-off-by: Evan Quan <evan.quan at amd.com>

Acked-by: Alex Deucher <alexander.deucher at amd.com>

> ---
>  drivers/gpu/drm/amd/powerplay/amdgpu_smu.c |  2 +-
>  drivers/gpu/drm/amd/powerplay/smu_v11_0.c  | 61 +++++++++++++---------
>  2 files changed, 36 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> index 4b686f0af538..290976f5f6c2 100644
> --- a/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> +++ b/drivers/gpu/drm/amd/powerplay/amdgpu_smu.c
> @@ -1313,7 +1313,7 @@ static int smu_hw_init(void *handle)
>
>  static int smu_stop_dpms(struct smu_context *smu)
>  {
> -       return smu_send_smc_msg(smu, SMU_MSG_DisableAllSmuFeatures);
> +       return smu_system_features_control(smu, false);
>  }
>
>  static int smu_hw_fini(void *handle)
> diff --git a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
> index 962e97860fe8..e804f9854027 100644
> --- a/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
> +++ b/drivers/gpu/drm/amd/powerplay/smu_v11_0.c
> @@ -855,27 +855,33 @@ int smu_v11_0_get_enabled_mask(struct smu_context *smu,
>                                       uint32_t *feature_mask, uint32_t num)
>  {
>         uint32_t feature_mask_high = 0, feature_mask_low = 0;
> +       struct smu_feature *feature = &smu->smu_feature;
>         int ret = 0;
>
>         if (!feature_mask || num < 2)
>                 return -EINVAL;
>
> -       ret = smu_send_smc_msg(smu, SMU_MSG_GetEnabledSmuFeaturesHigh);
> -       if (ret)
> -               return ret;
> -       ret = smu_read_smc_arg(smu, &feature_mask_high);
> -       if (ret)
> -               return ret;
> +       if (bitmap_empty(feature->enabled, feature->feature_num)) {
> +               ret = smu_send_smc_msg(smu, SMU_MSG_GetEnabledSmuFeaturesHigh);
> +               if (ret)
> +                       return ret;
> +               ret = smu_read_smc_arg(smu, &feature_mask_high);
> +               if (ret)
> +                       return ret;
>
> -       ret = smu_send_smc_msg(smu, SMU_MSG_GetEnabledSmuFeaturesLow);
> -       if (ret)
> -               return ret;
> -       ret = smu_read_smc_arg(smu, &feature_mask_low);
> -       if (ret)
> -               return ret;
> +               ret = smu_send_smc_msg(smu, SMU_MSG_GetEnabledSmuFeaturesLow);
> +               if (ret)
> +                       return ret;
> +               ret = smu_read_smc_arg(smu, &feature_mask_low);
> +               if (ret)
> +                       return ret;
>
> -       feature_mask[0] = feature_mask_low;
> -       feature_mask[1] = feature_mask_high;
> +               feature_mask[0] = feature_mask_low;
> +               feature_mask[1] = feature_mask_high;
> +       } else {
> +               bitmap_copy((unsigned long *)feature_mask, feature->enabled,
> +                            feature->feature_num);
> +       }
>
>         return ret;
>  }
> @@ -887,21 +893,24 @@ int smu_v11_0_system_features_control(struct smu_context *smu,
>         uint32_t feature_mask[2];
>         int ret = 0;
>
> -       if (smu->pm_enabled) {
> -               ret = smu_send_smc_msg(smu, (en ? SMU_MSG_EnableAllSmuFeatures :
> -                                            SMU_MSG_DisableAllSmuFeatures));
> -               if (ret)
> -                       return ret;
> -       }
> -
> -       ret = smu_feature_get_enabled_mask(smu, feature_mask, 2);
> +       ret = smu_send_smc_msg(smu, (en ? SMU_MSG_EnableAllSmuFeatures :
> +                                    SMU_MSG_DisableAllSmuFeatures));
>         if (ret)
>                 return ret;
>
> -       bitmap_copy(feature->enabled, (unsigned long *)&feature_mask,
> -                   feature->feature_num);
> -       bitmap_copy(feature->supported, (unsigned long *)&feature_mask,
> -                   feature->feature_num);
> +       if (en) {
> +               ret = smu_feature_get_enabled_mask(smu, feature_mask, 2);
> +               if (ret)
> +                       return ret;
> +
> +               bitmap_copy(feature->enabled, (unsigned long *)&feature_mask,
> +                           feature->feature_num);
> +               bitmap_copy(feature->supported, (unsigned long *)&feature_mask,
> +                           feature->feature_num);
> +       } else {
> +               bitmap_zero(feature->enabled, feature->feature_num);
> +               bitmap_zero(feature->supported, feature->feature_num);
> +       }
>
>         return ret;
>  }
> --
> 2.24.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