Public

> -----Original Message-----
> From: Tvrtko Ursulin <[email protected]>
> Sent: Monday, September 14, 2026 10:54 AM
> To: [email protected]
> Cc: Deucher, Alexander <[email protected]>; Koenig, Christian
> <[email protected]>; [email protected]; Tvrtko Ursulin
> <[email protected]>; Timur Kristóf <[email protected]>
> Subject: [PATCH v3 1/6] drm/amdgpu: Add SDMA ring init helper
>
> Consolidate one part of the SDMA ring initialization with a new
> amdgpu_sdma_ring_init() helper.
>
> Only code which is completely IP version agnostic is moved to the helper.
>
> Signed-off-by: Tvrtko Ursulin <[email protected]>
> Cc: Timur Kristóf <[email protected]>

Patches 1-4, 6:
Reviewed-by: Alex Deucher <[email protected]>

Just one minor comment on patch 5.  With that fixed, feel free to add my RB to 
that patch as well.

Alex


> ---
> v2:
>  - Use va args to consolidate even better.
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c | 18
> ++++++++++++++++++  drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h |
> 4 ++++
>  drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c   |  7 +------
>  drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c   |  7 +------
>  drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c   | 13 ++-----------
>  drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c | 20 +++++---------------
>  drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c   |  7 +------
>  drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c   |  6 +-----
>  drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c   |  8 ++------
>  drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c   |  7 +------
>  drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c   | 10 +++-------
>  11 files changed, 39 insertions(+), 68 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
> index fbac732f3e01..7d975c1680a1 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
> @@ -22,6 +22,7 @@
>   */
>
>  #include <linux/firmware.h>
> +#include <linux/stdarg.h>
>  #include "amdgpu.h"
>  #include "amdgpu_sdma.h"
>  #include "amdgpu_ras.h"
> @@ -37,6 +38,23 @@
>   * GPU SDMA IP block helpers function.
>   */
>
> +int __printf(4, 5)
> +amdgpu_sdma_ring_init(struct amdgpu_device *adev, struct amdgpu_ring
> *ring,
> +                   unsigned int instance, const char *fmt, ...) {
> +     va_list args;
> +
> +     ring->ring_obj = NULL;
> +
> +     va_start(args, fmt);
> +     vsnprintf(ring->name, sizeof(ring->name), fmt, args);
> +     va_end(args);
> +
> +     return amdgpu_ring_init(adev, ring, 1024, &adev->sdma.trap_irq,
> +                             AMDGPU_SDMA_IRQ_INSTANCE0 + instance,
> +                             AMDGPU_RING_PRIO_DEFAULT, NULL);
> +}
> +
>  struct amdgpu_sdma_instance
> *amdgpu_sdma_get_instance_from_ring(struct amdgpu_ring *ring)  {
>       struct amdgpu_device *adev = ring->adev; diff --git
> a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
> index 671cfbb67b7a..0a692804bc53 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
> @@ -158,6 +158,10 @@ struct amdgpu_buffer_funcs {
>                                uint32_t byte_count);
>  };
>
> +int __printf(4, 5)
> +amdgpu_sdma_ring_init(struct amdgpu_device *adev, struct amdgpu_ring
> *ring,
> +                   unsigned int instance, const char *fmt, ...);
> +
>  int amdgpu_sdma_reset_engine(struct amdgpu_device *adev, uint32_t
> instance_id,
>                            bool caller_handles_kernel_queues);
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> index 657ef6c93c61..11e118a4aee8 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> @@ -865,13 +865,8 @@ static int sdma_v2_4_sw_init(struct
> amdgpu_ip_block *ip_block)
>
>       for (i = 0; i < adev->sdma.num_instances; i++) {
>               ring = &adev->sdma.instance[i].ring;
> -             ring->ring_obj = NULL;
>               ring->use_doorbell = false;
> -             sprintf(ring->name, "sdma%d", i);
> -             r = amdgpu_ring_init(adev, ring, 1024, &adev->sdma.trap_irq,
> -                                  (i == 0) ? AMDGPU_SDMA_IRQ_INSTANCE0
> :
> -                                  AMDGPU_SDMA_IRQ_INSTANCE1,
> -                                  AMDGPU_RING_PRIO_DEFAULT, NULL);
> +             r = amdgpu_sdma_ring_init(adev, ring, i, "sdma%d", i);
>               if (r)
>                       return r;
>       }
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> index 9478dd034aff..87743fe6ae44 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> @@ -1146,7 +1146,6 @@ static int sdma_v3_0_sw_init(struct
> amdgpu_ip_block *ip_block)
>
>       for (i = 0; i < adev->sdma.num_instances; i++) {
>               ring = &adev->sdma.instance[i].ring;
> -             ring->ring_obj = NULL;
>               if (!amdgpu_sriov_vf(adev)) {
>                       ring->use_doorbell = true;
>                       ring->doorbell_index = adev-
> >doorbell_index.sdma_engine[i];
> @@ -1154,11 +1153,7 @@ static int sdma_v3_0_sw_init(struct
> amdgpu_ip_block *ip_block)
>                       ring->use_pollmem = true;
>               }
>
> -             sprintf(ring->name, "sdma%d", i);
> -             r = amdgpu_ring_init(adev, ring, 1024, &adev->sdma.trap_irq,
> -                                  (i == 0) ? AMDGPU_SDMA_IRQ_INSTANCE0
> :
> -                                  AMDGPU_SDMA_IRQ_INSTANCE1,
> -                                  AMDGPU_RING_PRIO_DEFAULT, NULL);
> +             r = amdgpu_sdma_ring_init(adev, ring, i, "sdma%d", i);
>               if (r)
>                       return r;
>       }
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> index 9d7d919a5aa1..e77e29855c68 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> @@ -1858,7 +1858,6 @@ static int sdma_v4_0_sw_init(struct
> amdgpu_ip_block *ip_block)
>
>       for (i = 0; i < adev->sdma.num_instances; i++) {
>               ring = &adev->sdma.instance[i].ring;
> -             ring->ring_obj = NULL;
>               ring->use_doorbell = true;
>
>               DRM_DEBUG("SDMA %d use_doorbell being set to: [%s]\n", i,
> @@ -1878,16 +1877,12 @@ static int sdma_v4_0_sw_init(struct
> amdgpu_ip_block *ip_block)
>               else
>                       ring->vm_hub = AMDGPU_MMHUB0(0);
>
> -             sprintf(ring->name, "sdma%d", i);
> -             r = amdgpu_ring_init(adev, ring, 1024, &adev->sdma.trap_irq,
> -                                  AMDGPU_SDMA_IRQ_INSTANCE0 + i,
> -                                  AMDGPU_RING_PRIO_DEFAULT, NULL);
> +             r = amdgpu_sdma_ring_init(adev, ring, i, "sdma%d", i);
>               if (r)
>                       return r;
>
>               if (adev->sdma.has_page_queue) {
>                       ring = &adev->sdma.instance[i].page;
> -                     ring->ring_obj = NULL;
>                       ring->use_doorbell = true;
>
>                       /* paging queue use same doorbell index/routing as
> gfx queue @@ -1915,11 +1910,7 @@ static int sdma_v4_0_sw_init(struct
> amdgpu_ip_block *ip_block)
>                       else
>                               ring->vm_hub = AMDGPU_MMHUB0(0);
>
> -                     sprintf(ring->name, "page%d", i);
> -                     r = amdgpu_ring_init(adev, ring, 1024,
> -                                          &adev->sdma.trap_irq,
> -                                          AMDGPU_SDMA_IRQ_INSTANCE0
> + i,
> -                                          AMDGPU_RING_PRIO_DEFAULT,
> NULL);
> +                     r = amdgpu_sdma_ring_init(adev, ring, i, "page%d", i);
>                       if (r)
>                               return r;
>               }
> 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 461f8b220a3e..2bed58e983be 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> @@ -1484,7 +1484,6 @@ static int sdma_v4_4_2_sw_init(struct
> amdgpu_ip_block *ip_block)
>               adev->sdma.instance[i].funcs = &sdma_v4_4_2_sdma_funcs;
>
>               ring = &adev->sdma.instance[i].ring;
> -             ring->ring_obj = NULL;
>               ring->use_doorbell = true;
>               aid_id = adev->sdma.instance[i].aid_id;
>
> @@ -1495,18 +1494,13 @@ static int sdma_v4_4_2_sw_init(struct
> amdgpu_ip_block *ip_block)
>               ring->doorbell_index = adev->doorbell_index.sdma_engine[i]
> << 1;
>               ring->vm_hub = AMDGPU_MMHUB0(aid_id);
>               ring->no_user_submission = adev-
> >sdma.no_user_submission;
> -
> -             sprintf(ring->name, "sdma%d.%d", aid_id,
> -                             i % adev->sdma.num_inst_per_aid);
> -             r = amdgpu_ring_init(adev, ring, 1024, &adev->sdma.trap_irq,
> -                                  AMDGPU_SDMA_IRQ_INSTANCE0 + i,
> -                                  AMDGPU_RING_PRIO_DEFAULT, NULL);
> +             r = amdgpu_sdma_ring_init(adev, ring, i, "sdma%d.%d",
> aid_id,
> +                                       i % adev->sdma.num_inst_per_aid);
>               if (r)
>                       return r;
>
>               if (adev->sdma.has_page_queue) {
>                       ring = &adev->sdma.instance[i].page;
> -                     ring->ring_obj = NULL;
>                       ring->use_doorbell = true;
>
>                       /* doorbell index of page queue is assigned right after
> @@ -1515,13 +1509,9 @@ static int sdma_v4_4_2_sw_init(struct
> amdgpu_ip_block *ip_block)
>                       ring->doorbell_index =
>                               (adev->doorbell_index.sdma_engine[i] + 1) <<
> 1;
>                       ring->vm_hub = AMDGPU_MMHUB0(aid_id);
> -
> -                     sprintf(ring->name, "page%d.%d", aid_id,
> -                                     i % adev->sdma.num_inst_per_aid);
> -                     r = amdgpu_ring_init(adev, ring, 1024,
> -                                          &adev->sdma.trap_irq,
> -                                          AMDGPU_SDMA_IRQ_INSTANCE0
> + i,
> -                                          AMDGPU_RING_PRIO_DEFAULT,
> NULL);
> +                     r = amdgpu_sdma_ring_init(adev, ring, i,
> "page%d.%d",
> +                                               aid_id,
> +                                               i % adev-
> >sdma.num_inst_per_aid);
>                       if (r)
>                               return r;
>               }
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
> index 97fee70dc2f6..fa25d1508404 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
> @@ -1411,7 +1411,6 @@ static int sdma_v5_0_sw_init(struct
> amdgpu_ip_block *ip_block)
>               mutex_init(&adev->sdma.instance[i].engine_reset_mutex);
>               adev->sdma.instance[i].funcs = &sdma_v5_0_sdma_funcs;
>               ring = &adev->sdma.instance[i].ring;
> -             ring->ring_obj = NULL;
>               ring->use_doorbell = true;
>
>               DRM_DEBUG("SDMA %d use_doorbell being set to: [%s]\n", i,
> @@ -1422,11 +1421,7 @@ static int sdma_v5_0_sw_init(struct
> amdgpu_ip_block *ip_block)
>                       : (adev->doorbell_index.sdma_engine[1] << 1); // get
> DWORD offset
>
>               ring->vm_hub = AMDGPU_GFXHUB(0);
> -             sprintf(ring->name, "sdma%d", i);
> -             r = amdgpu_ring_init(adev, ring, 1024, &adev->sdma.trap_irq,
> -                                  (i == 0) ? AMDGPU_SDMA_IRQ_INSTANCE0
> :
> -                                  AMDGPU_SDMA_IRQ_INSTANCE1,
> -                                  AMDGPU_RING_PRIO_DEFAULT, NULL);
> +             r = amdgpu_sdma_ring_init(adev, ring, i, "sdma%d", i);
>               if (r)
>                       return r;
>       }
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> index 35cdf6c149f8..8d0ffad0284a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> @@ -1331,7 +1331,6 @@ static int sdma_v5_2_sw_init(struct
> amdgpu_ip_block *ip_block)
>               mutex_init(&adev->sdma.instance[i].engine_reset_mutex);
>               adev->sdma.instance[i].funcs = &sdma_v5_2_sdma_funcs;
>               ring = &adev->sdma.instance[i].ring;
> -             ring->ring_obj = NULL;
>               ring->use_doorbell = true;
>               ring->me = i;
>
> @@ -1342,10 +1341,7 @@ static int sdma_v5_2_sw_init(struct
> amdgpu_ip_block *ip_block)
>                       (adev->doorbell_index.sdma_engine[i] << 1); //get
> DWORD offset
>
>               ring->vm_hub = AMDGPU_GFXHUB(0);
> -             sprintf(ring->name, "sdma%d", i);
> -             r = amdgpu_ring_init(adev, ring, 1024, &adev->sdma.trap_irq,
> -                                  AMDGPU_SDMA_IRQ_INSTANCE0 + i,
> -                                  AMDGPU_RING_PRIO_DEFAULT, NULL);
> +             r = amdgpu_sdma_ring_init(adev, ring, i, "sdma%d", i);
>               if (r)
>                       return r;
>       }
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> index 303fd7d1b7c8..b28934739d32 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> @@ -1335,7 +1335,6 @@ static int sdma_v6_0_sw_init(struct
> amdgpu_ip_block *ip_block)
>
>       for (i = 0; i < adev->sdma.num_instances; i++) {
>               ring = &adev->sdma.instance[i].ring;
> -             ring->ring_obj = NULL;
>               ring->use_doorbell = true;
>               ring->me = i;
>               ring->no_user_submission = adev-
> >sdma.no_user_submission; @@ -1347,11 +1346,8 @@ static int
> sdma_v6_0_sw_init(struct amdgpu_ip_block *ip_block)
>                       (adev->doorbell_index.sdma_engine[i] << 1); // get
> DWORD offset
>
>               ring->vm_hub = AMDGPU_GFXHUB(0);
> -             sprintf(ring->name, "sdma%d", i);
> -             r = amdgpu_ring_init(adev, ring, 1024,
> -                                  &adev->sdma.trap_irq,
> -                                  AMDGPU_SDMA_IRQ_INSTANCE0 + i,
> -                                  AMDGPU_RING_PRIO_DEFAULT, NULL);
> +
> +             r = amdgpu_sdma_ring_init(adev, ring, i, "sdma%d", i);
>               if (r)
>                       return r;
>       }
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> index d5552f206e4d..4503bae1d48c 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> @@ -1319,7 +1319,6 @@ static int sdma_v7_0_sw_init(struct
> amdgpu_ip_block *ip_block)
>
>       for (i = 0; i < adev->sdma.num_instances; i++) {
>               ring = &adev->sdma.instance[i].ring;
> -             ring->ring_obj = NULL;
>               ring->use_doorbell = true;
>               ring->me = i;
>               ring->no_user_submission = adev-
> >sdma.no_user_submission; @@ -1331,11 +1330,7 @@ static int
> sdma_v7_0_sw_init(struct amdgpu_ip_block *ip_block)
>                       (adev->doorbell_index.sdma_engine[i] << 1); // get
> DWORD offset
>
>               ring->vm_hub = AMDGPU_GFXHUB(0);
> -             sprintf(ring->name, "sdma%d", i);
> -             r = amdgpu_ring_init(adev, ring, 1024,
> -                                  &adev->sdma.trap_irq,
> -                                  AMDGPU_SDMA_IRQ_INSTANCE0 + i,
> -                                  AMDGPU_RING_PRIO_DEFAULT, NULL);
> +             r = amdgpu_sdma_ring_init(adev, ring, i, "sdma%d", i);
>               if (r)
>                       return r;
>       }
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
> index 0f30eb503c2a..f33b0dc17c50 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
> @@ -1305,7 +1305,6 @@ static int sdma_v7_1_sw_init(struct
> amdgpu_ip_block *ip_block)
>
>       for (i = 0; i < adev->sdma.num_instances; i++) {
>               ring = &adev->sdma.instance[i].ring;
> -             ring->ring_obj = NULL;
>               ring->use_doorbell = true;
>               ring->me = i;
>               ring->no_user_submission = adev-
> >sdma.no_user_submission; @@ -1323,12 +1322,9 @@ static int
> sdma_v7_1_sw_init(struct amdgpu_ip_block *ip_block)
>                       (adev->doorbell_index.sdma_engine[i] << 1); // get
> DWORD offset
>
>               ring->vm_hub = AMDGPU_GFXHUB(xcc_id);
> -             sprintf(ring->name, "sdma%d.%d", xcc_id,
> -                             GET_INST(SDMA0, i) % adev-
> >sdma.num_inst_per_xcc);
> -             r = amdgpu_ring_init(adev, ring, 1024,
> -                                  &adev->sdma.trap_irq,
> -                                  AMDGPU_SDMA_IRQ_INSTANCE0 + i,
> -                                  AMDGPU_RING_PRIO_DEFAULT, NULL);
> +             r = amdgpu_sdma_ring_init(adev, ring, i, "sdma%d.%d",
> xcc_id,
> +                                       GET_INST(SDMA0, i) %
> +                                       adev->sdma.num_inst_per_xcc);
>               if (r)
>                       return r;
>       }
> --
> 2.55.0

Reply via email to