From: Alex Deucher <[email protected]>

Will be used by the common compute queue reset handler.

Signed-off-by: Alex Deucher <[email protected]>
Reviewed-by: Jesse Zhang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/mes_userqueue.c | 39 +++++++++++++++++++++-
 drivers/gpu/drm/amd/amdgpu/mes_userqueue.h |  9 +++++
 2 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c 
b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
index cf7e2ab66d10..5e6a146109fc 100644
--- a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
+++ b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
@@ -177,7 +177,7 @@ static int mes_userq_unmap(struct amdgpu_usermode_queue 
*queue)
        return r;
 }
 
-static int mes_userq_reset(struct amdgpu_usermode_queue *queue)
+int mes_userq_reset(struct amdgpu_usermode_queue *queue)
 {
        struct amdgpu_userq_mgr *uq_mgr = queue->userq_mgr;
        struct amdgpu_device *adev = uq_mgr->adev;
@@ -197,6 +197,43 @@ static int mes_userq_reset(struct amdgpu_usermode_queue 
*queue)
        return mes_userq_unmap(queue);
 }
 
+int mes_userq_reset_queue(struct amdgpu_device *adev,
+                         struct amdgpu_usermode_queue *guilty_uq,
+                         int queue_type,
+                         unsigned int pipe,
+                         unsigned int queue,
+                         unsigned int db)
+{
+       struct amdgpu_usermode_queue *uq;
+       bool use_mmio = false;
+       unsigned long uq_id;
+       int r;
+
+       xa_for_each(&adev->userq_doorbell_xa, uq_id, uq) {
+               if (uq->queue_type == queue_type) {
+                       if (uq == guilty_uq)
+                               continue;
+                       if (uq->doorbell_index == db) {
+                               uq->state = AMDGPU_USERQ_STATE_HUNG;
+                               if (use_mmio)
+                                       r = amdgpu_mes_reset_queue_mmio(adev, 
queue_type, 0, 1, pipe, queue, 0);
+                               else
+                                       r = amdgpu_mes_reset_user_queue(adev, 
queue_type, db, 0);
+                               if (r)
+                                       return r;
+                               r = mes_userq_unmap(uq);
+                               if (r)
+                                       return r;
+                               atomic_inc(&adev->gpu_reset_counter);
+                               amdgpu_userq_fence_driver_force_completion(uq);
+                               drm_dev_wedged_event(adev_to_drm(adev), 
DRM_WEDGE_RECOVERY_NONE, NULL);
+                               break;
+                       }
+               }
+       }
+       return 0;
+}
+
 static int mes_userq_create_ctx_space(struct amdgpu_userq_mgr *uq_mgr,
                                      struct amdgpu_usermode_queue *queue,
                                      struct drm_amdgpu_userq_in *mqd_user)
diff --git a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.h 
b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.h
index 090ae8897770..a473360d6a8b 100644
--- a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.h
+++ b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.h
@@ -27,4 +27,13 @@
 #include "amdgpu_userq.h"
 
 extern const struct amdgpu_userq_funcs userq_mes_funcs;
+
+int mes_userq_reset(struct amdgpu_usermode_queue *queue);
+int mes_userq_reset_queue(struct amdgpu_device *adev,
+                         struct amdgpu_usermode_queue *guilty_uq,
+                         int queue_type,
+                         unsigned int pipe,
+                         unsigned int queue,
+                         unsigned int db);
+
 #endif
-- 
2.49.0

Reply via email to