drm/amdgpu/userq: rework front end call sequence
authorAlex Deucher <alexander.deucher@amd.com>
Fri, 21 Feb 2025 19:47:00 +0000 (14:47 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 21 Apr 2025 14:49:16 +0000 (10:49 -0400)
Split out the queue map from the mqd create call and split
out the queue unmap from the mqd destroy call.  This splits
the queue setup and teardown with the actual enablement
in the firmware.

Reviewed-by: Sunil Khatri <sunil.khatri@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c
drivers/gpu/drm/amd/amdgpu/mes_userqueue.c

index 2be1e54b78997a08a34d89a96a875cd0715e6ff4..c3873041ec942e5224624d9a6c7721886cfa9624 100644 (file)
@@ -263,7 +263,10 @@ amdgpu_userqueue_destroy(struct drm_file *filp, int queue_id)
 {
        struct amdgpu_fpriv *fpriv = filp->driver_priv;
        struct amdgpu_userq_mgr *uq_mgr = &fpriv->userq_mgr;
+       struct amdgpu_device *adev = uq_mgr->adev;
+       const struct amdgpu_userq_funcs *uq_funcs;
        struct amdgpu_usermode_queue *queue;
+       int r;
 
        cancel_delayed_work(&uq_mgr->resume_work);
        mutex_lock(&uq_mgr->userq_mutex);
@@ -274,12 +277,13 @@ amdgpu_userqueue_destroy(struct drm_file *filp, int queue_id)
                mutex_unlock(&uq_mgr->userq_mutex);
                return -EINVAL;
        }
-
+       uq_funcs = adev->userq_funcs[queue->queue_type];
+       r = uq_funcs->unmap(uq_mgr, queue);
        amdgpu_bo_unpin(queue->db_obj.obj);
        amdgpu_bo_unref(&queue->db_obj.obj);
        amdgpu_userqueue_cleanup(uq_mgr, queue, queue_id);
        mutex_unlock(&uq_mgr->userq_mutex);
-       return 0;
+       return r;
 }
 
 static int
@@ -364,6 +368,15 @@ amdgpu_userqueue_create(struct drm_file *filp, union drm_amdgpu_userq *args)
                r = -ENOMEM;
                goto unlock;
        }
+
+       r = uq_funcs->map(uq_mgr, queue);
+       if (r) {
+               DRM_ERROR("Failed to map Queue\n");
+               uq_funcs->mqd_destroy(uq_mgr, queue);
+               kfree(queue);
+               goto unlock;
+       }
+
        args->out.queue_id = qid;
 
 unlock:
index fe6fc3e0a320419a477e0849f507dd20e214d841..e3c3fc160b7999a7642ac0a266699109b01ab17f 100644 (file)
@@ -320,13 +320,6 @@ static int mes_userq_mqd_create(struct amdgpu_userq_mgr *uq_mgr,
                goto free_ctx;
        }
 
-       /* Map userqueue into FW using MES */
-       r = mes_userq_map(uq_mgr, queue);
-       if (r) {
-               DRM_ERROR("Failed to init MQD\n");
-               goto free_ctx;
-       }
-
        return 0;
 
 free_ctx:
@@ -350,9 +343,6 @@ mes_userq_mqd_destroy(struct amdgpu_userq_mgr *uq_mgr,
 {
        struct amdgpu_device *adev = uq_mgr->adev;
 
-       if (queue->queue_active)
-               mes_userq_unmap(uq_mgr, queue);
-
        amdgpu_userqueue_destroy_object(uq_mgr, &queue->fw_obj);
        kfree(queue->userq_prop);
        amdgpu_userqueue_destroy_object(uq_mgr, &queue->mqd);