drm/i915/gt: Disable preparser around xcs invalidations on tgl
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 28 Jul 2020 15:21:09 +0000 (16:21 +0100)
committerJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
Mon, 7 Sep 2020 10:13:59 +0000 (13:13 +0300)
Unlike rcs where we have conclusive evidence from our selftesting that
disabling the preparser before performing the TLB invalidate and
relocations does impact upon the GPU execution, the evidence for the
same requirement on xcs is much more circumstantial. Let's apply the
preparser disable between batches as we invalidate the TLB as a dose of
healthy paranoia, just in case.

References: https://gitlab.freedesktop.org/drm/intel/-/issues/2169
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200728152110.830-1-chris@chris-wilson.co.uk
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
drivers/gpu/drm/i915/gt/intel_lrc.c

index d03da2f64a49d868ed9aafbcecd8907526a5d62e..1138b5c56e2f8b4a8ad7f17d66b34661cad76577 100644 (file)
@@ -4757,14 +4757,21 @@ static int gen12_emit_flush(struct i915_request *request, u32 mode)
        intel_engine_mask_t aux_inv = 0;
        u32 cmd, *cs;
 
+       cmd = 4;
+       if (mode & EMIT_INVALIDATE)
+               cmd += 2;
        if (mode & EMIT_INVALIDATE)
                aux_inv = request->engine->mask & ~BIT(BCS0);
+       if (aux_inv)
+               cmd += 2 * hweight8(aux_inv) + 2;
 
-       cs = intel_ring_begin(request,
-                             4 + (aux_inv ? 2 * hweight8(aux_inv) + 2 : 0));
+       cs = intel_ring_begin(request, cmd);
        if (IS_ERR(cs))
                return PTR_ERR(cs);
 
+       if (mode & EMIT_INVALIDATE)
+               *cs++ = preparser_disable(true);
+
        cmd = MI_FLUSH_DW + 1;
 
        /* We always require a command barrier so that subsequent
@@ -4797,6 +4804,10 @@ static int gen12_emit_flush(struct i915_request *request, u32 mode)
                }
                *cs++ = MI_NOOP;
        }
+
+       if (mode & EMIT_INVALIDATE)
+               *cs++ = preparser_disable(false);
+
        intel_ring_advance(request, cs);
 
        return 0;