drm/amdgpu: rework userq fence signal processing
authorChristian König <christian.koenig@amd.com>
Mon, 20 Apr 2026 14:08:35 +0000 (16:08 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 28 Apr 2026 18:29:02 +0000 (14:29 -0400)
Move more code into a common userq function.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Sunil Khatri <sunil.khatri@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h
drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v12_0.c
drivers/gpu/drm/amd/amdgpu/gfx_v12_1.c
drivers/gpu/drm/amd/amdgpu/sdma_v6_0.c
drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c

index a15ca3e..d9b9c03 100644 (file)
@@ -205,6 +205,19 @@ void amdgpu_userq_start_hang_detect_work(struct amdgpu_usermode_queue *queue)
                     msecs_to_jiffies(timeout_ms));
 }
 
+void amdgpu_userq_process_fence_irq(struct amdgpu_device *adev, u32 doorbell)
+{
+       struct xarray *xa = &adev->userq_doorbell_xa;
+       struct amdgpu_usermode_queue *queue;
+       unsigned long flags;
+
+       xa_lock_irqsave(xa, flags);
+       queue = xa_load(xa, doorbell);
+       if (queue)
+               amdgpu_userq_fence_driver_process(queue->fence_drv);
+       xa_unlock_irqrestore(xa, flags);
+}
+
 static void amdgpu_userq_init_hang_detect_work(struct amdgpu_usermode_queue *queue)
 {
        INIT_DELAYED_WORK(&queue->hang_detect_work, amdgpu_userq_hang_detect_work);
index 675fe63..8b8f345 100644 (file)
@@ -156,6 +156,7 @@ void amdgpu_userq_reset_work(struct work_struct *work);
 void amdgpu_userq_pre_reset(struct amdgpu_device *adev);
 int amdgpu_userq_post_reset(struct amdgpu_device *adev, bool vram_lost);
 void amdgpu_userq_start_hang_detect_work(struct amdgpu_usermode_queue *queue);
+void amdgpu_userq_process_fence_irq(struct amdgpu_device *adev, u32 doorbell);
 
 int amdgpu_userq_input_va_validate(struct amdgpu_device *adev,
                                   struct amdgpu_usermode_queue *queue,
index 837d989..1ffbb54 100644 (file)
@@ -6528,15 +6528,7 @@ static int gfx_v11_0_eop_irq(struct amdgpu_device *adev,
        DRM_DEBUG("IH: CP EOP\n");
 
        if (adev->enable_mes && doorbell_offset) {
-               struct amdgpu_usermode_queue *queue;
-               struct xarray *xa = &adev->userq_doorbell_xa;
-               unsigned long flags;
-
-               xa_lock_irqsave(xa, flags);
-               queue = xa_load(xa, doorbell_offset);
-               if (queue)
-                       amdgpu_userq_fence_driver_process(queue->fence_drv);
-               xa_unlock_irqrestore(xa, flags);
+               amdgpu_userq_process_fence_irq(adev, doorbell_offset);
        } else {
                me_id = (entry->ring_id & 0x0c) >> 2;
                pipe_id = (entry->ring_id & 0x03) >> 0;
index 60f0c7d..6baac53 100644 (file)
@@ -4859,15 +4859,7 @@ static int gfx_v12_0_eop_irq(struct amdgpu_device *adev,
        DRM_DEBUG("IH: CP EOP\n");
 
        if (adev->enable_mes && doorbell_offset) {
-               struct xarray *xa = &adev->userq_doorbell_xa;
-               struct amdgpu_usermode_queue *queue;
-               unsigned long flags;
-
-               xa_lock_irqsave(xa, flags);
-               queue = xa_load(xa, doorbell_offset);
-               if (queue)
-                       amdgpu_userq_fence_driver_process(queue->fence_drv);
-               xa_unlock_irqrestore(xa, flags);
+               amdgpu_userq_process_fence_irq(adev, doorbell_offset);
        } else {
                me_id = (entry->ring_id & 0x0c) >> 2;
                pipe_id = (entry->ring_id & 0x03) >> 0;
index 5b5bfc3..033f15e 100644 (file)
@@ -3688,16 +3688,7 @@ static int gfx_v12_1_eop_irq(struct amdgpu_device *adev,
        DRM_DEBUG("IH: CP EOP\n");
 
        if (adev->enable_mes && doorbell_offset) {
-               struct xarray *xa = &adev->userq_doorbell_xa;
-               struct amdgpu_usermode_queue *queue;
-               unsigned long flags;
-
-               xa_lock_irqsave(xa, flags);
-               queue = xa_load(xa, doorbell_offset);
-               if (queue)
-                       amdgpu_userq_fence_driver_process(queue->fence_drv);
-
-               xa_unlock_irqrestore(xa, flags);
+               amdgpu_userq_process_fence_irq(adev, doorbell_offset);
        } else {
                me_id = (entry->ring_id & 0x0c) >> 2;
                pipe_id = (entry->ring_id & 0x03) >> 0;
index de329b7..bf09ac8 100644 (file)
@@ -1662,17 +1662,8 @@ static int sdma_v6_0_process_fence_irq(struct amdgpu_device *adev,
        u32 doorbell_offset = entry->src_data[0];
 
        if (adev->enable_mes && doorbell_offset) {
-               struct amdgpu_usermode_queue *queue;
-               struct xarray *xa = &adev->userq_doorbell_xa;
-               unsigned long flags;
-
                doorbell_offset >>= SDMA0_QUEUE0_DOORBELL_OFFSET__OFFSET__SHIFT;
-
-               xa_lock_irqsave(xa, flags);
-               queue = xa_load(xa, doorbell_offset);
-               if (queue)
-                       amdgpu_userq_fence_driver_process(queue->fence_drv);
-               xa_unlock_irqrestore(xa, flags);
+               amdgpu_userq_process_fence_irq(adev, doorbell_offset);
        }
 
        return 0;
index 85d98a0..f154b68 100644 (file)
@@ -1594,17 +1594,8 @@ static int sdma_v7_0_process_fence_irq(struct amdgpu_device *adev,
        u32 doorbell_offset = entry->src_data[0];
 
        if (adev->enable_mes && doorbell_offset) {
-               struct xarray *xa = &adev->userq_doorbell_xa;
-               struct amdgpu_usermode_queue *queue;
-               unsigned long flags;
-
                doorbell_offset >>= SDMA0_QUEUE0_DOORBELL_OFFSET__OFFSET__SHIFT;
-
-               xa_lock_irqsave(xa, flags);
-               queue = xa_load(xa, doorbell_offset);
-               if (queue)
-                       amdgpu_userq_fence_driver_process(queue->fence_drv);
-               xa_unlock_irqrestore(xa, flags);
+               amdgpu_userq_process_fence_irq(adev, doorbell_offset);
        }
 
        return 0;