aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4177-drm-amdgpu-fix-and-cleanup-cpu-visible-VRAM-handling.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4177-drm-amdgpu-fix-and-cleanup-cpu-visible-VRAM-handling.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/4177-drm-amdgpu-fix-and-cleanup-cpu-visible-VRAM-handling.patch123
1 files changed, 123 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4177-drm-amdgpu-fix-and-cleanup-cpu-visible-VRAM-handling.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4177-drm-amdgpu-fix-and-cleanup-cpu-visible-VRAM-handling.patch
new file mode 100644
index 00000000..74b4f33b
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4177-drm-amdgpu-fix-and-cleanup-cpu-visible-VRAM-handling.patch
@@ -0,0 +1,123 @@
+From 7a6ff6773c8cb0b0141e113d9b330896328a79f5 Mon Sep 17 00:00:00 2001
+From: christian koenig <christian.koenig@amd.com>
+Date: Thu, 5 Apr 2018 16:42:03 +0200
+Subject: [PATCH 4177/5725] drm/amdgpu: fix and cleanup cpu visible VRAM
+ handling
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+The detection if a BO was placed in CPU visible VRAM was incorrect.
+
+Fix it and merge it with the correct detection in amdgpu_ttm.c
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
+Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
+Signed-off-by: Kalyan Alle <kalyan.alle@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 6 ++----
+ drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 21 +++++++++++++++++++++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 19 +++----------------
+ 3 files changed, 26 insertions(+), 20 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+index 19265a9..6a5534e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+@@ -382,8 +382,7 @@ static int amdgpu_cs_bo_validate(struct amdgpu_cs_parser *p,
+
+ p->bytes_moved += ctx.bytes_moved;
+ if (adev->gmc.visible_vram_size < adev->gmc.real_vram_size &&
+- bo->tbo.mem.mem_type == TTM_PL_VRAM &&
+- bo->tbo.mem.start < adev->gmc.visible_vram_size >> PAGE_SHIFT)
++ amdgpu_bo_in_cpu_visible_vram(bo))
+ p->bytes_moved_vis += ctx.bytes_moved;
+
+ if (unlikely(r == -ENOMEM) && domain != bo->allowed_domains &&
+@@ -437,8 +436,7 @@ static bool amdgpu_cs_try_evict(struct amdgpu_cs_parser *p,
+ /* Good we can try to move this BO somewhere else */
+ update_bytes_moved_vis =
+ adev->gmc.visible_vram_size < adev->gmc.real_vram_size &&
+- bo->tbo.mem.mem_type == TTM_PL_VRAM &&
+- bo->tbo.mem.start < adev->gmc.visible_vram_size >> PAGE_SHIFT;
++ amdgpu_bo_in_cpu_visible_vram(bo);
+ amdgpu_ttm_placement_from_domain(bo, other);
+ r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);
+ p->bytes_moved += ctx.bytes_moved;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
+index 092e853..92873fa 100755
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
+@@ -207,6 +207,27 @@ static inline bool amdgpu_bo_gpu_accessible(struct amdgpu_bo *bo)
+ }
+
+ /**
++ * amdgpu_bo_in_cpu_visible_vram - check if BO is (partly) in visible VRAM
++ */
++static inline bool amdgpu_bo_in_cpu_visible_vram(struct amdgpu_bo *bo)
++{
++ struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
++ unsigned fpfn = adev->gmc.visible_vram_size >> PAGE_SHIFT;
++ struct drm_mm_node *node = bo->tbo.mem.mm_node;
++ unsigned long pages_left;
++
++ if (bo->tbo.mem.mem_type != TTM_PL_VRAM)
++ return false;
++
++ for (pages_left = bo->tbo.mem.num_pages; pages_left;
++ pages_left -= node->size, node++)
++ if (node->start < fpfn)
++ return true;
++
++ return false;
++}
++
++/**
+ * amdgpu_bo_explicit_sync - return whether the bo is explicitly synced
+ */
+ static inline bool amdgpu_bo_explicit_sync(struct amdgpu_bo *bo)
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+index 6c81f2d..aa6d4e0 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+@@ -241,20 +241,8 @@ static void amdgpu_evict_flags(struct ttm_buffer_object *bo,
+ if (!adev->mman.buffer_funcs_enabled) {
+ amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU);
+ } else if (adev->gmc.visible_vram_size < adev->gmc.real_vram_size &&
+- !(abo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)) {
+- unsigned fpfn = adev->gmc.visible_vram_size >> PAGE_SHIFT;
+- struct drm_mm_node *node = bo->mem.mm_node;
+- unsigned long pages_left;
+-
+- for (pages_left = bo->mem.num_pages;
+- pages_left;
+- pages_left -= node->size, node++) {
+- if (node->start < fpfn)
+- break;
+- }
+-
+- if (!pages_left)
+- goto gtt;
++ !(abo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) &&
++ amdgpu_bo_in_cpu_visible_vram(abo)) {
+
+ /* Try evicting to the CPU inaccessible part of VRAM
+ * first, but only set GTT as busy placement, so this
+@@ -263,12 +251,11 @@ static void amdgpu_evict_flags(struct ttm_buffer_object *bo,
+ */
+ amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_VRAM |
+ AMDGPU_GEM_DOMAIN_GTT);
+- abo->placements[0].fpfn = fpfn;
++ abo->placements[0].fpfn = adev->gmc.visible_vram_size >> PAGE_SHIFT;
+ abo->placements[0].lpfn = 0;
+ abo->placement.busy_placement = &abo->placements[1];
+ abo->placement.num_busy_placement = 1;
+ } else {
+-gtt:
+ amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT);
+ }
+ break;
+--
+2.7.4
+