[PATCH 09/18] drm/amdgpu: add set_powergating_state_instance

Alex Deucher alexdeucher at gmail.com
Fri Oct 4 19:40:23 UTC 2024


On Fri, Oct 4, 2024 at 2:45 PM <boyuan.zhang at amd.com> wrote:
>
> From: Boyuan Zhang <boyuan.zhang at amd.com>
>
> Add a new function to allow setting requested powergating state for the
> given instance. If the instance value doesn't match with the one inside
> ip_block, then do nothing since this request is for other instances with
> the same block type.
>
> Signed-off-by: Boyuan Zhang <boyuan.zhang at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu.h        |  4 +++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 37 ++++++++++++++++++++++
>  2 files changed, 41 insertions(+)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index 3442564fe174..ae59497f3074 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -358,6 +358,10 @@ int amdgpu_device_ip_set_clockgating_state(void *dev,
>  int amdgpu_device_ip_set_powergating_state(void *dev,
>                                            enum amd_ip_block_type block_type,
>                                            enum amd_powergating_state state);
> +int amdgpu_device_ip_set_powergating_state_instance(void *dev,
> +                                          enum amd_ip_block_type block_type,
> +                                          enum amd_powergating_state state,
> +                                          unsigned int inst);
>  void amdgpu_device_ip_get_clockgating_state(struct amdgpu_device *adev,
>                                             u64 *flags);
>  int amdgpu_device_ip_wait_for_idle(struct amdgpu_device *adev,
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 35a3e71a5a84..f0b6a9675405 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -2162,6 +2162,43 @@ int amdgpu_device_ip_set_powergating_state(void *dev,
>         return r;
>  }
>
> +/**
> + * amdgpu_device_ip_set_powergating_state_instance - set the PG state
> + *
> + * @dev: amdgpu_device pointer
> + * @block_type: Type of hardware IP (SMU, GFX, UVD, etc.)
> + * @state: powergating state (gate or ungate)
> + *
> + * Sets the requested powergating state for the given instance of
> + * the hardware IP specified.
> + * Returns the error code from the last instance.
> + */
> +int amdgpu_device_ip_set_powergating_state_instance(void *dev,
> +                                          enum amd_ip_block_type block_type,
> +                                          enum amd_powergating_state state,
> +                                          unsigned int inst)
> +{
> +       struct amdgpu_device *adev = dev;
> +       int i, r = 0;
> +
> +       for (i = 0; i < adev->num_ip_blocks; i++) {
> +               if (!adev->ip_blocks[i].status.valid)
> +                       continue;
> +               if (adev->ip_blocks[i].version->type != block_type)
> +                       continue;
> +               if (adev->ip_blocks[i].instance != inst)
> +                       continue;
> +               if (!adev->ip_blocks[i].version->funcs->set_powergating_state)
> +                       continue;
> +               r = adev->ip_blocks[i].version->funcs->set_powergating_state(
> +                       (void *)&adev->ip_blocks[i], state);
> +               if (r)
> +                       DRM_ERROR("set_powergating_state of IP block <%s> failed %d\n",
> +                                 adev->ip_blocks[i].version->funcs->name, r);
> +       }
> +       return r;
> +}
> +

I think it would also be cleaner to update
amdgpu_device_ip_set_powergating_state() to take the instance as a new
parameter.  Same for amdgpu_device_ip_set_clockgating_state().

Alex

>  /**
>   * amdgpu_device_ip_get_clockgating_state - get the CG state
>   *
> --
> 2.34.1
>


More information about the amd-gfx mailing list