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
