aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0670-drm-amdgpu-cleanup-amdgpu_cs_parser-handling.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0670-drm-amdgpu-cleanup-amdgpu_cs_parser-handling.patch')
-rw-r--r--common/recipes-kernel/linux/files/0670-drm-amdgpu-cleanup-amdgpu_cs_parser-handling.patch220
1 files changed, 220 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0670-drm-amdgpu-cleanup-amdgpu_cs_parser-handling.patch b/common/recipes-kernel/linux/files/0670-drm-amdgpu-cleanup-amdgpu_cs_parser-handling.patch
new file mode 100644
index 00000000..4c8351f1
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0670-drm-amdgpu-cleanup-amdgpu_cs_parser-handling.patch
@@ -0,0 +1,220 @@
+From 9844767a11ccfce6de44bc0d7948cf1ebc410bfe Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Wed, 4 Nov 2015 15:44:39 +0100
+Subject: [PATCH 0670/1050] drm/amdgpu: cleanup amdgpu_cs_parser handling
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+No need any more to allocate that structure dynamically, just put it on the
+stack. This is a start to cleanup some of the scheduler fallouts.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu.h | 5 --
+ drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 88 +++++++++++++---------------------
+ 2 files changed, 33 insertions(+), 60 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+index ef16632..6bb4cea 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+@@ -2256,11 +2256,6 @@ void amdgpu_pci_config_reset(struct amdgpu_device *adev);
+ bool amdgpu_card_posted(struct amdgpu_device *adev);
+ void amdgpu_update_display_priority(struct amdgpu_device *adev);
+ bool amdgpu_boot_test_post_card(struct amdgpu_device *adev);
+-struct amdgpu_cs_parser *amdgpu_cs_parser_create(struct amdgpu_device *adev,
+- struct drm_file *filp,
+- struct amdgpu_ctx *ctx,
+- struct amdgpu_ib *ibs,
+- uint32_t num_ibs);
+
+ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data);
+ int amdgpu_cs_get_ring(struct amdgpu_device *adev, u32 ip_type,
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+index ecc82df..bf32096 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+@@ -127,30 +127,6 @@ int amdgpu_cs_get_ring(struct amdgpu_device *adev, u32 ip_type,
+ return 0;
+ }
+
+-struct amdgpu_cs_parser *amdgpu_cs_parser_create(struct amdgpu_device *adev,
+- struct drm_file *filp,
+- struct amdgpu_ctx *ctx,
+- struct amdgpu_ib *ibs,
+- uint32_t num_ibs)
+-{
+- struct amdgpu_cs_parser *parser;
+- int i;
+-
+- parser = kzalloc(sizeof(struct amdgpu_cs_parser), GFP_KERNEL);
+- if (!parser)
+- return NULL;
+-
+- parser->adev = adev;
+- parser->filp = filp;
+- parser->ctx = ctx;
+- parser->ibs = ibs;
+- parser->num_ibs = num_ibs;
+- for (i = 0; i < num_ibs; i++)
+- ibs[i].ctx = ctx;
+-
+- return parser;
+-}
+-
+ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
+ {
+ union drm_amdgpu_cs *cs = data;
+@@ -490,6 +466,7 @@ static void amdgpu_cs_parser_fini_early(struct amdgpu_cs_parser *parser, int err
+ static void amdgpu_cs_parser_fini_late(struct amdgpu_cs_parser *parser)
+ {
+ unsigned i;
++
+ if (parser->ctx)
+ amdgpu_ctx_put(parser->ctx);
+ if (parser->bo_list)
+@@ -505,7 +482,6 @@ static void amdgpu_cs_parser_fini_late(struct amdgpu_cs_parser *parser)
+ kfree(parser->ibs);
+ if (parser->uf.bo)
+ drm_gem_object_unreference_unlocked(&parser->uf.bo->gem_base);
+- kfree(parser);
+ }
+
+ /**
+@@ -824,36 +800,36 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
+ union drm_amdgpu_cs *cs = data;
+ struct amdgpu_fpriv *fpriv = filp->driver_priv;
+ struct amdgpu_vm *vm = &fpriv->vm;
+- struct amdgpu_cs_parser *parser;
++ struct amdgpu_cs_parser parser = {};
+ bool reserved_buffers = false;
+ int i, r;
+
+ if (!adev->accel_working)
+ return -EBUSY;
+
+- parser = amdgpu_cs_parser_create(adev, filp, NULL, NULL, 0);
+- if (!parser)
+- return -ENOMEM;
+- r = amdgpu_cs_parser_init(parser, data);
++ parser.adev = adev;
++ parser.filp = filp;
++
++ r = amdgpu_cs_parser_init(&parser, data);
+ if (r) {
+ DRM_ERROR("Failed to initialize parser !\n");
+- amdgpu_cs_parser_fini(parser, r, false);
++ amdgpu_cs_parser_fini(&parser, r, false);
+ r = amdgpu_cs_handle_lockup(adev, r);
+ return r;
+ }
+ mutex_lock(&vm->mutex);
+- r = amdgpu_cs_parser_relocs(parser);
++ r = amdgpu_cs_parser_relocs(&parser);
+ if (r == -ENOMEM)
+ DRM_ERROR("Not enough memory for command submission!\n");
+ else if (r && r != -ERESTARTSYS)
+ DRM_ERROR("Failed to process the buffer list %d!\n", r);
+ else if (!r) {
+ reserved_buffers = true;
+- r = amdgpu_cs_ib_fill(adev, parser);
++ r = amdgpu_cs_ib_fill(adev, &parser);
+ }
+
+ if (!r) {
+- r = amdgpu_cs_dependencies(adev, parser);
++ r = amdgpu_cs_dependencies(adev, &parser);
+ if (r)
+ DRM_ERROR("Failed in the dependencies handling %d!\n", r);
+ }
+@@ -861,36 +837,38 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
+ if (r)
+ goto out;
+
+- for (i = 0; i < parser->num_ibs; i++)
+- trace_amdgpu_cs(parser, i);
++ for (i = 0; i < parser.num_ibs; i++)
++ trace_amdgpu_cs(&parser, i);
+
+- r = amdgpu_cs_ib_vm_chunk(adev, parser);
++ r = amdgpu_cs_ib_vm_chunk(adev, &parser);
+ if (r)
+ goto out;
+
+- if (amdgpu_enable_scheduler && parser->num_ibs) {
++ if (amdgpu_enable_scheduler && parser.num_ibs) {
+ struct amdgpu_job *job;
+- struct amdgpu_ring * ring = parser->ibs->ring;
++ struct amdgpu_ring * ring = parser.ibs->ring;
++
+ job = kzalloc(sizeof(struct amdgpu_job), GFP_KERNEL);
+ if (!job) {
+ r = -ENOMEM;
+ goto out;
+ }
++
+ job->base.sched = &ring->sched;
+- 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->base.owner = parser->filp;
++ 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->base.owner = parser.filp;
+ mutex_init(&job->job_lock);
+ if (job->ibs[job->num_ibs - 1].user) {
+- job->uf = parser->uf;
++ job->uf = parser.uf;
+ job->ibs[job->num_ibs - 1].user = &job->uf;
+- parser->uf.bo = NULL;
++ parser.uf.bo = NULL;
+ }
+
+- parser->ibs = NULL;
+- parser->num_ibs = 0;
++ parser.ibs = NULL;
++ parser.num_ibs = 0;
+
+ job->free_job = amdgpu_cs_free_job;
+ mutex_lock(&job->job_lock);
+@@ -902,24 +880,24 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
+ goto out;
+ }
+ cs->out.handle =
+- amdgpu_ctx_add_fence(parser->ctx, ring,
++ amdgpu_ctx_add_fence(parser.ctx, ring,
+ &job->base.s_fence->base);
+ job->ibs[job->num_ibs - 1].sequence = cs->out.handle;
+
+- list_sort(NULL, &parser->validated, cmp_size_smaller_first);
+- ttm_eu_fence_buffer_objects(&parser->ticket,
+- &parser->validated,
++ list_sort(NULL, &parser.validated, cmp_size_smaller_first);
++ ttm_eu_fence_buffer_objects(&parser.ticket,
++ &parser.validated,
+ &job->base.s_fence->base);
+
+ mutex_unlock(&job->job_lock);
+- amdgpu_cs_parser_fini_late(parser);
++ amdgpu_cs_parser_fini_late(&parser);
+ mutex_unlock(&vm->mutex);
+ return 0;
+ }
+
+- cs->out.handle = parser->ibs[parser->num_ibs - 1].sequence;
++ cs->out.handle = parser.ibs[parser.num_ibs - 1].sequence;
+ out:
+- amdgpu_cs_parser_fini(parser, r, reserved_buffers);
++ amdgpu_cs_parser_fini(&parser, r, reserved_buffers);
+ mutex_unlock(&vm->mutex);
+ r = amdgpu_cs_handle_lockup(adev, r);
+ return r;
+--
+1.9.1
+