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