Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: use BO pages instead of GART array

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Christian König and committed by
Alex Deucher
8358dcee fa3ab3c7

+16 -13
+16 -13
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
··· 836 836 * amdgpu_vm_bo_split_mapping - split a mapping into smaller chunks 837 837 * 838 838 * @adev: amdgpu_device pointer 839 - * @gtt: GART instance to use for mapping 839 + * @gtt_flags: flags as they are used for GTT 840 + * @pages_addr: DMA addresses to use for mapping 840 841 * @vm: requested vm 841 842 * @mapping: mapped range and flags to use for the update 842 843 * @addr: addr to set the area to 843 - * @gtt_flags: flags as they are used for GTT 844 + * @flags: HW flags for the mapping 844 845 * @fence: optional resulting fence 845 846 * 846 847 * Split the mapping into smaller chunks so that each update fits ··· 849 848 * Returns 0 for success, -EINVAL for failure. 850 849 */ 851 850 static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev, 852 - struct amdgpu_gart *gtt, 853 851 uint32_t gtt_flags, 852 + dma_addr_t *pages_addr, 854 853 struct amdgpu_vm *vm, 855 854 struct amdgpu_bo_va_mapping *mapping, 856 855 uint32_t flags, uint64_t addr, ··· 859 858 const uint64_t max_size = 64ULL * 1024ULL * 1024ULL / AMDGPU_GPU_PAGE_SIZE; 860 859 861 860 uint64_t src = 0, start = mapping->it.start; 862 - dma_addr_t *pages_addr = NULL; 863 861 int r; 864 862 865 863 /* normally,bo_va->flags only contians READABLE and WIRTEABLE bit go here ··· 871 871 872 872 trace_amdgpu_vm_bo_update(mapping); 873 873 874 - if (gtt) { 874 + if (pages_addr) { 875 875 if (flags == gtt_flags) 876 876 src = adev->gart.table_addr + (addr >> 12) * 8; 877 - else 878 - pages_addr = &gtt->pages_addr[addr >> 12]; 879 877 addr = 0; 880 878 } 881 879 addr += mapping->offset; 882 880 883 - if (!gtt || src) 881 + if (!pages_addr || src) 884 882 return amdgpu_vm_bo_update_mapping(adev, src, pages_addr, vm, 885 883 start, mapping->it.last, 886 884 flags, addr, fence); ··· 918 920 { 919 921 struct amdgpu_vm *vm = bo_va->vm; 920 922 struct amdgpu_bo_va_mapping *mapping; 921 - struct amdgpu_gart *gtt = NULL; 923 + dma_addr_t *pages_addr = NULL; 922 924 uint32_t gtt_flags, flags; 923 925 uint64_t addr; 924 926 int r; 925 927 926 928 if (mem) { 929 + struct ttm_dma_tt *ttm; 930 + 927 931 addr = (u64)mem->start << PAGE_SHIFT; 928 932 switch (mem->mem_type) { 929 933 case TTM_PL_TT: 930 - gtt = &bo_va->bo->adev->gart; 934 + ttm = container_of(bo_va->bo->tbo.ttm, struct 935 + ttm_dma_tt, ttm); 936 + pages_addr = ttm->dma_address; 931 937 break; 932 938 933 939 case TTM_PL_VRAM: ··· 954 952 spin_unlock(&vm->status_lock); 955 953 956 954 list_for_each_entry(mapping, &bo_va->invalids, list) { 957 - r = amdgpu_vm_bo_split_mapping(adev, gtt, gtt_flags, vm, mapping, 958 - flags, addr, &bo_va->last_pt_update); 955 + r = amdgpu_vm_bo_split_mapping(adev, gtt_flags, pages_addr, vm, 956 + mapping, flags, addr, 957 + &bo_va->last_pt_update); 959 958 if (r) 960 959 return r; 961 960 } ··· 1001 998 struct amdgpu_bo_va_mapping, list); 1002 999 list_del(&mapping->list); 1003 1000 1004 - r = amdgpu_vm_bo_split_mapping(adev, NULL, 0, vm, mapping, 1001 + r = amdgpu_vm_bo_split_mapping(adev, 0, NULL, vm, mapping, 1005 1002 0, 0, NULL); 1006 1003 kfree(mapping); 1007 1004 if (r)