提交 353819d8 编写于 作者: M Matthew Auld

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: NMatthew Auld <matthew.auld@intel.com>
Cc: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Cc: Ramalingam C <ramalingam.c@intel.com>
Reviewed-by: NRamalingam C <ramalingam.c@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220727164346.282407-1-matthew.auld@intel.com
上级 f5dfbfc0
...@@ -708,7 +708,7 @@ intel_context_migrate_copy(struct intel_context *ce, ...@@ -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, ...@@ -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, ...@@ -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. */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册