[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