And the interface can be accessed globally.

Signed-off-by: Tao Zhou <[email protected]>
---
 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

Reply via email to