diff options
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.patch | 221 |
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 + |