On 06/09/2021 17:55, Thomas Hellström wrote:
When backing up or restoring contents of pinned objects at suspend /
resume time we need to allocate a new object as the backup. Add a function
to facilitate copies between the two. Some data needs to be copied before
the migration context is ready for operation, so make sure we can
disable accelerated copies.

Signed-off-by: Thomas Hellström <thomas.hellst...@linux.intel.com>
---

<snip>

+
+/**
+ * i915_gem_obj_copy_ttm - Copy the contents of one ttm-based gem object to
+ * another
+ * @dst: The destination object
+ * @src: The source object
+ * @allow_accel: Allow using the blitter. Otherwise TTM memcpy is used.
+ * @intr: Whether to perform waits interruptible:
+ *
+ * Note: The caller is responsible for assuring that the underlying
+ * TTM objects are populated if needed and locked.
+ *
+ * Return: Zero on success. Negative error code on error. If @intr == true,
+ * then it may return -ERESTARTSYS or -EINTR.
+ */
+int i915_gem_obj_copy_ttm(struct drm_i915_gem_object *dst,
+                         struct drm_i915_gem_object *src,
+                         bool allow_accel, bool intr)
+{
+       struct ttm_buffer_object *dst_bo = i915_gem_to_ttm(dst);
+       struct ttm_buffer_object *src_bo = i915_gem_to_ttm(src);
+       struct ttm_operation_ctx ctx = {
+               .interruptible = intr,
+       };
+       struct sg_table *dst_st;
+       int ret;
+
+       assert_object_held(dst);
+       assert_object_held(src);
+
+       /*
+        * Sync for now. This will change with async moves.
+        */
+       ret = ttm_bo_wait_ctx(dst_bo, &ctx);
+       if (!ret)
+               ttm_bo_wait_ctx(src_bo, &ctx);

ret = ?

+       if (ret)
+               return ret;
+
+       dst_st = gpu_binds_iomem(dst_bo->resource) ?
+               dst->ttm.cached_io_st : i915_ttm_tt_get_st(dst_bo->ttm);
+
+       __i915_ttm_move(src_bo, false, dst_bo->resource, dst_bo->ttm,
+                       dst_st, allow_accel);
+
+       return 0;
+}
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.h 
b/drivers/gpu/drm/i915/gem/i915_gem_ttm.h
index 40927f67b6d9..34ac78d47b0d 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.h
+++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.h
@@ -46,4 +46,8 @@ int __i915_gem_ttm_object_init(struct intel_memory_region 
*mem,
                               resource_size_t size,
                               resource_size_t page_size,
                               unsigned int flags);
+
+int i915_gem_obj_copy_ttm(struct drm_i915_gem_object *dst,
+                         struct drm_i915_gem_object *src,
+                         bool allow_accel, bool intr);
  #endif

Reply via email to