The FW expects us to allocate atleast one page as process context space, and one for gang context space. This patch adds some object for the same. Cc: Alex Deucher <alexander.deucher@xxxxxxx> Cc: Christian Koenig <christian.koenig@xxxxxxx> Signed-off-by: Shashank Sharma <shashank.sharma@xxxxxxx> --- drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c | 57 +++++++++++++++++++ .../drm/amd/include/amdgpu_usermode_queue.h | 8 +++ 2 files changed, 65 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c index b566ce4cb7f0..2a854a5e2f70 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_userqueue.c @@ -69,6 +69,56 @@ amdgpu_userqueue_get_doorbell(struct amdgpu_device *adev, return 0; } +static int +amdgpu_userqueue_create_context(struct amdgpu_device *adev, struct amdgpu_usermode_queue *queue) +{ + int r; + struct amdgpu_userq_ctx *pctx = &queue->proc_ctx; + struct amdgpu_userq_ctx *gctx = &queue->gang_ctx; + /* + * The FW expects atleast one page space allocated for + * process context related work, and one for gang context. + */ + r = amdgpu_bo_create_kernel(adev, PAGE_SIZE, PAGE_SIZE, + AMDGPU_GEM_DOMAIN_VRAM, + &pctx->obj, + &pctx->gpu_addr, + &pctx->cpu_ptr); + if (r) { + DRM_ERROR("Failed to allocate proc bo for userqueue (%d)", r); + return r; + } + + r = amdgpu_bo_create_kernel(adev, PAGE_SIZE, PAGE_SIZE, + AMDGPU_GEM_DOMAIN_VRAM, + &gctx->obj, + &gctx->gpu_addr, + &gctx->cpu_ptr); + if (r) { + DRM_ERROR("Failed to allocate proc bo for userqueue (%d)", r); + amdgpu_bo_free_kernel(&pctx->obj, + &pctx->gpu_addr, + &pctx->cpu_ptr); + return r; + } + + return 0; +} + +static void +amdgpu_userqueue_free_context(struct amdgpu_device *adev, struct amdgpu_usermode_queue *queue) +{ + struct amdgpu_userq_ctx *pctx = &queue->proc_ctx; + struct amdgpu_userq_ctx *gctx = &queue->gang_ctx; + + amdgpu_bo_free_kernel(&pctx->obj, + &pctx->gpu_addr, + &pctx->cpu_ptr); + amdgpu_bo_free_kernel(&pctx->obj, + &gctx->gpu_addr, + &gctx->cpu_ptr); +} + static void amdgpu_userqueue_setup_mqd(struct amdgpu_device *adev, struct amdgpu_usermode_queue *queue) { @@ -282,6 +332,12 @@ int amdgpu_userqueue_create(struct amdgpu_device *adev, struct drm_file *filp, goto free_mqd; } + r = amdgpu_userqueue_create_context(adev, queue); + if (r < 0) { + DRM_ERROR("Failed to create context for queue\n"); + goto free_mqd; + } + ctx->userq = queue; args->out.q_id = queue->queue_id; args->out.flags = 0; @@ -306,6 +362,7 @@ void amdgpu_userqueue_destroy(struct amdgpu_device *adev, struct drm_file *filp, struct amdgpu_usermode_queue *queue = ctx->userq; mutex_lock(&adev->userq.userq_mutex); + amdgpu_userqueue_free_context(adev, queue); amdgpu_userqueue_destroy_mqd(queue); amdgpu_userqueue_remove_index(adev, queue); ctx->userq = NULL; diff --git a/drivers/gpu/drm/amd/include/amdgpu_usermode_queue.h b/drivers/gpu/drm/amd/include/amdgpu_usermode_queue.h index c1fe39ffaf72..8bf3c0be6937 100644 --- a/drivers/gpu/drm/amd/include/amdgpu_usermode_queue.h +++ b/drivers/gpu/drm/amd/include/amdgpu_usermode_queue.h @@ -26,6 +26,12 @@ #define AMDGPU_MAX_USERQ 512 +struct amdgpu_userq_ctx { + struct amdgpu_bo *obj; + uint64_t gpu_addr; + void *cpu_ptr; +}; + struct amdgpu_usermode_queue { int queue_id; int queue_type; @@ -44,6 +50,8 @@ struct amdgpu_usermode_queue { struct amdgpu_bo *mqd_obj; struct amdgpu_vm *vm; + struct amdgpu_userq_ctx proc_ctx; + struct amdgpu_userq_ctx gang_ctx; struct list_head list; }; -- 2.34.1