From f2d38d96a8e2987d8e6ca4374ee14b1c0e2bafc0 Mon Sep 17 00:00:00 2001 From: Amber Lin Date: Thu, 13 Apr 2017 16:49:58 -0400 Subject: [PATCH 2195/4131] drm/amdgpu: handle foreign BOs in the VM mapping Use the correct device for the PTE creation. Bug: SWDEV-118409 Change-Id: Idf9989d122f9923702f13c3f7dd3b4d1a0796448 Signed-off-by: Amber Lin --- drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index efe6b95..0f9d35d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -1704,6 +1704,7 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev, dma_addr_t *pages_addr, struct amdgpu_vm *vm, struct amdgpu_bo_va_mapping *mapping, + uint64_t vram_base_offset, uint64_t flags, struct ttm_mem_reg *mem, struct dma_fence **fence) @@ -1779,13 +1780,13 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev, dma_addr = pages_addr; break; case AMDGPU_PL_DGMA: - addr += adev->vm_manager.vram_base_offset + + addr += vram_base_offset + adev->mman.bdev.man[mem->mem_type].gpu_offset - adev->mman.bdev.man[TTM_PL_VRAM].gpu_offset; addr += pfn << PAGE_SHIFT; break; case TTM_PL_VRAM: - addr += adev->vm_manager.vram_base_offset; + addr += vram_base_offset; addr += pfn << PAGE_SHIFT; break; default: @@ -1837,6 +1838,8 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev, struct drm_mm_node *nodes; struct dma_fence *exclusive, **last_update; uint64_t flags; + uint64_t vram_base_offset = adev->vm_manager.vram_base_offset; + struct amdgpu_device *bo_adev; int r; if (clear || !bo_va->base.bo) { @@ -1858,9 +1861,15 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev, exclusive = reservation_object_get_excl(bo->tbo.resv); } - if (bo) + if (bo) { flags = amdgpu_ttm_tt_pte_flags(adev, bo->tbo.ttm, mem); - else + bo_adev = amdgpu_ttm_adev(bo->tbo.bdev); + if (mem && mem->mem_type == TTM_PL_VRAM && + adev != bo_adev) { + flags |= AMDGPU_PTE_SYSTEM; + vram_base_offset = bo_adev->mc.aper_base; + } + } else flags = 0x0; if (clear || (bo && bo->tbo.resv == vm->root.base.bo->tbo.resv)) @@ -1878,8 +1887,8 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev, list_for_each_entry(mapping, &bo_va->invalids, list) { r = amdgpu_vm_bo_split_mapping(adev, exclusive, pages_addr, vm, - mapping, flags, mem, - last_update); + mapping, vram_base_offset, flags, + mem, last_update); if (r) return r; } -- 2.7.4