diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 30 | 
1 files changed, 21 insertions, 9 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 6b15cad78de9..0e7dc23f78e7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -800,7 +800,7 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,  	struct amdgpu_bo *bo = &vmbo->bo;  	unsigned entries, ats_entries;  	uint64_t addr; -	int r; +	int r, idx;  	/* Figure out our place in the hierarchy */  	if (ancestor->parent) { @@ -845,9 +845,12 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,  			return r;  	} +	if (!drm_dev_enter(adev_to_drm(adev), &idx)) +		return -ENODEV; +  	r = vm->update_funcs->map_table(vmbo);  	if (r) -		return r; +		goto exit;  	memset(¶ms, 0, sizeof(params));  	params.adev = adev; @@ -856,7 +859,7 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,  	r = vm->update_funcs->prepare(¶ms, NULL, AMDGPU_SYNC_EXPLICIT);  	if (r) -		return r; +		goto exit;  	addr = 0;  	if (ats_entries) { @@ -872,7 +875,7 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,  		r = vm->update_funcs->update(¶ms, vmbo, addr, 0, ats_entries,  					     value, flags);  		if (r) -			return r; +			goto exit;  		addr += ats_entries * 8;  	} @@ -895,10 +898,13 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,  		r = vm->update_funcs->update(¶ms, vmbo, addr, 0, entries,  					     value, flags);  		if (r) -			return r; +			goto exit;  	} -	return vm->update_funcs->commit(¶ms, NULL); +	r = vm->update_funcs->commit(¶ms, NULL); +exit: +	drm_dev_exit(idx); +	return r;  }  /** @@ -1384,11 +1390,14 @@ int amdgpu_vm_update_pdes(struct amdgpu_device *adev,  			  struct amdgpu_vm *vm, bool immediate)  {  	struct amdgpu_vm_update_params params; -	int r; +	int r, idx;  	if (list_empty(&vm->relocated))  		return 0; +	if (!drm_dev_enter(adev_to_drm(adev), &idx)) +		return -ENODEV; +  	memset(¶ms, 0, sizeof(params));  	params.adev = adev;  	params.vm = vm; @@ -1396,7 +1405,7 @@ int amdgpu_vm_update_pdes(struct amdgpu_device *adev,  	r = vm->update_funcs->prepare(¶ms, NULL, AMDGPU_SYNC_EXPLICIT);  	if (r) -		return r; +		goto exit;  	while (!list_empty(&vm->relocated)) {  		struct amdgpu_vm_bo_base *entry; @@ -1414,10 +1423,13 @@ int amdgpu_vm_update_pdes(struct amdgpu_device *adev,  	r = vm->update_funcs->commit(¶ms, &vm->last_update);  	if (r)  		goto error; +	drm_dev_exit(idx);  	return 0;  error:  	amdgpu_vm_invalidate_pds(adev, vm); +exit: +	drm_dev_exit(idx);  	return r;  } @@ -1706,7 +1718,7 @@ int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,  	enum amdgpu_sync_mode sync_mode;  	int r, idx; -	if (!drm_dev_enter(&adev->ddev, &idx)) +	if (!drm_dev_enter(adev_to_drm(adev), &idx))  		return -ENODEV;  	memset(¶ms, 0, sizeof(params)); |