diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0467-drm-amdgpu-abstract-amdgpu_job-for-scheduler.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0467-drm-amdgpu-abstract-amdgpu_job-for-scheduler.patch | 541 |
1 files changed, 0 insertions, 541 deletions
diff --git a/common/recipes-kernel/linux/files/0467-drm-amdgpu-abstract-amdgpu_job-for-scheduler.patch b/common/recipes-kernel/linux/files/0467-drm-amdgpu-abstract-amdgpu_job-for-scheduler.patch deleted file mode 100644 index a0df8f3b..00000000 --- a/common/recipes-kernel/linux/files/0467-drm-amdgpu-abstract-amdgpu_job-for-scheduler.patch +++ /dev/null @@ -1,541 +0,0 @@ -From bb977d3711ed1de1601b463e7fd5a43d82a2b077 Mon Sep 17 00:00:00 2001 -From: Chunming Zhou <david1.zhou@amd.com> -Date: Tue, 18 Aug 2015 15:16:40 +0800 -Subject: [PATCH 0467/1050] drm/amdgpu: abstract amdgpu_job for scheduler - -Signed-off-by: Chunming Zhou <david1.zhou@amd.com> -Reviewed-by: Christian K?nig <christian.koenig@amd.com> ---- - drivers/gpu/drm/amd/amdgpu/amdgpu.h | 16 +++- - drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 101 ++++++++++++++------------ - drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 7 ++ - drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c | 88 +++++++++------------- - drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 2 +- - drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 2 +- - drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 2 +- - drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | 42 ++++------- - drivers/gpu/drm/amd/scheduler/gpu_scheduler.h | 6 +- - 9 files changed, 130 insertions(+), 136 deletions(-) - -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h -index 2fc58e6..95d4969 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h -@@ -183,6 +183,7 @@ struct amdgpu_vm; - struct amdgpu_ring; - struct amdgpu_semaphore; - struct amdgpu_cs_parser; -+struct amdgpu_job; - struct amdgpu_irq_src; - struct amdgpu_fpriv; - -@@ -871,7 +872,7 @@ int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev, - struct amdgpu_ring *ring, - struct amdgpu_ib *ibs, - unsigned num_ibs, -- int (*free_job)(struct amdgpu_cs_parser *), -+ int (*free_job)(struct amdgpu_job *), - void *owner, - struct fence **fence); - -@@ -1040,6 +1041,7 @@ void amdgpu_ctx_fini(struct amdgpu_ctx *ctx); - - struct amdgpu_ctx *amdgpu_ctx_get(struct amdgpu_fpriv *fpriv, uint32_t id); - int amdgpu_ctx_put(struct amdgpu_ctx *ctx); -+struct amdgpu_ctx *amdgpu_ctx_get_ref(struct amdgpu_ctx *ctx); - - uint64_t amdgpu_ctx_add_fence(struct amdgpu_ctx *ctx, struct amdgpu_ring *ring, - struct fence *fence, uint64_t queued_seq); -@@ -1265,6 +1267,18 @@ struct amdgpu_cs_parser { - struct amd_sched_fence *s_fence; - }; - -+struct amdgpu_job { -+ struct amd_sched_job base; -+ struct amdgpu_device *adev; -+ struct amdgpu_ctx *ctx; -+ struct drm_file *owner; -+ struct amdgpu_ib *ibs; -+ uint32_t num_ibs; -+ struct mutex job_lock; -+ struct amdgpu_user_fence uf; -+ int (*free_job)(struct amdgpu_job *sched_job); -+}; -+ - static inline u32 amdgpu_get_ib_value(struct amdgpu_cs_parser *p, uint32_t ib_idx, int idx) - { - return p->ibs[ib_idx].ptr[idx]; -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c -index e4424b4..c8de4b6 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c -@@ -126,19 +126,6 @@ int amdgpu_cs_get_ring(struct amdgpu_device *adev, u32 ip_type, - return 0; - } - --static void amdgpu_job_work_func(struct work_struct *work) --{ -- struct amdgpu_cs_parser *sched_job = -- container_of(work, struct amdgpu_cs_parser, -- job_work); -- mutex_lock(&sched_job->job_lock); -- if (sched_job->free_job) -- sched_job->free_job(sched_job); -- mutex_unlock(&sched_job->job_lock); -- /* after processing job, free memory */ -- fence_put(&sched_job->s_fence->base); -- kfree(sched_job); --} - struct amdgpu_cs_parser *amdgpu_cs_parser_create(struct amdgpu_device *adev, - struct drm_file *filp, - struct amdgpu_ctx *ctx, -@@ -157,10 +144,6 @@ struct amdgpu_cs_parser *amdgpu_cs_parser_create(struct amdgpu_device *adev, - parser->ctx = ctx; - parser->ibs = ibs; - parser->num_ibs = num_ibs; -- if (amdgpu_enable_scheduler) { -- mutex_init(&parser->job_lock); -- INIT_WORK(&parser->job_work, amdgpu_job_work_func); -- } - for (i = 0; i < num_ibs; i++) - ibs[i].ctx = ctx; - -@@ -508,15 +491,17 @@ static void amdgpu_cs_parser_fini_late(struct amdgpu_cs_parser *parser) - for (i = 0; i < parser->nchunks; i++) - drm_free_large(parser->chunks[i].kdata); - kfree(parser->chunks); -- if (parser->ibs) -- for (i = 0; i < parser->num_ibs; i++) -- amdgpu_ib_free(parser->adev, &parser->ibs[i]); -- kfree(parser->ibs); -- if (parser->uf.bo) -- drm_gem_object_unreference_unlocked(&parser->uf.bo->gem_base); -- - if (!amdgpu_enable_scheduler) -- kfree(parser); -+ { -+ if (parser->ibs) -+ for (i = 0; i < parser->num_ibs; i++) -+ amdgpu_ib_free(parser->adev, &parser->ibs[i]); -+ kfree(parser->ibs); -+ if (parser->uf.bo) -+ drm_gem_object_unreference_unlocked(&parser->uf.bo->gem_base); -+ } -+ -+ kfree(parser); - } - - /** -@@ -533,12 +518,6 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error, bo - amdgpu_cs_parser_fini_late(parser); - } - --static int amdgpu_cs_parser_free_job(struct amdgpu_cs_parser *sched_job) --{ -- amdgpu_cs_parser_fini_late(sched_job); -- return 0; --} -- - static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p, - struct amdgpu_vm *vm) - { -@@ -874,6 +853,19 @@ static struct amdgpu_ring *amdgpu_cs_parser_get_ring( - return ring; - } - -+static int amdgpu_cs_free_job(struct amdgpu_job *sched_job) -+{ -+ int i; -+ amdgpu_ctx_put(sched_job->ctx); -+ if (sched_job->ibs) -+ for (i = 0; i < sched_job->num_ibs; i++) -+ amdgpu_ib_free(sched_job->adev, &sched_job->ibs[i]); -+ kfree(sched_job->ibs); -+ if (sched_job->uf.bo) -+ drm_gem_object_unreference_unlocked(&sched_job->uf.bo->gem_base); -+ return 0; -+} -+ - int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) - { - struct amdgpu_device *adev = dev->dev_private; -@@ -900,33 +892,50 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) - } - - if (amdgpu_enable_scheduler && parser->num_ibs) { -+ struct amdgpu_job *job; - struct amdgpu_ring * ring = - amdgpu_cs_parser_get_ring(adev, parser); - r = amdgpu_cs_parser_prepare_job(parser); - if (r) - goto out; -- parser->ring = ring; -- parser->free_job = amdgpu_cs_parser_free_job; -- mutex_lock(&parser->job_lock); -- r = amd_sched_push_job(ring->scheduler, -- &parser->ctx->rings[ring->idx].entity, -- parser, -- &parser->s_fence); -+ job = kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL); -+ if (!job) -+ return -ENOMEM; -+ job->base.sched = ring->scheduler; -+ job->base.s_entity = &parser->ctx->rings[ring->idx].entity; -+ job->adev = parser->adev; -+ job->ibs = parser->ibs; -+ job->num_ibs = parser->num_ibs; -+ job->owner = parser->filp; -+ job->ctx = amdgpu_ctx_get_ref(parser->ctx); -+ mutex_init(&job->job_lock); -+ if (job->ibs[job->num_ibs - 1].user) { -+ memcpy(&job->uf, &parser->uf, -+ sizeof(struct amdgpu_user_fence)); -+ job->ibs[job->num_ibs - 1].user = &job->uf; -+ } -+ -+ job->free_job = amdgpu_cs_free_job; -+ mutex_lock(&job->job_lock); -+ r = amd_sched_push_job((struct amd_sched_job *)job); - if (r) { -- mutex_unlock(&parser->job_lock); -+ mutex_unlock(&job->job_lock); -+ amdgpu_cs_free_job(job); -+ kfree(job); - goto out; - } -- parser->ibs[parser->num_ibs - 1].sequence = -- amdgpu_ctx_add_fence(parser->ctx, ring, -- &parser->s_fence->base, -- parser->s_fence->v_seq); -- cs->out.handle = parser->s_fence->v_seq; -+ job->ibs[parser->num_ibs - 1].sequence = -+ amdgpu_ctx_add_fence(job->ctx, ring, -+ &job->base.s_fence->base, -+ job->base.s_fence->v_seq); -+ cs->out.handle = job->base.s_fence->v_seq; - list_sort(NULL, &parser->validated, cmp_size_smaller_first); - ttm_eu_fence_buffer_objects(&parser->ticket, - &parser->validated, -- &parser->s_fence->base); -+ &job->base.s_fence->base); - -- mutex_unlock(&parser->job_lock); -+ mutex_unlock(&job->job_lock); -+ amdgpu_cs_parser_fini_late(parser); - up_read(&adev->exclusive_lock); - return 0; - } -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c -index 08bc772..8660c08 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c -@@ -219,6 +219,13 @@ struct amdgpu_ctx *amdgpu_ctx_get(struct amdgpu_fpriv *fpriv, uint32_t id) - return ctx; - } - -+struct amdgpu_ctx *amdgpu_ctx_get_ref(struct amdgpu_ctx *ctx) -+{ -+ if (ctx) -+ kref_get(&ctx->refcount); -+ return ctx; -+} -+ - int amdgpu_ctx_put(struct amdgpu_ctx *ctx) - { - if (ctx == NULL) -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c -index a86e381..5b1ae18 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c -@@ -27,81 +27,58 @@ - #include <drm/drmP.h> - #include "amdgpu.h" - --static int amdgpu_sched_prepare_job(struct amd_gpu_scheduler *sched, -- struct amd_sched_entity *entity, -- struct amd_sched_job *job) --{ -- int r = 0; -- struct amdgpu_cs_parser *sched_job; -- if (!job || !job->data) { -- DRM_ERROR("job is null\n"); -- return -EINVAL; -- } -- -- sched_job = (struct amdgpu_cs_parser *)job->data; -- if (sched_job->prepare_job) { -- r = sched_job->prepare_job(sched_job); -- if (r) { -- DRM_ERROR("Prepare job error\n"); -- schedule_work(&sched_job->job_work); -- } -- } -- return r; --} -- - static struct fence *amdgpu_sched_run_job(struct amd_gpu_scheduler *sched, - struct amd_sched_entity *entity, - struct amd_sched_job *job) - { - int r = 0; -- struct amdgpu_cs_parser *sched_job; -+ struct amdgpu_job *sched_job; - struct amdgpu_fence *fence; - -- if (!job || !job->data) { -+ if (!job) { - DRM_ERROR("job is null\n"); - return NULL; - } -- sched_job = (struct amdgpu_cs_parser *)job->data; -+ sched_job = (struct amdgpu_job *)job; - mutex_lock(&sched_job->job_lock); - r = amdgpu_ib_schedule(sched_job->adev, - sched_job->num_ibs, - sched_job->ibs, -- sched_job->filp); -+ sched_job->owner); - if (r) - goto err; - fence = amdgpu_fence_ref(sched_job->ibs[sched_job->num_ibs - 1].fence); - -- if (sched_job->run_job) { -- r = sched_job->run_job(sched_job); -- if (r) -- goto err; -- } -- - mutex_unlock(&sched_job->job_lock); - return &fence->base; - - err: - DRM_ERROR("Run job error\n"); - mutex_unlock(&sched_job->job_lock); -- schedule_work(&sched_job->job_work); -+ sched->ops->process_job(sched, (struct amd_sched_job *)sched_job); - return NULL; - } - - static void amdgpu_sched_process_job(struct amd_gpu_scheduler *sched, - struct amd_sched_job *job) - { -- struct amdgpu_cs_parser *sched_job; -+ struct amdgpu_job *sched_job; - -- if (!job || !job->data) { -+ if (!job) { - DRM_ERROR("job is null\n"); - return; - } -- sched_job = (struct amdgpu_cs_parser *)job->data; -- schedule_work(&sched_job->job_work); -+ sched_job = (struct amdgpu_job *)job; -+ mutex_lock(&sched_job->job_lock); -+ if (sched_job->free_job) -+ sched_job->free_job(sched_job); -+ mutex_unlock(&sched_job->job_lock); -+ /* after processing job, free memory */ -+ fence_put(&sched_job->base.s_fence->base); -+ kfree(sched_job); - } - - struct amd_sched_backend_ops amdgpu_sched_ops = { -- .prepare_job = amdgpu_sched_prepare_job, - .run_job = amdgpu_sched_run_job, - .process_job = amdgpu_sched_process_job - }; -@@ -110,31 +87,34 @@ int amdgpu_sched_ib_submit_kernel_helper(struct amdgpu_device *adev, - struct amdgpu_ring *ring, - struct amdgpu_ib *ibs, - unsigned num_ibs, -- int (*free_job)(struct amdgpu_cs_parser *), -+ int (*free_job)(struct amdgpu_job *), - void *owner, - struct fence **f) - { - int r = 0; - if (amdgpu_enable_scheduler) { -- struct amdgpu_cs_parser *sched_job = -- amdgpu_cs_parser_create(adev, owner, &adev->kernel_ctx, -- ibs, num_ibs); -- if(!sched_job) { -+ struct amdgpu_job *job = -+ kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL); -+ if (!job) - return -ENOMEM; -- } -- sched_job->free_job = free_job; -- mutex_lock(&sched_job->job_lock); -- r = amd_sched_push_job(ring->scheduler, -- &adev->kernel_ctx.rings[ring->idx].entity, -- sched_job, &sched_job->s_fence); -+ job->base.sched = ring->scheduler; -+ job->base.s_entity = &adev->kernel_ctx.rings[ring->idx].entity; -+ job->adev = adev; -+ job->ibs = ibs; -+ job->num_ibs = num_ibs; -+ job->owner = owner; -+ mutex_init(&job->job_lock); -+ job->free_job = free_job; -+ mutex_lock(&job->job_lock); -+ r = amd_sched_push_job((struct amd_sched_job *)job); - if (r) { -- mutex_unlock(&sched_job->job_lock); -- kfree(sched_job); -+ mutex_unlock(&job->job_lock); -+ kfree(job); - return r; - } -- ibs[num_ibs - 1].sequence = sched_job->s_fence->v_seq; -- *f = fence_get(&sched_job->s_fence->base); -- mutex_unlock(&sched_job->job_lock); -+ ibs[num_ibs - 1].sequence = job->base.s_fence->v_seq; -+ *f = fence_get(&job->base.s_fence->base); -+ mutex_unlock(&job->job_lock); - } else { - r = amdgpu_ib_schedule(adev, num_ibs, ibs, owner); - if (r) -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c -index 68369cf..b87355c 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c -@@ -807,7 +807,7 @@ int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx) - } - - static int amdgpu_uvd_free_job( -- struct amdgpu_cs_parser *sched_job) -+ struct amdgpu_job *sched_job) - { - amdgpu_ib_free(sched_job->adev, sched_job->ibs); - kfree(sched_job->ibs); -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c -index 33ee6ae..1a984c9 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c -@@ -340,7 +340,7 @@ void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp) - } - - static int amdgpu_vce_free_job( -- struct amdgpu_cs_parser *sched_job) -+ struct amdgpu_job *sched_job) - { - amdgpu_ib_free(sched_job->adev, sched_job->ibs); - kfree(sched_job->ibs); -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c -index a78a206..5b99214 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c -@@ -307,7 +307,7 @@ static void amdgpu_vm_update_pages(struct amdgpu_device *adev, - } - - static int amdgpu_vm_free_job( -- struct amdgpu_cs_parser *sched_job) -+ struct amdgpu_job *sched_job) - { - int i; - for (i = 0; i < sched_job->num_ibs; i++) -diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c -index 265d3e2..462c161 100644 ---- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c -+++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c -@@ -282,30 +282,18 @@ int amd_sched_entity_fini(struct amd_gpu_scheduler *sched, - * scheduler consum some queued command. - * -1 other fail. - */ --int amd_sched_push_job(struct amd_gpu_scheduler *sched, -- struct amd_sched_entity *c_entity, -- void *data, -- struct amd_sched_fence **fence) -+int amd_sched_push_job(struct amd_sched_job *sched_job) - { -- struct amd_sched_job *job; -- -+ struct amd_sched_fence *fence = -+ amd_sched_fence_create(sched_job->s_entity); - if (!fence) - return -EINVAL; -- job = kzalloc(sizeof(struct amd_sched_job), GFP_KERNEL); -- if (!job) -- return -ENOMEM; -- job->sched = sched; -- job->s_entity = c_entity; -- job->data = data; -- *fence = amd_sched_fence_create(c_entity); -- if ((*fence) == NULL) { -- kfree(job); -- return -EINVAL; -- } -- fence_get(&(*fence)->base); -- job->s_fence = *fence; -- while (kfifo_in_spinlocked(&c_entity->job_queue, &job, sizeof(void *), -- &c_entity->queue_lock) != sizeof(void *)) { -+ fence_get(&fence->base); -+ sched_job->s_fence = fence; -+ while (kfifo_in_spinlocked(&sched_job->s_entity->job_queue, -+ &sched_job, sizeof(void *), -+ &sched_job->s_entity->queue_lock) != -+ sizeof(void *)) { - /** - * Current context used up all its IB slots - * wait here, or need to check whether GPU is hung -@@ -313,8 +301,8 @@ int amd_sched_push_job(struct amd_gpu_scheduler *sched, - schedule(); - } - /* first job wake up scheduler */ -- if ((kfifo_len(&c_entity->job_queue) / sizeof(void *)) == 1) -- wake_up_interruptible(&sched->wait_queue); -+ if ((kfifo_len(&sched_job->s_entity->job_queue) / sizeof(void *)) == 1) -+ wake_up_interruptible(&sched_job->sched->wait_queue); - return 0; - } - -@@ -333,10 +321,8 @@ static void amd_sched_process_job(struct fence *f, struct fence_cb *cb) - list_del(&sched_job->list); - atomic64_dec(&sched->hw_rq_count); - spin_unlock_irqrestore(&sched->queue_lock, flags); -- -- sched->ops->process_job(sched, sched_job); - fence_put(&sched_job->s_fence->base); -- kfree(sched_job); -+ sched->ops->process_job(sched, sched_job); - wake_up_interruptible(&sched->wait_queue); - } - -@@ -359,7 +345,9 @@ static int amd_sched_main(void *param) - r = kfifo_out(&c_entity->job_queue, &job, sizeof(void *)); - if (r != sizeof(void *)) - continue; -- r = sched->ops->prepare_job(sched, c_entity, job); -+ r = 0; -+ if (sched->ops->prepare_job) -+ r = sched->ops->prepare_job(sched, c_entity, job); - if (!r) { - unsigned long flags; - spin_lock_irqsave(&sched->queue_lock, flags); -diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h -index ceb5918..25e38d0 100644 ---- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h -+++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h -@@ -81,7 +81,6 @@ struct amd_sched_job { - struct fence_cb cb; - struct amd_gpu_scheduler *sched; - struct amd_sched_entity *s_entity; -- void *data; - struct amd_sched_fence *s_fence; - }; - -@@ -140,10 +139,7 @@ struct amd_gpu_scheduler *amd_sched_create(void *device, - uint32_t hw_submission); - int amd_sched_destroy(struct amd_gpu_scheduler *sched); - --int amd_sched_push_job(struct amd_gpu_scheduler *sched, -- struct amd_sched_entity *c_entity, -- void *data, -- struct amd_sched_fence **fence); -+int amd_sched_push_job(struct amd_sched_job *sched_job); - - int amd_sched_entity_init(struct amd_gpu_scheduler *sched, - struct amd_sched_entity *entity, --- -1.9.1 - |