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