diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_object.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 108 | 
1 files changed, 32 insertions, 76 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 9e495da0bb03..6982baeccd14 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -64,11 +64,12 @@ bool amdgpu_ttm_bo_is_amdgpu_bo(struct ttm_buffer_object *bo)  	return false;  } -static void amdgpu_ttm_placement_init(struct amdgpu_device *adev, -				      struct ttm_placement *placement, -				      struct ttm_place *places, -				      u32 domain, u64 flags) +void amdgpu_ttm_placement_from_domain(struct amdgpu_bo *abo, u32 domain)  { +	struct amdgpu_device *adev = amdgpu_ttm_adev(abo->tbo.bdev); +	struct ttm_placement *placement = &abo->placement; +	struct ttm_place *places = abo->placements; +	u64 flags = abo->flags;  	u32 c = 0;  	if (domain & AMDGPU_GEM_DOMAIN_VRAM) { @@ -151,27 +152,6 @@ static void amdgpu_ttm_placement_init(struct amdgpu_device *adev,  	placement->busy_placement = places;  } -void amdgpu_ttm_placement_from_domain(struct amdgpu_bo *abo, u32 domain) -{ -	struct amdgpu_device *adev = amdgpu_ttm_adev(abo->tbo.bdev); - -	amdgpu_ttm_placement_init(adev, &abo->placement, abo->placements, -				  domain, abo->flags); -} - -static void amdgpu_fill_placement_to_bo(struct amdgpu_bo *bo, -					struct ttm_placement *placement) -{ -	BUG_ON(placement->num_placement > (AMDGPU_GEM_DOMAIN_MAX + 1)); - -	memcpy(bo->placements, placement->placement, -	       placement->num_placement * sizeof(struct ttm_place)); -	bo->placement.num_placement = placement->num_placement; -	bo->placement.num_busy_placement = placement->num_busy_placement; -	bo->placement.placement = bo->placements; -	bo->placement.busy_placement = bo->placements; -} -  /**   * amdgpu_bo_create_reserved - create reserved BO for kernel use   * @@ -303,14 +283,13 @@ void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr,  		*cpu_addr = NULL;  } -int amdgpu_bo_create_restricted(struct amdgpu_device *adev, -				unsigned long size, int byte_align, -				bool kernel, u32 domain, u64 flags, -				struct sg_table *sg, -				struct ttm_placement *placement, -				struct reservation_object *resv, -				uint64_t init_value, -				struct amdgpu_bo **bo_ptr) +static int amdgpu_bo_do_create(struct amdgpu_device *adev, +			       unsigned long size, int byte_align, +			       bool kernel, u32 domain, u64 flags, +			       struct sg_table *sg, +			       struct reservation_object *resv, +			       uint64_t init_value, +			       struct amdgpu_bo **bo_ptr)  {  	struct amdgpu_bo *bo;  	enum ttm_bo_type type; @@ -384,10 +363,11 @@ int amdgpu_bo_create_restricted(struct amdgpu_device *adev,  		bo->flags &= ~AMDGPU_GEM_CREATE_CPU_GTT_USWC;  #endif -	amdgpu_fill_placement_to_bo(bo, placement); -	/* Kernel allocation are uninterruptible */ +	bo->tbo.bdev = &adev->mman.bdev; +	amdgpu_ttm_placement_from_domain(bo, domain);  	initial_bytes_moved = atomic64_read(&adev->num_bytes_moved); +	/* Kernel allocation are uninterruptible */  	r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, type,  				 &bo->placement, page_align, !kernel, NULL,  				 acc_size, sg, resv, &amdgpu_ttm_bo_destroy); @@ -442,27 +422,17 @@ static int amdgpu_bo_create_shadow(struct amdgpu_device *adev,  				   unsigned long size, int byte_align,  				   struct amdgpu_bo *bo)  { -	struct ttm_placement placement = {0}; -	struct ttm_place placements[AMDGPU_GEM_DOMAIN_MAX + 1];  	int r;  	if (bo->shadow)  		return 0; -	memset(&placements, 0, sizeof(placements)); -	amdgpu_ttm_placement_init(adev, &placement, placements, -				  AMDGPU_GEM_DOMAIN_GTT, -				  AMDGPU_GEM_CREATE_CPU_GTT_USWC | -				  AMDGPU_GEM_CREATE_SHADOW); - -	r = amdgpu_bo_create_restricted(adev, size, byte_align, true, -					AMDGPU_GEM_DOMAIN_GTT, -					AMDGPU_GEM_CREATE_CPU_GTT_USWC | -					AMDGPU_GEM_CREATE_SHADOW, -					NULL, &placement, -					bo->tbo.resv, -					0, -					&bo->shadow); +	r = amdgpu_bo_do_create(adev, size, byte_align, true, +				AMDGPU_GEM_DOMAIN_GTT, +				AMDGPU_GEM_CREATE_CPU_GTT_USWC | +				AMDGPU_GEM_CREATE_SHADOW, +				NULL, bo->tbo.resv, 0, +				&bo->shadow);  	if (!r) {  		bo->shadow->parent = amdgpu_bo_ref(bo);  		mutex_lock(&adev->shadow_list_lock); @@ -484,18 +454,11 @@ int amdgpu_bo_create(struct amdgpu_device *adev,  		     uint64_t init_value,  		     struct amdgpu_bo **bo_ptr)  { -	struct ttm_placement placement = {0}; -	struct ttm_place placements[AMDGPU_GEM_DOMAIN_MAX + 1];  	uint64_t parent_flags = flags & ~AMDGPU_GEM_CREATE_SHADOW;  	int r; -	memset(&placements, 0, sizeof(placements)); -	amdgpu_ttm_placement_init(adev, &placement, placements, -				  domain, parent_flags); - -	r = amdgpu_bo_create_restricted(adev, size, byte_align, kernel, domain, -					parent_flags, sg, &placement, resv, -					init_value, bo_ptr); +	r = amdgpu_bo_do_create(adev, size, byte_align, kernel, domain, +				parent_flags, sg, resv, init_value, bo_ptr);  	if (r)  		return r; @@ -672,7 +635,6 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,  {  	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);  	int r, i; -	unsigned fpfn, lpfn;  	if (amdgpu_ttm_tt_get_usermm(bo->tbo.ttm))  		return -EPERM; @@ -704,22 +666,16 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,  	}  	bo->flags |= AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS; +	/* force to pin into visible video ram */ +	if (!(bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)) +		bo->flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;  	amdgpu_ttm_placement_from_domain(bo, domain);  	for (i = 0; i < bo->placement.num_placement; i++) { -		/* force to pin into visible video ram */ -		if ((bo->placements[i].flags & TTM_PL_FLAG_VRAM) && -		    !(bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS) && -		    (!max_offset || max_offset > -		     adev->mc.visible_vram_size)) { -			if (WARN_ON_ONCE(min_offset > -					 adev->mc.visible_vram_size)) -				return -EINVAL; -			fpfn = min_offset >> PAGE_SHIFT; -			lpfn = adev->mc.visible_vram_size >> PAGE_SHIFT; -		} else { -			fpfn = min_offset >> PAGE_SHIFT; -			lpfn = max_offset >> PAGE_SHIFT; -		} +		unsigned fpfn, lpfn; + +		fpfn = min_offset >> PAGE_SHIFT; +		lpfn = max_offset >> PAGE_SHIFT; +  		if (fpfn > bo->placements[i].fpfn)  			bo->placements[i].fpfn = fpfn;  		if (!bo->placements[i].lpfn || @@ -929,7 +885,7 @@ void amdgpu_bo_move_notify(struct ttm_buffer_object *bo,  		return;  	abo = container_of(bo, struct amdgpu_bo, tbo); -	amdgpu_vm_bo_invalidate(adev, abo); +	amdgpu_vm_bo_invalidate(adev, abo, evict);  	amdgpu_bo_kunmap(abo);  | 
