[PATCH 1/4] drm/amdgpu: get sdma instance from irq id

Zhou1, Tao Tao.Zhou1 at amd.com
Fri Jun 13 06:43:50 UTC 2025


[AMD Official Use Only - AMD Internal Distribution Only]

Ping for the series.

> -----Original Message-----
> From: Zhou1, Tao <Tao.Zhou1 at amd.com>
> Sent: Wednesday, June 11, 2025 11:35 AM
> To: amd-gfx at lists.freedesktop.org
> Cc: Zhou1, Tao <Tao.Zhou1 at amd.com>
> Subject: [PATCH 1/4] drm/amdgpu: get sdma instance from irq id
>
> And the interface can be accessed globally.
>
> Signed-off-by: Tao Zhou <tao.zhou1 at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h |  2 +
> drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c | 51 ++++++++++++++++--------
>  2 files changed, 36 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
> index e5f8951bbb6f..262321a0aa4f 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
> @@ -54,6 +54,8 @@ struct amdgpu_sdma_funcs {
>       int (*stop_kernel_queue)(struct amdgpu_ring *ring);
>       int (*start_kernel_queue)(struct amdgpu_ring *ring);
>       int (*soft_reset_kernel_queue)(struct amdgpu_device *adev, u32
> instance_id);
> +     int (*sdma_irq_id_to_seq)(struct amdgpu_device *adev,
> +                     uint16_t client_id, uint16_t node_id);
>  };
>
>  struct amdgpu_sdma_instance {
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> index 9c169112a5e7..96ea9a0f952c 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> @@ -156,6 +156,35 @@ static int sdma_v4_4_2_irq_id_to_seq(struct
> amdgpu_device *adev, unsigned client
>       }
>  }
>
> +static int sdma_v4_4_2_irq_id_to_seq_global(struct amdgpu_device *adev,
> +             uint16_t client_id, uint16_t node_id) {
> +     uint32_t instance, i;
> +
> +     instance = sdma_v4_4_2_irq_id_to_seq(adev, client_id);
> +
> +     /* Client id gives the SDMA instance in AID. To know the exact SDMA
> +      * instance, interrupt entry gives the node id which corresponds to
> +      * the AID instance. Match node id with the AID id associated with
> +      * the SDMA instance.
> +      */
> +     for (i = instance; i < adev->sdma.num_instances;
> +              i += adev->sdma.num_inst_per_aid) {
> +             if (adev->sdma.instance[i].aid_id ==
> +                     node_id_to_phys_map[node_id])
> +                     break;
> +     }
> +
> +     if (i >= adev->sdma.num_instances) {
> +             dev_WARN_ONCE(
> +                     adev->dev, 1,
> +                     "Couldn't find the right sdma instance in trap handler");
> +             return -EINVAL;
> +     }
> +
> +     return i;
> +}
> +
>  static void sdma_v4_4_2_inst_init_golden_registers(struct amdgpu_device *adev,
>                                                  uint32_t inst_mask)
>  {
> @@ -1337,6 +1366,7 @@ static bool
> sdma_v4_4_2_fw_support_paging_queue(struct amdgpu_device *adev)  static const
> struct amdgpu_sdma_funcs sdma_v4_4_2_sdma_funcs = {
>       .stop_kernel_queue = &sdma_v4_4_2_stop_queue,
>       .start_kernel_queue = &sdma_v4_4_2_restore_queue,
> +     .sdma_irq_id_to_seq = &sdma_v4_4_2_irq_id_to_seq_global,
>  };
>
>  static int sdma_v4_4_2_early_init(struct amdgpu_ip_block *ip_block) @@ -1764,27
> +1794,14 @@ static int sdma_v4_4_2_process_trap_irq(struct amdgpu_device
> *adev,
>                                     struct amdgpu_irq_src *source,
>                                     struct amdgpu_iv_entry *entry)  {
> -     uint32_t instance, i;
> +     int i;
>
>       DRM_DEBUG("IH: SDMA trap\n");
> -     instance = sdma_v4_4_2_irq_id_to_seq(adev, entry->client_id);
>
> -     /* Client id gives the SDMA instance in AID. To know the exact SDMA
> -      * instance, interrupt entry gives the node id which corresponds to the AID
> instance.
> -      * Match node id with the AID id associated with the SDMA instance. */
> -     for (i = instance; i < adev->sdma.num_instances;
> -          i += adev->sdma.num_inst_per_aid) {
> -             if (adev->sdma.instance[i].aid_id ==
> -                 node_id_to_phys_map[entry->node_id])
> -                     break;
> -     }
> -
> -     if (i >= adev->sdma.num_instances) {
> -             dev_WARN_ONCE(
> -                     adev->dev, 1,
> -                     "Couldn't find the right sdma instance in trap handler");
> +     i = sdma_v4_4_2_irq_id_to_seq_global(adev, entry->client_id,
> +                             entry->node_id);
> +     if (i < 0)
>               return 0;
> -     }
>
>       switch (entry->ring_id) {
>       case 0:
> --
> 2.34.1



More information about the amd-gfx mailing list