diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_object.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 41 | 
1 files changed, 30 insertions, 11 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 2099159a693f..8d8c39be6129 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -39,6 +39,7 @@  #include "amdgpu.h"  #include "amdgpu_trace.h"  #include "amdgpu_amdkfd.h" +#include "amdgpu_vram_mgr.h"  /**   * DOC: amdgpu_object @@ -153,8 +154,10 @@ void amdgpu_bo_placement_from_domain(struct amdgpu_bo *abo, u32 domain)  		else  			places[c].flags |= TTM_PL_FLAG_TOPDOWN; -		if (flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS) +		if (abo->tbo.type == ttm_bo_type_kernel && +		    flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS)  			places[c].flags |= TTM_PL_FLAG_CONTIGUOUS; +  		c++;  	} @@ -173,6 +176,12 @@ void amdgpu_bo_placement_from_domain(struct amdgpu_bo *abo, u32 domain)  			abo->flags & AMDGPU_GEM_CREATE_PREEMPTIBLE ?  			AMDGPU_PL_PREEMPT : TTM_PL_TT;  		places[c].flags = 0; +		/* +		 * When GTT is just an alternative to VRAM make sure that we +		 * only use it as fallback and still try to fill up VRAM first. +		 */ +		if (domain & abo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) +			places[c].flags |= TTM_PL_FLAG_FALLBACK;  		c++;  	} @@ -595,8 +604,7 @@ int amdgpu_bo_create(struct amdgpu_device *adev,  	if (!amdgpu_bo_support_uswc(bo->flags))  		bo->flags &= ~AMDGPU_GEM_CREATE_CPU_GTT_USWC; -	if (adev->ras_enabled) -		bo->flags |= AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE; +	bo->flags |= AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE;  	bo->tbo.bdev = &adev->mman.bdev;  	if (bp->domain & (AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA | @@ -605,6 +613,8 @@ int amdgpu_bo_create(struct amdgpu_device *adev,  	else  		amdgpu_bo_placement_from_domain(bo, bp->domain);  	if (bp->type == ttm_bo_type_kernel) +		bo->tbo.priority = 2; +	else if (!(bp->flags & AMDGPU_GEM_CREATE_DISCARDABLE))  		bo->tbo.priority = 1;  	if (!bp->destroy) @@ -627,7 +637,7 @@ int amdgpu_bo_create(struct amdgpu_device *adev,  	    bo->tbo.resource->mem_type == TTM_PL_VRAM) {  		struct dma_fence *fence; -		r = amdgpu_fill_buffer(bo, 0, bo->tbo.base.resv, &fence, true); +		r = amdgpu_ttm_clear_buffer(bo, bo->tbo.base.resv, &fence);  		if (unlikely(r))  			goto fail_unreserve; @@ -757,7 +767,7 @@ int amdgpu_bo_restore_shadow(struct amdgpu_bo *shadow, struct dma_fence **fence)  	return amdgpu_copy_buffer(ring, shadow_addr, parent_addr,  				  amdgpu_bo_size(shadow), NULL, fence, -				  true, false, false); +				  true, false, 0);  }  /** @@ -959,6 +969,10 @@ int amdgpu_bo_pin_restricted(struct amdgpu_bo *bo, u32 domain,  		if (!bo->placements[i].lpfn ||  		    (lpfn && lpfn < bo->placements[i].lpfn))  			bo->placements[i].lpfn = lpfn; + +		if (bo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS && +		    bo->placements[i].mem_type == TTM_PL_VRAM) +			bo->placements[i].flags |= TTM_PL_FLAG_CONTIGUOUS;  	}  	r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx); @@ -1241,14 +1255,18 @@ int amdgpu_bo_get_metadata(struct amdgpu_bo *bo, void *buffer,   * amdgpu_bo_move_notify - notification about a memory move   * @bo: pointer to a buffer object   * @evict: if this move is evicting the buffer from the graphics address space + * @new_mem: new resource for backing the BO   *   * Marks the corresponding &amdgpu_bo buffer object as invalid, also performs   * bookkeeping.   * TTM driver callback which is called when ttm moves a buffer.   */ -void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, bool evict) +void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, +			   bool evict, +			   struct ttm_resource *new_mem)  {  	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev); +	struct ttm_resource *old_mem = bo->resource;  	struct amdgpu_bo *abo;  	if (!amdgpu_bo_is_amdgpu_bo(bo)) @@ -1260,12 +1278,12 @@ void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, bool evict)  	amdgpu_bo_kunmap(abo);  	if (abo->tbo.base.dma_buf && !abo->tbo.base.import_attach && -	    bo->resource->mem_type != TTM_PL_SYSTEM) +	    old_mem && old_mem->mem_type != TTM_PL_SYSTEM)  		dma_buf_move_notify(abo->tbo.base.dma_buf); -	/* remember the eviction */ -	if (evict) -		atomic64_inc(&adev->num_evictions); +	/* move_notify is called before move happens */ +	trace_amdgpu_bo_move(abo, new_mem ? new_mem->mem_type : -1, +			     old_mem ? old_mem->mem_type : -1);  }  void amdgpu_bo_get_memory(struct amdgpu_bo *bo, @@ -1360,8 +1378,9 @@ void amdgpu_bo_release_notify(struct ttm_buffer_object *bo)  	if (WARN_ON_ONCE(!dma_resv_trylock(bo->base.resv)))  		return; -	r = amdgpu_fill_buffer(abo, AMDGPU_POISON, bo->base.resv, &fence, true); +	r = amdgpu_fill_buffer(abo, 0, bo->base.resv, &fence, true);  	if (!WARN_ON(r)) { +		amdgpu_vram_mgr_set_cleared(bo->resource);  		amdgpu_bo_fence(abo, fence, false);  		dma_fence_put(fence);  	} | 
