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

Tao Zhou tao.zhou1 at amd.com
Wed Jun 11 03:34:50 UTC 2025


And the interface can be accessed globally.

Signed-off-by: Tao Zhou <tao.zhou1 at amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h |  2 +
 drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c | 51 ++++++++++++++++--------
 2 files changed, 36 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
index e5f8951bbb6f..262321a0aa4f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
@@ -54,6 +54,8 @@ struct amdgpu_sdma_funcs {
 	int (*stop_kernel_queue)(struct amdgpu_ring *ring);
 	int (*start_kernel_queue)(struct amdgpu_ring *ring);
 	int (*soft_reset_kernel_queue)(struct amdgpu_device *adev, u32 instance_id);
+	int (*sdma_irq_id_to_seq)(struct amdgpu_device *adev,
+			uint16_t client_id, uint16_t node_id);
 };
 
 struct amdgpu_sdma_instance {
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
index 9c169112a5e7..96ea9a0f952c 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
@@ -156,6 +156,35 @@ static int sdma_v4_4_2_irq_id_to_seq(struct amdgpu_device *adev, unsigned client
 	}
 }
 
+static int sdma_v4_4_2_irq_id_to_seq_global(struct amdgpu_device *adev,
+		uint16_t client_id, uint16_t node_id)
+{
+	uint32_t instance, i;
+
+	instance = sdma_v4_4_2_irq_id_to_seq(adev, client_id);
+
+	/* Client id gives the SDMA instance in AID. To know the exact SDMA
+	 * instance, interrupt entry gives the node id which corresponds to
+	 * the AID instance. Match node id with the AID id associated with
+	 * the SDMA instance.
+	 */
+	for (i = instance; i < adev->sdma.num_instances;
+		 i += adev->sdma.num_inst_per_aid) {
+		if (adev->sdma.instance[i].aid_id ==
+			node_id_to_phys_map[node_id])
+			break;
+	}
+
+	if (i >= adev->sdma.num_instances) {
+		dev_WARN_ONCE(
+			adev->dev, 1,
+			"Couldn't find the right sdma instance in trap handler");
+		return -EINVAL;
+	}
+
+	return i;
+}
+
 static void sdma_v4_4_2_inst_init_golden_registers(struct amdgpu_device *adev,
 						   uint32_t inst_mask)
 {
@@ -1337,6 +1366,7 @@ static bool sdma_v4_4_2_fw_support_paging_queue(struct amdgpu_device *adev)
 static const struct amdgpu_sdma_funcs sdma_v4_4_2_sdma_funcs = {
 	.stop_kernel_queue = &sdma_v4_4_2_stop_queue,
 	.start_kernel_queue = &sdma_v4_4_2_restore_queue,
+	.sdma_irq_id_to_seq = &sdma_v4_4_2_irq_id_to_seq_global,
 };
 
 static int sdma_v4_4_2_early_init(struct amdgpu_ip_block *ip_block)
@@ -1764,27 +1794,14 @@ static int sdma_v4_4_2_process_trap_irq(struct amdgpu_device *adev,
 				      struct amdgpu_irq_src *source,
 				      struct amdgpu_iv_entry *entry)
 {
-	uint32_t instance, i;
+	int i;
 
 	DRM_DEBUG("IH: SDMA trap\n");
-	instance = sdma_v4_4_2_irq_id_to_seq(adev, entry->client_id);
 
-	/* Client id gives the SDMA instance in AID. To know the exact SDMA
-	 * instance, interrupt entry gives the node id which corresponds to the AID instance.
-	 * Match node id with the AID id associated with the SDMA instance. */
-	for (i = instance; i < adev->sdma.num_instances;
-	     i += adev->sdma.num_inst_per_aid) {
-		if (adev->sdma.instance[i].aid_id ==
-		    node_id_to_phys_map[entry->node_id])
-			break;
-	}
-
-	if (i >= adev->sdma.num_instances) {
-		dev_WARN_ONCE(
-			adev->dev, 1,
-			"Couldn't find the right sdma instance in trap handler");
+	i = sdma_v4_4_2_irq_id_to_seq_global(adev, entry->client_id,
+				entry->node_id);
+	if (i < 0)
 		return 0;
-	}
 
 	switch (entry->ring_id) {
 	case 0:
-- 
2.34.1



More information about the amd-gfx mailing list