[PATCH 04/29] drm/amd/pm: add inst to set_powergating_by_smu

Alex Deucher alexdeucher at gmail.com
Mon Oct 28 19:08:35 UTC 2024


On Thu, Oct 24, 2024 at 11:18 PM <boyuan.zhang at amd.com> wrote:
>
> From: Boyuan Zhang <boyuan.zhang at amd.com>
>
> Add an instance parameter to set_powergating_by_smu() function, and
> re-write all amd_pm functions accordingly. Then use the instance to
> call smu_dpm_set_vcn_enable().
>
> v2: remove duplicated functions.
>
> remove for-loop in smu_dpm_set_power_gate(), and temporarily move it to
> to amdgpu_dpm_set_powergating_by_smu(), in order to keep the exact same
> logic as before, until further separation in next patch.
>
> v3: add instance number in error message.
>
> Signed-off-by: Boyuan Zhang <boyuan.zhang at amd.com>
> Acked-by: Christian König <christian.koenig at amd.com>

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

> ---
>  drivers/gpu/drm/amd/include/kgd_pp_interface.h   |  4 +++-
>  drivers/gpu/drm/amd/pm/amdgpu_dpm.c              | 10 ++++++++--
>  drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c       |  4 +++-
>  drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c |  4 +++-
>  drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c        | 14 ++++++--------
>  5 files changed, 23 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/include/kgd_pp_interface.h b/drivers/gpu/drm/amd/include/kgd_pp_interface.h
> index 2fa71f68205e..f24bc61df9a7 100644
> --- a/drivers/gpu/drm/amd/include/kgd_pp_interface.h
> +++ b/drivers/gpu/drm/amd/include/kgd_pp_interface.h
> @@ -405,7 +405,9 @@ struct amd_pm_funcs {
>         int (*load_firmware)(void *handle);
>         int (*wait_for_fw_loading_complete)(void *handle);
>         int (*set_powergating_by_smu)(void *handle,
> -                               uint32_t block_type, bool gate);
> +                               uint32_t block_type,
> +                               bool gate,
> +                               int inst);
>         int (*set_clockgating_by_smu)(void *handle, uint32_t msg_id);
>         int (*set_power_limit)(void *handle, uint32_t n);
>         int (*get_power_limit)(void *handle, uint32_t *limit,
> diff --git a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
> index 9dc82f4d7c93..bcedbeec082f 100644
> --- a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
> +++ b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c
> @@ -88,7 +88,6 @@ int amdgpu_dpm_set_powergating_by_smu(struct amdgpu_device *adev, uint32_t block
>         case AMD_IP_BLOCK_TYPE_UVD:
>         case AMD_IP_BLOCK_TYPE_VCE:
>         case AMD_IP_BLOCK_TYPE_GFX:
> -       case AMD_IP_BLOCK_TYPE_VCN:
>         case AMD_IP_BLOCK_TYPE_SDMA:
>         case AMD_IP_BLOCK_TYPE_JPEG:
>         case AMD_IP_BLOCK_TYPE_GMC:
> @@ -96,7 +95,14 @@ int amdgpu_dpm_set_powergating_by_smu(struct amdgpu_device *adev, uint32_t block
>         case AMD_IP_BLOCK_TYPE_VPE:
>                 if (pp_funcs && pp_funcs->set_powergating_by_smu)
>                         ret = (pp_funcs->set_powergating_by_smu(
> -                               (adev)->powerplay.pp_handle, block_type, gate));
> +                               (adev)->powerplay.pp_handle, block_type, gate, 0));
> +               break;
> +       case AMD_IP_BLOCK_TYPE_VCN:
> +               if (pp_funcs && pp_funcs->set_powergating_by_smu) {
> +                       for (int i = 0; i < adev->vcn.num_vcn_inst; i++)
> +                               ret = (pp_funcs->set_powergating_by_smu(
> +                                       (adev)->powerplay.pp_handle, block_type, gate, i));
> +               }
>                 break;
>         default:
>                 break;
> diff --git a/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c b/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c
> index 8908646ad620..f0f81ecd9ad6 100644
> --- a/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c
> +++ b/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c
> @@ -3276,7 +3276,9 @@ static int kv_dpm_read_sensor(void *handle, int idx,
>  }
>
>  static int kv_set_powergating_by_smu(void *handle,
> -                               uint32_t block_type, bool gate)
> +                               uint32_t block_type,
> +                               bool gate,
> +                               int inst)
>  {
>         switch (block_type) {
>         case AMD_IP_BLOCK_TYPE_UVD:
> diff --git a/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c
> index 26624a716fc6..90500b419d60 100644
> --- a/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c
> +++ b/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c
> @@ -1227,7 +1227,9 @@ static void pp_dpm_powergate_sdma(void *handle, bool gate)
>  }
>
>  static int pp_set_powergating_by_smu(void *handle,
> -                               uint32_t block_type, bool gate)
> +                               uint32_t block_type,
> +                               bool gate,
> +                               int inst)
>  {
>         int ret = 0;
>
> diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
> index bb7980f48674..c5ef8806dbb3 100644
> --- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
> +++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
> @@ -354,10 +354,10 @@ static int smu_set_mall_enable(struct smu_context *smu)
>   */
>  static int smu_dpm_set_power_gate(void *handle,
>                                   uint32_t block_type,
> -                                 bool gate)
> +                                 bool gate,
> +                                 int inst)
>  {
>         struct smu_context *smu = handle;
> -       struct amdgpu_device *adev = smu->adev;
>         int ret = 0;
>
>         if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) {
> @@ -374,12 +374,10 @@ static int smu_dpm_set_power_gate(void *handle,
>          */
>         case AMD_IP_BLOCK_TYPE_UVD:
>         case AMD_IP_BLOCK_TYPE_VCN:
> -               for (int i = 0; i < adev->vcn.num_vcn_inst; i++) {
> -                       ret = smu_dpm_set_vcn_enable(smu, !gate, i);
> -                       if (ret)
> -                               dev_err(smu->adev->dev, "Failed to power %s VCN instance %d!\n",
> -                                       gate ? "gate" : "ungate", i);
> -               }
> +               ret = smu_dpm_set_vcn_enable(smu, !gate, inst);
> +               if (ret)
> +                       dev_err(smu->adev->dev, "Failed to power %s VCN instance %d!\n",
> +                               gate ? "gate" : "ungate", inst);
>                 break;
>         case AMD_IP_BLOCK_TYPE_GFX:
>                 ret = smu_gfx_off_control(smu, gate);
> --
> 2.34.1
>


More information about the amd-gfx mailing list