[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