diff options
Diffstat (limited to 'drivers/gpu/drm/ttm/ttm_bo_util.c')
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo_util.c | 22 | 
1 files changed, 11 insertions, 11 deletions
| diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c index 1c5ffe2935af..72a94301bc95 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_util.c +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c @@ -78,22 +78,21 @@ void ttm_mem_io_free(struct ttm_device *bdev,  /**   * ttm_move_memcpy - Helper to perform a memcpy ttm move operation. - * @bo: The struct ttm_buffer_object. - * @new_mem: The struct ttm_resource we're moving to (copy destination). - * @new_iter: A struct ttm_kmap_iter representing the destination resource. + * @clear: Whether to clear rather than copy. + * @num_pages: Number of pages of the operation. + * @dst_iter: A struct ttm_kmap_iter representing the destination resource.   * @src_iter: A struct ttm_kmap_iter representing the source resource.   *   * This function is intended to be able to move out async under a   * dma-fence if desired.   */ -void ttm_move_memcpy(struct ttm_buffer_object *bo, +void ttm_move_memcpy(bool clear,  		     u32 num_pages,  		     struct ttm_kmap_iter *dst_iter,  		     struct ttm_kmap_iter *src_iter)  {  	const struct ttm_kmap_iter_ops *dst_ops = dst_iter->ops;  	const struct ttm_kmap_iter_ops *src_ops = src_iter->ops; -	struct ttm_tt *ttm = bo->ttm;  	struct dma_buf_map src_map, dst_map;  	pgoff_t i; @@ -102,10 +101,7 @@ void ttm_move_memcpy(struct ttm_buffer_object *bo,  		return;  	/* Don't move nonexistent data. Clear destination instead. */ -	if (src_ops->maps_tt && (!ttm || !ttm_tt_is_populated(ttm))) { -		if (ttm && !(ttm->page_flags & TTM_PAGE_FLAG_ZERO_ALLOC)) -			return; - +	if (clear) {  		for (i = 0; i < num_pages; ++i) {  			dst_ops->map_local(dst_iter, &dst_map, i);  			if (dst_map.is_iomem) @@ -148,9 +144,10 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,  		struct ttm_kmap_iter_linear_io io;  	} _dst_iter, _src_iter;  	struct ttm_kmap_iter *dst_iter, *src_iter; +	bool clear;  	int ret = 0; -	if (ttm && ((ttm->page_flags & TTM_PAGE_FLAG_SWAPPED) || +	if (ttm && ((ttm->page_flags & TTM_TT_FLAG_SWAPPED) ||  		    dst_man->use_tt)) {  		ret = ttm_tt_populate(bdev, ttm, ctx);  		if (ret) @@ -171,7 +168,9 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,  		goto out_src_iter;  	} -	ttm_move_memcpy(bo, dst_mem->num_pages, dst_iter, src_iter); +	clear = src_iter->ops->maps_tt && (!ttm || !ttm_tt_is_populated(ttm)); +	if (!(clear && ttm && !(ttm->page_flags & TTM_TT_FLAG_ZERO_ALLOC))) +		ttm_move_memcpy(clear, dst_mem->num_pages, dst_iter, src_iter);  	if (!src_iter->ops->maps_tt)  		ttm_kmap_iter_linear_io_fini(&_src_iter.io, bdev, src_mem); @@ -190,6 +189,7 @@ static void ttm_transfered_destroy(struct ttm_buffer_object *bo)  	struct ttm_transfer_obj *fbo;  	fbo = container_of(bo, struct ttm_transfer_obj, base); +	dma_resv_fini(&fbo->base.base._resv);  	ttm_bo_put(fbo->bo);  	kfree(fbo);  } |