diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 32 | 
1 files changed, 22 insertions, 10 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index e87eedcc0da9..e48b4ec88c8c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c @@ -72,7 +72,7 @@ retry:  				initial_domain |= AMDGPU_GEM_DOMAIN_GTT;  				goto retry;  			} -			DRM_ERROR("Failed to allocate GEM object (%ld, %d, %u, %d)\n", +			DRM_DEBUG("Failed to allocate GEM object (%ld, %d, %u, %d)\n",  				  size, initial_domain, alignment, r);  		}  		return r; @@ -282,6 +282,7 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,  int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,  			     struct drm_file *filp)  { +	struct ttm_operation_ctx ctx = { true, false };  	struct amdgpu_device *adev = dev->dev_private;  	struct drm_amdgpu_gem_userptr *args = data;  	struct drm_gem_object *gobj; @@ -335,7 +336,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,  			goto free_pages;  		amdgpu_ttm_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_GTT); -		r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false); +		r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);  		amdgpu_bo_unreserve(bo);  		if (r)  			goto free_pages; @@ -517,10 +518,6 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev,  	if (!amdgpu_vm_ready(vm))  		return; -	r = amdgpu_vm_update_directories(adev, vm); -	if (r) -		goto error; -  	r = amdgpu_vm_clear_freed(adev, vm, NULL);  	if (r)  		goto error; @@ -529,6 +526,10 @@ static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev,  	    operation == AMDGPU_VA_OP_REPLACE)  		r = amdgpu_vm_bo_update(adev, bo_va, false); +	r = amdgpu_vm_update_directories(adev, vm); +	if (r) +		goto error; +  error:  	if (r && r != -ERESTARTSYS)  		DRM_ERROR("Couldn't update BO_VA (%d)\n", r); @@ -557,14 +558,25 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,  	int r = 0;  	if (args->va_address < AMDGPU_VA_RESERVED_SIZE) { -		dev_err(&dev->pdev->dev, +		dev_dbg(&dev->pdev->dev,  			"va_address 0x%LX is in reserved area 0x%LX\n",  			args->va_address, AMDGPU_VA_RESERVED_SIZE);  		return -EINVAL;  	} +	if (args->va_address >= AMDGPU_VA_HOLE_START && +	    args->va_address < AMDGPU_VA_HOLE_END) { +		dev_dbg(&dev->pdev->dev, +			"va_address 0x%LX is in VA hole 0x%LX-0x%LX\n", +			args->va_address, AMDGPU_VA_HOLE_START, +			AMDGPU_VA_HOLE_END); +		return -EINVAL; +	} + +	args->va_address &= AMDGPU_VA_HOLE_MASK; +  	if ((args->flags & ~valid_flags) && (args->flags & ~prt_flags)) { -		dev_err(&dev->pdev->dev, "invalid flags combination 0x%08X\n", +		dev_dbg(&dev->pdev->dev, "invalid flags combination 0x%08X\n",  			args->flags);  		return -EINVAL;  	} @@ -576,7 +588,7 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,  	case AMDGPU_VA_OP_REPLACE:  		break;  	default: -		dev_err(&dev->pdev->dev, "unsupported operation %d\n", +		dev_dbg(&dev->pdev->dev, "unsupported operation %d\n",  			args->operation);  		return -EINVAL;  	} @@ -839,7 +851,7 @@ static const struct drm_info_list amdgpu_debugfs_gem_list[] = {  };  #endif -int amdgpu_gem_debugfs_init(struct amdgpu_device *adev) +int amdgpu_debugfs_gem_init(struct amdgpu_device *adev)  {  #if defined(CONFIG_DEBUG_FS)  	return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_gem_list, 1); |