aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/5033-drm-amdgpu-create-an-empty-bo_list-if-no-handle-is-p.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5033-drm-amdgpu-create-an-empty-bo_list-if-no-handle-is-p.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/5033-drm-amdgpu-create-an-empty-bo_list-if-no-handle-is-p.patch221
1 files changed, 221 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5033-drm-amdgpu-create-an-empty-bo_list-if-no-handle-is-p.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5033-drm-amdgpu-create-an-empty-bo_list-if-no-handle-is-p.patch
new file mode 100644
index 00000000..11321522
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5033-drm-amdgpu-create-an-empty-bo_list-if-no-handle-is-p.patch
@@ -0,0 +1,221 @@
+From 1c2c3a624ddcfb33507ace1e2b099c7ab8b07d0a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Mon, 30 Jul 2018 16:44:14 +0200
+Subject: [PATCH 5033/5725] drm/amdgpu: create an empty bo_list if no handle is
+ provided
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Instead of having extra handling just create an empty bo_list when no
+handle is provided.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
+Reviewed-by: Huang Rui <ray.huang@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Raveendra Talabattula <raveendra.talabattula@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 113 ++++++++++++++-------------------
+ 1 file changed, 47 insertions(+), 66 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+index df87259..bf68877 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+@@ -561,6 +561,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
+ union drm_amdgpu_cs *cs)
+ {
+ struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
++ struct amdgpu_vm *vm = &fpriv->vm;
+ struct amdgpu_bo_list_entry *e;
+ struct list_head duplicates;
+ struct amdgpu_bo *gds;
+@@ -580,13 +581,17 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
+ &p->bo_list);
+ if (r)
+ return r;
++ } else if (!p->bo_list) {
++ /* Create a empty bo_list when no handle is provided */
++ r = amdgpu_bo_list_create(p->adev, p->filp, NULL, 0,
++ &p->bo_list);
++ if (r)
++ return r;
+ }
+
+- if (p->bo_list) {
+- amdgpu_bo_list_get_list(p->bo_list, &p->validated);
+- if (p->bo_list->first_userptr != p->bo_list->num_entries)
+- p->mn = amdgpu_mn_get(p->adev, AMDGPU_MN_TYPE_GFX);
+- }
++ amdgpu_bo_list_get_list(p->bo_list, &p->validated);
++ if (p->bo_list->first_userptr != p->bo_list->num_entries)
++ p->mn = amdgpu_mn_get(p->adev, AMDGPU_MN_TYPE_GFX);
+
+ INIT_LIST_HEAD(&duplicates);
+ amdgpu_vm_get_pd_bo(&fpriv->vm, &p->validated, &p->vm_pd);
+@@ -605,10 +610,6 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
+ goto error_free_pages;
+ }
+
+- /* Without a BO list we don't have userptr BOs */
+- if (!p->bo_list)
+- break;
+-
+ INIT_LIST_HEAD(&need_pages);
+ amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) {
+ struct amdgpu_bo *bo = e->robj;
+@@ -704,21 +705,12 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
+ amdgpu_cs_report_moved_bytes(p->adev, p->bytes_moved,
+ p->bytes_moved_vis);
+
+- if (p->bo_list) {
+- struct amdgpu_vm *vm = &fpriv->vm;
+- struct amdgpu_bo_list_entry *e;
++ gds = p->bo_list->gds_obj;
++ gws = p->bo_list->gws_obj;
++ oa = p->bo_list->oa_obj;
+
+- gds = p->bo_list->gds_obj;
+- gws = p->bo_list->gws_obj;
+- oa = p->bo_list->oa_obj;
+-
+- amdgpu_bo_list_for_each_entry(e, p->bo_list)
+- e->bo_va = amdgpu_vm_bo_find(vm, e->robj);
+- } else {
+- gds = p->adev->gds.gds_gfx_bo;
+- gws = p->adev->gds.gws_gfx_bo;
+- oa = p->adev->gds.oa_gfx_bo;
+- }
++ amdgpu_bo_list_for_each_entry(e, p->bo_list)
++ e->bo_va = amdgpu_vm_bo_find(vm, e->robj);
+
+ if (gds) {
+ p->job->gds_base = amdgpu_bo_gpu_offset(gds);
+@@ -746,16 +738,14 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
+
+ error_free_pages:
+
+- if (p->bo_list) {
+- amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) {
+- if (!e->user_pages)
+- continue;
++ amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) {
++ if (!e->user_pages)
++ continue;
+
+- release_pages(e->user_pages,
+- e->robj->tbo.ttm->num_pages,
+- false);
+- kvfree(e->user_pages);
+- }
++ release_pages(e->user_pages,
++ e->robj->tbo.ttm->num_pages,
++ false);
++ kvfree(e->user_pages);
+ }
+
+ return r;
+@@ -817,9 +807,10 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error,
+
+ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p)
+ {
+- struct amdgpu_device *adev = p->adev;
+ struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
++ struct amdgpu_device *adev = p->adev;
+ struct amdgpu_vm *vm = &fpriv->vm;
++ struct amdgpu_bo_list_entry *e;
+ struct amdgpu_bo_va *bo_va;
+ struct amdgpu_bo *bo;
+ int r;
+@@ -852,31 +843,26 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p)
+ return r;
+ }
+
+- if (p->bo_list) {
+- struct amdgpu_bo_list_entry *e;
+-
+- amdgpu_bo_list_for_each_entry(e, p->bo_list) {
+- struct dma_fence *f;
+-
+- /* ignore duplicates */
+- bo = e->robj;
+- if (!bo)
+- continue;
++ amdgpu_bo_list_for_each_entry(e, p->bo_list) {
++ struct dma_fence *f;
+
+- bo_va = e->bo_va;
+- if (bo_va == NULL)
+- continue;
++ /* ignore duplicates */
++ bo = e->robj;
++ if (!bo)
++ continue;
+
+- r = amdgpu_vm_bo_update(adev, bo_va, false);
+- if (r)
+- return r;
++ bo_va = e->bo_va;
++ if (bo_va == NULL)
++ continue;
+
+- f = bo_va->last_pt_update;
+- r = amdgpu_sync_fence(adev, &p->job->sync, f, false);
+- if (r)
+- return r;
+- }
++ r = amdgpu_vm_bo_update(adev, bo_va, false);
++ if (r)
++ return r;
+
++ f = bo_va->last_pt_update;
++ r = amdgpu_sync_fence(adev, &p->job->sync, f, false);
++ if (r)
++ return r;
+ }
+
+ r = amdgpu_vm_handle_moved(adev, vm);
+@@ -891,9 +877,7 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p)
+ if (r)
+ return r;
+
+- if (amdgpu_vm_debug && p->bo_list) {
+- struct amdgpu_bo_list_entry *e;
+-
++ if (amdgpu_vm_debug) {
+ /* Invalidate all BOs to test for userspace bugs */
+ amdgpu_bo_list_for_each_entry(e, p->bo_list) {
+ /* ignore duplicates */
+@@ -1219,22 +1203,19 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
+ struct amdgpu_ring *ring = p->ring;
+ struct drm_sched_entity *entity = &p->ctx->rings[ring->idx].entity;
+ enum drm_sched_priority priority;
++ struct amdgpu_bo_list_entry *e;
+ struct amdgpu_job *job;
+ uint64_t seq;
+
+ int r;
+
+ amdgpu_mn_lock(p->mn);
+- if (p->bo_list) {
+- struct amdgpu_bo_list_entry *e;
++ amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) {
++ struct amdgpu_bo *bo = e->robj;
+
+- amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) {
+- struct amdgpu_bo *bo = e->robj;
+-
+- if (amdgpu_ttm_tt_userptr_needs_pages(bo->tbo.ttm)) {
+- amdgpu_mn_unlock(p->mn);
+- return -ERESTARTSYS;
+- }
++ if (amdgpu_ttm_tt_userptr_needs_pages(bo->tbo.ttm)) {
++ amdgpu_mn_unlock(p->mn);
++ return -ERESTARTSYS;
+ }
+ }
+
+--
+2.7.4
+