From: Alex Deucher <[email protected]>

No intended functional change.

Signed-off-by: Alex Deucher <[email protected]>
Reviewed-by: Amber Lin <[email protected]>
---
 .../drm/amd/amdkfd/kfd_device_queue_manager.c | 48 ++++++++++++-------
 1 file changed, 31 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
index e323658f972c..0a59a79ee28b 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
@@ -407,6 +407,32 @@ static int add_all_kfd_queues_mes(struct 
device_queue_manager *dqm)
        return retval;
 }
 
+static int reset_queue_mes(struct device_queue_manager *dqm, struct queue *q,
+                          int queue_type, int pipe, int queue, unsigned int db)
+{
+       struct amdgpu_device *adev = (struct amdgpu_device *)dqm->dev->adev;
+       struct kfd_process_device *pdd;
+       bool use_mmio = false;
+       int r;
+
+       pdd = kfd_get_process_device_data(q->device, q->process);
+       if (!pdd)
+               return -ENODEV;
+
+       if (use_mmio)
+               r = amdgpu_mes_reset_queue_mmio(adev, queue_type, 0, 1, pipe, 
queue,
+                                               ffs(dqm->dev->xcc_mask) - 1);
+       else
+               r = amdgpu_mes_reset_user_queue(adev, queue_type, db,
+                                               ffs(dqm->dev->xcc_mask) - 1);
+       if (r)
+               return r;
+       /* Proceed remove_queue with reset=true */
+       remove_queue_mes_on_reset_option(dqm, q, &pdd->qpd, true, false);
+       set_queue_as_reset(dqm, q, &pdd->qpd);
+       return 0;
+}
+
 static int reset_queues_mes(struct device_queue_manager *dqm)
 {
        struct amdgpu_device *adev = (struct amdgpu_device *)dqm->dev->adev;
@@ -414,7 +440,6 @@ static int reset_queues_mes(struct device_queue_manager 
*dqm)
        int num_hung = 0, r = 0, i, pipe, queue, queue_type;
        u32 *hung_array = dqm->hung_db_array;
        struct amdgpu_mes_hung_queue_hqd_info *hqd_info = dqm->hqd_info;
-       struct kfd_process_device *pdd;
        struct queue *q;
 
        if (!amdgpu_mes_queue_reset_by_mes_supported(adev)) {
@@ -468,24 +493,13 @@ static int reset_queues_mes(struct device_queue_manager 
*dqm)
 
                q = find_queue_by_doorbell_offset(dqm, hung_array[i]);
                /* skip queues not owned by KFD */
-               if (!q)
+               if (!q) {
                        continue;
-
-               pdd = kfd_get_process_device_data(q->device, q->process);
-               if (!pdd) {
-                       r = -ENODEV;
-                       goto fail;
+               } else {
+                       r = reset_queue_mes(dqm, q, queue_type, pipe, queue, 
hung_array[i]);
+                       if (r)
+                               goto fail;
                }
-
-               pr_warn("Hang detected doorbell %x pipe %d queue %d type %d\n",
-                               hung_array[i], pipe, queue, queue_type);
-               r = amdgpu_mes_reset_user_queue(adev, queue_type, hung_array[i],
-                                               ffs(dqm->dev->xcc_mask) - 1);
-               if (r)
-                       goto fail;
-               /* Proceed remove_queue with reset=true */
-               remove_queue_mes_on_reset_option(dqm, q, &pdd->qpd, true, 
false);
-               set_queue_as_reset(dqm, q, &pdd->qpd);
        }
 
        dqm->detect_hang_count = num_hung;
-- 
2.49.0

Reply via email to