aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2009-drm-amdgpu-Add-amdgpu_find_mm_node.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2009-drm-amdgpu-Add-amdgpu_find_mm_node.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2009-drm-amdgpu-Add-amdgpu_find_mm_node.patch113
1 files changed, 113 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2009-drm-amdgpu-Add-amdgpu_find_mm_node.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2009-drm-amdgpu-Add-amdgpu_find_mm_node.patch
new file mode 100644
index 00000000..78b56fbf
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/2009-drm-amdgpu-Add-amdgpu_find_mm_node.patch
@@ -0,0 +1,113 @@
+From efc8d1b74a41dfa17e22aee2475eb8d256ba354a Mon Sep 17 00:00:00 2001
+From: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
+Date: Fri, 6 Oct 2017 17:36:35 -0400
+Subject: [PATCH 2009/4131] drm/amdgpu: Add amdgpu_find_mm_node()
+
+v2: Use amdgpu_find_mm_node() in amdgpu_ttm_io_mem_pfn()
+
+Change-Id: I12231e18bb60152843cd0e0213ddd0d0e04e7497
+Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
+
+ Conflicts:
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 49 ++++++++++++++++++---------------
+ 1 file changed, 27 insertions(+), 22 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+index 5cd086d..a2aec3f 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+@@ -334,7 +334,24 @@ static uint64_t amdgpu_mm_node_addr(struct ttm_buffer_object *bo,
+ }
+
+ /**
+- * amdgpu_ttm_copy_mem_to_mem - Helper function for copy
++ * amdgpu_find_mm_node - Helper function finds the drm_mm_node
++ * corresponding to @offset. It also modifies the offset to be
++ * within the drm_mm_node returned
++ */
++static struct drm_mm_node *amdgpu_find_mm_node(struct ttm_mem_reg *mem,
++ unsigned long *offset)
++{
++ struct drm_mm_node *mm_node = mem->mm_node;
++
++ while (*offset >= (mm_node->size << PAGE_SHIFT)) {
++ *offset -= (mm_node->size << PAGE_SHIFT);
++ ++mm_node;
++ }
++ return mm_node;
++}
++
++/**
++ * amdgpu_copy_ttm_mem_to_mem - Helper function for copy
+ *
+ * The function copies @size bytes from {src->mem + src->offset} to
+ * {dst->mem + dst->offset}. src->bo and dst->bo could be same BO for a
+@@ -363,21 +380,13 @@ int amdgpu_ttm_copy_mem_to_mem(struct amdgpu_device *adev,
+ return -EINVAL;
+ }
+
+- src_mm = src->mem->mm_node;
+- while (src->offset >= (src_mm->size << PAGE_SHIFT)) {
+- src->offset -= (src_mm->size << PAGE_SHIFT);
+- ++src_mm;
+- }
++ src_mm = amdgpu_find_mm_node(src->mem, &src->offset);
+ src_node_start = amdgpu_mm_node_addr(src->bo, src_mm, src->mem) +
+ src->offset;
+ src_node_size = (src_mm->size << PAGE_SHIFT) - src->offset;
+ src_page_offset = src_node_start & (PAGE_SIZE - 1);
+
+- dst_mm = dst->mem->mm_node;
+- while (dst->offset >= (dst_mm->size << PAGE_SHIFT)) {
+- dst->offset -= (dst_mm->size << PAGE_SHIFT);
+- ++dst_mm;
+- }
++ dst_mm = amdgpu_find_mm_node(dst->mem, &dst->offset);
+ dst_node_start = amdgpu_mm_node_addr(dst->bo, dst_mm, dst->mem) +
+ dst->offset;
+ dst_node_size = (dst_mm->size << PAGE_SHIFT) - dst->offset;
+@@ -713,13 +722,12 @@ static unsigned long amdgpu_ttm_io_mem_pfn(struct ttm_buffer_object *bo,
+ {
+ if (bo->mem.mem_type != AMDGPU_PL_DGMA &&
+ bo->mem.mem_type != AMDGPU_PL_DGMA_IMPORT) {
+- struct drm_mm_node *mm = bo->mem.mm_node;
+- uint64_t size = mm->size;
+- uint64_t offset = page_offset;
++ struct drm_mm_node *mm;
++ unsigned long offset = (page_offset << PAGE_SHIFT);
+
+- page_offset = do_div(offset, size);
+- mm += offset;
+- return (bo->mem.bus.base >> PAGE_SHIFT) + mm->start + page_offset;
++ mm = amdgpu_find_mm_node(&bo->mem, &offset);
++ return (bo->mem.bus.base >> PAGE_SHIFT) + mm->start +
++ (offset >> PAGE_SHIFT);
+ }
+
+ return ttm_bo_default_io_mem_pfn(bo, page_offset);
+@@ -1293,7 +1301,7 @@ static int amdgpu_ttm_access_memory(struct ttm_buffer_object *bo,
+ {
+ struct amdgpu_bo *abo = ttm_to_amdgpu_bo(bo);
+ struct amdgpu_device *adev = amdgpu_ttm_adev(abo->tbo.bdev);
+- struct drm_mm_node *nodes = abo->tbo.mem.mm_node;
++ struct drm_mm_node *nodes;
+ uint32_t value = 0;
+ int ret = 0;
+ uint64_t pos;
+@@ -1302,10 +1310,7 @@ static int amdgpu_ttm_access_memory(struct ttm_buffer_object *bo,
+ if (bo->mem.mem_type != TTM_PL_VRAM)
+ return -EIO;
+
+- while (offset >= (nodes->size << PAGE_SHIFT)) {
+- offset -= nodes->size << PAGE_SHIFT;
+- ++nodes;
+- }
++ nodes = amdgpu_find_mm_node(&abo->tbo.mem, &offset);
+ pos = (nodes->start << PAGE_SHIFT) + offset;
+
+ while (len && pos < adev->mc.mc_vram_size) {
+--
+2.7.4
+