[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 dri-devel mailing list