diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0222-drm-amdgpu-keep-the-prefered-allowed-domains-in-the-.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0222-drm-amdgpu-keep-the-prefered-allowed-domains-in-the-.patch | 348 |
1 files changed, 348 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0222-drm-amdgpu-keep-the-prefered-allowed-domains-in-the-.patch b/common/recipes-kernel/linux/files/0222-drm-amdgpu-keep-the-prefered-allowed-domains-in-the-.patch new file mode 100644 index 00000000..39293ddb --- /dev/null +++ b/common/recipes-kernel/linux/files/0222-drm-amdgpu-keep-the-prefered-allowed-domains-in-the-.patch @@ -0,0 +1,348 @@ +From 9e3086daf194226378bd489d9089328d3cf3cbc9 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> +Date: Fri, 18 Dec 2015 22:13:12 +0100 +Subject: [PATCH 0222/1110] drm/amdgpu: keep the prefered/allowed domains in + the BO +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Stop copying that to the bo list entry, it doesn't change anyway. + +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 | 6 +- + drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c | 14 ++--- + drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 86 ++++++++++++++++++++++------- + drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 14 +++-- + drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 15 +++-- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 4 -- + 6 files changed, 91 insertions(+), 48 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +index b7b5d2e..d5e4503 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h +@@ -445,8 +445,6 @@ struct amdgpu_bo_list_entry { + struct amdgpu_bo *robj; + struct ttm_validate_buffer tv; + struct amdgpu_bo_va *bo_va; +- unsigned prefered_domains; +- unsigned allowed_domains; + uint32_t priority; + }; + +@@ -484,6 +482,8 @@ struct amdgpu_bo { + struct list_head list; + /* Protected by tbo.reserved */ + u32 initial_domain; ++ u32 prefered_domains; ++ u32 allowed_domains; + struct ttm_place placements[AMDGPU_GEM_DOMAIN_MAX + 1]; + struct ttm_placement placement; + struct ttm_buffer_object tbo; +@@ -1064,8 +1064,6 @@ 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 9da4bd0..1c6c0ac 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c +@@ -111,23 +111,17 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev, + drm_gem_object_unreference_unlocked(gobj); + 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) +- entry->allowed_domains |= AMDGPU_GEM_DOMAIN_GTT; +- if (amdgpu_ttm_tt_has_userptr(entry->robj->tbo.ttm)) { ++ if (amdgpu_ttm_tt_has_userptr(entry->robj->tbo.ttm)) + has_userptr = true; +- entry->prefered_domains = AMDGPU_GEM_DOMAIN_GTT; +- entry->allowed_domains = AMDGPU_GEM_DOMAIN_GTT; + } + entry->tv.bo = &entry->robj->tbo; + entry->tv.shared = true; + +- if (entry->prefered_domains == AMDGPU_GEM_DOMAIN_GDS) ++ if (entry->robj->prefered_domains == AMDGPU_GEM_DOMAIN_GDS) + gds_obj = entry->robj; +- if (entry->prefered_domains == AMDGPU_GEM_DOMAIN_GWS) ++ if (entry->robj->prefered_domains == AMDGPU_GEM_DOMAIN_GWS) + gws_obj = entry->robj; +- if (entry->prefered_domains == AMDGPU_GEM_DOMAIN_OA) ++ if (entry->robj->prefered_domains == AMDGPU_GEM_DOMAIN_OA) + oa_obj = entry->robj; + + trace_amdgpu_bo_list_set(list, entry->robj); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +index 76ec99d..dba4bad 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +@@ -30,6 +30,47 @@ + #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) +@@ -107,8 +148,6 @@ static int amdgpu_cs_user_fence_chunk(struct amdgpu_cs_parser *p, + } + + p->uf_entry.robj = amdgpu_bo_ref(p->uf.bo); +- p->uf_entry.prefered_domains = AMDGPU_GEM_DOMAIN_GTT; +- p->uf_entry.allowed_domains = AMDGPU_GEM_DOMAIN_GTT; + p->uf_entry.priority = 0; + p->uf_entry.tv.bo = &p->uf_entry.robj->tbo; + p->uf_entry.tv.shared = true; +@@ -139,13 +178,16 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) + ret = -EINVAL; + goto free_chunk; + } ++ ++ p->bo_list = amdgpu_bo_list_get(fpriv, cs->in.bo_list_handle); + + /* get chunks */ ++ INIT_LIST_HEAD(&p->validated); + chunk_array_user = (uint64_t __user *)(unsigned long)(cs->in.chunks); + if (copy_from_user(chunk_array, chunk_array_user, + sizeof(uint64_t)*cs->in.num_chunks)) { + ret = -EFAULT; +- goto put_ctx; ++ goto put_bo_list; + } + + p->nchunks = cs->in.num_chunks; +@@ -153,7 +195,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data) + GFP_KERNEL); + if (!p->chunks) { + ret = -ENOMEM; +- goto put_ctx; ++ goto put_bo_list; + } + + for (i = 0; i < p->nchunks; i++) { +@@ -229,7 +271,9 @@ free_partial_kdata: + for (; i >= 0; i--) + drm_free_large(p->chunks[i].kdata); + kfree(p->chunks); +-put_ctx: ++put_bo_list: ++ if (p->bo_list) ++ amdgpu_bo_list_put(p->bo_list); + amdgpu_ctx_put(p->ctx); + free_chunk: + kfree(chunk_array); +@@ -315,9 +359,9 @@ int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p, + * completely. + */ + if (p->bytes_moved <= p->bytes_moved_threshold) +- domain = lobj->prefered_domains; ++ domain = bo->prefered_domains; + else +- domain = lobj->allowed_domains; ++ domain = bo->allowed_domains; + + retry: + amdgpu_ttm_placement_from_domain(bo, domain); +@@ -327,36 +371,38 @@ int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p, + initial_bytes_moved; + + if (unlikely(r)) { +- if (r != -ERESTARTSYS && domain != lobj->allowed_domains) { +- domain = lobj->allowed_domains; +- goto retry; ++ if (r != -ERESTARTSYS && domain != bo->allowed_domains) { ++ domain = bo->allowed_domains; + ++ goto retry; + } ++ return r; + } + } + return 0; + } + +-static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p, +- union drm_amdgpu_cs *cs) ++static int amdgpu_cs_parser_relocs(struct amdgpu_cs_parser *p) + { +- struct amdgpu_fpriv *fpriv = p->filp->driver_priv; ++ struct amdgpu_cs_buckets buckets; + struct list_head duplicates; + bool need_mmap_lock = false; +- int r; +- +- INIT_LIST_HEAD(&p->validated); + +- p->bo_list = amdgpu_bo_list_get(fpriv, cs->in.bo_list_handle); ++ int i, r; ++ + if (p->bo_list) { + need_mmap_lock = p->bo_list->has_userptr; +- amdgpu_bo_list_get_list(p->bo_list, &p->validated); ++ 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); + } + + INIT_LIST_HEAD(&duplicates); + amdgpu_vm_get_pd_bo(&fpriv->vm, &p->validated, &p->vm_pd); + +- if (p->uf.bo) + list_add(&p->uf_entry.tv.head, &p->validated); + + if (need_mmap_lock) +@@ -774,7 +820,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) + r = amdgpu_cs_handle_lockup(adev, r); + return r; + } +- r = amdgpu_cs_parser_bos(&parser, data); ++ r = amdgpu_cs_parser_relocs(&parser); + if (r == -ENOMEM) + DRM_ERROR("Not enough memory for command submission!\n"); + else if (r && r != -ERESTARTSYS) +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +index cb34ff6..95e12f4 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +@@ -252,6 +252,8 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data, + goto handle_lockup; + + bo = gem_to_amdgpu_bo(gobj); ++ bo->prefered_domains = AMDGPU_GEM_DOMAIN_GTT; ++ bo->allowed_domains = AMDGPU_GEM_DOMAIN_GTT; + r = amdgpu_ttm_tt_set_userptr(bo->tbo.ttm, args->addr, args->flags); + if (r) + goto release_object; +@@ -629,7 +631,7 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data, + + info.bo_size = robj->gem_base.size; + info.alignment = robj->tbo.mem.page_alignment << PAGE_SHIFT; +- info.domains = robj->initial_domain; ++ info.domains = robj->prefered_domains; + info.domain_flags = robj->flags; + amdgpu_bo_unreserve(robj); + if (copy_to_user(out, &info, sizeof(info))) +@@ -642,9 +644,13 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data, + amdgpu_bo_unreserve(robj); + break; + } +- robj->initial_domain = args->value & (AMDGPU_GEM_DOMAIN_VRAM | +- AMDGPU_GEM_DOMAIN_GTT | +- AMDGPU_GEM_DOMAIN_CPU); ++ robj->prefered_domains = args->value & (AMDGPU_GEM_DOMAIN_VRAM | ++ AMDGPU_GEM_DOMAIN_GTT | ++ AMDGPU_GEM_DOMAIN_CPU); ++ robj->allowed_domains = robj->prefered_domains; ++ if (robj->allowed_domains == AMDGPU_GEM_DOMAIN_VRAM) ++ robj->allowed_domains |= AMDGPU_GEM_DOMAIN_GTT; ++ + amdgpu_bo_unreserve(robj); + break; + default: +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +index 73628c7..b79a4f3 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +@@ -254,12 +254,15 @@ int amdgpu_bo_create_restricted(struct amdgpu_device *adev, + bo->adev = adev; + INIT_LIST_HEAD(&bo->list); + INIT_LIST_HEAD(&bo->va); +- bo->initial_domain = domain & (AMDGPU_GEM_DOMAIN_VRAM | +- AMDGPU_GEM_DOMAIN_GTT | +- AMDGPU_GEM_DOMAIN_CPU | +- AMDGPU_GEM_DOMAIN_GDS | +- AMDGPU_GEM_DOMAIN_GWS | +- AMDGPU_GEM_DOMAIN_OA); ++ bo->prefered_domains = domain & (AMDGPU_GEM_DOMAIN_VRAM | ++ AMDGPU_GEM_DOMAIN_GTT | ++ AMDGPU_GEM_DOMAIN_CPU | ++ AMDGPU_GEM_DOMAIN_GDS | ++ AMDGPU_GEM_DOMAIN_GWS | ++ AMDGPU_GEM_DOMAIN_OA); ++ bo->allowed_domains = bo->prefered_domains; ++ if (!kernel && bo->allowed_domains == AMDGPU_GEM_DOMAIN_VRAM) ++ bo->allowed_domains |= AMDGPU_GEM_DOMAIN_GTT; + + bo->flags = flags; + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +index d495db3..8c729b1 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +@@ -88,8 +88,6 @@ void amdgpu_vm_get_pd_bo(struct amdgpu_vm *vm, + struct amdgpu_bo_list_entry *entry) + { + entry->robj = vm->page_directory; +- entry->prefered_domains = AMDGPU_GEM_DOMAIN_VRAM; +- entry->allowed_domains = AMDGPU_GEM_DOMAIN_VRAM; + entry->priority = 0; + entry->tv.bo = &vm->page_directory->tbo; + entry->tv.shared = true; +@@ -1131,8 +1129,6 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, + } + + entry->robj = pt; +- entry->prefered_domains = AMDGPU_GEM_DOMAIN_VRAM; +- entry->allowed_domains = AMDGPU_GEM_DOMAIN_VRAM; + entry->priority = 0; + entry->tv.bo = &entry->robj->tbo; + entry->tv.shared = true; +-- +2.7.4 + |