From: Christian König <christian.koe...@amd.com>

Convert GTT mappings into linear ones for huge page handling.

Signed-off-by: Christian König <christian.koe...@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 3c86381..16454bd 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -1732,6 +1732,7 @@ static int amdgpu_vm_bo_split_mapping(struct 
amdgpu_device *adev,
        }
 
        do {
+               dma_addr_t *dma_addr = NULL;
                uint64_t max_entries;
                uint64_t addr, last;
 
@@ -1745,15 +1746,32 @@ static int amdgpu_vm_bo_split_mapping(struct 
amdgpu_device *adev,
                }
 
                if (pages_addr) {
+                       uint64_t count;
+
                        max_entries = min(max_entries, 16ull * 1024ull);
-                       addr = 0;
+                       for (count = 1; count < max_entries; ++count) {
+                               uint64_t idx = pfn + count;
+
+                               if (pages_addr[idx] !=
+                                   (pages_addr[idx - 1] + PAGE_SIZE))
+                                       break;
+                       }
+
+                       if (count < 64) {
+                               addr = pfn << PAGE_SHIFT;
+                               dma_addr = pages_addr;
+                       } else {
+                               addr = pages_addr[pfn];
+                               max_entries = count;
+                       }
+
                } else if (flags & AMDGPU_PTE_VALID) {
                        addr += adev->vm_manager.vram_base_offset;
+                       addr += pfn << PAGE_SHIFT;
                }
-               addr += pfn << PAGE_SHIFT;
 
                last = min((uint64_t)mapping->last, start + max_entries - 1);
-               r = amdgpu_vm_bo_update_mapping(adev, exclusive, pages_addr, vm,
+               r = amdgpu_vm_bo_update_mapping(adev, exclusive, dma_addr, vm,
                                                start, last, flags, addr,
                                                fence);
                if (r)
-- 
2.7.4

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to