aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0221-drm-amdgpu-cleanup-bo-list-bucket-handling.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0221-drm-amdgpu-cleanup-bo-list-bucket-handling.patch')
-rw-r--r--common/recipes-kernel/linux/files/0221-drm-amdgpu-cleanup-bo-list-bucket-handling.patch174
1 files changed, 174 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0221-drm-amdgpu-cleanup-bo-list-bucket-handling.patch b/common/recipes-kernel/linux/files/0221-drm-amdgpu-cleanup-bo-list-bucket-handling.patch
new file mode 100644
index 00000000..bdbc4a11
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0221-drm-amdgpu-cleanup-bo-list-bucket-handling.patch
@@ -0,0 +1,174 @@
+From 401109ddd43b20b0bbf8965bac4c5d5ac68e8f5c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com>
+Date: Fri, 18 Dec 2015 21:26:47 +0100
+Subject: [PATCH 0221/1110] drm/amdgpu: cleanup bo list bucket handling
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Move that into the BO list. No functional change.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Kalyan Alle <kalyan.alle@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu.h | 2 ++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | 36 +++++++++++++++++++-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 51 ++---------------------------
+ 3 files changed, 39 insertions(+), 50 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+index 8676505..b7b5d2e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+@@ -1064,6 +1064,8 @@ struct amdgpu_bo_list {
+
+ struct amdgpu_bo_list *
+ amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id);
++void amdgpu_bo_list_get_list(struct amdgpu_bo_list *list,
++ struct list_head *validated);
+ void amdgpu_bo_list_put(struct amdgpu_bo_list *list);
+ void amdgpu_bo_list_free(struct amdgpu_bo_list *list);
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
+index f82a2dd..9da4bd0 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
+@@ -32,6 +32,9 @@
+ #include "amdgpu.h"
+ #include "amdgpu_trace.h"
+
++#define AMDGPU_BO_LIST_MAX_PRIORITY 32u
++#define AMDGPU_BO_LIST_NUM_BUCKETS (AMDGPU_BO_LIST_MAX_PRIORITY + 1)
++
+ static int amdgpu_bo_list_create(struct amdgpu_fpriv *fpriv,
+ struct amdgpu_bo_list **result,
+ int *id)
+@@ -106,7 +109,8 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,
+
+ entry->robj = amdgpu_bo_ref(gem_to_amdgpu_bo(gobj));
+ drm_gem_object_unreference_unlocked(gobj);
+- entry->priority = info[i].bo_priority;
++ entry->priority = min(info[i].bo_priority,
++ AMDGPU_BO_LIST_MAX_PRIORITY);
+ entry->prefered_domains = entry->robj->initial_domain;
+ entry->allowed_domains = entry->prefered_domains;
+ if (entry->allowed_domains == AMDGPU_GEM_DOMAIN_VRAM)
+@@ -161,6 +165,36 @@ amdgpu_bo_list_get(struct amdgpu_fpriv *fpriv, int id)
+ return result;
+ }
+
++void amdgpu_bo_list_get_list(struct amdgpu_bo_list *list,
++ struct list_head *validated)
++{
++ /* This is based on the bucket sort with O(n) time complexity.
++ * An item with priority "i" is added to bucket[i]. The lists are then
++ * concatenated in descending order.
++ */
++ struct list_head bucket[AMDGPU_BO_LIST_NUM_BUCKETS];
++ unsigned i;
++
++ for (i = 0; i < AMDGPU_BO_LIST_NUM_BUCKETS; i++)
++ INIT_LIST_HEAD(&bucket[i]);
++
++ /* Since buffers which appear sooner in the relocation list are
++ * likely to be used more often than buffers which appear later
++ * 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;
++
++ list_add_tail(&list->array[i].tv.head,
++ &bucket[priority]);
++ }
++
++ /* Connect the sorted buckets in the output list. */
++ for (i = 0; i < AMDGPU_BO_LIST_NUM_BUCKETS; i++)
++ list_splice(&bucket[i], validated);
++}
++
+ void amdgpu_bo_list_put(struct amdgpu_bo_list *list)
+ {
+ mutex_unlock(&list->lock);
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+index e615aa0..76ec99d 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+@@ -30,47 +30,6 @@
+ #include "amdgpu.h"
+ #include "amdgpu_trace.h"
+
+-#define AMDGPU_CS_MAX_PRIORITY 32u
+-#define AMDGPU_CS_NUM_BUCKETS (AMDGPU_CS_MAX_PRIORITY + 1)
+-
+-/* This is based on the bucket sort with O(n) time complexity.
+- * An item with priority "i" is added to bucket[i]. The lists are then
+- * concatenated in descending order.
+- */
+-struct amdgpu_cs_buckets {
+- struct list_head bucket[AMDGPU_CS_NUM_BUCKETS];
+-};
+-
+-static void amdgpu_cs_buckets_init(struct amdgpu_cs_buckets *b)
+-{
+- unsigned i;
+-
+- for (i = 0; i < AMDGPU_CS_NUM_BUCKETS; i++)
+- INIT_LIST_HEAD(&b->bucket[i]);
+-}
+-
+-static void amdgpu_cs_buckets_add(struct amdgpu_cs_buckets *b,
+- struct list_head *item, unsigned priority)
+-{
+- /* Since buffers which appear sooner in the relocation list are
+- * likely to be used more often than buffers which appear later
+- * in the list, the sort mustn't change the ordering of buffers
+- * with the same priority, i.e. it must be stable.
+- */
+- list_add_tail(item, &b->bucket[min(priority, AMDGPU_CS_MAX_PRIORITY)]);
+-}
+-
+-static void amdgpu_cs_buckets_get_list(struct amdgpu_cs_buckets *b,
+- struct list_head *out_list)
+-{
+- unsigned i;
+-
+- /* Connect the sorted buckets in the output list. */
+- for (i = 0; i < AMDGPU_CS_NUM_BUCKETS; i++) {
+- list_splice(&b->bucket[i], out_list);
+- }
+-}
+-
+ int amdgpu_cs_get_ring(struct amdgpu_device *adev, u32 ip_type,
+ u32 ip_instance, u32 ring,
+ struct amdgpu_ring **out_ring)
+@@ -382,22 +341,16 @@ 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_cs_buckets buckets;
+ struct list_head duplicates;
+ bool need_mmap_lock = false;
+- int i, r;
++ int r;
+
+ INIT_LIST_HEAD(&p->validated);
+
+ p->bo_list = amdgpu_bo_list_get(fpriv, cs->in.bo_list_handle);
+ if (p->bo_list) {
+ need_mmap_lock = p->bo_list->has_userptr;
+- amdgpu_cs_buckets_init(&buckets);
+- for (i = 0; i < p->bo_list->num_entries; i++)
+- amdgpu_cs_buckets_add(&buckets, &p->bo_list->array[i].tv.head,
+- p->bo_list->array[i].priority);
+-
+- amdgpu_cs_buckets_get_list(&buckets, &p->validated);
++ amdgpu_bo_list_get_list(p->bo_list, &p->validated);
+ }
+
+ INIT_LIST_HEAD(&duplicates);
+--
+2.7.4
+