[PATCH 2/3] drm/i915/gt: Serialise gen8+ breadcrumbs

Chris Wilson chris at chris-wilson.co.uk
Sun May 3 08:59:22 UTC 2020


The MI_FLUSH_DW serialised most things, except for MI ops, which
significantly include such things as relocation processing. To serialise
with the MI ops, use another MI to write the breadcrmb which thankfully
is in write order with the rest.

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
---
 drivers/gpu/drm/i915/gt/intel_lrc.c | 30 +++++++++++++++++++++--------
 1 file changed, 22 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
index d4ef344657b0..4e16e5904e85 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -4656,12 +4656,29 @@ gen8_emit_fini_breadcrumb_footer(struct i915_request *request,
 	return gen8_emit_wa_tail(request, cs);
 }
 
+static u32 *emit_xcs_breadcrumb(struct i915_request *request, u32 *cs)
+{
+	u64 addr = i915_request_active_timeline(request)->hwsp_offset;
+
+	/* Serialising flush... */
+	*cs++ = (MI_FLUSH_DW + 1) |
+		MI_FLUSH_DW_STORE_INDEX | MI_FLUSH_DW_OP_STOREDW;
+	*cs++ = LRC_PPHWSP_SCRATCH_ADDR;
+	*cs++ = 0;
+	*cs++ = 0;
+
+	/* But it did not serialise its write with earlier MI! */
+	*cs++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
+	*cs++ = lower_32_bits(addr);
+	*cs++ = upper_32_bits(addr);
+	*cs++ = request->fence.seqno;
+
+	return cs;
+}
+
 static u32 *gen8_emit_fini_breadcrumb(struct i915_request *request, u32 *cs)
 {
-	cs = gen8_emit_ggtt_write(cs,
-				  request->fence.seqno,
-				  i915_request_active_timeline(request)->hwsp_offset,
-				  0);
+	cs = emit_xcs_breadcrumb(request, cs);
 
 	return gen8_emit_fini_breadcrumb_footer(request, cs);
 }
@@ -4751,10 +4768,7 @@ gen12_emit_fini_breadcrumb_footer(struct i915_request *request, u32 *cs)
 
 static u32 *gen12_emit_fini_breadcrumb(struct i915_request *request, u32 *cs)
 {
-	cs = gen8_emit_ggtt_write(cs,
-				  request->fence.seqno,
-				  i915_request_active_timeline(request)->hwsp_offset,
-				  0);
+	cs = emit_xcs_breadcrumb(request, cs);
 
 	return gen12_emit_fini_breadcrumb_footer(request, cs);
 }
-- 
2.20.1



More information about the Intel-gfx-trybot mailing list