[Intel-gfx] [PATCH v2 1/6] drm/i915/ttm: Implement a function to copy the contents of two TTM-base objects
Matthew Auld
matthew.auld at intel.com
Tue Sep 7 08:54:34 UTC 2021
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 at 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
>
More information about the Intel-gfx
mailing list