Merge drm/drm-next into drm-intel-gt-next
[linux-2.6-microblaze.git] / drivers / gpu / drm / ttm / ttm_bo_util.c
index 1c5ffe2..c893c3d 100644 (file)
@@ -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,6 +144,7 @@ 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) ||
@@ -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_PAGE_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);