BO VRAM resource maybe on multiple blocks, use resource cursor to
handle MQD and control stack GART mapping.

Signed-off-by: Philip Yang <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 29 +++++++++++++++++++------
 1 file changed, 22 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 43009d3809b5..47923c632f2f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -888,6 +888,7 @@ static void amdgpu_ttm_gart_bind_gfx9_mqd_vram(struct 
amdgpu_device *adev,
        uint64_t total_pages;
        int num_xcc = max(1U, adev->gfx.num_xcc_per_xcp);
        uint64_t page_idx, pages_per_xcc;
+       struct amdgpu_res_cursor cursor;
        uint64_t ctrl_flags = flags;
        int i;
 
@@ -901,18 +902,32 @@ static void amdgpu_ttm_gart_bind_gfx9_mqd_vram(struct 
amdgpu_device *adev,
        pages_per_xcc = total_pages;
        do_div(pages_per_xcc, num_xcc);
 
+       amdgpu_res_first(tbo->resource, 0, tbo->resource->size, &cursor);
+
        for (i = 0, page_idx = 0; i < num_xcc; i++, page_idx += pages_per_xcc) {
-               u64 pa = (tbo->resource->start + page_idx) << PAGE_SHIFT;
                u64 start_page = mm_node->start + page_idx;
+               u64 npages, n;
+               u64 pa;
 
-               pa += adev->vm_manager.vram_base_offset;
-               amdgpu_gart_map_vram_range(adev, pa, start_page, 1,
+               pa = cursor.start + adev->vm_manager.vram_base_offset;
+               n = 1;
+               amdgpu_gart_map_vram_range(adev, pa, start_page, n,
                                           flags, NULL);
 
-               amdgpu_gart_map_vram_range(adev, pa + PAGE_SIZE,
-                                          start_page + 1,
-                                          pages_per_xcc - 1,
-                                          ctrl_flags, NULL);
+               npages = pages_per_xcc - 1;
+               while (npages) {
+                       amdgpu_res_next(&cursor, n * PAGE_SIZE);
+
+                       start_page += n;
+                       pa = cursor.start + adev->vm_manager.vram_base_offset;
+                       n = min(cursor.size / PAGE_SIZE, npages);
+
+                       amdgpu_gart_map_vram_range(adev, pa, start_page, n,
+                                                  ctrl_flags, NULL);
+
+                       npages -= n;
+               }
+               amdgpu_res_next(&cursor, n * PAGE_SIZE);
        }
 }
 
-- 
2.50.1

Reply via email to