]> git.ipfire.org Git - thirdparty/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 19:43:57 +0000 (15:43 -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>
(cherry picked from commit 12f52fab11500d0dce7d23c71909eaf0cf9aa701)

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 8c82e90f871b7375f5c8bf7458882c66c0e1a7b7..d40ab1e95480600486de360b8515c6ee80d876db 100644 (file)
@@ -6523,15 +6523,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 65c33823a688fcbc4ad2d9b82312f35ea0cad6b1..0e0b1e5b88fce8002d4cc71e84322b93afc22d40 100644 (file)
@@ -4854,15 +4854,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 68fd3c04134d8e2258d4a1c898092275553caa2e..68db1bc73bc7c80ba7381e2c9aa838b566ea7138 100644 (file)
@@ -3643,16 +3643,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 0f530bb8a9a36044c705dfc3501f0fa62079a107..8ca46e1e474edcae6b414caa2c197ed295975e62 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 9ed817b69a3b74f803d0545bab22c6160cc98cee..37191e2918d45398b4a38645f0869a45c06853d6 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;