drm/amdgpu: add node_id to physical id conversion in EOP handler
authorLe Ma <le.ma@amd.com>
Fri, 19 Nov 2021 10:03:34 +0000 (18:03 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 9 Jun 2023 13:42:13 +0000 (09:42 -0400)
A new field nodeid in interrupt cookie indicates the node ID.

Signed-off-by: Le Ma <le.ma@amd.com>
Reviewed-by: Shiwu Zhang <shiwu.zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.h
drivers/gpu/drm/amd/amdgpu/gfx_v9_4_3.c

index fafebec..031610c 100644 (file)
@@ -99,6 +99,17 @@ const char *soc15_ih_clientid_name[] = {
        "MP1"
 };
 
+const int node_id_to_phys_map[NODEID_MAX] = {
+       [XCD0_NODEID] = 0,
+       [XCD1_NODEID] = 1,
+       [XCD2_NODEID] = 2,
+       [XCD3_NODEID] = 3,
+       [XCD4_NODEID] = 4,
+       [XCD5_NODEID] = 5,
+       [XCD6_NODEID] = 6,
+       [XCD7_NODEID] = 7,
+};
+
 /**
  * amdgpu_irq_disable_all - disable *all* interrupts
  *
index 1c747ac..efe8a27 100644 (file)
@@ -102,6 +102,20 @@ struct amdgpu_irq {
        bool                            retry_cam_enabled;
 };
 
+enum interrupt_node_id_per_xcp {
+       XCD0_NODEID = 1,
+       XCD1_NODEID = 2,
+       XCD2_NODEID = 5,
+       XCD3_NODEID = 6,
+       XCD4_NODEID = 9,
+       XCD5_NODEID = 10,
+       XCD6_NODEID = 13,
+       XCD7_NODEID = 14,
+       NODEID_MAX,
+};
+
+extern const int node_id_to_phys_map[NODEID_MAX];
+
 void amdgpu_irq_disable_all(struct amdgpu_device *adev);
 
 int amdgpu_irq_init(struct amdgpu_device *adev);
index ec273a2..ce64c4f 100644 (file)
@@ -2799,7 +2799,7 @@ static int gfx_v9_4_3_eop_irq(struct amdgpu_device *adev,
                            struct amdgpu_irq_src *source,
                            struct amdgpu_iv_entry *entry)
 {
-       int i;
+       int i, phys_id;
        u8 me_id, pipe_id, queue_id;
        struct amdgpu_ring *ring;
 
@@ -2808,12 +2808,14 @@ static int gfx_v9_4_3_eop_irq(struct amdgpu_device *adev,
        pipe_id = (entry->ring_id & 0x03) >> 0;
        queue_id = (entry->ring_id & 0x70) >> 4;
 
+       phys_id = node_id_to_phys_map[entry->node_id];
+
        switch (me_id) {
        case 0:
        case 1:
        case 2:
                for (i = 0; i < adev->gfx.num_compute_rings; i++) {
-                       ring = &adev->gfx.compute_ring[i];
+                       ring = &adev->gfx.compute_ring[i + phys_id * adev->gfx.num_compute_rings];
                        /* Per-queue interrupt is supported for MEC starting from VI.
                          * The interrupt can only be enabled/disabled per pipe instead of per queue.
                          */