diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 16 | 
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index ae43b58c9733..5839fab374bf 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c @@ -449,7 +449,7 @@ out:   * vital here, so they are not reported back to userspace.   */  static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, -				    struct amdgpu_bo_va *bo_va) +				    struct amdgpu_bo_va *bo_va, uint32_t operation)  {  	struct ttm_validate_buffer tv, *entry;  	struct amdgpu_bo_list_entry *vm_bos; @@ -485,7 +485,9 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev,  	if (r)  		goto error_unlock; -	r = amdgpu_vm_bo_update(adev, bo_va, &bo_va->bo->tbo.mem); + +	if (operation == AMDGPU_VA_OP_MAP) +		r = amdgpu_vm_bo_update(adev, bo_va, &bo_va->bo->tbo.mem);  error_unlock:  	mutex_unlock(&bo_va->vm->mutex); @@ -580,7 +582,7 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,  	}  	if (!r && !(args->flags & AMDGPU_VM_DELAY_UPDATE)) -		amdgpu_gem_va_update_vm(adev, bo_va); +		amdgpu_gem_va_update_vm(adev, bo_va, args->operation);  	drm_gem_object_unreference_unlocked(gobj);  	return r; @@ -613,6 +615,7 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data,  		info.alignment = robj->tbo.mem.page_alignment << PAGE_SHIFT;  		info.domains = robj->initial_domain;  		info.domain_flags = robj->flags; +		amdgpu_bo_unreserve(robj);  		if (copy_to_user(out, &info, sizeof(info)))  			r = -EFAULT;  		break; @@ -620,17 +623,19 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data,  	case AMDGPU_GEM_OP_SET_PLACEMENT:  		if (amdgpu_ttm_tt_has_userptr(robj->tbo.ttm)) {  			r = -EPERM; +			amdgpu_bo_unreserve(robj);  			break;  		}  		robj->initial_domain = args->value & (AMDGPU_GEM_DOMAIN_VRAM |  						      AMDGPU_GEM_DOMAIN_GTT |  						      AMDGPU_GEM_DOMAIN_CPU); +		amdgpu_bo_unreserve(robj);  		break;  	default: +		amdgpu_bo_unreserve(robj);  		r = -EINVAL;  	} -	amdgpu_bo_unreserve(robj);  out:  	drm_gem_object_unreference_unlocked(gobj);  	return r; @@ -651,7 +656,8 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv,  	r = amdgpu_gem_object_create(adev, args->size, 0,  				     AMDGPU_GEM_DOMAIN_VRAM, -				     0, ttm_bo_type_device, +				     AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, +				     ttm_bo_type_device,  				     &gobj);  	if (r)  		return -ENOMEM;  |