]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
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 a15ca3e35344b5dbb942ead114ff2dd09aae3669..d9b9c03267c0b0cea1e18d2920b8fe9153da55d3 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 675fe6395ac8ca651c0ceca44a30b2617d9d8a32..8b8f345b60b6b123e9d1aa59f019f57621458502 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 837d98947958b6f77f126f6301c0d1e197bff808..1ffbb5450f3a54fed93ad257d26fe7be47cfc75f 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 60f0c7d6a7a3744645d9d36603e4b5c3337fc178..6baac533a2e68fb04f3d7fcabce9cf5c84b3237d 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 5b5bfc379e9ddfc7a64b9efda39128aeb64d1510..033f15e21ad333225d26382fe226cb6c431b9c43 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 de329b76a00ca0cc63579f37b421aaa96e148259..bf09ac841a684172ccbcd1a3ad162f9e79c68f79 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 85d98a0e1bffb1921a5bbb632f6ed66792330cd8..f154b68dda70165c0515394c2bc80bcd43832e67 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;