diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 33 | 
1 files changed, 21 insertions, 12 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index d21dd2f369da..d4fcf5475464 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c @@ -31,6 +31,7 @@  #include <drm/amdgpu_drm.h>  #include "amdgpu.h"  #include "amdgpu_display.h" +#include "amdgpu_xgmi.h"  void amdgpu_gem_object_free(struct drm_gem_object *gobj)  { @@ -627,11 +628,6 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,  	switch (args->operation) {  	case AMDGPU_VA_OP_MAP: -		r = amdgpu_vm_alloc_pts(adev, bo_va->base.vm, args->va_address, -					args->map_size); -		if (r) -			goto error_backoff; -  		va_flags = amdgpu_gmc_get_pte_flags(adev, args->flags);  		r = amdgpu_vm_bo_map(adev, bo_va, args->va_address,  				     args->offset_in_bo, args->map_size, @@ -647,11 +643,6 @@ int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data,  						args->map_size);  		break;  	case AMDGPU_VA_OP_REPLACE: -		r = amdgpu_vm_alloc_pts(adev, bo_va->base.vm, args->va_address, -					args->map_size); -		if (r) -			goto error_backoff; -  		va_flags = amdgpu_gmc_get_pte_flags(adev, args->flags);  		r = amdgpu_vm_bo_replace_map(adev, bo_va, args->va_address,  					     args->offset_in_bo, args->map_size, @@ -678,6 +669,7 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data,  	struct amdgpu_device *adev = dev->dev_private;  	struct drm_amdgpu_gem_op *args = data;  	struct drm_gem_object *gobj; +	struct amdgpu_vm_bo_base *base;  	struct amdgpu_bo *robj;  	int r; @@ -716,6 +708,15 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data,  			amdgpu_bo_unreserve(robj);  			break;  		} +		for (base = robj->vm_bo; base; base = base->next) +			if (amdgpu_xgmi_same_hive(amdgpu_ttm_adev(robj->tbo.bdev), +				amdgpu_ttm_adev(base->vm->root.base.bo->tbo.bdev))) { +				r = -EINVAL; +				amdgpu_bo_unreserve(robj); +				goto out; +			} + +  		robj->preferred_domains = args->value & (AMDGPU_GEM_DOMAIN_VRAM |  							AMDGPU_GEM_DOMAIN_GTT |  							AMDGPU_GEM_DOMAIN_CPU); @@ -745,17 +746,25 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv,  	struct amdgpu_device *adev = dev->dev_private;  	struct drm_gem_object *gobj;  	uint32_t handle; +	u64 flags = AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;  	u32 domain;  	int r; +	/* +	 * The buffer returned from this function should be cleared, but +	 * it can only be done if the ring is enabled or we'll fail to +	 * create the buffer. +	 */ +	if (adev->mman.buffer_funcs_enabled) +		flags |= AMDGPU_GEM_CREATE_VRAM_CLEARED; +  	args->pitch = amdgpu_align_pitch(adev, args->width,  					 DIV_ROUND_UP(args->bpp, 8), 0);  	args->size = (u64)args->pitch * args->height;  	args->size = ALIGN(args->size, PAGE_SIZE);  	domain = amdgpu_bo_get_preferred_pin_domain(adev,  				amdgpu_display_supported_domains(adev)); -	r = amdgpu_gem_object_create(adev, args->size, 0, domain, -				     AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, +	r = amdgpu_gem_object_create(adev, args->size, 0, domain, flags,  				     ttm_bo_type_device, NULL, &gobj);  	if (r)  		return -ENOMEM;  | 
