aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/5031-drm-amdgpu-add-bo_list-iterators.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/5031-drm-amdgpu-add-bo_list-iterators.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/5031-drm-amdgpu-add-bo_list-iterators.patch251
1 files changed, 251 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/5031-drm-amdgpu-add-bo_list-iterators.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/5031-drm-amdgpu-add-bo_list-iterators.patch
new file mode 100644
index 00000000..f6e37b2d
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/5031-drm-amdgpu-add-bo_list-iterators.patch
@@ -0,0 +1,251 @@
+From f10a187969235463c0c2384920837b8ba27b5d8d Mon Sep 17 00:00:00 2001
+From: Chaudhary Amit Kumar <chaudharyamit.kumar@amd.com>
+Date: Wed, 9 Jan 2019 20:55:49 +0530
+Subject: [PATCH 5031/5725] drm/amdgpu: add bo_list iterators
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Add helpers to iterate over all entries in a bo_list.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
+Acked-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>
+Signed-off-by: Chaudhary Amit Kumar <chaudharyamit.kumar@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | 22 +++++++------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h | 10 ++++++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 51 +++++++++++++----------------
+ 3 files changed, 44 insertions(+), 39 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
+index ee09c2d..3f96f38 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
+@@ -43,12 +43,12 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,
+
+ static void amdgpu_bo_list_release_rcu(struct kref *ref)
+ {
+- unsigned i;
+ struct amdgpu_bo_list *list = container_of(ref, struct amdgpu_bo_list,
+ refcount);
++ struct amdgpu_bo_list_entry *e;
+
+- for (i = 0; i < list->num_entries; ++i)
+- amdgpu_bo_unref(&list->array[i].robj);
++ amdgpu_bo_list_for_each_entry(e, list)
++ amdgpu_bo_unref(&e->robj);
+
+ kvfree(list->array);
+ kfree_rcu(list, rhead);
+@@ -103,6 +103,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,
+ struct amdgpu_bo *oa_obj = adev->gds.oa_gfx_bo;
+
+ unsigned last_entry = 0, first_userptr = num_entries;
++ struct amdgpu_bo_list_entry *e;
+ uint64_t total_size = 0;
+ unsigned i;
+ int r;
+@@ -156,7 +157,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,
+ trace_amdgpu_bo_list_set(list, entry->robj);
+ }
+
+- for (i = 0; i < list->num_entries; ++i)
++ amdgpu_bo_list_for_each_entry(e, list)
+ amdgpu_bo_unref(&list->array[i].robj);
+
+ kvfree(list->array);
+@@ -201,6 +202,7 @@ void amdgpu_bo_list_get_list(struct amdgpu_bo_list *list,
+ * concatenated in descending order.
+ */
+ struct list_head bucket[AMDGPU_BO_LIST_NUM_BUCKETS];
++ struct amdgpu_bo_list_entry *e;
+ unsigned i;
+
+ for (i = 0; i < AMDGPU_BO_LIST_NUM_BUCKETS; i++)
+@@ -211,13 +213,13 @@ void amdgpu_bo_list_get_list(struct amdgpu_bo_list *list,
+ * in the list, the sort mustn't change the ordering of buffers
+ * with the same priority, i.e. it must be stable.
+ */
+- for (i = 0; i < list->num_entries; i++) {
+- unsigned priority = list->array[i].priority;
++ amdgpu_bo_list_for_each_entry(e, list) {
++ unsigned priority = e->priority;
++
++ if (!e->robj->parent)
++ list_add_tail(&e->tv.head, &bucket[priority]);
+
+- if (!list->array[i].robj->parent)
+- list_add_tail(&list->array[i].tv.head,
+- &bucket[priority]);
+- list->array[i].user_pages = NULL;
++ e->user_pages = NULL;
+ }
+
+ /* Connect the sorted buckets in the output list. */
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h
+index 0ce5402..3d77abf 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.h
+@@ -65,4 +65,14 @@ int amdgpu_bo_list_create(struct amdgpu_device *adev,
+ unsigned num_entries,
+ struct amdgpu_bo_list **list);
+
++#define amdgpu_bo_list_for_each_entry(e, list) \
++ for (e = &(list)->array[0]; \
++ e != &(list)->array[(list)->num_entries]; \
++ ++e)
++
++#define amdgpu_bo_list_for_each_userptr_entry(e, list) \
++ for (e = &(list)->array[(list)->first_userptr]; \
++ e != &(list)->array[(list)->num_entries]; \
++ ++e)
++
+ #endif
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+index e41ab4f..df87259 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+@@ -563,10 +563,10 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
+ struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
+ struct amdgpu_bo_list_entry *e;
+ struct list_head duplicates;
+- unsigned i, tries = 10;
+ struct amdgpu_bo *gds;
+ struct amdgpu_bo *gws;
+ struct amdgpu_bo *oa;
++ unsigned tries = 10;
+ int r;
+
+ INIT_LIST_HEAD(&p->validated);
+@@ -596,7 +596,6 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
+
+ while (1) {
+ struct list_head need_pages;
+- unsigned i;
+
+ r = ttm_eu_reserve_buffers(&p->ticket, &p->validated, true,
+ &duplicates);
+@@ -611,12 +610,8 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
+ break;
+
+ INIT_LIST_HEAD(&need_pages);
+- for (i = p->bo_list->first_userptr;
+- i < p->bo_list->num_entries; ++i) {
+- struct amdgpu_bo *bo;
+-
+- e = &p->bo_list->array[i];
+- 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_invalidated(bo->tbo.ttm,
+ &e->user_invalidated) && e->user_pages) {
+@@ -711,16 +706,14 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
+
+ if (p->bo_list) {
+ struct amdgpu_vm *vm = &fpriv->vm;
+- unsigned i;
++ struct amdgpu_bo_list_entry *e;
+
+ gds = p->bo_list->gds_obj;
+ gws = p->bo_list->gws_obj;
+ oa = p->bo_list->oa_obj;
+- for (i = 0; i < p->bo_list->num_entries; i++) {
+- struct amdgpu_bo *bo = p->bo_list->array[i].robj;
+
+- p->bo_list->array[i].bo_va = amdgpu_vm_bo_find(vm, bo);
+- }
++ 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;
+@@ -754,10 +747,7 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
+ error_free_pages:
+
+ if (p->bo_list) {
+- for (i = p->bo_list->first_userptr;
+- i < p->bo_list->num_entries; ++i) {
+- e = &p->bo_list->array[i];
+-
++ amdgpu_bo_list_for_each_userptr_entry(e, p->bo_list) {
+ if (!e->user_pages)
+ continue;
+
+@@ -832,7 +822,7 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p)
+ struct amdgpu_vm *vm = &fpriv->vm;
+ struct amdgpu_bo_va *bo_va;
+ struct amdgpu_bo *bo;
+- int i, r;
++ int r;
+
+ r = amdgpu_vm_clear_freed(adev, vm, NULL);
+ if (r)
+@@ -863,15 +853,17 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p)
+ }
+
+ if (p->bo_list) {
+- for (i = 0; i < p->bo_list->num_entries; i++) {
++ struct amdgpu_bo_list_entry *e;
++
++ amdgpu_bo_list_for_each_entry(e, p->bo_list) {
+ struct dma_fence *f;
+
+ /* ignore duplicates */
+- bo = p->bo_list->array[i].robj;
++ bo = e->robj;
+ if (!bo)
+ continue;
+
+- bo_va = p->bo_list->array[i].bo_va;
++ bo_va = e->bo_va;
+ if (bo_va == NULL)
+ continue;
+
+@@ -900,14 +892,15 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p)
+ return r;
+
+ if (amdgpu_vm_debug && p->bo_list) {
++ struct amdgpu_bo_list_entry *e;
++
+ /* Invalidate all BOs to test for userspace bugs */
+- for (i = 0; i < p->bo_list->num_entries; i++) {
++ amdgpu_bo_list_for_each_entry(e, p->bo_list) {
+ /* ignore duplicates */
+- bo = p->bo_list->array[i].robj;
+- if (!bo)
++ if (!e->robj)
+ continue;
+
+- amdgpu_vm_bo_invalidate(adev, bo, false);
++ amdgpu_vm_bo_invalidate(adev, e->robj, false);
+ }
+ }
+
+@@ -1227,16 +1220,16 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
+ struct drm_sched_entity *entity = &p->ctx->rings[ring->idx].entity;
+ enum drm_sched_priority priority;
+ struct amdgpu_job *job;
+- unsigned i;
+ uint64_t seq;
+
+ int r;
+
+ amdgpu_mn_lock(p->mn);
+ if (p->bo_list) {
+- for (i = p->bo_list->first_userptr;
+- i < p->bo_list->num_entries; ++i) {
+- struct amdgpu_bo *bo = p->bo_list->array[i].robj;
++ struct amdgpu_bo_list_entry *e;
++
++ 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);
+--
+2.7.4
+