On 2026. szeptember 9., szerda 12:52:10 közép-európai nyári idő Tvrtko Ursulin 
wrote:
> Consolidate one part of the SDMA ring initialization with a new
> amdgpu_sdma_ring_init() helper.
> 
> Signed-off-by: Tvrtko Ursulin <[email protected]>
> Cc: Timur Kristóf <[email protected]>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c | 19 +++++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h |  3 +++
>  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 | 19 ++++++-------------
>  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   | 13 +++++--------
>  11 files changed, 42 insertions(+), 67 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c index fbac732f3e01..cca8b3a98f6a
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
> @@ -37,6 +37,25 @@
>   * GPU SDMA IP block helpers function.
>   */
> 
> +int amdgpu_sdma_ring_init(struct amdgpu_device *adev, struct amdgpu_ring
> *ring, +                        const char *prefix, unsigned int index)

Instead of "index", I suggest "instance_id" to make it clear what it is.
Additionally please add an xcc_id argument because some SDMA versions seem to 
need that too.

> +{
> +     int r;
> +
> +     ring->ring_obj = NULL;

Maybe also consider moving here the following lines:
ring->me = instance_id;
ring->use_doorbell = ... // based on SDMA IP version
ring->no_user_submission = adev->sdma.no_user_submission;

> +
> +     if (prefix)
> +             sprintf(ring->name, "sdma%u", index);

Seems like this wouldn't name the page queues correctly.
Suggestion:

sprintf(ring->name, "%s%u.%u", prefix ?: "sdma", xcc_id, instance_id);


> +
> +     r = amdgpu_ring_init(adev, ring, 1024, &adev->sdma.trap_irq,
> +                          AMDGPU_SDMA_IRQ_INSTANCE0 + index,
> +                          AMDGPU_RING_PRIO_DEFAULT, NULL);
> +     if (r)
> +             return r;
> +
> +     return 0;
> +}
> +
>  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..2f1edef97c2f
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
> @@ -158,6 +158,9 @@ struct amdgpu_buffer_funcs {
>                                uint32_t byte_count);
>  };
> 
> +int amdgpu_sdma_ring_init(struct amdgpu_device *adev, struct amdgpu_ring
> *ring, +                        const char *prefix, unsigned int index);
> +
>  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..fb2047d8e25a
> 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, "sdma", 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..656f66527999
> 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, "sdma", 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..e135dfb1c3e2
> 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, "sdma", 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, "page", 
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..2e46e63a6dbf
> 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,15 @@ 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;
> +             r = amdgpu_sdma_ring_init(adev, ring, NULL, i);
> +             if (r)
> +                     return r;
> 
>               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);
> -             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,15 +1511,12 @@ 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);
> +                     r = amdgpu_sdma_ring_init(adev, ring, NULL, 
i);
> +                     if (r)
> +                             return r;
> 
>                       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);
> -                     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..a0614fa9ffa6
> 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, "sdma", 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..5b3dafc194d7
> 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, "sdma", 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..845e622d3c1a
> 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, "sdma", 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..ea460a19b89d
> 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, "sdma", 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..1704d406c34a
> 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,14 +1322,12 @@ 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);
> +             r = amdgpu_sdma_ring_init(adev, ring, NULL, i);
> +             if (r)
> +                     return r;
> +
>               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);
> -             if (r)
> -                     return r;
> +                     GET_INST(SDMA0, i) % adev-
>sdma.num_inst_per_xcc);
>       }
> 
>       adev->sdma.supported_reset =



Reply via email to