diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 24 | 
1 files changed, 18 insertions, 6 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 143d11afe0e5..291977b93b1d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -1771,18 +1771,30 @@ int amdgpu_vm_bo_clear_mappings(struct amdgpu_device *adev,  	/* Insert partial mapping before the range */  	if (!list_empty(&before->list)) { +		struct amdgpu_bo *bo = before->bo_va->base.bo; +  		amdgpu_vm_it_insert(before, &vm->va);  		if (before->flags & AMDGPU_PTE_PRT)  			amdgpu_vm_prt_get(adev); + +		if (bo && bo->tbo.base.resv == vm->root.bo->tbo.base.resv && +		    !before->bo_va->base.moved) +			amdgpu_vm_bo_moved(&before->bo_va->base);  	} else {  		kfree(before);  	}  	/* Insert partial mapping after the range */  	if (!list_empty(&after->list)) { +		struct amdgpu_bo *bo = after->bo_va->base.bo; +  		amdgpu_vm_it_insert(after, &vm->va);  		if (after->flags & AMDGPU_PTE_PRT)  			amdgpu_vm_prt_get(adev); + +		if (bo && bo->tbo.base.resv == vm->root.bo->tbo.base.resv && +		    !after->bo_va->base.moved) +			amdgpu_vm_bo_moved(&after->bo_va->base);  	} else {  		kfree(after);  	} @@ -2233,16 +2245,16 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm)  	if (r)  		return r; -	/* Sanity checks */ -	if (!amdgpu_vm_pt_is_root_clean(adev, vm)) { -		r = -EINVAL; -		goto unreserve_bo; -	} -  	/* Check if PD needs to be reinitialized and do it before  	 * changing any other state, in case it fails.  	 */  	if (pte_support_ats != vm->pte_support_ats) { +		/* Sanity checks */ +		if (!amdgpu_vm_pt_is_root_clean(adev, vm)) { +			r = -EINVAL; +			goto unreserve_bo; +		} +  		vm->pte_support_ats = pte_support_ats;  		r = amdgpu_vm_pt_clear(adev, vm, to_amdgpu_bo_vm(vm->root.bo),  				       false);  | 
