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
