diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 45 |
1 files changed, 11 insertions, 34 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index f68b7cdc370a..1e14531353e0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
@@ -316,12 +316,12 @@ static void amdgpu_vm_update_pages(struct amdgpu_device *adev, | |||
316 | } | 316 | } |
317 | } | 317 | } |
318 | 318 | ||
319 | int amdgpu_vm_free_job(struct amdgpu_job *sched_job) | 319 | int amdgpu_vm_free_job(struct amdgpu_job *job) |
320 | { | 320 | { |
321 | int i; | 321 | int i; |
322 | for (i = 0; i < sched_job->num_ibs; i++) | 322 | for (i = 0; i < job->num_ibs; i++) |
323 | amdgpu_ib_free(sched_job->adev, &sched_job->ibs[i]); | 323 | amdgpu_ib_free(job->adev, &job->ibs[i]); |
324 | kfree(sched_job->ibs); | 324 | kfree(job->ibs); |
325 | return 0; | 325 | return 0; |
326 | } | 326 | } |
327 | 327 | ||
@@ -686,31 +686,6 @@ static int amdgpu_vm_update_ptes(struct amdgpu_device *adev, | |||
686 | } | 686 | } |
687 | 687 | ||
688 | /** | 688 | /** |
689 | * amdgpu_vm_fence_pts - fence page tables after an update | ||
690 | * | ||
691 | * @vm: requested vm | ||
692 | * @start: start of GPU address range | ||
693 | * @end: end of GPU address range | ||
694 | * @fence: fence to use | ||
695 | * | ||
696 | * Fence the page tables in the range @start - @end (cayman+). | ||
697 | * | ||
698 | * Global and local mutex must be locked! | ||
699 | */ | ||
700 | static void amdgpu_vm_fence_pts(struct amdgpu_vm *vm, | ||
701 | uint64_t start, uint64_t end, | ||
702 | struct fence *fence) | ||
703 | { | ||
704 | unsigned i; | ||
705 | |||
706 | start >>= amdgpu_vm_block_size; | ||
707 | end >>= amdgpu_vm_block_size; | ||
708 | |||
709 | for (i = start; i <= end; ++i) | ||
710 | amdgpu_bo_fence(vm->page_tables[i].bo, fence, true); | ||
711 | } | ||
712 | |||
713 | /** | ||
714 | * amdgpu_vm_bo_update_mapping - update a mapping in the vm page table | 689 | * amdgpu_vm_bo_update_mapping - update a mapping in the vm page table |
715 | * | 690 | * |
716 | * @adev: amdgpu_device pointer | 691 | * @adev: amdgpu_device pointer |
@@ -813,8 +788,7 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev, | |||
813 | if (r) | 788 | if (r) |
814 | goto error_free; | 789 | goto error_free; |
815 | 790 | ||
816 | amdgpu_vm_fence_pts(vm, mapping->it.start, | 791 | amdgpu_bo_fence(vm->page_directory, f, true); |
817 | mapping->it.last + 1, f); | ||
818 | if (fence) { | 792 | if (fence) { |
819 | fence_put(*fence); | 793 | fence_put(*fence); |
820 | *fence = fence_get(f); | 794 | *fence = fence_get(f); |
@@ -855,7 +829,7 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev, | |||
855 | int r; | 829 | int r; |
856 | 830 | ||
857 | if (mem) { | 831 | if (mem) { |
858 | addr = mem->start << PAGE_SHIFT; | 832 | addr = (u64)mem->start << PAGE_SHIFT; |
859 | if (mem->mem_type != TTM_PL_TT) | 833 | if (mem->mem_type != TTM_PL_TT) |
860 | addr += adev->vm_manager.vram_base_offset; | 834 | addr += adev->vm_manager.vram_base_offset; |
861 | } else { | 835 | } else { |
@@ -1089,6 +1063,7 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, | |||
1089 | 1063 | ||
1090 | /* walk over the address space and allocate the page tables */ | 1064 | /* walk over the address space and allocate the page tables */ |
1091 | for (pt_idx = saddr; pt_idx <= eaddr; ++pt_idx) { | 1065 | for (pt_idx = saddr; pt_idx <= eaddr; ++pt_idx) { |
1066 | struct reservation_object *resv = vm->page_directory->tbo.resv; | ||
1092 | struct amdgpu_bo *pt; | 1067 | struct amdgpu_bo *pt; |
1093 | 1068 | ||
1094 | if (vm->page_tables[pt_idx].bo) | 1069 | if (vm->page_tables[pt_idx].bo) |
@@ -1097,11 +1072,13 @@ int amdgpu_vm_bo_map(struct amdgpu_device *adev, | |||
1097 | /* drop mutex to allocate and clear page table */ | 1072 | /* drop mutex to allocate and clear page table */ |
1098 | mutex_unlock(&vm->mutex); | 1073 | mutex_unlock(&vm->mutex); |
1099 | 1074 | ||
1075 | ww_mutex_lock(&resv->lock, NULL); | ||
1100 | r = amdgpu_bo_create(adev, AMDGPU_VM_PTE_COUNT * 8, | 1076 | r = amdgpu_bo_create(adev, AMDGPU_VM_PTE_COUNT * 8, |
1101 | AMDGPU_GPU_PAGE_SIZE, true, | 1077 | AMDGPU_GPU_PAGE_SIZE, true, |
1102 | AMDGPU_GEM_DOMAIN_VRAM, | 1078 | AMDGPU_GEM_DOMAIN_VRAM, |
1103 | AMDGPU_GEM_CREATE_NO_CPU_ACCESS, | 1079 | AMDGPU_GEM_CREATE_NO_CPU_ACCESS, |
1104 | NULL, &pt); | 1080 | NULL, resv, &pt); |
1081 | ww_mutex_unlock(&resv->lock); | ||
1105 | if (r) | 1082 | if (r) |
1106 | goto error_free; | 1083 | goto error_free; |
1107 | 1084 | ||
@@ -1303,7 +1280,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) | |||
1303 | r = amdgpu_bo_create(adev, pd_size, align, true, | 1280 | r = amdgpu_bo_create(adev, pd_size, align, true, |
1304 | AMDGPU_GEM_DOMAIN_VRAM, | 1281 | AMDGPU_GEM_DOMAIN_VRAM, |
1305 | AMDGPU_GEM_CREATE_NO_CPU_ACCESS, | 1282 | AMDGPU_GEM_CREATE_NO_CPU_ACCESS, |
1306 | NULL, &vm->page_directory); | 1283 | NULL, NULL, &vm->page_directory); |
1307 | if (r) | 1284 | if (r) |
1308 | return r; | 1285 | return r; |
1309 | 1286 | ||