Commit 353819d8 authored by Matthew Auld's avatar Matthew Auld
Browse files

drm/i915/ttm: don't leak the ccs state



The kernel only manages the ccs state with lmem-only objects, however
the kernel should still take care not to leak the CCS state from the
previous user.

Fixes: 48760ffe ("drm/i915/gt: Clear compress metadata for Flat-ccs objects")
Signed-off-by: default avatarMatthew Auld <matthew.auld@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Ramalingam C <ramalingam.c@intel.com>
Reviewed-by: default avatarRamalingam C <ramalingam.c@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220727164346.282407-1-matthew.auld@intel.com
parent f5dfbfc0
Loading
Loading
Loading
Loading
+22 −1
Original line number Original line Diff line number Diff line
@@ -708,7 +708,7 @@ intel_context_migrate_copy(struct intel_context *ce,
	u8 src_access, dst_access;
	u8 src_access, dst_access;
	struct i915_request *rq;
	struct i915_request *rq;
	int src_sz, dst_sz;
	int src_sz, dst_sz;
	bool ccs_is_src;
	bool ccs_is_src, overwrite_ccs;
	int err;
	int err;


	GEM_BUG_ON(ce->vm != ce->engine->gt->migrate.context->vm);
	GEM_BUG_ON(ce->vm != ce->engine->gt->migrate.context->vm);
@@ -749,6 +749,8 @@ intel_context_migrate_copy(struct intel_context *ce,
			get_ccs_sg_sgt(&it_ccs, bytes_to_cpy);
			get_ccs_sg_sgt(&it_ccs, bytes_to_cpy);
	}
	}


	overwrite_ccs = HAS_FLAT_CCS(i915) && !ccs_bytes_to_cpy && dst_is_lmem;

	src_offset = 0;
	src_offset = 0;
	dst_offset = CHUNK_SZ;
	dst_offset = CHUNK_SZ;
	if (HAS_64K_PAGES(ce->engine->i915)) {
	if (HAS_64K_PAGES(ce->engine->i915)) {
@@ -852,6 +854,25 @@ intel_context_migrate_copy(struct intel_context *ce,
			if (err)
			if (err)
				goto out_rq;
				goto out_rq;
			ccs_bytes_to_cpy -= ccs_sz;
			ccs_bytes_to_cpy -= ccs_sz;
		} else if (overwrite_ccs) {
			err = rq->engine->emit_flush(rq, EMIT_INVALIDATE);
			if (err)
				goto out_rq;

			/*
			 * While we can't always restore/manage the CCS state,
			 * we still need to ensure we don't leak the CCS state
			 * from the previous user, so make sure we overwrite it
			 * with something.
			 */
			err = emit_copy_ccs(rq, dst_offset, INDIRECT_ACCESS,
					    dst_offset, DIRECT_ACCESS, len);
			if (err)
				goto out_rq;

			err = rq->engine->emit_flush(rq, EMIT_INVALIDATE);
			if (err)
				goto out_rq;
		}
		}


		/* Arbitration is re-enabled between requests. */
		/* Arbitration is re-enabled between requests. */