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.hellstrom@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,
#endifbool allow_accel, bool intr);