All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/6] A bit of SDMA (mostly) streamlining
@ 2026-09-09 10:52 Tvrtko Ursulin
  2026-09-09 10:52 ` [PATCH 1/6] drm/amdgpu: Add SDMA ring init helper Tvrtko Ursulin
                   ` (5 more replies)
  0 siblings, 6 replies; 13+ messages in thread
From: Tvrtko Ursulin @ 2026-09-09 10:52 UTC (permalink / raw)
  To: amd-gfx; +Cc: kernel-dev, Tvrtko Ursulin, Timur Kristóf

Some old plus some new patches which mostly streamline the SDMA ring emission,
plus a little bit of GFX ring padding optimisation.

More or less it is about replacing repeated runtime array walks (and
conditionals in general) with direct lookups for things which are invariant at
runtime.

Smoke tested on Steam Deck only.

Bloat-o-meter (from a debug build though):

add/remove: 14/15 grow/shrink: 70/294 up/down: 53590/-196161 (-142571)
...
Total: Before=10822624, After=10680053, chg -1.32%

Cc: Timur Kristóf <timur.kristof@gmail.com>

Tvrtko Ursulin (6):
  drm/amdgpu: Add SDMA ring init helper
  drm/amdgpu: Add amdgpu_sdma_types.h header
  drm/amdgpu: Convert SDMA instance and index to direct lookup
  drm/amdgpu: Cache the SDMA CSA address
  drm/amdgpu: Extend logical to device instance lookup to all devices
  drm/amdgpu: Use memset32 for SDMA padding

 drivers/gpu/drm/amd/amdgpu/amdgpu.h           |   2 +-
 .../drm/amd/amdgpu/amdgpu_amdkfd_gc_9_4_3.c   |   1 +
 .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c |   1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c   |   1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c    |   2 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c       |   2 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_ip.c        |  49 ++----
 drivers/gpu/drm/amd/amdgpu/amdgpu_ip.h        |  21 ++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c      |   1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c       |   1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c      |  17 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h      |  26 +++
 drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c      |  67 +++-----
 drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h      | 161 +++---------------
 .../gpu/drm/amd/amdgpu/amdgpu_sdma_types.h    | 161 ++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c    |   1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c       |   1 +
 drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c    |   3 +-
 drivers/gpu/drm/amd/amdgpu/cik_sdma.c         |   1 +
 drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c       |   8 +-
 drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c      |   1 +
 drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c        |   1 +
 drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c        |   1 +
 drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c        |   1 +
 drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c         |   1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c      |   1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c      |   1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_0.c      |   1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c      |   1 +
 drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c        |   1 +
 drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c        |  25 ++-
 drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c        |  25 ++-
 drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c        |  31 ++--
 drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c      |  38 ++---
 drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c        |  29 ++--
 drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c        |  30 ++--
 drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c        |  32 ++--
 drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c        |  31 ++--
 drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c        |  37 ++--
 drivers/gpu/drm/amd/amdgpu/soc15_common.h     |   6 +-
 drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c         |   1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c         |   1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c         |   1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c         |   1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c       |   1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c       |   1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c       |   1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c       |   1 +
 drivers/gpu/drm/amd/amdkfd/kfd_device.c       |   1 +
 drivers/gpu/drm/amd/amdkfd/kfd_migrate.c      |   2 +
 .../drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c |   1 +
 .../drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c  |   1 +
 drivers/gpu/drm/amd/ras/ras_mgr/ras_sys.h     |   7 +-
 53 files changed, 436 insertions(+), 405 deletions(-)
 create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h

-- 
2.55.0


^ permalink raw reply	[flat|nested] 13+ messages in thread

* [PATCH 1/6] drm/amdgpu: Add SDMA ring init helper
  2026-09-09 10:52 [PATCH 0/6] A bit of SDMA (mostly) streamlining Tvrtko Ursulin
@ 2026-09-09 10:52 ` Tvrtko Ursulin
  2026-09-09 18:27   ` Timur Kristóf
  2026-09-09 10:52 ` [PATCH 2/6] drm/amdgpu: Add amdgpu_sdma_types.h header Tvrtko Ursulin
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: Tvrtko Ursulin @ 2026-09-09 10:52 UTC (permalink / raw)
  To: amd-gfx; +Cc: kernel-dev, Tvrtko Ursulin, Timur Kristóf

Consolidate one part of the SDMA ring initialization with a new
amdgpu_sdma_ring_init() helper.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Cc: Timur Kristóf <timur.kristof@gmail.com>
---
 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)
+{
+	int r;
+
+	ring->ring_obj = NULL;
+
+	if (prefix)
+		sprintf(ring->name, "sdma%u", index);
+
+	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 =
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 2/6] drm/amdgpu: Add amdgpu_sdma_types.h header
  2026-09-09 10:52 [PATCH 0/6] A bit of SDMA (mostly) streamlining Tvrtko Ursulin
  2026-09-09 10:52 ` [PATCH 1/6] drm/amdgpu: Add SDMA ring init helper Tvrtko Ursulin
@ 2026-09-09 10:52 ` Tvrtko Ursulin
  2026-09-09 18:28   ` Timur Kristóf
  2026-09-09 10:52 ` [PATCH 3/6] drm/amdgpu: Convert SDMA instance and index to direct lookup Tvrtko Ursulin
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: Tvrtko Ursulin @ 2026-09-09 10:52 UTC (permalink / raw)
  To: amd-gfx; +Cc: kernel-dev, Tvrtko Ursulin, Timur Kristóf

There is an include loop between amdgpu.h and amdgpu_sdma.h which
prevents adding any interesting static inline helpers to the latter.

Break it by moving the type definitions to a new amdgpu_sdma_types.h
header.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Cc: Timur Kristóf <timur.kristof@gmail.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h           |   2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c   |   1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c       |   2 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h      | 141 ++--------------
 .../gpu/drm/amd/amdgpu/amdgpu_sdma_types.h    | 159 ++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c    |   1 +
 drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c    |   1 +
 drivers/gpu/drm/amd/amdgpu/cik_sdma.c         |   1 +
 drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c        |   1 +
 drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c        |   1 +
 drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c        |   1 +
 drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c      |   1 +
 drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c        |   1 +
 drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c        |   1 +
 drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c        |   1 +
 drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c        |   1 +
 drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c        |   1 +
 drivers/gpu/drm/amd/amdkfd/kfd_migrate.c      |   2 +
 18 files changed, 188 insertions(+), 131 deletions(-)
 create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 79b69d74eb2e..5811709b33b7 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -79,7 +79,7 @@
 #include "amdgpu_umsch_mm.h"
 #include "amdgpu_gmc.h"
 #include "amdgpu_gfx.h"
-#include "amdgpu_sdma.h"
+#include "amdgpu_sdma_types.h"
 #include "amdgpu_lsdma.h"
 #include "amdgpu_nbio.h"
 #include "amdgpu_reg_access.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
index d80fe17556da..d8786a93a851 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
@@ -36,6 +36,7 @@
 #include "amdgpu_rap.h"
 #include "amdgpu_securedisplay.h"
 #include "amdgpu_fw_attestation.h"
+#include "amdgpu_sdma.h"
 #include "amdgpu_umr.h"
 
 #include "amdgpu_reset.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
index 7c0554506334..1bf2a42fa63c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
@@ -33,6 +33,8 @@
 #include "amdgpu_gmc.h"
 #include "amdgpu_ras.h"
 #include "amdgpu_reset.h"
+#include "amdgpu_ring.h"
+#include "amdgpu_sdma.h"
 #include "amdgpu_xgmi.h"
 #include "amdgpu_atomfirmware.h"
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
index 2f1edef97c2f..526ea305a7de 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
@@ -23,141 +23,22 @@
 
 #ifndef __AMDGPU_SDMA_H__
 #define __AMDGPU_SDMA_H__
-#include "amdgpu_ras.h"
 
-/* max number of IP instances */
-#define AMDGPU_MAX_SDMA_INSTANCES		16
+#include "amdgpu_sdma_types.h"
 
-enum amdgpu_sdma_irq {
-	AMDGPU_SDMA_IRQ_INSTANCE0  = 0,
-	AMDGPU_SDMA_IRQ_INSTANCE1,
-	AMDGPU_SDMA_IRQ_INSTANCE2,
-	AMDGPU_SDMA_IRQ_INSTANCE3,
-	AMDGPU_SDMA_IRQ_INSTANCE4,
-	AMDGPU_SDMA_IRQ_INSTANCE5,
-	AMDGPU_SDMA_IRQ_INSTANCE6,
-	AMDGPU_SDMA_IRQ_INSTANCE7,
-	AMDGPU_SDMA_IRQ_INSTANCE8,
-	AMDGPU_SDMA_IRQ_INSTANCE9,
-	AMDGPU_SDMA_IRQ_INSTANCE10,
-	AMDGPU_SDMA_IRQ_INSTANCE11,
-	AMDGPU_SDMA_IRQ_INSTANCE12,
-	AMDGPU_SDMA_IRQ_INSTANCE13,
-	AMDGPU_SDMA_IRQ_INSTANCE14,
-	AMDGPU_SDMA_IRQ_INSTANCE15,
-	AMDGPU_SDMA_IRQ_LAST
-};
+#include "amdgpu.h"
+#include "amdgpu_ring.h"
+
+#include <linux/types.h>
+
+struct amdgpu_device;
+struct amdgpu_iv_entry;
+struct amdgpu_irq_src;
+struct amdgpu_ring;
+struct ras_common_if;
 
 #define NUM_SDMA(x) hweight32(x)
 
-struct amdgpu_sdma_csa_info {
-	u32 size;
-	u32 alignment;
-};
-
-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);
-};
-
-struct amdgpu_sdma_instance {
-	/* SDMA firmware */
-	const struct firmware	*fw;
-	uint32_t		fw_version;
-	uint32_t		feature_version;
-
-	struct amdgpu_ring	ring;
-	struct amdgpu_ring	page;
-	bool			burst_nop;
-	union {
-	    uint32_t		aid_id;
-	    uint32_t		xcc_id;
-	};
-
-	struct amdgpu_bo	*sdma_fw_obj;
-	uint64_t		sdma_fw_gpu_addr;
-	uint32_t		*sdma_fw_ptr;
-	struct mutex		engine_reset_mutex;
-	/* track guilty state of GFX and PAGE queues */
-	bool			gfx_guilty;
-	bool			page_guilty;
-	const struct amdgpu_sdma_funcs   *funcs;
-};
-
-struct amdgpu_sdma_ras {
-	struct amdgpu_ras_block_object ras_block;
-};
-
-struct amdgpu_sdma {
-	struct amdgpu_sdma_instance instance[AMDGPU_MAX_SDMA_INSTANCES];
-	struct amdgpu_irq_src	trap_irq;
-	struct amdgpu_irq_src	illegal_inst_irq;
-	struct amdgpu_irq_src	fence_irq;
-	struct amdgpu_irq_src	ecc_irq;
-	struct amdgpu_irq_src	vm_hole_irq;
-	struct amdgpu_irq_src	doorbell_invalid_irq;
-	struct amdgpu_irq_src	pool_timeout_irq;
-	struct amdgpu_irq_src	srbm_write_irq;
-	struct amdgpu_irq_src	ctxt_empty_irq;
-
-	int			num_instances;
-	uint32_t 		sdma_mask;
-	bool    		sdma_debug;
-	union {
-	    int			num_inst_per_aid;
-	    int			num_inst_per_xcc;
-	};
-	uint32_t                    srbm_soft_reset;
-	bool			has_page_queue;
-	struct ras_common_if	*ras_if;
-	struct amdgpu_sdma_ras	*ras;
-	uint32_t		*ip_dump;
-	uint32_t 		supported_reset;
-	struct list_head	reset_callback_list;
-	bool			no_user_submission;
-	bool			disable_uq;
-	void (*get_csa_info)(struct amdgpu_device *adev,
-			     struct amdgpu_sdma_csa_info *csa_info);
-};
-
-/*
- * Provided by hw blocks that can move/clear data.  e.g., gfx or sdma
- * But currently, we use sdma to move data.
- */
-struct amdgpu_buffer_funcs {
-	/* maximum bytes in a single operation */
-	uint32_t	copy_max_bytes;
-
-	/* number of dw to reserve per operation */
-	unsigned	copy_num_dw;
-
-	/* used for buffer migration */
-	void (*emit_copy_buffer)(struct amdgpu_ib *ib,
-				 /* src addr in bytes */
-				 uint64_t src_offset,
-				 /* dst addr in bytes */
-				 uint64_t dst_offset,
-				 /* number of byte to transfer */
-				 uint32_t byte_count,
-				 uint32_t copy_flags);
-
-	/* maximum bytes in a single operation */
-	uint32_t	fill_max_bytes;
-
-	/* number of dw to reserve per operation */
-	unsigned	fill_num_dw;
-
-	/* used for buffer clearing */
-	void (*emit_fill_buffer)(struct amdgpu_ib *ib,
-				 /* value to write to memory */
-				 uint32_t src_data,
-				 /* dst addr in bytes */
-				 uint64_t dst_offset,
-				 /* number of byte to fill */
-				 uint32_t byte_count);
-};
-
 int amdgpu_sdma_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
 			  const char *prefix, unsigned int index);
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h
new file mode 100644
index 000000000000..d6e7a703c2e0
--- /dev/null
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h
@@ -0,0 +1,159 @@
+/*
+ * Copyright 2018 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#ifndef __AMDGPU_SDMA_TYPES_H__
+#define __AMDGPU_SDMA_TYPES_H__
+#include "amdgpu_ras.h"
+
+/* max number of IP instances */
+#define AMDGPU_MAX_SDMA_INSTANCES		16
+
+enum amdgpu_sdma_irq {
+	AMDGPU_SDMA_IRQ_INSTANCE0  = 0,
+	AMDGPU_SDMA_IRQ_INSTANCE1,
+	AMDGPU_SDMA_IRQ_INSTANCE2,
+	AMDGPU_SDMA_IRQ_INSTANCE3,
+	AMDGPU_SDMA_IRQ_INSTANCE4,
+	AMDGPU_SDMA_IRQ_INSTANCE5,
+	AMDGPU_SDMA_IRQ_INSTANCE6,
+	AMDGPU_SDMA_IRQ_INSTANCE7,
+	AMDGPU_SDMA_IRQ_INSTANCE8,
+	AMDGPU_SDMA_IRQ_INSTANCE9,
+	AMDGPU_SDMA_IRQ_INSTANCE10,
+	AMDGPU_SDMA_IRQ_INSTANCE11,
+	AMDGPU_SDMA_IRQ_INSTANCE12,
+	AMDGPU_SDMA_IRQ_INSTANCE13,
+	AMDGPU_SDMA_IRQ_INSTANCE14,
+	AMDGPU_SDMA_IRQ_INSTANCE15,
+	AMDGPU_SDMA_IRQ_LAST
+};
+
+struct amdgpu_sdma_csa_info {
+	u32 size;
+	u32 alignment;
+};
+
+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);
+};
+
+struct amdgpu_sdma_instance {
+	/* SDMA firmware */
+	const struct firmware	*fw;
+	uint32_t		fw_version;
+	uint32_t		feature_version;
+
+	struct amdgpu_ring	ring;
+	struct amdgpu_ring	page;
+	bool			burst_nop;
+	union {
+	    uint32_t		aid_id;
+	    uint32_t		xcc_id;
+	};
+
+	struct amdgpu_bo	*sdma_fw_obj;
+	uint64_t		sdma_fw_gpu_addr;
+	uint32_t		*sdma_fw_ptr;
+	struct mutex		engine_reset_mutex;
+	/* track guilty state of GFX and PAGE queues */
+	bool			gfx_guilty;
+	bool			page_guilty;
+	const struct amdgpu_sdma_funcs   *funcs;
+};
+
+struct amdgpu_sdma_ras {
+	struct amdgpu_ras_block_object ras_block;
+};
+
+struct amdgpu_sdma {
+	struct amdgpu_sdma_instance instance[AMDGPU_MAX_SDMA_INSTANCES];
+	struct amdgpu_irq_src	trap_irq;
+	struct amdgpu_irq_src	illegal_inst_irq;
+	struct amdgpu_irq_src	fence_irq;
+	struct amdgpu_irq_src	ecc_irq;
+	struct amdgpu_irq_src	vm_hole_irq;
+	struct amdgpu_irq_src	doorbell_invalid_irq;
+	struct amdgpu_irq_src	pool_timeout_irq;
+	struct amdgpu_irq_src	srbm_write_irq;
+	struct amdgpu_irq_src	ctxt_empty_irq;
+
+	int			num_instances;
+	uint32_t 		sdma_mask;
+	bool    		sdma_debug;
+	union {
+	    int			num_inst_per_aid;
+	    int			num_inst_per_xcc;
+	};
+	uint32_t                    srbm_soft_reset;
+	bool			has_page_queue;
+	struct ras_common_if	*ras_if;
+	struct amdgpu_sdma_ras	*ras;
+	uint32_t		*ip_dump;
+	uint32_t 		supported_reset;
+	struct list_head	reset_callback_list;
+	bool			no_user_submission;
+	bool			disable_uq;
+	void (*get_csa_info)(struct amdgpu_device *adev,
+			     struct amdgpu_sdma_csa_info *csa_info);
+};
+
+/*
+ * Provided by hw blocks that can move/clear data.  e.g., gfx or sdma
+ * But currently, we use sdma to move data.
+ */
+struct amdgpu_buffer_funcs {
+	/* maximum bytes in a single operation */
+	uint32_t	copy_max_bytes;
+
+	/* number of dw to reserve per operation */
+	unsigned	copy_num_dw;
+
+	/* used for buffer migration */
+	void (*emit_copy_buffer)(struct amdgpu_ib *ib,
+				 /* src addr in bytes */
+				 uint64_t src_offset,
+				 /* dst addr in bytes */
+				 uint64_t dst_offset,
+				 /* number of byte to transfer */
+				 uint32_t byte_count,
+				 uint32_t copy_flags);
+
+	/* maximum bytes in a single operation */
+	uint32_t	fill_max_bytes;
+
+	/* number of dw to reserve per operation */
+	unsigned	fill_num_dw;
+
+	/* used for buffer clearing */
+	void (*emit_fill_buffer)(struct amdgpu_ib *ib,
+				 /* value to write to memory */
+				 uint32_t src_data,
+				 /* dst addr in bytes */
+				 uint64_t dst_offset,
+				 /* number of byte to fill */
+				 uint32_t byte_count);
+};
+
+#endif
\ No newline at end of file
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
index ad8cc95e6cfa..29723ff53503 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
@@ -26,6 +26,7 @@
 #include <drm/drm_mm.h>
 #include <linux/random.h>
 #include "amdgpu.h"
+#include "amdgpu_sdma.h"
 #include "amdgpu_ualink.h"
 #include "amdgpu_xgmi.h"
 #include "amdgpu_dma_buf.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c b/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
index cddfe4015f53..9a0c12b1a309 100644
--- a/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
+++ b/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
@@ -30,6 +30,7 @@
 #include "gfxhub_v1_2.h"
 #include "sdma_v4_4_2.h"
 #include "amdgpu_ip.h"
+#include "amdgpu_sdma.h"
 
 void aqua_vanjaram_doorbell_index_init(struct amdgpu_device *adev)
 {
diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
index de2323e23566..45f429ed23e4 100644
--- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
+++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
@@ -27,6 +27,7 @@
 
 #include "amdgpu.h"
 #include "amdgpu_ucode.h"
+#include "amdgpu_sdma.h"
 #include "amdgpu_trace.h"
 #include "cikd.h"
 #include "cik.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
index fb2047d8e25a..1f9fd8b23ac7 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
@@ -28,6 +28,7 @@
 
 #include "amdgpu.h"
 #include "amdgpu_ucode.h"
+#include "amdgpu_sdma.h"
 #include "amdgpu_trace.h"
 #include "vi.h"
 #include "vid.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
index 656f66527999..6577306311a3 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
@@ -28,6 +28,7 @@
 
 #include "amdgpu.h"
 #include "amdgpu_ucode.h"
+#include "amdgpu_sdma.h"
 #include "amdgpu_trace.h"
 #include "vi.h"
 #include "vid.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
index e135dfb1c3e2..5ab191806b22 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
@@ -28,6 +28,7 @@
 
 #include "amdgpu.h"
 #include "amdgpu_ucode.h"
+#include "amdgpu_sdma.h"
 #include "amdgpu_trace.h"
 
 #include "sdma0/sdma0_4_2_offset.h"
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 2e46e63a6dbf..365085a15a34 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
@@ -30,6 +30,7 @@
 #include "amdgpu_xcp.h"
 #include "amdgpu_ucode.h"
 #include "amdgpu_trace.h"
+#include "amdgpu_sdma.h"
 #include "amdgpu_reset.h"
 
 #include "sdma/sdma_4_4_2_offset.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
index a0614fa9ffa6..b803d74fc40f 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
@@ -28,6 +28,7 @@
 
 #include "amdgpu.h"
 #include "amdgpu_ucode.h"
+#include "amdgpu_sdma.h"
 #include "amdgpu_trace.h"
 
 #include "gc/gc_10_1_0_offset.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
index 5b3dafc194d7..213fa9ac883f 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
@@ -28,6 +28,7 @@
 
 #include "amdgpu.h"
 #include "amdgpu_ucode.h"
+#include "amdgpu_sdma.h"
 #include "amdgpu_trace.h"
 
 #include "gc/gc_10_3_0_offset.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
index 845e622d3c1a..2f5de866b248 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
@@ -28,6 +28,7 @@
 
 #include "amdgpu.h"
 #include "amdgpu_ucode.h"
+#include "amdgpu_sdma.h"
 #include "amdgpu_trace.h"
 
 #include "gc/gc_11_0_0_offset.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
index ea460a19b89d..d5cad2cede98 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
@@ -28,6 +28,7 @@
 
 #include "amdgpu.h"
 #include "amdgpu_ucode.h"
+#include "amdgpu_sdma.h"
 #include "amdgpu_trace.h"
 
 #include "gc/gc_12_0_0_offset.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
index 1704d406c34a..bf26cc515b9a 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
@@ -28,6 +28,7 @@
 
 #include "amdgpu.h"
 #include "amdgpu_ucode.h"
+#include "amdgpu_sdma.h"
 #include "amdgpu_trace.h"
 
 #include "gc/gc_12_1_0_offset.h"
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
index 6b64b1692235..8b96e1fe741a 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
@@ -24,6 +24,8 @@
 #include <linux/dma-direction.h>
 #include <linux/dma-mapping.h>
 #include <linux/migrate.h>
+#include "amdgpu.h"
+#include "amdgpu_sdma.h"
 #include "amdgpu_sync.h"
 #include "amdgpu_object.h"
 #include "amdgpu_vm.h"
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 3/6] drm/amdgpu: Convert SDMA instance and index to direct lookup
  2026-09-09 10:52 [PATCH 0/6] A bit of SDMA (mostly) streamlining Tvrtko Ursulin
  2026-09-09 10:52 ` [PATCH 1/6] drm/amdgpu: Add SDMA ring init helper Tvrtko Ursulin
  2026-09-09 10:52 ` [PATCH 2/6] drm/amdgpu: Add amdgpu_sdma_types.h header Tvrtko Ursulin
@ 2026-09-09 10:52 ` Tvrtko Ursulin
  2026-09-09 10:52 ` [PATCH 4/6] drm/amdgpu: Cache the SDMA CSA address Tvrtko Ursulin
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 13+ messages in thread
From: Tvrtko Ursulin @ 2026-09-09 10:52 UTC (permalink / raw)
  To: amd-gfx; +Cc: kernel-dev, Tvrtko Ursulin, Timur Kristóf

Instead of searching for the matching SDMA instance inside many of the
SDMA ring vfuncs lets just use the instance number already stored in the
ring and replace the function calls and array walks with direct lookups.

As these helpers are used only from SDMA vfuncs we can remove safely
remove the "is this a SDMA ring" checks as well.

We could add an assert that ring->type queried is AMDGPU_RING_TYPE_SDMA
but as currently there are no debug build only assert macros in this
driver for now I opted not to so the helper can stay a trivial static
inline without polluting the callers with out of line logging.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Cc: Timur Kristóf <timur.kristof@gmail.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c | 45 +++---------------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h |  9 +++--
 drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c   |  6 ++--
 drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c   |  6 ++--
 drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c   |  6 ++--
 drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c |  6 ++--
 drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c   | 10 +++---
 drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c   | 12 +++----
 drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c   | 12 +++----
 drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c   | 12 +++----
 drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c   | 12 +++----
 11 files changed, 55 insertions(+), 81 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
index cca8b3a98f6a..68a92ce49ac2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
@@ -56,57 +56,20 @@ int amdgpu_sdma_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
 	return 0;
 }
 
-struct amdgpu_sdma_instance *amdgpu_sdma_get_instance_from_ring(struct amdgpu_ring *ring)
-{
-	struct amdgpu_device *adev = ring->adev;
-	int i;
-
-	for (i = 0; i < adev->sdma.num_instances; i++)
-		if (ring == &adev->sdma.instance[i].ring ||
-		    ring == &adev->sdma.instance[i].page)
-			return &adev->sdma.instance[i];
-
-	return NULL;
-}
-
-int amdgpu_sdma_get_index_from_ring(struct amdgpu_ring *ring, uint32_t *index)
-{
-	struct amdgpu_device *adev = ring->adev;
-	int i;
-
-	for (i = 0; i < adev->sdma.num_instances; i++) {
-		if (ring == &adev->sdma.instance[i].ring ||
-			ring == &adev->sdma.instance[i].page) {
-			*index = i;
-			return 0;
-		}
-	}
-
-	return -EINVAL;
-}
-
 uint64_t amdgpu_sdma_get_csa_mc_addr(struct amdgpu_ring *ring,
 				     unsigned int vmid)
 {
 	struct amdgpu_device *adev = ring->adev;
-	uint64_t csa_mc_addr;
-	uint32_t index = 0;
-	int r;
 
 	/* don't enable OS preemption on SDMA under SRIOV */
 	if (amdgpu_sriov_vf(adev) || vmid == 0 || !adev->gfx.mcbp)
 		return 0;
 
-	r = amdgpu_sdma_get_index_from_ring(ring, &index);
+	if (ring->me > 31)
+		return 0;
 
-	if (r || index > 31)
-		csa_mc_addr = 0;
-	else
-		csa_mc_addr = amdgpu_csa_vaddr(adev) +
-			AMDGPU_CSA_SDMA_OFFSET +
-			index * AMDGPU_CSA_SDMA_SIZE;
-
-	return csa_mc_addr;
+	return amdgpu_csa_vaddr(adev) + AMDGPU_CSA_SDMA_OFFSET +
+	       ring->me * AMDGPU_CSA_SDMA_SIZE;
 }
 
 int amdgpu_sdma_ras_late_init(struct amdgpu_device *adev,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
index 526ea305a7de..14c67e46515f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
@@ -48,9 +48,12 @@ int amdgpu_sdma_reset_engine(struct amdgpu_device *adev, uint32_t instance_id,
 #define amdgpu_emit_copy_buffer(adev, ib, s, d, b, t) (adev)->mman.buffer_funcs->emit_copy_buffer((ib),  (s), (d), (b), (t))
 #define amdgpu_emit_fill_buffer(adev, ib, s, d, b) (adev)->mman.buffer_funcs->emit_fill_buffer((ib), (s), (d), (b))
 
-struct amdgpu_sdma_instance *
-amdgpu_sdma_get_instance_from_ring(struct amdgpu_ring *ring);
-int amdgpu_sdma_get_index_from_ring(struct amdgpu_ring *ring, uint32_t *index);
+static inline struct amdgpu_sdma_instance *
+amdgpu_sdma_get_instance_from_ring(struct amdgpu_ring *ring)
+{
+	return &ring->adev->sdma.instance[ring->me];
+}
+
 uint64_t amdgpu_sdma_get_csa_mc_addr(struct amdgpu_ring *ring, unsigned vmid);
 int amdgpu_sdma_ras_late_init(struct amdgpu_device *adev,
 			      struct ras_common_if *ras_block);
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
index 1f9fd8b23ac7..006f3fd3464a 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
@@ -224,10 +224,11 @@ static void sdma_v2_4_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v2_4_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	int i;
 
 	for (i = 0; i < count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			amdgpu_ring_write(ring, ring->funcs->nop |
 				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
 		else
@@ -739,12 +740,13 @@ static void sdma_v2_4_vm_set_pte_pde(struct amdgpu_ib *ib, uint64_t pe,
 static void sdma_v2_4_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	u32 pad_count;
 	int i;
 
 	pad_count = (-ib->length_dw) & 7;
 	for (i = 0; i < pad_count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			ib->ptr[ib->length_dw++] =
 				SDMA_PKT_HEADER_OP(SDMA_OP_NOP) |
 				SDMA_PKT_NOP_HEADER_COUNT(pad_count - 1);
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
index 6577306311a3..3fb15032e1ef 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
@@ -401,10 +401,11 @@ static void sdma_v3_0_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v3_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	int i;
 
 	for (i = 0; i < count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			amdgpu_ring_write(ring, ring->funcs->nop |
 				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
 		else
@@ -1013,12 +1014,13 @@ static void sdma_v3_0_vm_set_pte_pde(struct amdgpu_ib *ib, uint64_t pe,
 static void sdma_v3_0_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	u32 pad_count;
 	int i;
 
 	pad_count = (-ib->length_dw) & 7;
 	for (i = 0; i < pad_count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			ib->ptr[ib->length_dw++] =
 				SDMA_PKT_HEADER_OP(SDMA_OP_NOP) |
 				SDMA_PKT_NOP_HEADER_COUNT(pad_count - 1);
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
index 5ab191806b22..dfb0ea709bad 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
@@ -784,10 +784,11 @@ static void sdma_v4_0_page_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v4_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	int i;
 
 	for (i = 0; i < count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			amdgpu_ring_write(ring, ring->funcs->nop |
 				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
 		else
@@ -1673,12 +1674,13 @@ static void sdma_v4_0_vm_set_pte_pde(struct amdgpu_ib *ib,
 static void sdma_v4_0_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	u32 pad_count;
 	int i;
 
 	pad_count = (-ib->length_dw) & 7;
 	for (i = 0; i < pad_count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			ib->ptr[ib->length_dw++] =
 				SDMA_PKT_HEADER_OP(SDMA_OP_NOP) |
 				SDMA_PKT_NOP_HEADER_COUNT(pad_count - 1);
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 365085a15a34..da8206b834e5 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
@@ -349,10 +349,11 @@ static void sdma_v4_4_2_page_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v4_4_2_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	int i;
 
 	for (i = 0; i < count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			amdgpu_ring_write(ring, ring->funcs->nop |
 				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
 		else
@@ -1267,12 +1268,13 @@ static void sdma_v4_4_2_vm_set_pte_pde(struct amdgpu_ib *ib,
 static void sdma_v4_4_2_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	u32 pad_count;
 	int i;
 
 	pad_count = (-ib->length_dw) & 7;
 	for (i = 0; i < pad_count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			ib->ptr[ib->length_dw++] =
 				SDMA_PKT_HEADER_OP(SDMA_OP_NOP) |
 				SDMA_PKT_NOP_HEADER_COUNT(pad_count - 1);
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
index b803d74fc40f..cb36b38582c5 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
@@ -407,10 +407,11 @@ static void sdma_v5_0_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v5_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	int i;
 
 	for (i = 0; i < count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			amdgpu_ring_write(ring, ring->funcs->nop |
 				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
 		else
@@ -1241,12 +1242,13 @@ static void sdma_v5_0_vm_set_pte_pde(struct amdgpu_ib *ib,
 static void sdma_v5_0_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	u32 pad_count;
 	int i;
 
 	pad_count = (-ib->length_dw) & 0x7;
 	for (i = 0; i < pad_count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			ib->ptr[ib->length_dw++] =
 				SDMA_PKT_HEADER_OP(SDMA_OP_NOP) |
 				SDMA_PKT_NOP_HEADER_COUNT(pad_count - 1);
@@ -1620,11 +1622,9 @@ static int sdma_v5_0_ring_preempt_ib(struct amdgpu_ring *ring)
 {
 	int i, r = 0;
 	struct amdgpu_device *adev = ring->adev;
-	u32 index = 0;
 	u64 sdma_gfx_preempt;
 
-	amdgpu_sdma_get_index_from_ring(ring, &index);
-	if (index == 0)
+	if (ring->me == 0)
 		sdma_gfx_preempt = mmSDMA0_GFX_PREEMPT;
 	else
 		sdma_gfx_preempt = mmSDMA1_GFX_PREEMPT;
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
index 213fa9ac883f..2858820bb864 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
@@ -255,10 +255,11 @@ static void sdma_v5_2_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v5_2_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	int i;
 
 	for (i = 0; i < count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			amdgpu_ring_write(ring, ring->funcs->nop |
 				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
 		else
@@ -1142,12 +1143,13 @@ static void sdma_v5_2_vm_set_pte_pde(struct amdgpu_ib *ib,
 static void sdma_v5_2_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	u32 pad_count;
 	int i;
 
 	pad_count = (-ib->length_dw) & 0x7;
 	for (i = 0; i < pad_count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			ib->ptr[ib->length_dw++] =
 				SDMA_PKT_HEADER_OP(SDMA_OP_NOP) |
 				SDMA_PKT_NOP_HEADER_COUNT(pad_count - 1);
@@ -1536,12 +1538,10 @@ static int sdma_v5_2_ring_preempt_ib(struct amdgpu_ring *ring)
 {
 	int i, r = 0;
 	struct amdgpu_device *adev = ring->adev;
-	u32 index = 0;
 	u64 sdma_gfx_preempt;
 
-	amdgpu_sdma_get_index_from_ring(ring, &index);
-	sdma_gfx_preempt =
-		sdma_v5_2_get_reg_offset(adev, index, mmSDMA0_GFX_PREEMPT);
+	sdma_gfx_preempt = sdma_v5_2_get_reg_offset(adev, ring->me,
+						    mmSDMA0_GFX_PREEMPT);
 
 	/* assert preemption condition */
 	amdgpu_ring_set_preempt_cond_exec(ring, false);
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
index 2f5de866b248..d3504606bee7 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
@@ -243,10 +243,11 @@ static void sdma_v6_0_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v6_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	int i;
 
 	for (i = 0; i < count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			amdgpu_ring_write(ring, ring->funcs->nop |
 				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
 		else
@@ -1132,12 +1133,13 @@ static void sdma_v6_0_vm_set_pte_pde(struct amdgpu_ib *ib,
 static void sdma_v6_0_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	u32 pad_count;
 	int i;
 
 	pad_count = (-ib->length_dw) & 0x7;
 	for (i = 0; i < pad_count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			ib->ptr[ib->length_dw++] =
 				SDMA_PKT_COPY_LINEAR_HEADER_OP(SDMA_OP_NOP) |
 				SDMA_PKT_NOP_HEADER_COUNT(pad_count - 1);
@@ -1512,12 +1514,10 @@ static int sdma_v6_0_ring_preempt_ib(struct amdgpu_ring *ring)
 {
 	int i, r = 0;
 	struct amdgpu_device *adev = ring->adev;
-	u32 index = 0;
 	u64 sdma_gfx_preempt;
 
-	amdgpu_sdma_get_index_from_ring(ring, &index);
-	sdma_gfx_preempt =
-		sdma_v6_0_get_reg_offset(adev, index, regSDMA0_QUEUE0_PREEMPT);
+	sdma_gfx_preempt = sdma_v6_0_get_reg_offset(adev, ring->me,
+						    regSDMA0_QUEUE0_PREEMPT);
 
 	/* assert preemption condition */
 	amdgpu_ring_set_preempt_cond_exec(ring, false);
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
index d5cad2cede98..1760f03db9e7 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
@@ -245,10 +245,11 @@ static void sdma_v7_0_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v7_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	int i;
 
 	for (i = 0; i < count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			amdgpu_ring_write(ring, ring->funcs->nop |
 				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
 		else
@@ -1151,12 +1152,13 @@ static void sdma_v7_0_vm_set_pte_pde(struct amdgpu_ib *ib,
 static void sdma_v7_0_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	u32 pad_count;
 	int i;
 
 	pad_count = (-ib->length_dw) & 0x7;
 	for (i = 0; i < pad_count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			ib->ptr[ib->length_dw++] =
 				SDMA_PKT_COPY_LINEAR_HEADER_OP(SDMA_OP_NOP) |
 				SDMA_PKT_NOP_HEADER_COUNT(pad_count - 1);
@@ -1465,12 +1467,10 @@ static int sdma_v7_0_ring_preempt_ib(struct amdgpu_ring *ring)
 {
 	int i, r = 0;
 	struct amdgpu_device *adev = ring->adev;
-	u32 index = 0;
 	u64 sdma_gfx_preempt;
 
-	amdgpu_sdma_get_index_from_ring(ring, &index);
-	sdma_gfx_preempt =
-		sdma_v7_0_get_reg_offset(adev, index, regSDMA0_QUEUE0_PREEMPT);
+	sdma_gfx_preempt = sdma_v7_0_get_reg_offset(adev, ring->me,
+						    regSDMA0_QUEUE0_PREEMPT);
 
 	/* assert preemption condition */
 	amdgpu_ring_set_preempt_cond_exec(ring, false);
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
index bf26cc515b9a..b9f11f2f7e5c 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
@@ -239,10 +239,11 @@ static void sdma_v7_1_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v7_1_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	int i;
 
 	for (i = 0; i < count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			amdgpu_ring_write(ring, ring->funcs->nop |
 				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
 		else
@@ -1162,12 +1163,13 @@ static void sdma_v7_1_vm_set_pte_pde(struct amdgpu_ib *ib,
 static void sdma_v7_1_ring_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
+	const bool burst_nop = sdma->burst_nop;
 	u32 pad_count;
 	int i;
 
 	pad_count = (-ib->length_dw) & 0x7;
 	for (i = 0; i < pad_count; i++)
-		if (sdma && sdma->burst_nop && (i == 0))
+		if (i == 0 && burst_nop)
 			ib->ptr[ib->length_dw++] =
 				SDMA_PKT_COPY_LINEAR_HEADER_OP(SDMA_OP_NOP) |
 				SDMA_PKT_NOP_HEADER_COUNT(pad_count - 1);
@@ -1454,12 +1456,10 @@ static int sdma_v7_1_ring_preempt_ib(struct amdgpu_ring *ring)
 {
 	int i, r = 0;
 	struct amdgpu_device *adev = ring->adev;
-	u32 index = 0;
 	u64 sdma_gfx_preempt;
 
-	amdgpu_sdma_get_index_from_ring(ring, &index);
-	sdma_gfx_preempt =
-		sdma_v7_1_get_reg_offset(adev, index, regSDMA0_SDMA_QUEUE0_PREEMPT);
+	sdma_gfx_preempt = sdma_v7_1_get_reg_offset(adev, ring->me,
+						    regSDMA0_SDMA_QUEUE0_PREEMPT);
 
 	/* assert preemption condition */
 	amdgpu_ring_set_preempt_cond_exec(ring, false);
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 4/6] drm/amdgpu: Cache the SDMA CSA address
  2026-09-09 10:52 [PATCH 0/6] A bit of SDMA (mostly) streamlining Tvrtko Ursulin
                   ` (2 preceding siblings ...)
  2026-09-09 10:52 ` [PATCH 3/6] drm/amdgpu: Convert SDMA instance and index to direct lookup Tvrtko Ursulin
@ 2026-09-09 10:52 ` Tvrtko Ursulin
  2026-09-09 10:52 ` [PATCH 5/6] drm/amdgpu: Extend logical to device instance lookup to all devices Tvrtko Ursulin
  2026-09-09 10:52 ` [PATCH 6/6] drm/amdgpu: Use memset32 for SDMA padding Tvrtko Ursulin
  5 siblings, 0 replies; 13+ messages in thread
From: Tvrtko Ursulin @ 2026-09-09 10:52 UTC (permalink / raw)
  To: amd-gfx; +Cc: kernel-dev, Tvrtko Ursulin, Timur Kristóf

SDMA CSA address is static while the driver is loaded so lets store it in
the SDMA instance allowing us to simplify and inline the
amdgpu_sdma_get_csa_mc_addr() helper.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Cc: Timur Kristóf <timur.kristof@gmail.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c      | 23 ++++++++-----------
 drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h      | 10 +++++++-
 .../gpu/drm/amd/amdgpu/amdgpu_sdma_types.h    |  2 ++
 3 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
index 68a92ce49ac2..687e9863f11f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
@@ -40,6 +40,7 @@
 int amdgpu_sdma_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
 			  const char *prefix, unsigned int index)
 {
+	struct amdgpu_sdma_instance *sdma;
 	int r;
 
 	ring->ring_obj = NULL;
@@ -53,23 +54,17 @@ int amdgpu_sdma_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
 	if (r)
 		return r;
 
-	return 0;
-}
-
-uint64_t amdgpu_sdma_get_csa_mc_addr(struct amdgpu_ring *ring,
-				     unsigned int vmid)
-{
-	struct amdgpu_device *adev = ring->adev;
+	sdma = amdgpu_sdma_get_instance_from_ring(ring);
 
 	/* don't enable OS preemption on SDMA under SRIOV */
-	if (amdgpu_sriov_vf(adev) || vmid == 0 || !adev->gfx.mcbp)
-		return 0;
+	if (amdgpu_sriov_vf(adev) || !adev->gfx.mcbp)
+		sdma->csa_addr = 0;
+	else
+		sdma->csa_addr = amdgpu_csa_vaddr(adev) +
+				 AMDGPU_CSA_SDMA_OFFSET +
+				 ring->me * AMDGPU_CSA_SDMA_SIZE;
 
-	if (ring->me > 31)
-		return 0;
-
-	return amdgpu_csa_vaddr(adev) + AMDGPU_CSA_SDMA_OFFSET +
-	       ring->me * AMDGPU_CSA_SDMA_SIZE;
+	return 0;
 }
 
 int amdgpu_sdma_ras_late_init(struct amdgpu_device *adev,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
index 14c67e46515f..0142edba7817 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
@@ -54,7 +54,15 @@ amdgpu_sdma_get_instance_from_ring(struct amdgpu_ring *ring)
 	return &ring->adev->sdma.instance[ring->me];
 }
 
-uint64_t amdgpu_sdma_get_csa_mc_addr(struct amdgpu_ring *ring, unsigned vmid);
+static inline uint64_t
+amdgpu_sdma_get_csa_mc_addr(struct amdgpu_ring *ring, unsigned vmid)
+{
+	if (vmid == 0)
+		return 0;
+	else
+		return amdgpu_sdma_get_instance_from_ring(ring)->csa_addr;
+}
+
 int amdgpu_sdma_ras_late_init(struct amdgpu_device *adev,
 			      struct ras_common_if *ras_block);
 int amdgpu_sdma_process_ras_data_cb(struct amdgpu_device *adev,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h
index d6e7a703c2e0..61be3d593d18 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h
@@ -73,6 +73,8 @@ struct amdgpu_sdma_instance {
 	    uint32_t		xcc_id;
 	};
 
+	uint64_t		csa_addr;
+
 	struct amdgpu_bo	*sdma_fw_obj;
 	uint64_t		sdma_fw_gpu_addr;
 	uint32_t		*sdma_fw_ptr;
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 5/6] drm/amdgpu: Extend logical to device instance lookup to all devices
  2026-09-09 10:52 [PATCH 0/6] A bit of SDMA (mostly) streamlining Tvrtko Ursulin
                   ` (3 preceding siblings ...)
  2026-09-09 10:52 ` [PATCH 4/6] drm/amdgpu: Cache the SDMA CSA address Tvrtko Ursulin
@ 2026-09-09 10:52 ` Tvrtko Ursulin
  2026-09-09 10:52 ` [PATCH 6/6] drm/amdgpu: Use memset32 for SDMA padding Tvrtko Ursulin
  5 siblings, 0 replies; 13+ messages in thread
From: Tvrtko Ursulin @ 2026-09-09 10:52 UTC (permalink / raw)
  To: amd-gfx; +Cc: kernel-dev, Tvrtko Ursulin, Timur Kristóf

A subset of supported devices can have a mismatch between the logical and
device engine instance numbers which the driver currently solves by a
combination of lookup table generated at driver init time, and a
conditionally set vfunc checked and used at runtime to do the lookup.

As the requirement to do these lookups is relatively widespread in the
code base, plus the fact the mapping table is already allocated for all
possible hw ips and instances, we can significantly streamline them by
initializing the said lookup table unconditionally to the predominant
"identity map" (logical instance numbers equal to device instances),
and allow affected parts to re-configure the table based on their
configuration.

The effect is that for each lookup site we replace the conditional
followed by a indirect function call with a simple two-dimensional table
lookup.

Bloat-o-meter agrees the savings are significant:

add/remove: 13/12 grow/shrink: 23/279 up/down: 51626/-198973 (-147347)
...
Total: Before=10139692, After=9992345, chg -1.45%

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Cc: Timur Kristóf <timur.kristof@gmail.com>
---
 .../drm/amd/amdgpu/amdgpu_amdkfd_gc_9_4_3.c   |  1 +
 .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c |  1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c    |  2 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_ip.c        | 49 +++++++------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_ip.h        | 21 +++++---
 drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c      |  1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c       |  1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c       |  1 +
 drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c    |  2 +-
 drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c       |  8 +--
 drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c      |  1 +
 drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c        |  1 +
 drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c        |  1 +
 drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c        |  1 +
 drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c         |  1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c      |  1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c      |  1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_0.c      |  1 +
 drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c      |  1 +
 drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c        |  1 +
 drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c      |  1 +
 drivers/gpu/drm/amd/amdgpu/soc15_common.h     |  6 +--
 drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c         |  1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c         |  1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c         |  1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c         |  1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c       |  1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c       |  1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c       |  1 +
 drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c       |  1 +
 drivers/gpu/drm/amd/amdkfd/kfd_device.c       |  1 +
 .../drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c |  1 +
 .../drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c  |  1 +
 drivers/gpu/drm/amd/ras/ras_mgr/ras_sys.h     |  7 ++-
 34 files changed, 70 insertions(+), 52 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gc_9_4_3.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gc_9_4_3.c
index bc079b95fc52..4626e0b13909 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gc_9_4_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gc_9_4_3.c
@@ -20,6 +20,7 @@
  * OTHER DEALINGS IN THE SOFTWARE.
  */
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_amdkfd.h"
 #include "amdgpu_amdkfd_gfx_v9.h"
 #include "amdgpu_amdkfd_aldebaran.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
index b30ad9701bce..38566dfea023 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
@@ -20,6 +20,7 @@
  * OTHER DEALINGS IN THE SOFTWARE.
  */
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_amdkfd.h"
 #include "gc/gc_9_0_offset.h"
 #include "gc/gc_9_0_sh_mask.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 0426118a9279..7af65416acc5 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -68,6 +68,7 @@
 #include "amdgpu_vf_error.h"
 
 #include "amdgpu_amdkfd.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_pm.h"
 
 #include "amdgpu_xgmi.h"
@@ -3850,6 +3851,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,
 
 	spin_lock_init(&adev->irq.lock);
 
+	amdgpu_ip_map_init(adev);
 	amdgpu_early_init_rlc_reg_funcs(adev);
 	amdgpu_device_init_apu_flags(adev);
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ip.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ip.c
index a426327f2141..5b908b4ce54a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ip.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ip.c
@@ -24,39 +24,16 @@
 #include "amdgpu.h"
 #include "amdgpu_ip.h"
 
-static int8_t amdgpu_logical_to_dev_inst(struct amdgpu_device *adev,
-					 enum amd_hw_ip_block_type block,
-					 int8_t inst)
+u32 amdgpu_ip_map_logical_to_dev_mask(struct amdgpu_ip_map_info *ip_map,
+				      enum amd_hw_ip_block_type block,
+				      u32 mask)
 {
-	int8_t dev_inst;
-
-	switch (block) {
-	case GC_HWIP:
-	case SDMA0_HWIP:
-	/* Both JPEG and VCN as JPEG is only alias of VCN */
-	case VCN_HWIP:
-		dev_inst = adev->ip_map.dev_inst[block][inst];
-		break;
-	default:
-		/* For rest of the IPs, no look up required.
-		 * Assume 'logical instance == physical instance' for all configs. */
-		dev_inst = inst;
-		break;
-	}
-
-	return dev_inst;
-}
-
-static uint32_t amdgpu_logical_to_dev_mask(struct amdgpu_device *adev,
-					   enum amd_hw_ip_block_type block,
-					   uint32_t mask)
-{
-	uint32_t dev_mask = 0;
-	int8_t log_inst, dev_inst;
+	unsigned int log_inst, dev_inst;
+	u32 dev_mask = 0;
 
 	while (mask) {
 		log_inst = ffs(mask) - 1;
-		dev_inst = amdgpu_logical_to_dev_inst(adev, block, log_inst);
+		dev_inst = ip_map->dev_inst[block][log_inst];
 		dev_mask |= (1 << dev_inst);
 		mask &= ~(1 << log_inst);
 	}
@@ -80,6 +57,17 @@ static void amdgpu_populate_ip_map(struct amdgpu_device *adev,
 }
 
 void amdgpu_ip_map_init(struct amdgpu_device *adev)
+{
+	int i, j;
+
+	/* Assume 'logical instance == physical instance' unless overridden. */
+	for (i = 0; i < MAX_HWIP; i++) {
+		for (j = 0; j < HWIP_MAX_INSTANCE; j++)
+			adev->ip_map.dev_inst[i][j] = j;
+	}
+}
+
+void amdgpu_ip_map_aqua_vanjaram_override(struct amdgpu_device *adev)
 {
 	u32 ip_map[][2] = {
 		{ GC_HWIP, adev->gfx.xcc_mask },
@@ -90,9 +78,6 @@ void amdgpu_ip_map_init(struct amdgpu_device *adev)
 
 	for (i = 0; i < ARRAY_SIZE(ip_map); ++i)
 		amdgpu_populate_ip_map(adev, ip_map[i][0], ip_map[i][1]);
-
-	adev->ip_map.logical_to_dev_inst = amdgpu_logical_to_dev_inst;
-	adev->ip_map.logical_to_dev_mask = amdgpu_logical_to_dev_mask;
 }
 
 int amdgpu_ip_block_suspend(struct amdgpu_ip_block *ip_block)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ip.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ip.h
index 70fc4e5db51f..8e739d19dec2 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ip.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ip.h
@@ -90,13 +90,7 @@ struct amdgpu_fence;
 
 struct amdgpu_ip_map_info {
 	/* Map of logical to actual dev instances/mask */
-	uint32_t dev_inst[MAX_HWIP][HWIP_MAX_INSTANCE];
-	int8_t (*logical_to_dev_inst)(struct amdgpu_device *adev,
-				      enum amd_hw_ip_block_type block,
-				      int8_t inst);
-	uint32_t (*logical_to_dev_mask)(struct amdgpu_device *adev,
-					enum amd_hw_ip_block_type block,
-					uint32_t mask);
+	unsigned int dev_inst[MAX_HWIP][HWIP_MAX_INSTANCE];
 };
 
 #define AMDGPU_MAX_IP_NUM AMD_IP_BLOCK_TYPE_NUM
@@ -124,6 +118,19 @@ struct amdgpu_ip_block {
 };
 
 void amdgpu_ip_map_init(struct amdgpu_device *adev);
+void amdgpu_ip_map_aqua_vanjaram_override(struct amdgpu_device *adev);
+
+u32 amdgpu_ip_map_logical_to_dev_mask(struct amdgpu_ip_map_info *ip_map,
+				      enum amd_hw_ip_block_type block,
+				      u32 mask);
+
+static inline unsigned int
+amdgpu_ip_map_logical_to_dev_inst(struct amdgpu_ip_map_info *ip_map,
+				  enum amd_hw_ip_block_type block,
+				  unsigned int inst)
+{
+	return ip_map->dev_inst[block][inst];
+}
 
 int amdgpu_ip_block_suspend(struct amdgpu_ip_block *ip_block);
 int amdgpu_ip_block_resume(struct amdgpu_ip_block *ip_block);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c
index 208566ffe898..9887a4f99aed 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c
@@ -25,6 +25,7 @@
  */
 
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_jpeg.h"
 #include "amdgpu_pm.h"
 #include "soc15d.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index a676fccc466d..66eb2f34cc0d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -27,6 +27,7 @@
 #include <drm/drm_drv.h>
 
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_psp.h"
 #include "amdgpu_ucode.h"
 #include "amdgpu_xgmi.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c
index c80ffa08920d..0c2e045dc397 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c
@@ -23,6 +23,7 @@
 #include "amdgpu.h"
 #include "amdgpu_xcp.h"
 #include "amdgpu_drv.h"
+#include "amdgpu_ip.h"
 
 #include <drm/drm_drv.h>
 #include "../amdxcp/amdgpu_xcp_drv.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c b/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
index 9a0c12b1a309..87db0aeb0461 100644
--- a/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
+++ b/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
@@ -548,7 +548,7 @@ int aqua_vanjaram_init_soc_config(struct amdgpu_device *adev)
 	if (ret)
 		return ret;
 
-	amdgpu_ip_map_init(adev);
+	amdgpu_ip_map_aqua_vanjaram_override(adev);
 
 	return 0;
 }
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
index ce48da12edb2..484ecde55ac9 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c
@@ -23,6 +23,7 @@
 #include <linux/firmware.h>
 
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_gfx.h"
 #include "soc15.h"
 #include "soc15d.h"
@@ -1646,10 +1647,9 @@ static bool gfx_v9_4_3_check_rlcg_range(struct amdgpu_device *adev,
 		const struct soc15_reg_rlcg *entry;
 
 		entry = &entries[i];
-		inst = adev->ip_map.logical_to_dev_inst ?
-			       adev->ip_map.logical_to_dev_inst(
-				       adev, entry->hwip, entry->instance) :
-			       entry->instance;
+		inst = amdgpu_ip_map_logical_to_dev_inst(&adev->ip_map,
+							 entry->hwip,
+							 entry->instance);
 		reg = adev->reg_offset[entry->hwip][inst][entry->segment] +
 		      entry->reg;
 		if (offset == reg)
diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c
index 8397d3d38287..e89813590539 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c
@@ -21,6 +21,7 @@
  *
  */
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_xcp.h"
 #include "gfxhub_v1_2.h"
 #include "gfxhub_v1_1.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
index 9a8a7921ce98..490b4c4eb662 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
@@ -26,6 +26,7 @@
 #include <drm/drm_cache.h>
 
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_atomfirmware.h"
 #include "gmc_v10_0.h"
 #include "umc_v8_7.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
index bee269a8877a..3cdc7893587a 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c
@@ -26,6 +26,7 @@
 #include <drm/drm_cache.h>
 
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_atomfirmware.h"
 #include "gmc_v11_0.h"
 #include "umc_v8_10.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c
index 0cc73982ed6f..fcbaaca2dda5 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v12_0.c
@@ -27,6 +27,7 @@
 
 #include "amdgpu.h"
 #include "amdgpu_atomfirmware.h"
+#include "amdgpu_ip.h"
 #include "gmc_v12_0.h"
 #include "gmc_v12_1.h"
 #include "athub/athub_4_1_0_sh_mask.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
index 633772fa71fd..5245d8850a42 100644
--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
@@ -63,6 +63,7 @@
 
 #include "ivsrcid/vmc/irqsrcs_vmc_1_0.h"
 
+#include "amdgpu_ip.h"
 #include "amdgpu_ras.h"
 #include "amdgpu_xgmi.h"
 
diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
index 49f84e6647a5..0343a64595f2 100644
--- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_3.c
@@ -22,6 +22,7 @@
  */
 
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_jpeg.h"
 #include "soc15.h"
 #include "soc15d.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c
index 197d1af18a3a..4da3f9c995c1 100644
--- a/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c
+++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v4_0_5.c
@@ -22,6 +22,7 @@
  */
 
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_jpeg.h"
 #include "amdgpu_pm.h"
 #include "soc15.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_0.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_0.c
index 9b57fdc1e69a..dcdb089b4308 100644
--- a/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_0.c
@@ -22,6 +22,7 @@
  */
 
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_jpeg.h"
 #include "amdgpu_pm.h"
 #include "soc15.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c
index f67868132bed..f2debf6b6bd0 100644
--- a/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v5_0_1.c
@@ -22,6 +22,7 @@
  */
 
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_jpeg.h"
 #include "amdgpu_pm.h"
 #include "soc15.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c b/drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c
index bdfd2917e3ca..80f5e8106d5e 100644
--- a/drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c
+++ b/drivers/gpu/drm/amd/amdgpu/nbio_v7_9.c
@@ -22,6 +22,7 @@
  */
 #include "amdgpu.h"
 #include "nbio_v7_9.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_ras.h"
 
 #include "nbio/nbio_7_9_0_offset.h"
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 da8206b834e5..f2e6abe44a43 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
@@ -27,6 +27,7 @@
 #include <linux/pci.h>
 
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_xcp.h"
 #include "amdgpu_ucode.h"
 #include "amdgpu_trace.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/soc15_common.h b/drivers/gpu/drm/amd/amdgpu/soc15_common.h
index 47e0329b6f3f..937d02ef7124 100644
--- a/drivers/gpu/drm/amd/amdgpu/soc15_common.h
+++ b/drivers/gpu/drm/amd/amdgpu/soc15_common.h
@@ -26,11 +26,9 @@
 
 /* GET_INST returns the physical instance corresponding to a logical instance */
 #define GET_INST(ip, inst) \
-	(adev->ip_map.logical_to_dev_inst ? \
-	adev->ip_map.logical_to_dev_inst(adev, ip##_HWIP, inst) : inst)
+	amdgpu_ip_map_logical_to_dev_inst(&adev->ip_map, ip##_HWIP, inst)
 #define GET_MASK(ip, mask) \
-	(adev->ip_map.logical_to_dev_mask ? \
-	adev->ip_map.logical_to_dev_mask(adev, ip##_HWIP, mask) : mask)
+	amdgpu_ip_map_logical_to_dev_mask(&adev->ip_map, ip##_HWIP, mask)
 
 /* Register Access Macros */
 #define SOC15_REG_OFFSET(ip, inst, reg)	(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg)
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
index c559213e442c..7d2b9e4b913a 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
@@ -25,6 +25,7 @@
 #include <drm/drm_drv.h>
 
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_vcn.h"
 #include "soc15.h"
 #include "soc15d.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
index 732aaa1d8e67..10ef5616b2f5 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
@@ -25,6 +25,7 @@
 #include <drm/drm_drv.h>
 
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_vcn.h"
 #include "amdgpu_pm.h"
 #include "soc15.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
index e876733b754a..0f4f4d66e2e4 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
@@ -23,6 +23,7 @@
 
 #include <linux/firmware.h>
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_vcn.h"
 #include "amdgpu_pm.h"
 #include "amdgpu_cs.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
index 60a5636c0073..4b7f7bbe18da 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0.c
@@ -23,6 +23,7 @@
 
 #include <linux/firmware.h>
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_vcn.h"
 #include "amdgpu_pm.h"
 #include "amdgpu_cs.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
index 3d28289bc4f1..2fa8f0d911d0 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_3.c
@@ -25,6 +25,7 @@
 #include <drm/drm_drv.h>
 
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_vcn.h"
 #include "amdgpu_pm.h"
 #include "soc15.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
index 660dab262dfb..f30f80c1b07f 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v4_0_5.c
@@ -23,6 +23,7 @@
 
 #include <linux/firmware.h>
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_vcn.h"
 #include "amdgpu_pm.h"
 #include "amdgpu_cs.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
index 08fca20b2c99..7b7c3bc9f046 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_0.c
@@ -23,6 +23,7 @@
 
 #include <linux/firmware.h>
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_vcn.h"
 #include "amdgpu_pm.h"
 #include "soc15.h"
diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c
index b3b83ad20103..09e553b8a657 100644
--- a/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/vcn_v5_0_1.c
@@ -23,6 +23,7 @@
 
 #include <linux/firmware.h>
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_vcn.h"
 #include "amdgpu_pm.h"
 #include "soc15.h"
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
index 1c1e7878a2a7..351ca8718c87 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
@@ -34,6 +34,7 @@
 #include "kfd_svm.h"
 #include "kfd_migrate.h"
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_xcp.h"
 
 #define MQD_SIZE_ALIGNED 768
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
index 0033453f27e5..1ecf65d402ba 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_12_ppt.c
@@ -25,6 +25,7 @@
 
 #include <linux/firmware.h>
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_smu.h"
 #include "smu_v13_0_12_pmfw.h"
 #include "smu_v13_0_6_ppt.h"
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
index 19bc6ce29da0..ee380488d212 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_6_ppt.c
@@ -25,6 +25,7 @@
 
 #include <linux/firmware.h>
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 #include "amdgpu_smu.h"
 #include "atomfirmware.h"
 #include "amdgpu_atomfirmware.h"
diff --git a/drivers/gpu/drm/amd/ras/ras_mgr/ras_sys.h b/drivers/gpu/drm/amd/ras/ras_mgr/ras_sys.h
index de3da5571ef8..1c5e02de7fca 100644
--- a/drivers/gpu/drm/amd/ras/ras_mgr/ras_sys.h
+++ b/drivers/gpu/drm/amd/ras/ras_mgr/ras_sys.h
@@ -31,6 +31,7 @@
 #include <linux/math64.h>
 #include <linux/time.h>
 #include "amdgpu.h"
+#include "amdgpu_ip.h"
 
 /* inject address is 52 bits */
 #define RAS_UMC_INJECT_ADDR_LIMIT       (0x1ULL << 52)
@@ -96,15 +97,13 @@
 #define RAS_GET_INST(dev, ip, inst) \
 ({ \
 	struct amdgpu_device *adev = (struct amdgpu_device *)dev; \
-	adev->ip_map.logical_to_dev_inst ? \
-		adev->ip_map.logical_to_dev_inst(adev, ip##_HWIP, inst) : inst; \
+	amdgpu_ip_map_logical_to_dev_inst(&adev->ip_map, ip##_HWIP, inst); \
 })
 
 #define RAS_GET_MASK(dev, ip, mask) \
 ({ \
 	struct amdgpu_device *adev = (struct amdgpu_device *)dev; \
-	(adev->ip_map.logical_to_dev_mask ? \
-		adev->ip_map.logical_to_dev_mask(adev, ip##_HWIP, mask) : mask); \
+	amdgpu_ip_map_logical_to_dev_mask(&adev->ip_map, ip##_HWIP, mask); \
 })
 
 static inline void *ras_radix_tree_delete_iter(struct radix_tree_root *root, void *iter)
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [PATCH 6/6] drm/amdgpu: Use memset32 for SDMA padding
  2026-09-09 10:52 [PATCH 0/6] A bit of SDMA (mostly) streamlining Tvrtko Ursulin
                   ` (4 preceding siblings ...)
  2026-09-09 10:52 ` [PATCH 5/6] drm/amdgpu: Extend logical to device instance lookup to all devices Tvrtko Ursulin
@ 2026-09-09 10:52 ` Tvrtko Ursulin
  2026-09-09 18:37   ` Timur Kristóf
  5 siblings, 1 reply; 13+ messages in thread
From: Tvrtko Ursulin @ 2026-09-09 10:52 UTC (permalink / raw)
  To: amd-gfx; +Cc: kernel-dev, Tvrtko Ursulin, Timur Kristóf

Instead of open coding it via the inefficient amdgpu_ring_write(), which
which the compiler is not able to optimise much, we can add a new
amdgpu_ring_fill() helper which pads using memset32.

We convert the amdgpu_ring_insert_nop() used by the GFX rings and also
the SDMA ones. Although with SDMA this should have much less benefit than
with GFX (only SDMA v4.0 uses the 256 byte ring padding while the rest use
16), but on the other hand it should not harm and is at least more
consistent.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
Cc: Timur Kristóf <timur.kristof@gmail.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 17 +---------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 26 ++++++++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c   | 15 +++++++-------
 drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c   | 15 +++++++-------
 drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c   | 15 +++++++-------
 drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c | 15 +++++++-------
 drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c   | 15 +++++++-------
 drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c   | 15 +++++++-------
 drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c   | 15 +++++++-------
 drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c   | 15 +++++++-------
 drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c   | 15 +++++++-------
 11 files changed, 90 insertions(+), 88 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
index 686c92e96025..38434a4c3566 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -117,22 +117,7 @@ int amdgpu_ring_alloc(struct amdgpu_ring *ring, unsigned int ndw)
  */
 void amdgpu_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
-	uint32_t occupied, chunk1, chunk2;
-
-	occupied = ring->wptr & ring->buf_mask;
-	chunk1 = ring->buf_mask + 1 - occupied;
-	chunk1 = (chunk1 >= count) ? count : chunk1;
-	chunk2 = count - chunk1;
-
-	if (chunk1)
-		memset32(&ring->ring[occupied], ring->funcs->nop, chunk1);
-
-	if (chunk2)
-		memset32(ring->ring, ring->funcs->nop, chunk2);
-
-	ring->wptr += count;
-	ring->wptr &= ring->ptr_mask;
-	ring->count_dw -= count;
+	amdgpu_ring_fill(ring, ring->funcs->nop, count);
 }
 
 /**
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
index 6b6ee4083c8d..2b1d3956cdd3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
@@ -522,6 +522,32 @@ static inline void amdgpu_ring_write_multiple(struct amdgpu_ring *ring,
 	ring->count_dw -= count_dw;
 }
 
+static inline void amdgpu_ring_fill(struct amdgpu_ring *ring,
+				    u32 val, u32 count)
+{
+	const u32 buf_mask = ring->buf_mask;
+	u32 occupied, chunk1, chunk2;
+	u64 wptr = ring->wptr;
+
+	if (count == 0)
+		return;
+
+	occupied = wptr & buf_mask;
+	chunk1 = buf_mask + 1 - occupied;
+	chunk1 = (chunk1 >= count) ? count : chunk1;
+	chunk2 = count - chunk1;
+
+	if (chunk1)
+		memset32(&ring->ring[occupied], val, chunk1);
+
+	if (chunk2)
+		memset32(ring->ring, val, chunk2);
+
+	wptr += count;
+	ring->wptr = wptr & ring->ptr_mask;
+	ring->count_dw -= count;
+}
+
 static inline unsigned int amdgpu_ring_get_dw_distance(struct amdgpu_ring *ring,
 						       u64 start_wptr, u64 end_wptr)
 {
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
index 006f3fd3464a..e461e0236b5f 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
@@ -224,15 +224,14 @@ static void sdma_v2_4_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v2_4_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
-	const bool burst_nop = sdma->burst_nop;
-	int i;
+	const u32 nop = ring->funcs->nop;
 
-	for (i = 0; i < count; i++)
-		if (i == 0 && burst_nop)
-			amdgpu_ring_write(ring, ring->funcs->nop |
-				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
-		else
-			amdgpu_ring_write(ring, ring->funcs->nop);
+	if (sdma->burst_nop) {
+		--count;
+		amdgpu_ring_write(ring, nop | SDMA_PKT_NOP_HEADER_COUNT(count));
+	}
+
+	amdgpu_ring_fill(ring, nop, count);
 }
 
 /**
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
index 3fb15032e1ef..5cca7f715c6a 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
@@ -401,15 +401,14 @@ static void sdma_v3_0_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v3_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
-	const bool burst_nop = sdma->burst_nop;
-	int i;
+	const u32 nop = ring->funcs->nop;
 
-	for (i = 0; i < count; i++)
-		if (i == 0 && burst_nop)
-			amdgpu_ring_write(ring, ring->funcs->nop |
-				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
-		else
-			amdgpu_ring_write(ring, ring->funcs->nop);
+	if (sdma->burst_nop) {
+		--count;
+		amdgpu_ring_write(ring, nop | SDMA_PKT_NOP_HEADER_COUNT(count));
+	}
+
+	amdgpu_ring_fill(ring, nop, count);
 }
 
 /**
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
index dfb0ea709bad..63bdf8d4e8d5 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
@@ -784,15 +784,14 @@ static void sdma_v4_0_page_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v4_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
-	const bool burst_nop = sdma->burst_nop;
-	int i;
+	const u32 nop = ring->funcs->nop;
 
-	for (i = 0; i < count; i++)
-		if (i == 0 && burst_nop)
-			amdgpu_ring_write(ring, ring->funcs->nop |
-				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
-		else
-			amdgpu_ring_write(ring, ring->funcs->nop);
+	if (sdma->burst_nop) {
+		--count;
+		amdgpu_ring_write(ring, nop | SDMA_PKT_NOP_HEADER_COUNT(count));
+	}
+
+	amdgpu_ring_fill(ring, nop, count);
 }
 
 /**
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 f2e6abe44a43..145f862cbcc6 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
@@ -350,15 +350,14 @@ static void sdma_v4_4_2_page_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v4_4_2_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
-	const bool burst_nop = sdma->burst_nop;
-	int i;
+	const u32 nop = ring->funcs->nop;
 
-	for (i = 0; i < count; i++)
-		if (i == 0 && burst_nop)
-			amdgpu_ring_write(ring, ring->funcs->nop |
-				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
-		else
-			amdgpu_ring_write(ring, ring->funcs->nop);
+	if (sdma->burst_nop) {
+		--count;
+		amdgpu_ring_write(ring, nop | SDMA_PKT_NOP_HEADER_COUNT(count));
+	}
+
+	amdgpu_ring_fill(ring, nop, count);
 }
 
 /**
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
index cb36b38582c5..124bc5768983 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
@@ -407,15 +407,14 @@ static void sdma_v5_0_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v5_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
-	const bool burst_nop = sdma->burst_nop;
-	int i;
+	const u32 nop = ring->funcs->nop;
 
-	for (i = 0; i < count; i++)
-		if (i == 0 && burst_nop)
-			amdgpu_ring_write(ring, ring->funcs->nop |
-				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
-		else
-			amdgpu_ring_write(ring, ring->funcs->nop);
+	if (sdma->burst_nop) {
+		--count;
+		amdgpu_ring_write(ring, nop | SDMA_PKT_NOP_HEADER_COUNT(count));
+	}
+
+	amdgpu_ring_fill(ring, nop, count);
 }
 
 /**
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
index 2858820bb864..242586ea951a 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
@@ -255,15 +255,14 @@ static void sdma_v5_2_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v5_2_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
-	const bool burst_nop = sdma->burst_nop;
-	int i;
+	const u32 nop = ring->funcs->nop;
 
-	for (i = 0; i < count; i++)
-		if (i == 0 && burst_nop)
-			amdgpu_ring_write(ring, ring->funcs->nop |
-				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
-		else
-			amdgpu_ring_write(ring, ring->funcs->nop);
+	if (sdma->burst_nop) {
+		--count;
+		amdgpu_ring_write(ring, nop | SDMA_PKT_NOP_HEADER_COUNT(count));
+	}
+
+	amdgpu_ring_fill(ring, nop, count);
 }
 
 /**
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
index d3504606bee7..ae063ac3bd74 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
@@ -243,15 +243,14 @@ static void sdma_v6_0_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v6_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
-	const bool burst_nop = sdma->burst_nop;
-	int i;
+	const u32 nop = ring->funcs->nop;
 
-	for (i = 0; i < count; i++)
-		if (i == 0 && burst_nop)
-			amdgpu_ring_write(ring, ring->funcs->nop |
-				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
-		else
-			amdgpu_ring_write(ring, ring->funcs->nop);
+	if (sdma->burst_nop) {
+		--count;
+		amdgpu_ring_write(ring, nop | SDMA_PKT_NOP_HEADER_COUNT(count));
+	}
+
+	amdgpu_ring_fill(ring, nop, count);
 }
 
 /*
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
index 1760f03db9e7..fd92830d3324 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
@@ -245,15 +245,14 @@ static void sdma_v7_0_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v7_0_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
-	const bool burst_nop = sdma->burst_nop;
-	int i;
+	const u32 nop = ring->funcs->nop;
 
-	for (i = 0; i < count; i++)
-		if (i == 0 && burst_nop)
-			amdgpu_ring_write(ring, ring->funcs->nop |
-				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
-		else
-			amdgpu_ring_write(ring, ring->funcs->nop);
+	if (sdma->burst_nop) {
+		--count;
+		amdgpu_ring_write(ring, nop | SDMA_PKT_NOP_HEADER_COUNT(count));
+	}
+
+	amdgpu_ring_fill(ring, nop, count);
 }
 
 /**
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
index b9f11f2f7e5c..c0824c83ace9 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
@@ -239,15 +239,14 @@ static void sdma_v7_1_ring_set_wptr(struct amdgpu_ring *ring)
 static void sdma_v7_1_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
 {
 	struct amdgpu_sdma_instance *sdma = amdgpu_sdma_get_instance_from_ring(ring);
-	const bool burst_nop = sdma->burst_nop;
-	int i;
+	const u32 nop = ring->funcs->nop;
 
-	for (i = 0; i < count; i++)
-		if (i == 0 && burst_nop)
-			amdgpu_ring_write(ring, ring->funcs->nop |
-				SDMA_PKT_NOP_HEADER_COUNT(count - 1));
-		else
-			amdgpu_ring_write(ring, ring->funcs->nop);
+	if (sdma->burst_nop) {
+		--count;
+		amdgpu_ring_write(ring, nop | SDMA_PKT_NOP_HEADER_COUNT(count));
+	}
+
+	amdgpu_ring_fill(ring, nop, count);
 }
 
 /**
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/6] drm/amdgpu: Add SDMA ring init helper
  2026-09-09 10:52 ` [PATCH 1/6] drm/amdgpu: Add SDMA ring init helper Tvrtko Ursulin
@ 2026-09-09 18:27   ` Timur Kristóf
  2026-09-10 14:38     ` Tvrtko Ursulin
  0 siblings, 1 reply; 13+ messages in thread
From: Timur Kristóf @ 2026-09-09 18:27 UTC (permalink / raw)
  To: amd-gfx, Tvrtko Ursulin; +Cc: kernel-dev, Tvrtko Ursulin

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 <tvrtko.ursulin@igalia.com>
> Cc: Timur Kristóf <timur.kristof@gmail.com>
> ---
>  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 =




^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 2/6] drm/amdgpu: Add amdgpu_sdma_types.h header
  2026-09-09 10:52 ` [PATCH 2/6] drm/amdgpu: Add amdgpu_sdma_types.h header Tvrtko Ursulin
@ 2026-09-09 18:28   ` Timur Kristóf
  2026-09-10 14:39     ` Tvrtko Ursulin
  0 siblings, 1 reply; 13+ messages in thread
From: Timur Kristóf @ 2026-09-09 18:28 UTC (permalink / raw)
  To: amd-gfx, Tvrtko Ursulin; +Cc: kernel-dev, Tvrtko Ursulin

On 2026. szeptember 9., szerda 12:52:11 közép-európai nyári idő Tvrtko Ursulin 
wrote:
> There is an include loop between amdgpu.h and amdgpu_sdma.h which
> prevents adding any interesting static inline helpers to the latter.
> 
> Break it by moving the type definitions to a new amdgpu_sdma_types.h
> header.

Wouldn't it be simpler to add some forward-declatations to amdgpu_sdma.h 
instead?

> 
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
> Cc: Timur Kristóf <timur.kristof@gmail.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu.h           |   2 +-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c   |   1 +
>  drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c       |   2 +
>  drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h      | 141 ++--------------
>  .../gpu/drm/amd/amdgpu/amdgpu_sdma_types.h    | 159 ++++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c    |   1 +
>  drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c    |   1 +
>  drivers/gpu/drm/amd/amdgpu/cik_sdma.c         |   1 +
>  drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c        |   1 +
>  drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c        |   1 +
>  drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c        |   1 +
>  drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c      |   1 +
>  drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c        |   1 +
>  drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c        |   1 +
>  drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c        |   1 +
>  drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c        |   1 +
>  drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c        |   1 +
>  drivers/gpu/drm/amd/amdkfd/kfd_migrate.c      |   2 +
>  18 files changed, 188 insertions(+), 131 deletions(-)
>  create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 79b69d74eb2e..5811709b33b7
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -79,7 +79,7 @@
>  #include "amdgpu_umsch_mm.h"
>  #include "amdgpu_gmc.h"
>  #include "amdgpu_gfx.h"
> -#include "amdgpu_sdma.h"
> +#include "amdgpu_sdma_types.h"
>  #include "amdgpu_lsdma.h"
>  #include "amdgpu_nbio.h"
>  #include "amdgpu_reg_access.h"
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c index
> d80fe17556da..d8786a93a851 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> @@ -36,6 +36,7 @@
>  #include "amdgpu_rap.h"
>  #include "amdgpu_securedisplay.h"
>  #include "amdgpu_fw_attestation.h"
> +#include "amdgpu_sdma.h"
>  #include "amdgpu_umr.h"
> 
>  #include "amdgpu_reset.h"
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c index 7c0554506334..1bf2a42fa63c
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
> @@ -33,6 +33,8 @@
>  #include "amdgpu_gmc.h"
>  #include "amdgpu_ras.h"
>  #include "amdgpu_reset.h"
> +#include "amdgpu_ring.h"
> +#include "amdgpu_sdma.h"
>  #include "amdgpu_xgmi.h"
>  #include "amdgpu_atomfirmware.h"
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h index 2f1edef97c2f..526ea305a7de
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
> @@ -23,141 +23,22 @@
> 
>  #ifndef __AMDGPU_SDMA_H__
>  #define __AMDGPU_SDMA_H__
> -#include "amdgpu_ras.h"
> 
> -/* max number of IP instances */
> -#define AMDGPU_MAX_SDMA_INSTANCES		16
> +#include "amdgpu_sdma_types.h"
> 
> -enum amdgpu_sdma_irq {
> -	AMDGPU_SDMA_IRQ_INSTANCE0  = 0,
> -	AMDGPU_SDMA_IRQ_INSTANCE1,
> -	AMDGPU_SDMA_IRQ_INSTANCE2,
> -	AMDGPU_SDMA_IRQ_INSTANCE3,
> -	AMDGPU_SDMA_IRQ_INSTANCE4,
> -	AMDGPU_SDMA_IRQ_INSTANCE5,
> -	AMDGPU_SDMA_IRQ_INSTANCE6,
> -	AMDGPU_SDMA_IRQ_INSTANCE7,
> -	AMDGPU_SDMA_IRQ_INSTANCE8,
> -	AMDGPU_SDMA_IRQ_INSTANCE9,
> -	AMDGPU_SDMA_IRQ_INSTANCE10,
> -	AMDGPU_SDMA_IRQ_INSTANCE11,
> -	AMDGPU_SDMA_IRQ_INSTANCE12,
> -	AMDGPU_SDMA_IRQ_INSTANCE13,
> -	AMDGPU_SDMA_IRQ_INSTANCE14,
> -	AMDGPU_SDMA_IRQ_INSTANCE15,
> -	AMDGPU_SDMA_IRQ_LAST
> -};
> +#include "amdgpu.h"
> +#include "amdgpu_ring.h"
> +
> +#include <linux/types.h>
> +
> +struct amdgpu_device;
> +struct amdgpu_iv_entry;
> +struct amdgpu_irq_src;
> +struct amdgpu_ring;
> +struct ras_common_if;
> 
>  #define NUM_SDMA(x) hweight32(x)
> 
> -struct amdgpu_sdma_csa_info {
> -	u32 size;
> -	u32 alignment;
> -};
> -
> -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); -};
> -
> -struct amdgpu_sdma_instance {
> -	/* SDMA firmware */
> -	const struct firmware	*fw;
> -	uint32_t		fw_version;
> -	uint32_t		feature_version;
> -
> -	struct amdgpu_ring	ring;
> -	struct amdgpu_ring	page;
> -	bool			burst_nop;
> -	union {
> -	    uint32_t		aid_id;
> -	    uint32_t		xcc_id;
> -	};
> -
> -	struct amdgpu_bo	*sdma_fw_obj;
> -	uint64_t		sdma_fw_gpu_addr;
> -	uint32_t		*sdma_fw_ptr;
> -	struct mutex		engine_reset_mutex;
> -	/* track guilty state of GFX and PAGE queues */
> -	bool			gfx_guilty;
> -	bool			page_guilty;
> -	const struct amdgpu_sdma_funcs   *funcs;
> -};
> -
> -struct amdgpu_sdma_ras {
> -	struct amdgpu_ras_block_object ras_block;
> -};
> -
> -struct amdgpu_sdma {
> -	struct amdgpu_sdma_instance instance[AMDGPU_MAX_SDMA_INSTANCES];
> -	struct amdgpu_irq_src	trap_irq;
> -	struct amdgpu_irq_src	illegal_inst_irq;
> -	struct amdgpu_irq_src	fence_irq;
> -	struct amdgpu_irq_src	ecc_irq;
> -	struct amdgpu_irq_src	vm_hole_irq;
> -	struct amdgpu_irq_src	doorbell_invalid_irq;
> -	struct amdgpu_irq_src	pool_timeout_irq;
> -	struct amdgpu_irq_src	srbm_write_irq;
> -	struct amdgpu_irq_src	ctxt_empty_irq;
> -
> -	int			num_instances;
> -	uint32_t 		sdma_mask;
> -	bool    		sdma_debug;
> -	union {
> -	    int			num_inst_per_aid;
> -	    int			num_inst_per_xcc;
> -	};
> -	uint32_t                    srbm_soft_reset;
> -	bool			has_page_queue;
> -	struct ras_common_if	*ras_if;
> -	struct amdgpu_sdma_ras	*ras;
> -	uint32_t		*ip_dump;
> -	uint32_t 		supported_reset;
> -	struct list_head	reset_callback_list;
> -	bool			no_user_submission;
> -	bool			disable_uq;
> -	void (*get_csa_info)(struct amdgpu_device *adev,
> -			     struct amdgpu_sdma_csa_info *csa_info);
> -};
> -
> -/*
> - * Provided by hw blocks that can move/clear data.  e.g., gfx or sdma
> - * But currently, we use sdma to move data.
> - */
> -struct amdgpu_buffer_funcs {
> -	/* maximum bytes in a single operation */
> -	uint32_t	copy_max_bytes;
> -
> -	/* number of dw to reserve per operation */
> -	unsigned	copy_num_dw;
> -
> -	/* used for buffer migration */
> -	void (*emit_copy_buffer)(struct amdgpu_ib *ib,
> -				 /* src addr in bytes */
> -				 uint64_t src_offset,
> -				 /* dst addr in bytes */
> -				 uint64_t dst_offset,
> -				 /* number of byte to transfer */
> -				 uint32_t byte_count,
> -				 uint32_t copy_flags);
> -
> -	/* maximum bytes in a single operation */
> -	uint32_t	fill_max_bytes;
> -
> -	/* number of dw to reserve per operation */
> -	unsigned	fill_num_dw;
> -
> -	/* used for buffer clearing */
> -	void (*emit_fill_buffer)(struct amdgpu_ib *ib,
> -				 /* value to write to memory */
> -				 uint32_t src_data,
> -				 /* dst addr in bytes */
> -				 uint64_t dst_offset,
> -				 /* number of byte to fill */
> -				 uint32_t byte_count);
> -};
> -
>  int amdgpu_sdma_ring_init(struct amdgpu_device *adev, struct amdgpu_ring
> *ring, const char *prefix, unsigned int index);
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h new file mode 100644
> index 000000000000..d6e7a703c2e0
> --- /dev/null
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h
> @@ -0,0 +1,159 @@
> +/*
> + * Copyright 2018 Advanced Micro Devices, Inc.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the
> "Software"), + * to deal in the Software without restriction, including
> without limitation + * the rights to use, copy, modify, merge, publish,
> distribute, sublicense, + * and/or sell copies of the Software, and to
> permit persons to whom the + * Software is furnished to do so, subject to
> the following conditions: + *
> + * The above copyright notice and this permission notice shall be included
> in + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
> IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR
> ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF
> CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH
> THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE.
> + *
> + */
> +
> +#ifndef __AMDGPU_SDMA_TYPES_H__
> +#define __AMDGPU_SDMA_TYPES_H__
> +#include "amdgpu_ras.h"
> +
> +/* max number of IP instances */
> +#define AMDGPU_MAX_SDMA_INSTANCES		16
> +
> +enum amdgpu_sdma_irq {
> +	AMDGPU_SDMA_IRQ_INSTANCE0  = 0,
> +	AMDGPU_SDMA_IRQ_INSTANCE1,
> +	AMDGPU_SDMA_IRQ_INSTANCE2,
> +	AMDGPU_SDMA_IRQ_INSTANCE3,
> +	AMDGPU_SDMA_IRQ_INSTANCE4,
> +	AMDGPU_SDMA_IRQ_INSTANCE5,
> +	AMDGPU_SDMA_IRQ_INSTANCE6,
> +	AMDGPU_SDMA_IRQ_INSTANCE7,
> +	AMDGPU_SDMA_IRQ_INSTANCE8,
> +	AMDGPU_SDMA_IRQ_INSTANCE9,
> +	AMDGPU_SDMA_IRQ_INSTANCE10,
> +	AMDGPU_SDMA_IRQ_INSTANCE11,
> +	AMDGPU_SDMA_IRQ_INSTANCE12,
> +	AMDGPU_SDMA_IRQ_INSTANCE13,
> +	AMDGPU_SDMA_IRQ_INSTANCE14,
> +	AMDGPU_SDMA_IRQ_INSTANCE15,
> +	AMDGPU_SDMA_IRQ_LAST
> +};
> +
> +struct amdgpu_sdma_csa_info {
> +	u32 size;
> +	u32 alignment;
> +};
> +
> +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); +};
> +
> +struct amdgpu_sdma_instance {
> +	/* SDMA firmware */
> +	const struct firmware	*fw;
> +	uint32_t		fw_version;
> +	uint32_t		feature_version;
> +
> +	struct amdgpu_ring	ring;
> +	struct amdgpu_ring	page;
> +	bool			burst_nop;
> +	union {
> +	    uint32_t		aid_id;
> +	    uint32_t		xcc_id;
> +	};
> +
> +	struct amdgpu_bo	*sdma_fw_obj;
> +	uint64_t		sdma_fw_gpu_addr;
> +	uint32_t		*sdma_fw_ptr;
> +	struct mutex		engine_reset_mutex;
> +	/* track guilty state of GFX and PAGE queues */
> +	bool			gfx_guilty;
> +	bool			page_guilty;
> +	const struct amdgpu_sdma_funcs   *funcs;
> +};
> +
> +struct amdgpu_sdma_ras {
> +	struct amdgpu_ras_block_object ras_block;
> +};
> +
> +struct amdgpu_sdma {
> +	struct amdgpu_sdma_instance instance[AMDGPU_MAX_SDMA_INSTANCES];
> +	struct amdgpu_irq_src	trap_irq;
> +	struct amdgpu_irq_src	illegal_inst_irq;
> +	struct amdgpu_irq_src	fence_irq;
> +	struct amdgpu_irq_src	ecc_irq;
> +	struct amdgpu_irq_src	vm_hole_irq;
> +	struct amdgpu_irq_src	doorbell_invalid_irq;
> +	struct amdgpu_irq_src	pool_timeout_irq;
> +	struct amdgpu_irq_src	srbm_write_irq;
> +	struct amdgpu_irq_src	ctxt_empty_irq;
> +
> +	int			num_instances;
> +	uint32_t 		sdma_mask;
> +	bool    		sdma_debug;
> +	union {
> +	    int			num_inst_per_aid;
> +	    int			num_inst_per_xcc;
> +	};
> +	uint32_t                    srbm_soft_reset;
> +	bool			has_page_queue;
> +	struct ras_common_if	*ras_if;
> +	struct amdgpu_sdma_ras	*ras;
> +	uint32_t		*ip_dump;
> +	uint32_t 		supported_reset;
> +	struct list_head	reset_callback_list;
> +	bool			no_user_submission;
> +	bool			disable_uq;
> +	void (*get_csa_info)(struct amdgpu_device *adev,
> +			     struct amdgpu_sdma_csa_info *csa_info);
> +};
> +
> +/*
> + * Provided by hw blocks that can move/clear data.  e.g., gfx or sdma
> + * But currently, we use sdma to move data.
> + */
> +struct amdgpu_buffer_funcs {
> +	/* maximum bytes in a single operation */
> +	uint32_t	copy_max_bytes;
> +
> +	/* number of dw to reserve per operation */
> +	unsigned	copy_num_dw;
> +
> +	/* used for buffer migration */
> +	void (*emit_copy_buffer)(struct amdgpu_ib *ib,
> +				 /* src addr in bytes */
> +				 uint64_t src_offset,
> +				 /* dst addr in bytes */
> +				 uint64_t dst_offset,
> +				 /* number of byte to transfer */
> +				 uint32_t byte_count,
> +				 uint32_t copy_flags);
> +
> +	/* maximum bytes in a single operation */
> +	uint32_t	fill_max_bytes;
> +
> +	/* number of dw to reserve per operation */
> +	unsigned	fill_num_dw;
> +
> +	/* used for buffer clearing */
> +	void (*emit_fill_buffer)(struct amdgpu_ib *ib,
> +				 /* value to write to memory */
> +				 uint32_t src_data,
> +				 /* dst addr in bytes */
> +				 uint64_t dst_offset,
> +				 /* number of byte to fill */
> +				 uint32_t byte_count);
> +};
> +
> +#endif
> \ No newline at end of file
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c index
> ad8cc95e6cfa..29723ff53503 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
> @@ -26,6 +26,7 @@
>  #include <drm/drm_mm.h>
>  #include <linux/random.h>
>  #include "amdgpu.h"
> +#include "amdgpu_sdma.h"
>  #include "amdgpu_ualink.h"
>  #include "amdgpu_xgmi.h"
>  #include "amdgpu_dma_buf.h"
> diff --git a/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
> b/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c index
> cddfe4015f53..9a0c12b1a309 100644
> --- a/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
> +++ b/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
> @@ -30,6 +30,7 @@
>  #include "gfxhub_v1_2.h"
>  #include "sdma_v4_4_2.h"
>  #include "amdgpu_ip.h"
> +#include "amdgpu_sdma.h"
> 
>  void aqua_vanjaram_doorbell_index_init(struct amdgpu_device *adev)
>  {
> diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
> b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c index de2323e23566..45f429ed23e4
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
> +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
> @@ -27,6 +27,7 @@
> 
>  #include "amdgpu.h"
>  #include "amdgpu_ucode.h"
> +#include "amdgpu_sdma.h"
>  #include "amdgpu_trace.h"
>  #include "cikd.h"
>  #include "cik.h"
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c index fb2047d8e25a..1f9fd8b23ac7
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> @@ -28,6 +28,7 @@
> 
>  #include "amdgpu.h"
>  #include "amdgpu_ucode.h"
> +#include "amdgpu_sdma.h"
>  #include "amdgpu_trace.h"
>  #include "vi.h"
>  #include "vid.h"
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c index 656f66527999..6577306311a3
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> @@ -28,6 +28,7 @@
> 
>  #include "amdgpu.h"
>  #include "amdgpu_ucode.h"
> +#include "amdgpu_sdma.h"
>  #include "amdgpu_trace.h"
>  #include "vi.h"
>  #include "vid.h"
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c index e135dfb1c3e2..5ab191806b22
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> @@ -28,6 +28,7 @@
> 
>  #include "amdgpu.h"
>  #include "amdgpu_ucode.h"
> +#include "amdgpu_sdma.h"
>  #include "amdgpu_trace.h"
> 
>  #include "sdma0/sdma0_4_2_offset.h"
> 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 2e46e63a6dbf..365085a15a34
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> @@ -30,6 +30,7 @@
>  #include "amdgpu_xcp.h"
>  #include "amdgpu_ucode.h"
>  #include "amdgpu_trace.h"
> +#include "amdgpu_sdma.h"
>  #include "amdgpu_reset.h"
> 
>  #include "sdma/sdma_4_4_2_offset.h"
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c index a0614fa9ffa6..b803d74fc40f
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
> @@ -28,6 +28,7 @@
> 
>  #include "amdgpu.h"
>  #include "amdgpu_ucode.h"
> +#include "amdgpu_sdma.h"
>  #include "amdgpu_trace.h"
> 
>  #include "gc/gc_10_1_0_offset.h"
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c index 5b3dafc194d7..213fa9ac883f
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> @@ -28,6 +28,7 @@
> 
>  #include "amdgpu.h"
>  #include "amdgpu_ucode.h"
> +#include "amdgpu_sdma.h"
>  #include "amdgpu_trace.h"
> 
>  #include "gc/gc_10_3_0_offset.h"
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c index 845e622d3c1a..2f5de866b248
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> @@ -28,6 +28,7 @@
> 
>  #include "amdgpu.h"
>  #include "amdgpu_ucode.h"
> +#include "amdgpu_sdma.h"
>  #include "amdgpu_trace.h"
> 
>  #include "gc/gc_11_0_0_offset.h"
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c index ea460a19b89d..d5cad2cede98
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> @@ -28,6 +28,7 @@
> 
>  #include "amdgpu.h"
>  #include "amdgpu_ucode.h"
> +#include "amdgpu_sdma.h"
>  #include "amdgpu_trace.h"
> 
>  #include "gc/gc_12_0_0_offset.h"
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c index 1704d406c34a..bf26cc515b9a
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
> @@ -28,6 +28,7 @@
> 
>  #include "amdgpu.h"
>  #include "amdgpu_ucode.h"
> +#include "amdgpu_sdma.h"
>  #include "amdgpu_trace.h"
> 
>  #include "gc/gc_12_1_0_offset.h"
> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
> b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c index 6b64b1692235..8b96e1fe741a
> 100644
> --- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
> @@ -24,6 +24,8 @@
>  #include <linux/dma-direction.h>
>  #include <linux/dma-mapping.h>
>  #include <linux/migrate.h>
> +#include "amdgpu.h"
> +#include "amdgpu_sdma.h"
>  #include "amdgpu_sync.h"
>  #include "amdgpu_object.h"
>  #include "amdgpu_vm.h"





^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 6/6] drm/amdgpu: Use memset32 for SDMA padding
  2026-09-09 10:52 ` [PATCH 6/6] drm/amdgpu: Use memset32 for SDMA padding Tvrtko Ursulin
@ 2026-09-09 18:37   ` Timur Kristóf
  2026-09-10 14:46     ` Tvrtko Ursulin
  0 siblings, 1 reply; 13+ messages in thread
From: Timur Kristóf @ 2026-09-09 18:37 UTC (permalink / raw)
  To: amd-gfx, Tvrtko Ursulin; +Cc: kernel-dev, Tvrtko Ursulin

On 2026. szeptember 9., szerda 12:52:15 közép-európai nyári idő Tvrtko Ursulin 
wrote:
> Instead of open coding it via the inefficient amdgpu_ring_write(), which
> which the compiler is not able to optimise much, we can add a new
> amdgpu_ring_fill() helper which pads using memset32.

Can you elaborate more on that? It seems to me that amdgpu_ring_insert_nop() 
already uses memset32() so I don't see how the commit improves it.

> 
> We convert the amdgpu_ring_insert_nop() used by the GFX rings and also
> the SDMA ones.

As far as I see amdgpu_ring_insert_nop() is used by all rings not just GFX and 
SDMA, isn't it?

> Although with SDMA this should have much less benefit than
> with GFX (only SDMA v4.0 uses the 256 byte ring padding while the rest use
> 16), but on the other hand it should not harm and is at least more
> consistent.
> 
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
> Cc: Timur Kristóf <timur.kristof@gmail.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 17 +---------------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 26 ++++++++++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c   | 15 +++++++-------
>  drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c   | 15 +++++++-------
>  drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c   | 15 +++++++-------
>  drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c | 15 +++++++-------
>  drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c   | 15 +++++++-------
>  drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c   | 15 +++++++-------
>  drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c   | 15 +++++++-------
>  drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c   | 15 +++++++-------
>  drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c   | 15 +++++++-------
>  11 files changed, 90 insertions(+), 88 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c index 686c92e96025..38434a4c3566
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
> @@ -117,22 +117,7 @@ int amdgpu_ring_alloc(struct amdgpu_ring *ring,
> unsigned int ndw) */
>  void amdgpu_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
>  {
> -	uint32_t occupied, chunk1, chunk2;
> -
> -	occupied = ring->wptr & ring->buf_mask;
> -	chunk1 = ring->buf_mask + 1 - occupied;
> -	chunk1 = (chunk1 >= count) ? count : chunk1;
> -	chunk2 = count - chunk1;
> -
> -	if (chunk1)
> -		memset32(&ring->ring[occupied], ring->funcs->nop, 
chunk1);
> -
> -	if (chunk2)
> -		memset32(ring->ring, ring->funcs->nop, chunk2);
> -
> -	ring->wptr += count;
> -	ring->wptr &= ring->ptr_mask;
> -	ring->count_dw -= count;
> +	amdgpu_ring_fill(ring, ring->funcs->nop, count);
>  }
> 
>  /**
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h index 6b6ee4083c8d..2b1d3956cdd3
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> @@ -522,6 +522,32 @@ static inline void amdgpu_ring_write_multiple(struct
> amdgpu_ring *ring, ring->count_dw -= count_dw;
>  }
> 
> +static inline void amdgpu_ring_fill(struct amdgpu_ring *ring,
> +				    u32 val, u32 count)
> +{
> +	const u32 buf_mask = ring->buf_mask;
> +	u32 occupied, chunk1, chunk2;
> +	u64 wptr = ring->wptr;
> +
> +	if (count == 0)
> +		return;
> +
> +	occupied = wptr & buf_mask;
> +	chunk1 = buf_mask + 1 - occupied;
> +	chunk1 = (chunk1 >= count) ? count : chunk1;
> +	chunk2 = count - chunk1;
> +
> +	if (chunk1)
> +		memset32(&ring->ring[occupied], val, chunk1);
> +
> +	if (chunk2)
> +		memset32(ring->ring, val, chunk2);
> +
> +	wptr += count;
> +	ring->wptr = wptr & ring->ptr_mask;
> +	ring->count_dw -= count;
> +}
> +
>  static inline unsigned int amdgpu_ring_get_dw_distance(struct amdgpu_ring
> *ring, u64 start_wptr, u64 end_wptr)
>  {
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c index 006f3fd3464a..e461e0236b5f
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> @@ -224,15 +224,14 @@ static void sdma_v2_4_ring_set_wptr(struct amdgpu_ring
> *ring) static void sdma_v2_4_ring_insert_nop(struct amdgpu_ring *ring,
> uint32_t count) {
>  	struct amdgpu_sdma_instance *sdma =
> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
> sdma->burst_nop;
> -	int i;
> +	const u32 nop = ring->funcs->nop;
> 
> -	for (i = 0; i < count; i++)
> -		if (i == 0 && burst_nop)
> -			amdgpu_ring_write(ring, ring->funcs->nop |
> -				SDMA_PKT_NOP_HEADER_COUNT(count - 
1));
> -		else
> -			amdgpu_ring_write(ring, ring->funcs->nop);
> +	if (sdma->burst_nop) {
> +		--count;
> +		amdgpu_ring_write(ring, nop | 
SDMA_PKT_NOP_HEADER_COUNT(count));
> +	}
> +
> +	amdgpu_ring_fill(ring, nop, count);
>  }
> 
>  /**
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c index 3fb15032e1ef..5cca7f715c6a
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> @@ -401,15 +401,14 @@ static void sdma_v3_0_ring_set_wptr(struct amdgpu_ring
> *ring) static void sdma_v3_0_ring_insert_nop(struct amdgpu_ring *ring,
> uint32_t count) {
>  	struct amdgpu_sdma_instance *sdma =
> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
> sdma->burst_nop;
> -	int i;
> +	const u32 nop = ring->funcs->nop;
> 
> -	for (i = 0; i < count; i++)
> -		if (i == 0 && burst_nop)
> -			amdgpu_ring_write(ring, ring->funcs->nop |
> -				SDMA_PKT_NOP_HEADER_COUNT(count - 
1));
> -		else
> -			amdgpu_ring_write(ring, ring->funcs->nop);
> +	if (sdma->burst_nop) {
> +		--count;
> +		amdgpu_ring_write(ring, nop | 
SDMA_PKT_NOP_HEADER_COUNT(count));
> +	}
> +
> +	amdgpu_ring_fill(ring, nop, count);
>  }
> 
>  /**
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c index dfb0ea709bad..63bdf8d4e8d5
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
> @@ -784,15 +784,14 @@ static void sdma_v4_0_page_ring_set_wptr(struct
> amdgpu_ring *ring) static void sdma_v4_0_ring_insert_nop(struct amdgpu_ring
> *ring, uint32_t count) {
>  	struct amdgpu_sdma_instance *sdma =
> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
> sdma->burst_nop;
> -	int i;
> +	const u32 nop = ring->funcs->nop;
> 
> -	for (i = 0; i < count; i++)
> -		if (i == 0 && burst_nop)
> -			amdgpu_ring_write(ring, ring->funcs->nop |
> -				SDMA_PKT_NOP_HEADER_COUNT(count - 
1));
> -		else
> -			amdgpu_ring_write(ring, ring->funcs->nop);
> +	if (sdma->burst_nop) {
> +		--count;
> +		amdgpu_ring_write(ring, nop | 
SDMA_PKT_NOP_HEADER_COUNT(count));
> +	}
> +
> +	amdgpu_ring_fill(ring, nop, count);
>  }
> 
>  /**
> 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 f2e6abe44a43..145f862cbcc6
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> @@ -350,15 +350,14 @@ static void sdma_v4_4_2_page_ring_set_wptr(struct
> amdgpu_ring *ring) static void sdma_v4_4_2_ring_insert_nop(struct
> amdgpu_ring *ring, uint32_t count) {
>  	struct amdgpu_sdma_instance *sdma =
> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
> sdma->burst_nop;
> -	int i;
> +	const u32 nop = ring->funcs->nop;
> 
> -	for (i = 0; i < count; i++)
> -		if (i == 0 && burst_nop)
> -			amdgpu_ring_write(ring, ring->funcs->nop |
> -				SDMA_PKT_NOP_HEADER_COUNT(count - 
1));
> -		else
> -			amdgpu_ring_write(ring, ring->funcs->nop);
> +	if (sdma->burst_nop) {
> +		--count;
> +		amdgpu_ring_write(ring, nop | 
SDMA_PKT_NOP_HEADER_COUNT(count));
> +	}
> +
> +	amdgpu_ring_fill(ring, nop, count);
>  }
> 
>  /**
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c index cb36b38582c5..124bc5768983
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
> @@ -407,15 +407,14 @@ static void sdma_v5_0_ring_set_wptr(struct amdgpu_ring
> *ring) static void sdma_v5_0_ring_insert_nop(struct amdgpu_ring *ring,
> uint32_t count) {
>  	struct amdgpu_sdma_instance *sdma =
> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
> sdma->burst_nop;
> -	int i;
> +	const u32 nop = ring->funcs->nop;
> 
> -	for (i = 0; i < count; i++)
> -		if (i == 0 && burst_nop)
> -			amdgpu_ring_write(ring, ring->funcs->nop |
> -				SDMA_PKT_NOP_HEADER_COUNT(count - 
1));
> -		else
> -			amdgpu_ring_write(ring, ring->funcs->nop);
> +	if (sdma->burst_nop) {
> +		--count;
> +		amdgpu_ring_write(ring, nop | 
SDMA_PKT_NOP_HEADER_COUNT(count));
> +	}
> +
> +	amdgpu_ring_fill(ring, nop, count);
>  }
> 
>  /**
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c index 2858820bb864..242586ea951a
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
> @@ -255,15 +255,14 @@ static void sdma_v5_2_ring_set_wptr(struct amdgpu_ring
> *ring) static void sdma_v5_2_ring_insert_nop(struct amdgpu_ring *ring,
> uint32_t count) {
>  	struct amdgpu_sdma_instance *sdma =
> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
> sdma->burst_nop;
> -	int i;
> +	const u32 nop = ring->funcs->nop;
> 
> -	for (i = 0; i < count; i++)
> -		if (i == 0 && burst_nop)
> -			amdgpu_ring_write(ring, ring->funcs->nop |
> -				SDMA_PKT_NOP_HEADER_COUNT(count - 
1));
> -		else
> -			amdgpu_ring_write(ring, ring->funcs->nop);
> +	if (sdma->burst_nop) {
> +		--count;
> +		amdgpu_ring_write(ring, nop | 
SDMA_PKT_NOP_HEADER_COUNT(count));
> +	}
> +
> +	amdgpu_ring_fill(ring, nop, count);
>  }
> 
>  /**
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c index d3504606bee7..ae063ac3bd74
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
> @@ -243,15 +243,14 @@ static void sdma_v6_0_ring_set_wptr(struct amdgpu_ring
> *ring) static void sdma_v6_0_ring_insert_nop(struct amdgpu_ring *ring,
> uint32_t count) {
>  	struct amdgpu_sdma_instance *sdma =
> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
> sdma->burst_nop;
> -	int i;
> +	const u32 nop = ring->funcs->nop;
> 
> -	for (i = 0; i < count; i++)
> -		if (i == 0 && burst_nop)
> -			amdgpu_ring_write(ring, ring->funcs->nop |
> -				SDMA_PKT_NOP_HEADER_COUNT(count - 
1));
> -		else
> -			amdgpu_ring_write(ring, ring->funcs->nop);
> +	if (sdma->burst_nop) {
> +		--count;
> +		amdgpu_ring_write(ring, nop | 
SDMA_PKT_NOP_HEADER_COUNT(count));
> +	}
> +
> +	amdgpu_ring_fill(ring, nop, count);
>  }
> 
>  /*
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c index 1760f03db9e7..fd92830d3324
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> @@ -245,15 +245,14 @@ static void sdma_v7_0_ring_set_wptr(struct amdgpu_ring
> *ring) static void sdma_v7_0_ring_insert_nop(struct amdgpu_ring *ring,
> uint32_t count) {
>  	struct amdgpu_sdma_instance *sdma =
> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
> sdma->burst_nop;
> -	int i;
> +	const u32 nop = ring->funcs->nop;
> 
> -	for (i = 0; i < count; i++)
> -		if (i == 0 && burst_nop)
> -			amdgpu_ring_write(ring, ring->funcs->nop |
> -				SDMA_PKT_NOP_HEADER_COUNT(count - 
1));
> -		else
> -			amdgpu_ring_write(ring, ring->funcs->nop);
> +	if (sdma->burst_nop) {
> +		--count;
> +		amdgpu_ring_write(ring, nop | 
SDMA_PKT_NOP_HEADER_COUNT(count));
> +	}
> +
> +	amdgpu_ring_fill(ring, nop, count);
>  }
> 
>  /**
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c index b9f11f2f7e5c..c0824c83ace9
> 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
> @@ -239,15 +239,14 @@ static void sdma_v7_1_ring_set_wptr(struct amdgpu_ring
> *ring) static void sdma_v7_1_ring_insert_nop(struct amdgpu_ring *ring,
> uint32_t count) {
>  	struct amdgpu_sdma_instance *sdma =
> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
> sdma->burst_nop;
> -	int i;
> +	const u32 nop = ring->funcs->nop;
> 
> -	for (i = 0; i < count; i++)
> -		if (i == 0 && burst_nop)
> -			amdgpu_ring_write(ring, ring->funcs->nop |
> -				SDMA_PKT_NOP_HEADER_COUNT(count - 
1));
> -		else
> -			amdgpu_ring_write(ring, ring->funcs->nop);
> +	if (sdma->burst_nop) {
> +		--count;
> +		amdgpu_ring_write(ring, nop | 
SDMA_PKT_NOP_HEADER_COUNT(count));
> +	}
> +
> +	amdgpu_ring_fill(ring, nop, count);
>  }
> 
>  /**





^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 1/6] drm/amdgpu: Add SDMA ring init helper
  2026-09-09 18:27   ` Timur Kristóf
@ 2026-09-10 14:38     ` Tvrtko Ursulin
  0 siblings, 0 replies; 13+ messages in thread
From: Tvrtko Ursulin @ 2026-09-10 14:38 UTC (permalink / raw)
  To: Timur Kristóf, amd-gfx; +Cc: kernel-dev


On 09/09/2026 19:27, Timur Kristóf wrote:
> 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 <tvrtko.ursulin@igalia.com>
>> Cc: Timur Kristóf <timur.kristof@gmail.com>
>> ---
>>   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.

I can use instance_id although then it will be incosistent with the two 
helpers just below it which call it index.

Regarding xcc_id I didn't to pull in thing which are IP version 
specific. With the expection of the name, will comment on that a bit lower.

> 
>> +{
>> +	int r;
>> +
>> +	ring->ring_obj = NULL;
> 
> Maybe also consider moving here the following lines:
> ring->me = instance_id;

I considered this but noticed ring->me assignment is a bit messy.

Basically it is done it early init via *_set_ring_funcs(). And I think 
this is required for ordering.

Some IP versions then set in again *_sw_init() but I don't see how that 
is required. Shall I add a patch to remove those instead of initializing 
ring->me in this new helper?

> ring->use_doorbell = ... // based on SDMA IP version

I didn't want to pull in anything which would require branching on IP 
version.

> ring->no_user_submission = adev->sdma.no_user_submission;

ring->no_user_submission I haven't looked at. If the default would be 
the same on IPs which currently leave it at default of false.. Let me 
see.. It looks it would be safe becuase both adev and sdma instance 
struct allocations are zeroed. Don't know somehow I would be nervous of 
baking this assumption in.

> 
>> +
>> +	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);

This is the exception to my rule in that I left those callers override 
it. For 7.1:

		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);
	}

And 4.4.2:

		ring = &adev->sdma.instance[i].ring;
...
		r = amdgpu_sdma_ring_init(adev, ring, NULL, i);
...
		sprintf(ring->name, "sdma%d.%d", aid_id,
				i % adev->sdma.num_inst_per_aid);


			ring = &adev->sdma.instance[i].page;
...
			r = amdgpu_sdma_ring_init(adev, ring, NULL, i);
...
			sprintf(ring->name, "page%d.%d", aid_id,
					i % adev->sdma.num_inst_per_aid);

Maybe I try to make amdgpu_sdma_ring_init variadic and so the format and 
args can be passed in?

Regards,

Tvrtko

> 
> 
>> +
>> +	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 =
> 
> 
> 


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 2/6] drm/amdgpu: Add amdgpu_sdma_types.h header
  2026-09-09 18:28   ` Timur Kristóf
@ 2026-09-10 14:39     ` Tvrtko Ursulin
  0 siblings, 0 replies; 13+ messages in thread
From: Tvrtko Ursulin @ 2026-09-10 14:39 UTC (permalink / raw)
  To: Timur Kristóf, amd-gfx; +Cc: kernel-dev


On 09/09/2026 19:28, Timur Kristóf wrote:
> On 2026. szeptember 9., szerda 12:52:11 közép-európai nyári idő Tvrtko Ursulin
> wrote:
>> There is an include loop between amdgpu.h and amdgpu_sdma.h which
>> prevents adding any interesting static inline helpers to the latter.
>>
>> Break it by moving the type definitions to a new amdgpu_sdma_types.h
>> header.
> 
> Wouldn't it be simpler to add some forward-declatations to amdgpu_sdma.h
> instead?

That was the first thing I tried but it doesn't work.

Regards,

Tvrtko

> 
>>
>> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
>> Cc: Timur Kristóf <timur.kristof@gmail.com>
>> ---
>>   drivers/gpu/drm/amd/amdgpu/amdgpu.h           |   2 +-
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c   |   1 +
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c       |   2 +
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h      | 141 ++--------------
>>   .../gpu/drm/amd/amdgpu/amdgpu_sdma_types.h    | 159 ++++++++++++++++++
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c    |   1 +
>>   drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c    |   1 +
>>   drivers/gpu/drm/amd/amdgpu/cik_sdma.c         |   1 +
>>   drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c        |   1 +
>>   drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c        |   1 +
>>   drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c        |   1 +
>>   drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c      |   1 +
>>   drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c        |   1 +
>>   drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c        |   1 +
>>   drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c        |   1 +
>>   drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c        |   1 +
>>   drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c        |   1 +
>>   drivers/gpu/drm/amd/amdkfd/kfd_migrate.c      |   2 +
>>   18 files changed, 188 insertions(+), 131 deletions(-)
>>   create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 79b69d74eb2e..5811709b33b7
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> @@ -79,7 +79,7 @@
>>   #include "amdgpu_umsch_mm.h"
>>   #include "amdgpu_gmc.h"
>>   #include "amdgpu_gfx.h"
>> -#include "amdgpu_sdma.h"
>> +#include "amdgpu_sdma_types.h"
>>   #include "amdgpu_lsdma.h"
>>   #include "amdgpu_nbio.h"
>>   #include "amdgpu_reg_access.h"
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c index
>> d80fe17556da..d8786a93a851 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
>> @@ -36,6 +36,7 @@
>>   #include "amdgpu_rap.h"
>>   #include "amdgpu_securedisplay.h"
>>   #include "amdgpu_fw_attestation.h"
>> +#include "amdgpu_sdma.h"
>>   #include "amdgpu_umr.h"
>>
>>   #include "amdgpu_reset.h"
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c index 7c0554506334..1bf2a42fa63c
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
>> @@ -33,6 +33,8 @@
>>   #include "amdgpu_gmc.h"
>>   #include "amdgpu_ras.h"
>>   #include "amdgpu_reset.h"
>> +#include "amdgpu_ring.h"
>> +#include "amdgpu_sdma.h"
>>   #include "amdgpu_xgmi.h"
>>   #include "amdgpu_atomfirmware.h"
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h index 2f1edef97c2f..526ea305a7de
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
>> @@ -23,141 +23,22 @@
>>
>>   #ifndef __AMDGPU_SDMA_H__
>>   #define __AMDGPU_SDMA_H__
>> -#include "amdgpu_ras.h"
>>
>> -/* max number of IP instances */
>> -#define AMDGPU_MAX_SDMA_INSTANCES		16
>> +#include "amdgpu_sdma_types.h"
>>
>> -enum amdgpu_sdma_irq {
>> -	AMDGPU_SDMA_IRQ_INSTANCE0  = 0,
>> -	AMDGPU_SDMA_IRQ_INSTANCE1,
>> -	AMDGPU_SDMA_IRQ_INSTANCE2,
>> -	AMDGPU_SDMA_IRQ_INSTANCE3,
>> -	AMDGPU_SDMA_IRQ_INSTANCE4,
>> -	AMDGPU_SDMA_IRQ_INSTANCE5,
>> -	AMDGPU_SDMA_IRQ_INSTANCE6,
>> -	AMDGPU_SDMA_IRQ_INSTANCE7,
>> -	AMDGPU_SDMA_IRQ_INSTANCE8,
>> -	AMDGPU_SDMA_IRQ_INSTANCE9,
>> -	AMDGPU_SDMA_IRQ_INSTANCE10,
>> -	AMDGPU_SDMA_IRQ_INSTANCE11,
>> -	AMDGPU_SDMA_IRQ_INSTANCE12,
>> -	AMDGPU_SDMA_IRQ_INSTANCE13,
>> -	AMDGPU_SDMA_IRQ_INSTANCE14,
>> -	AMDGPU_SDMA_IRQ_INSTANCE15,
>> -	AMDGPU_SDMA_IRQ_LAST
>> -};
>> +#include "amdgpu.h"
>> +#include "amdgpu_ring.h"
>> +
>> +#include <linux/types.h>
>> +
>> +struct amdgpu_device;
>> +struct amdgpu_iv_entry;
>> +struct amdgpu_irq_src;
>> +struct amdgpu_ring;
>> +struct ras_common_if;
>>
>>   #define NUM_SDMA(x) hweight32(x)
>>
>> -struct amdgpu_sdma_csa_info {
>> -	u32 size;
>> -	u32 alignment;
>> -};
>> -
>> -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); -};
>> -
>> -struct amdgpu_sdma_instance {
>> -	/* SDMA firmware */
>> -	const struct firmware	*fw;
>> -	uint32_t		fw_version;
>> -	uint32_t		feature_version;
>> -
>> -	struct amdgpu_ring	ring;
>> -	struct amdgpu_ring	page;
>> -	bool			burst_nop;
>> -	union {
>> -	    uint32_t		aid_id;
>> -	    uint32_t		xcc_id;
>> -	};
>> -
>> -	struct amdgpu_bo	*sdma_fw_obj;
>> -	uint64_t		sdma_fw_gpu_addr;
>> -	uint32_t		*sdma_fw_ptr;
>> -	struct mutex		engine_reset_mutex;
>> -	/* track guilty state of GFX and PAGE queues */
>> -	bool			gfx_guilty;
>> -	bool			page_guilty;
>> -	const struct amdgpu_sdma_funcs   *funcs;
>> -};
>> -
>> -struct amdgpu_sdma_ras {
>> -	struct amdgpu_ras_block_object ras_block;
>> -};
>> -
>> -struct amdgpu_sdma {
>> -	struct amdgpu_sdma_instance instance[AMDGPU_MAX_SDMA_INSTANCES];
>> -	struct amdgpu_irq_src	trap_irq;
>> -	struct amdgpu_irq_src	illegal_inst_irq;
>> -	struct amdgpu_irq_src	fence_irq;
>> -	struct amdgpu_irq_src	ecc_irq;
>> -	struct amdgpu_irq_src	vm_hole_irq;
>> -	struct amdgpu_irq_src	doorbell_invalid_irq;
>> -	struct amdgpu_irq_src	pool_timeout_irq;
>> -	struct amdgpu_irq_src	srbm_write_irq;
>> -	struct amdgpu_irq_src	ctxt_empty_irq;
>> -
>> -	int			num_instances;
>> -	uint32_t 		sdma_mask;
>> -	bool    		sdma_debug;
>> -	union {
>> -	    int			num_inst_per_aid;
>> -	    int			num_inst_per_xcc;
>> -	};
>> -	uint32_t                    srbm_soft_reset;
>> -	bool			has_page_queue;
>> -	struct ras_common_if	*ras_if;
>> -	struct amdgpu_sdma_ras	*ras;
>> -	uint32_t		*ip_dump;
>> -	uint32_t 		supported_reset;
>> -	struct list_head	reset_callback_list;
>> -	bool			no_user_submission;
>> -	bool			disable_uq;
>> -	void (*get_csa_info)(struct amdgpu_device *adev,
>> -			     struct amdgpu_sdma_csa_info *csa_info);
>> -};
>> -
>> -/*
>> - * Provided by hw blocks that can move/clear data.  e.g., gfx or sdma
>> - * But currently, we use sdma to move data.
>> - */
>> -struct amdgpu_buffer_funcs {
>> -	/* maximum bytes in a single operation */
>> -	uint32_t	copy_max_bytes;
>> -
>> -	/* number of dw to reserve per operation */
>> -	unsigned	copy_num_dw;
>> -
>> -	/* used for buffer migration */
>> -	void (*emit_copy_buffer)(struct amdgpu_ib *ib,
>> -				 /* src addr in bytes */
>> -				 uint64_t src_offset,
>> -				 /* dst addr in bytes */
>> -				 uint64_t dst_offset,
>> -				 /* number of byte to transfer */
>> -				 uint32_t byte_count,
>> -				 uint32_t copy_flags);
>> -
>> -	/* maximum bytes in a single operation */
>> -	uint32_t	fill_max_bytes;
>> -
>> -	/* number of dw to reserve per operation */
>> -	unsigned	fill_num_dw;
>> -
>> -	/* used for buffer clearing */
>> -	void (*emit_fill_buffer)(struct amdgpu_ib *ib,
>> -				 /* value to write to memory */
>> -				 uint32_t src_data,
>> -				 /* dst addr in bytes */
>> -				 uint64_t dst_offset,
>> -				 /* number of byte to fill */
>> -				 uint32_t byte_count);
>> -};
>> -
>>   int amdgpu_sdma_ring_init(struct amdgpu_device *adev, struct amdgpu_ring
>> *ring, const char *prefix, unsigned int index);
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h new file mode 100644
>> index 000000000000..d6e7a703c2e0
>> --- /dev/null
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma_types.h
>> @@ -0,0 +1,159 @@
>> +/*
>> + * Copyright 2018 Advanced Micro Devices, Inc.
>> + *
>> + * Permission is hereby granted, free of charge, to any person obtaining a
>> + * copy of this software and associated documentation files (the
>> "Software"), + * to deal in the Software without restriction, including
>> without limitation + * the rights to use, copy, modify, merge, publish,
>> distribute, sublicense, + * and/or sell copies of the Software, and to
>> permit persons to whom the + * Software is furnished to do so, subject to
>> the following conditions: + *
>> + * The above copyright notice and this permission notice shall be included
>> in + * all copies or substantial portions of the Software.
>> + *
>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
>> OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
>> MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
>> IN NO EVENT SHALL + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR
>> ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF
>> CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH
>> THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE.
>> + *
>> + */
>> +
>> +#ifndef __AMDGPU_SDMA_TYPES_H__
>> +#define __AMDGPU_SDMA_TYPES_H__
>> +#include "amdgpu_ras.h"
>> +
>> +/* max number of IP instances */
>> +#define AMDGPU_MAX_SDMA_INSTANCES		16
>> +
>> +enum amdgpu_sdma_irq {
>> +	AMDGPU_SDMA_IRQ_INSTANCE0  = 0,
>> +	AMDGPU_SDMA_IRQ_INSTANCE1,
>> +	AMDGPU_SDMA_IRQ_INSTANCE2,
>> +	AMDGPU_SDMA_IRQ_INSTANCE3,
>> +	AMDGPU_SDMA_IRQ_INSTANCE4,
>> +	AMDGPU_SDMA_IRQ_INSTANCE5,
>> +	AMDGPU_SDMA_IRQ_INSTANCE6,
>> +	AMDGPU_SDMA_IRQ_INSTANCE7,
>> +	AMDGPU_SDMA_IRQ_INSTANCE8,
>> +	AMDGPU_SDMA_IRQ_INSTANCE9,
>> +	AMDGPU_SDMA_IRQ_INSTANCE10,
>> +	AMDGPU_SDMA_IRQ_INSTANCE11,
>> +	AMDGPU_SDMA_IRQ_INSTANCE12,
>> +	AMDGPU_SDMA_IRQ_INSTANCE13,
>> +	AMDGPU_SDMA_IRQ_INSTANCE14,
>> +	AMDGPU_SDMA_IRQ_INSTANCE15,
>> +	AMDGPU_SDMA_IRQ_LAST
>> +};
>> +
>> +struct amdgpu_sdma_csa_info {
>> +	u32 size;
>> +	u32 alignment;
>> +};
>> +
>> +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); +};
>> +
>> +struct amdgpu_sdma_instance {
>> +	/* SDMA firmware */
>> +	const struct firmware	*fw;
>> +	uint32_t		fw_version;
>> +	uint32_t		feature_version;
>> +
>> +	struct amdgpu_ring	ring;
>> +	struct amdgpu_ring	page;
>> +	bool			burst_nop;
>> +	union {
>> +	    uint32_t		aid_id;
>> +	    uint32_t		xcc_id;
>> +	};
>> +
>> +	struct amdgpu_bo	*sdma_fw_obj;
>> +	uint64_t		sdma_fw_gpu_addr;
>> +	uint32_t		*sdma_fw_ptr;
>> +	struct mutex		engine_reset_mutex;
>> +	/* track guilty state of GFX and PAGE queues */
>> +	bool			gfx_guilty;
>> +	bool			page_guilty;
>> +	const struct amdgpu_sdma_funcs   *funcs;
>> +};
>> +
>> +struct amdgpu_sdma_ras {
>> +	struct amdgpu_ras_block_object ras_block;
>> +};
>> +
>> +struct amdgpu_sdma {
>> +	struct amdgpu_sdma_instance instance[AMDGPU_MAX_SDMA_INSTANCES];
>> +	struct amdgpu_irq_src	trap_irq;
>> +	struct amdgpu_irq_src	illegal_inst_irq;
>> +	struct amdgpu_irq_src	fence_irq;
>> +	struct amdgpu_irq_src	ecc_irq;
>> +	struct amdgpu_irq_src	vm_hole_irq;
>> +	struct amdgpu_irq_src	doorbell_invalid_irq;
>> +	struct amdgpu_irq_src	pool_timeout_irq;
>> +	struct amdgpu_irq_src	srbm_write_irq;
>> +	struct amdgpu_irq_src	ctxt_empty_irq;
>> +
>> +	int			num_instances;
>> +	uint32_t 		sdma_mask;
>> +	bool    		sdma_debug;
>> +	union {
>> +	    int			num_inst_per_aid;
>> +	    int			num_inst_per_xcc;
>> +	};
>> +	uint32_t                    srbm_soft_reset;
>> +	bool			has_page_queue;
>> +	struct ras_common_if	*ras_if;
>> +	struct amdgpu_sdma_ras	*ras;
>> +	uint32_t		*ip_dump;
>> +	uint32_t 		supported_reset;
>> +	struct list_head	reset_callback_list;
>> +	bool			no_user_submission;
>> +	bool			disable_uq;
>> +	void (*get_csa_info)(struct amdgpu_device *adev,
>> +			     struct amdgpu_sdma_csa_info *csa_info);
>> +};
>> +
>> +/*
>> + * Provided by hw blocks that can move/clear data.  e.g., gfx or sdma
>> + * But currently, we use sdma to move data.
>> + */
>> +struct amdgpu_buffer_funcs {
>> +	/* maximum bytes in a single operation */
>> +	uint32_t	copy_max_bytes;
>> +
>> +	/* number of dw to reserve per operation */
>> +	unsigned	copy_num_dw;
>> +
>> +	/* used for buffer migration */
>> +	void (*emit_copy_buffer)(struct amdgpu_ib *ib,
>> +				 /* src addr in bytes */
>> +				 uint64_t src_offset,
>> +				 /* dst addr in bytes */
>> +				 uint64_t dst_offset,
>> +				 /* number of byte to transfer */
>> +				 uint32_t byte_count,
>> +				 uint32_t copy_flags);
>> +
>> +	/* maximum bytes in a single operation */
>> +	uint32_t	fill_max_bytes;
>> +
>> +	/* number of dw to reserve per operation */
>> +	unsigned	fill_num_dw;
>> +
>> +	/* used for buffer clearing */
>> +	void (*emit_fill_buffer)(struct amdgpu_ib *ib,
>> +				 /* value to write to memory */
>> +				 uint32_t src_data,
>> +				 /* dst addr in bytes */
>> +				 uint64_t dst_offset,
>> +				 /* number of byte to fill */
>> +				 uint32_t byte_count);
>> +};
>> +
>> +#endif
>> \ No newline at end of file
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c index
>> ad8cc95e6cfa..29723ff53503 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ualink.c
>> @@ -26,6 +26,7 @@
>>   #include <drm/drm_mm.h>
>>   #include <linux/random.h>
>>   #include "amdgpu.h"
>> +#include "amdgpu_sdma.h"
>>   #include "amdgpu_ualink.h"
>>   #include "amdgpu_xgmi.h"
>>   #include "amdgpu_dma_buf.h"
>> diff --git a/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
>> b/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c index
>> cddfe4015f53..9a0c12b1a309 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/aqua_vanjaram.c
>> @@ -30,6 +30,7 @@
>>   #include "gfxhub_v1_2.h"
>>   #include "sdma_v4_4_2.h"
>>   #include "amdgpu_ip.h"
>> +#include "amdgpu_sdma.h"
>>
>>   void aqua_vanjaram_doorbell_index_init(struct amdgpu_device *adev)
>>   {
>> diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>> b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c index de2323e23566..45f429ed23e4
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
>> @@ -27,6 +27,7 @@
>>
>>   #include "amdgpu.h"
>>   #include "amdgpu_ucode.h"
>> +#include "amdgpu_sdma.h"
>>   #include "amdgpu_trace.h"
>>   #include "cikd.h"
>>   #include "cik.h"
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c index fb2047d8e25a..1f9fd8b23ac7
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>> @@ -28,6 +28,7 @@
>>
>>   #include "amdgpu.h"
>>   #include "amdgpu_ucode.h"
>> +#include "amdgpu_sdma.h"
>>   #include "amdgpu_trace.h"
>>   #include "vi.h"
>>   #include "vid.h"
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c index 656f66527999..6577306311a3
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>> @@ -28,6 +28,7 @@
>>
>>   #include "amdgpu.h"
>>   #include "amdgpu_ucode.h"
>> +#include "amdgpu_sdma.h"
>>   #include "amdgpu_trace.h"
>>   #include "vi.h"
>>   #include "vid.h"
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c index e135dfb1c3e2..5ab191806b22
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>> @@ -28,6 +28,7 @@
>>
>>   #include "amdgpu.h"
>>   #include "amdgpu_ucode.h"
>> +#include "amdgpu_sdma.h"
>>   #include "amdgpu_trace.h"
>>
>>   #include "sdma0/sdma0_4_2_offset.h"
>> 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 2e46e63a6dbf..365085a15a34
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
>> @@ -30,6 +30,7 @@
>>   #include "amdgpu_xcp.h"
>>   #include "amdgpu_ucode.h"
>>   #include "amdgpu_trace.h"
>> +#include "amdgpu_sdma.h"
>>   #include "amdgpu_reset.h"
>>
>>   #include "sdma/sdma_4_4_2_offset.h"
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c index a0614fa9ffa6..b803d74fc40f
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
>> @@ -28,6 +28,7 @@
>>
>>   #include "amdgpu.h"
>>   #include "amdgpu_ucode.h"
>> +#include "amdgpu_sdma.h"
>>   #include "amdgpu_trace.h"
>>
>>   #include "gc/gc_10_1_0_offset.h"
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c index 5b3dafc194d7..213fa9ac883f
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
>> @@ -28,6 +28,7 @@
>>
>>   #include "amdgpu.h"
>>   #include "amdgpu_ucode.h"
>> +#include "amdgpu_sdma.h"
>>   #include "amdgpu_trace.h"
>>
>>   #include "gc/gc_10_3_0_offset.h"
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c index 845e622d3c1a..2f5de866b248
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
>> @@ -28,6 +28,7 @@
>>
>>   #include "amdgpu.h"
>>   #include "amdgpu_ucode.h"
>> +#include "amdgpu_sdma.h"
>>   #include "amdgpu_trace.h"
>>
>>   #include "gc/gc_11_0_0_offset.h"
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c index ea460a19b89d..d5cad2cede98
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
>> @@ -28,6 +28,7 @@
>>
>>   #include "amdgpu.h"
>>   #include "amdgpu_ucode.h"
>> +#include "amdgpu_sdma.h"
>>   #include "amdgpu_trace.h"
>>
>>   #include "gc/gc_12_0_0_offset.h"
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c index 1704d406c34a..bf26cc515b9a
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
>> @@ -28,6 +28,7 @@
>>
>>   #include "amdgpu.h"
>>   #include "amdgpu_ucode.h"
>> +#include "amdgpu_sdma.h"
>>   #include "amdgpu_trace.h"
>>
>>   #include "gc/gc_12_1_0_offset.h"
>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
>> b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c index 6b64b1692235..8b96e1fe741a
>> 100644
>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_migrate.c
>> @@ -24,6 +24,8 @@
>>   #include <linux/dma-direction.h>
>>   #include <linux/dma-mapping.h>
>>   #include <linux/migrate.h>
>> +#include "amdgpu.h"
>> +#include "amdgpu_sdma.h"
>>   #include "amdgpu_sync.h"
>>   #include "amdgpu_object.h"
>>   #include "amdgpu_vm.h"
> 
> 
> 
> 


^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH 6/6] drm/amdgpu: Use memset32 for SDMA padding
  2026-09-09 18:37   ` Timur Kristóf
@ 2026-09-10 14:46     ` Tvrtko Ursulin
  0 siblings, 0 replies; 13+ messages in thread
From: Tvrtko Ursulin @ 2026-09-10 14:46 UTC (permalink / raw)
  To: Timur Kristóf, amd-gfx; +Cc: kernel-dev


On 09/09/2026 19:37, Timur Kristóf wrote:
> On 2026. szeptember 9., szerda 12:52:15 közép-európai nyári idő Tvrtko Ursulin
> wrote:
>> Instead of open coding it via the inefficient amdgpu_ring_write(), which
>> which the compiler is not able to optimise much, we can add a new
>> amdgpu_ring_fill() helper which pads using memset32.
> 
> Can you elaborate more on that? It seems to me that amdgpu_ring_insert_nop()
> already uses memset32() so I don't see how the commit improves it.

I created some confusion by rewriting the commit text. This is an old 
patch I remembered I had laying around. First time I posted it was 
around July 2024 believe it or not. Yesterday I cherry-picked it and 
tried to update the commit but messed up. Did not account for changes 
which landed since. Will fix.

Regards,

Tvrtko

>>
>> We convert the amdgpu_ring_insert_nop() used by the GFX rings and also
>> the SDMA ones.
> 
> As far as I see amdgpu_ring_insert_nop() is used by all rings not just GFX and
> SDMA, isn't it?
> 
>> Although with SDMA this should have much less benefit than
>> with GFX (only SDMA v4.0 uses the 256 byte ring padding while the rest use
>> 16), but on the other hand it should not harm and is at least more
>> consistent.
>>
>> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@igalia.com>
>> Cc: Timur Kristóf <timur.kristof@gmail.com>
>> ---
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 17 +---------------
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 26 ++++++++++++++++++++++++
>>   drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c   | 15 +++++++-------
>>   drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c   | 15 +++++++-------
>>   drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c   | 15 +++++++-------
>>   drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c | 15 +++++++-------
>>   drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c   | 15 +++++++-------
>>   drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c   | 15 +++++++-------
>>   drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c   | 15 +++++++-------
>>   drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c   | 15 +++++++-------
>>   drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c   | 15 +++++++-------
>>   11 files changed, 90 insertions(+), 88 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c index 686c92e96025..38434a4c3566
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
>> @@ -117,22 +117,7 @@ int amdgpu_ring_alloc(struct amdgpu_ring *ring,
>> unsigned int ndw) */
>>   void amdgpu_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
>>   {
>> -	uint32_t occupied, chunk1, chunk2;
>> -
>> -	occupied = ring->wptr & ring->buf_mask;
>> -	chunk1 = ring->buf_mask + 1 - occupied;
>> -	chunk1 = (chunk1 >= count) ? count : chunk1;
>> -	chunk2 = count - chunk1;
>> -
>> -	if (chunk1)
>> -		memset32(&ring->ring[occupied], ring->funcs->nop,
> chunk1);
>> -
>> -	if (chunk2)
>> -		memset32(ring->ring, ring->funcs->nop, chunk2);
>> -
>> -	ring->wptr += count;
>> -	ring->wptr &= ring->ptr_mask;
>> -	ring->count_dw -= count;
>> +	amdgpu_ring_fill(ring, ring->funcs->nop, count);
>>   }
>>
>>   /**
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h index 6b6ee4083c8d..2b1d3956cdd3
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
>> @@ -522,6 +522,32 @@ static inline void amdgpu_ring_write_multiple(struct
>> amdgpu_ring *ring, ring->count_dw -= count_dw;
>>   }
>>
>> +static inline void amdgpu_ring_fill(struct amdgpu_ring *ring,
>> +				    u32 val, u32 count)
>> +{
>> +	const u32 buf_mask = ring->buf_mask;
>> +	u32 occupied, chunk1, chunk2;
>> +	u64 wptr = ring->wptr;
>> +
>> +	if (count == 0)
>> +		return;
>> +
>> +	occupied = wptr & buf_mask;
>> +	chunk1 = buf_mask + 1 - occupied;
>> +	chunk1 = (chunk1 >= count) ? count : chunk1;
>> +	chunk2 = count - chunk1;
>> +
>> +	if (chunk1)
>> +		memset32(&ring->ring[occupied], val, chunk1);
>> +
>> +	if (chunk2)
>> +		memset32(ring->ring, val, chunk2);
>> +
>> +	wptr += count;
>> +	ring->wptr = wptr & ring->ptr_mask;
>> +	ring->count_dw -= count;
>> +}
>> +
>>   static inline unsigned int amdgpu_ring_get_dw_distance(struct amdgpu_ring
>> *ring, u64 start_wptr, u64 end_wptr)
>>   {
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c index 006f3fd3464a..e461e0236b5f
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
>> @@ -224,15 +224,14 @@ static void sdma_v2_4_ring_set_wptr(struct amdgpu_ring
>> *ring) static void sdma_v2_4_ring_insert_nop(struct amdgpu_ring *ring,
>> uint32_t count) {
>>   	struct amdgpu_sdma_instance *sdma =
>> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
>> sdma->burst_nop;
>> -	int i;
>> +	const u32 nop = ring->funcs->nop;
>>
>> -	for (i = 0; i < count; i++)
>> -		if (i == 0 && burst_nop)
>> -			amdgpu_ring_write(ring, ring->funcs->nop |
>> -				SDMA_PKT_NOP_HEADER_COUNT(count -
> 1));
>> -		else
>> -			amdgpu_ring_write(ring, ring->funcs->nop);
>> +	if (sdma->burst_nop) {
>> +		--count;
>> +		amdgpu_ring_write(ring, nop |
> SDMA_PKT_NOP_HEADER_COUNT(count));
>> +	}
>> +
>> +	amdgpu_ring_fill(ring, nop, count);
>>   }
>>
>>   /**
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c index 3fb15032e1ef..5cca7f715c6a
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
>> @@ -401,15 +401,14 @@ static void sdma_v3_0_ring_set_wptr(struct amdgpu_ring
>> *ring) static void sdma_v3_0_ring_insert_nop(struct amdgpu_ring *ring,
>> uint32_t count) {
>>   	struct amdgpu_sdma_instance *sdma =
>> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
>> sdma->burst_nop;
>> -	int i;
>> +	const u32 nop = ring->funcs->nop;
>>
>> -	for (i = 0; i < count; i++)
>> -		if (i == 0 && burst_nop)
>> -			amdgpu_ring_write(ring, ring->funcs->nop |
>> -				SDMA_PKT_NOP_HEADER_COUNT(count -
> 1));
>> -		else
>> -			amdgpu_ring_write(ring, ring->funcs->nop);
>> +	if (sdma->burst_nop) {
>> +		--count;
>> +		amdgpu_ring_write(ring, nop |
> SDMA_PKT_NOP_HEADER_COUNT(count));
>> +	}
>> +
>> +	amdgpu_ring_fill(ring, nop, count);
>>   }
>>
>>   /**
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c index dfb0ea709bad..63bdf8d4e8d5
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
>> @@ -784,15 +784,14 @@ static void sdma_v4_0_page_ring_set_wptr(struct
>> amdgpu_ring *ring) static void sdma_v4_0_ring_insert_nop(struct amdgpu_ring
>> *ring, uint32_t count) {
>>   	struct amdgpu_sdma_instance *sdma =
>> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
>> sdma->burst_nop;
>> -	int i;
>> +	const u32 nop = ring->funcs->nop;
>>
>> -	for (i = 0; i < count; i++)
>> -		if (i == 0 && burst_nop)
>> -			amdgpu_ring_write(ring, ring->funcs->nop |
>> -				SDMA_PKT_NOP_HEADER_COUNT(count -
> 1));
>> -		else
>> -			amdgpu_ring_write(ring, ring->funcs->nop);
>> +	if (sdma->burst_nop) {
>> +		--count;
>> +		amdgpu_ring_write(ring, nop |
> SDMA_PKT_NOP_HEADER_COUNT(count));
>> +	}
>> +
>> +	amdgpu_ring_fill(ring, nop, count);
>>   }
>>
>>   /**
>> 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 f2e6abe44a43..145f862cbcc6
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
>> @@ -350,15 +350,14 @@ static void sdma_v4_4_2_page_ring_set_wptr(struct
>> amdgpu_ring *ring) static void sdma_v4_4_2_ring_insert_nop(struct
>> amdgpu_ring *ring, uint32_t count) {
>>   	struct amdgpu_sdma_instance *sdma =
>> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
>> sdma->burst_nop;
>> -	int i;
>> +	const u32 nop = ring->funcs->nop;
>>
>> -	for (i = 0; i < count; i++)
>> -		if (i == 0 && burst_nop)
>> -			amdgpu_ring_write(ring, ring->funcs->nop |
>> -				SDMA_PKT_NOP_HEADER_COUNT(count -
> 1));
>> -		else
>> -			amdgpu_ring_write(ring, ring->funcs->nop);
>> +	if (sdma->burst_nop) {
>> +		--count;
>> +		amdgpu_ring_write(ring, nop |
> SDMA_PKT_NOP_HEADER_COUNT(count));
>> +	}
>> +
>> +	amdgpu_ring_fill(ring, nop, count);
>>   }
>>
>>   /**
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c index cb36b38582c5..124bc5768983
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
>> @@ -407,15 +407,14 @@ static void sdma_v5_0_ring_set_wptr(struct amdgpu_ring
>> *ring) static void sdma_v5_0_ring_insert_nop(struct amdgpu_ring *ring,
>> uint32_t count) {
>>   	struct amdgpu_sdma_instance *sdma =
>> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
>> sdma->burst_nop;
>> -	int i;
>> +	const u32 nop = ring->funcs->nop;
>>
>> -	for (i = 0; i < count; i++)
>> -		if (i == 0 && burst_nop)
>> -			amdgpu_ring_write(ring, ring->funcs->nop |
>> -				SDMA_PKT_NOP_HEADER_COUNT(count -
> 1));
>> -		else
>> -			amdgpu_ring_write(ring, ring->funcs->nop);
>> +	if (sdma->burst_nop) {
>> +		--count;
>> +		amdgpu_ring_write(ring, nop |
> SDMA_PKT_NOP_HEADER_COUNT(count));
>> +	}
>> +
>> +	amdgpu_ring_fill(ring, nop, count);
>>   }
>>
>>   /**
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c index 2858820bb864..242586ea951a
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
>> @@ -255,15 +255,14 @@ static void sdma_v5_2_ring_set_wptr(struct amdgpu_ring
>> *ring) static void sdma_v5_2_ring_insert_nop(struct amdgpu_ring *ring,
>> uint32_t count) {
>>   	struct amdgpu_sdma_instance *sdma =
>> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
>> sdma->burst_nop;
>> -	int i;
>> +	const u32 nop = ring->funcs->nop;
>>
>> -	for (i = 0; i < count; i++)
>> -		if (i == 0 && burst_nop)
>> -			amdgpu_ring_write(ring, ring->funcs->nop |
>> -				SDMA_PKT_NOP_HEADER_COUNT(count -
> 1));
>> -		else
>> -			amdgpu_ring_write(ring, ring->funcs->nop);
>> +	if (sdma->burst_nop) {
>> +		--count;
>> +		amdgpu_ring_write(ring, nop |
> SDMA_PKT_NOP_HEADER_COUNT(count));
>> +	}
>> +
>> +	amdgpu_ring_fill(ring, nop, count);
>>   }
>>
>>   /**
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c index d3504606bee7..ae063ac3bd74
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
>> @@ -243,15 +243,14 @@ static void sdma_v6_0_ring_set_wptr(struct amdgpu_ring
>> *ring) static void sdma_v6_0_ring_insert_nop(struct amdgpu_ring *ring,
>> uint32_t count) {
>>   	struct amdgpu_sdma_instance *sdma =
>> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
>> sdma->burst_nop;
>> -	int i;
>> +	const u32 nop = ring->funcs->nop;
>>
>> -	for (i = 0; i < count; i++)
>> -		if (i == 0 && burst_nop)
>> -			amdgpu_ring_write(ring, ring->funcs->nop |
>> -				SDMA_PKT_NOP_HEADER_COUNT(count -
> 1));
>> -		else
>> -			amdgpu_ring_write(ring, ring->funcs->nop);
>> +	if (sdma->burst_nop) {
>> +		--count;
>> +		amdgpu_ring_write(ring, nop |
> SDMA_PKT_NOP_HEADER_COUNT(count));
>> +	}
>> +
>> +	amdgpu_ring_fill(ring, nop, count);
>>   }
>>
>>   /*
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c index 1760f03db9e7..fd92830d3324
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
>> @@ -245,15 +245,14 @@ static void sdma_v7_0_ring_set_wptr(struct amdgpu_ring
>> *ring) static void sdma_v7_0_ring_insert_nop(struct amdgpu_ring *ring,
>> uint32_t count) {
>>   	struct amdgpu_sdma_instance *sdma =
>> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
>> sdma->burst_nop;
>> -	int i;
>> +	const u32 nop = ring->funcs->nop;
>>
>> -	for (i = 0; i < count; i++)
>> -		if (i == 0 && burst_nop)
>> -			amdgpu_ring_write(ring, ring->funcs->nop |
>> -				SDMA_PKT_NOP_HEADER_COUNT(count -
> 1));
>> -		else
>> -			amdgpu_ring_write(ring, ring->funcs->nop);
>> +	if (sdma->burst_nop) {
>> +		--count;
>> +		amdgpu_ring_write(ring, nop |
> SDMA_PKT_NOP_HEADER_COUNT(count));
>> +	}
>> +
>> +	amdgpu_ring_fill(ring, nop, count);
>>   }
>>
>>   /**
>> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
>> b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c index b9f11f2f7e5c..c0824c83ace9
>> 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_1.c
>> @@ -239,15 +239,14 @@ static void sdma_v7_1_ring_set_wptr(struct amdgpu_ring
>> *ring) static void sdma_v7_1_ring_insert_nop(struct amdgpu_ring *ring,
>> uint32_t count) {
>>   	struct amdgpu_sdma_instance *sdma =
>> amdgpu_sdma_get_instance_from_ring(ring); -	const bool burst_nop =
>> sdma->burst_nop;
>> -	int i;
>> +	const u32 nop = ring->funcs->nop;
>>
>> -	for (i = 0; i < count; i++)
>> -		if (i == 0 && burst_nop)
>> -			amdgpu_ring_write(ring, ring->funcs->nop |
>> -				SDMA_PKT_NOP_HEADER_COUNT(count -
> 1));
>> -		else
>> -			amdgpu_ring_write(ring, ring->funcs->nop);
>> +	if (sdma->burst_nop) {
>> +		--count;
>> +		amdgpu_ring_write(ring, nop |
> SDMA_PKT_NOP_HEADER_COUNT(count));
>> +	}
>> +
>> +	amdgpu_ring_fill(ring, nop, count);
>>   }
>>
>>   /**
> 
> 
> 
> 


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2026-09-10 14:46 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-09 10:52 [PATCH 0/6] A bit of SDMA (mostly) streamlining Tvrtko Ursulin
2026-09-09 10:52 ` [PATCH 1/6] drm/amdgpu: Add SDMA ring init helper Tvrtko Ursulin
2026-09-09 18:27   ` Timur Kristóf
2026-09-10 14:38     ` Tvrtko Ursulin
2026-09-09 10:52 ` [PATCH 2/6] drm/amdgpu: Add amdgpu_sdma_types.h header Tvrtko Ursulin
2026-09-09 18:28   ` Timur Kristóf
2026-09-10 14:39     ` Tvrtko Ursulin
2026-09-09 10:52 ` [PATCH 3/6] drm/amdgpu: Convert SDMA instance and index to direct lookup Tvrtko Ursulin
2026-09-09 10:52 ` [PATCH 4/6] drm/amdgpu: Cache the SDMA CSA address Tvrtko Ursulin
2026-09-09 10:52 ` [PATCH 5/6] drm/amdgpu: Extend logical to device instance lookup to all devices Tvrtko Ursulin
2026-09-09 10:52 ` [PATCH 6/6] drm/amdgpu: Use memset32 for SDMA padding Tvrtko Ursulin
2026-09-09 18:37   ` Timur Kristóf
2026-09-10 14:46     ` Tvrtko Ursulin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.