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