Re: [PATCH 2/2] drm/amdgpu: use cached SMU feature mask in runpm

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Jul 11, 2022 at 9:58 AM Guchun Chen <guchun.chen@xxxxxxx> wrote:
>
> SMU will perform dpm disablement when entering BACO,
> and enable them later on, so talking to SMU to get
> enabled features in runpm cycle as BACO support check
> is not reliable. Hence, use a cached value to fix it.
>
> Signed-off-by: Guchun Chen <guchun.chen@xxxxxxx>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c       | 4 ++++
>  drivers/gpu/drm/amd/pm/amdgpu_dpm.c           | 9 +++++++++
>  drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h       | 1 +
>  drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c     | 5 +++++
>  drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h | 3 +++
>  drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c        | 8 +++++++-
>  6 files changed, 29 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> index 1cc9260e75de..dc2e78bb7224 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
> @@ -2478,6 +2478,10 @@ static int amdgpu_pmops_runtime_suspend(struct device *dev)
>         }
>
>         adev->in_runpm = true;
> +
> +       /* cache SMU feature mask */
> +       amdgpu_dpm_set_cached_feature_mask(adev);
> +
>         if (amdgpu_device_supports_px(drm_dev))
>                 drm_dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
>
> diff --git a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
> index 956b6ce81c84..211f73a987d6 100644
> --- a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
> +++ b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
> @@ -1702,3 +1702,12 @@ int amdgpu_dpm_get_dpm_clock_table(struct amdgpu_device *adev,
>
>         return ret;
>  }
> +
> +void amdgpu_dpm_set_cached_feature_mask(struct amdgpu_device *adev)
> +{
> +       struct smu_context *smu = adev->powerplay.pp_handle;
> +
> +       mutex_lock(&adev->pm.mutex);
> +       smu_set_cached_enabled_mask(smu);
> +       mutex_unlock(&adev->pm.mutex);
> +}
> diff --git a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
> index 524fb09437e5..e9c002a561c2 100644
> --- a/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
> +++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
> @@ -543,4 +543,5 @@ enum pp_smu_status amdgpu_dpm_get_uclk_dpm_states(struct amdgpu_device *adev,
>                                                   unsigned int *num_states);
>  int amdgpu_dpm_get_dpm_clock_table(struct amdgpu_device *adev,
>                                    struct dpm_clocks *clock_table);
> +void amdgpu_dpm_set_cached_feature_mask(struct amdgpu_device *adev);
>  #endif
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
> index fd79b213fab4..e8ead58a00b4 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
> +++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
> @@ -3130,3 +3130,8 @@ int smu_send_hbm_bad_channel_flag(struct smu_context *smu, uint32_t size)
>
>         return ret;
>  }
> +
> +void smu_set_cached_enabled_mask(struct smu_context *smu)
> +{
> +       smu_feature_get_enabled_mask(smu, &smu->cache_enabled_mask);
> +}
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
> index b81c657c7386..678123b5e2bf 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
> +++ b/drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
> @@ -568,6 +568,8 @@ struct smu_context
>         u32 param_reg;
>         u32 msg_reg;
>         u32 resp_reg;
> +
> +       uint64_t cache_enabled_mask;
>  };
>
>  struct i2c_adapter;
> @@ -1465,5 +1467,6 @@ int smu_stb_collect_info(struct smu_context *smu, void *buff, uint32_t size);
>  void amdgpu_smu_stb_debug_fs_init(struct amdgpu_device *adev);
>  int smu_send_hbm_bad_pages_num(struct smu_context *smu, uint32_t size);
>  int smu_send_hbm_bad_channel_flag(struct smu_context *smu, uint32_t size);
> +void smu_set_cached_enabled_mask(struct smu_context *smu);
>  #endif
>  #endif
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c b/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c
> index 15e4298c7cc8..b3087085622a 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c
> +++ b/drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c
> @@ -499,7 +499,13 @@ int smu_cmn_feature_is_enabled(struct smu_context *smu,
>         uint64_t enabled_features;
>         int feature_id;
>
> -       if (__smu_get_enabled_features(smu, &enabled_features)) {
> +       /* SMU will perform dpm disablement when entering BACO, and enable
> +        * them later on, so talking to SMU to get enabled features in runpm
> +        * stage is not reliable. Use a cache value for this instead to fix it.
> +        */
> +       if (adev->in_runpm) {
> +               enabled_features = smu->cache_enabled_mask;

Do we need to handle this differently for BOCO?

Alex

> +       } else if (__smu_get_enabled_features(smu, &enabled_features)) {
>                 dev_err(adev->dev, "Failed to retrieve enabled ppfeatures!\n");
>                 return 0;
>         }
> --
> 2.17.1
>



[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux