diff options
Diffstat (limited to 'drivers/gpu/drm/ttm/ttm_bo_util.c')
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo_util.c | 40 | 
1 files changed, 27 insertions, 13 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c index 2b8caa1efaa3..1cbfb00c1d65 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_util.c +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c @@ -221,9 +221,6 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo,  	fbo->base = *bo; -	ttm_bo_get(bo); -	fbo->bo = bo; -  	/**  	 * Fix up members that we shouldn't copy directly:  	 * TODO: Explicit member copy would probably be better here. @@ -231,8 +228,6 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo,  	atomic_inc(&ttm_glob.bo_count);  	INIT_LIST_HEAD(&fbo->base.ddestroy); -	INIT_LIST_HEAD(&fbo->base.lru); -	fbo->base.moving = NULL;  	drm_vma_node_reset(&fbo->base.base.vma_node);  	kref_init(&fbo->base.kref); @@ -251,6 +246,15 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo,  	ret = dma_resv_trylock(&fbo->base.base._resv);  	WARN_ON(!ret); +	ret = dma_resv_reserve_fences(&fbo->base.base._resv, 1); +	if (ret) { +		kfree(fbo); +		return ret; +	} + +	ttm_bo_get(bo); +	fbo->bo = bo; +  	ttm_bo_move_to_lru_tail_unlocked(&fbo->base);  	*new_obj = &fbo->base; @@ -495,14 +499,12 @@ static int ttm_bo_move_to_ghost(struct ttm_buffer_object *bo,  	 * operation has completed.  	 */ -	dma_fence_put(bo->moving); -	bo->moving = dma_fence_get(fence); -  	ret = ttm_buffer_object_transfer(bo, &ghost_obj);  	if (ret)  		return ret; -	dma_resv_add_excl_fence(&ghost_obj->base._resv, fence); +	dma_resv_add_fence(&ghost_obj->base._resv, fence, +			   DMA_RESV_USAGE_KERNEL);  	/**  	 * If we're not moving to fixed memory, the TTM object @@ -540,9 +542,6 @@ static void ttm_bo_move_pipeline_evict(struct ttm_buffer_object *bo,  	spin_unlock(&from->move_lock);  	ttm_resource_free(bo, &bo->resource); - -	dma_fence_put(bo->moving); -	bo->moving = dma_fence_get(fence);  }  int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo, @@ -556,7 +555,7 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,  	struct ttm_resource_manager *man = ttm_manager_type(bdev, new_mem->mem_type);  	int ret = 0; -	dma_resv_add_excl_fence(bo->base.resv, fence); +	dma_resv_add_fence(bo->base.resv, fence, DMA_RESV_USAGE_KERNEL);  	if (!evict)  		ret = ttm_bo_move_to_ghost(bo, fence, man->use_tt);  	else if (!from->use_tt && pipeline) @@ -573,6 +572,21 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,  }  EXPORT_SYMBOL(ttm_bo_move_accel_cleanup); +void ttm_bo_move_sync_cleanup(struct ttm_buffer_object *bo, +			      struct ttm_resource *new_mem) +{ +	struct ttm_device *bdev = bo->bdev; +	struct ttm_resource_manager *man = ttm_manager_type(bdev, new_mem->mem_type); +	int ret; + +	ret = ttm_bo_wait_free_node(bo, man->use_tt); +	if (WARN_ON(ret)) +		return; + +	ttm_bo_assign_mem(bo, new_mem); +} +EXPORT_SYMBOL(ttm_bo_move_sync_cleanup); +  /**   * ttm_bo_pipeline_gutting - purge the contents of a bo   * @bo: The buffer object  |