[PATCH 2/9] drm/amdgpu/userq: rework front end call sequence
Khatri, Sunil
sukhatri at amd.com
Fri Apr 11 13:06:49 UTC 2025
Reviewed-by: Sunil Khatri <sunil.khatri at amd.com>
On 4/10/2025 11:41 PM, Alex Deucher wrote:
> 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.
>
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c | 17 +++++++++++++++--
> drivers/gpu/drm/amd/amdgpu/mes_userqueue.c | 10 ----------
> 2 files changed, 15 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c
> index 2be1e54b78997..c3873041ec942 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c
> @@ -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:
> diff --git a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
> index 94fee99bd2a08..abd32415d7343 100644
> --- a/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
> +++ b/drivers/gpu/drm/amd/amdgpu/mes_userqueue.c
> @@ -321,13 +321,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:
> @@ -351,9 +344,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);
More information about the amd-gfx
mailing list