drm/i915/icl: Implement gen11 flush including tile cache
authorMika Kuoppala <mika.kuoppala@linux.intel.com>
Thu, 15 Aug 2019 08:30:53 +0000 (11:30 +0300)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 15 Aug 2019 12:13:23 +0000 (13:13 +0100)
Add tile cache flushing for gen11. To relive us from the
burden of previous obsolete workarounds, make a dedicated
flush/invalidate callback for gen11.

To fortify an independent single flush, do post
sync op as there are indications that without it
we don't flush everything. This should also make this
callback more readily usable in tgl (see l3 fabric flush).

v2: whitespacing

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20190815083055.14132-1-mika.kuoppala@linux.intel.com
drivers/gpu/drm/i915/gt/intel_gpu_commands.h
drivers/gpu/drm/i915/gt/intel_lrc.c

index 6a0879c27d14d99859f223663835580691004313..929a17e54f2cada064b5b1228aebff967d54c3ec 100644 (file)
 #define   DISPLAY_PLANE_A           (0<<20)
 #define   DISPLAY_PLANE_B           (1<<20)
 #define GFX_OP_PIPE_CONTROL(len)       ((0x3<<29)|(0x3<<27)|(0x2<<24)|((len)-2))
+#define   PIPE_CONTROL_TILE_CACHE_FLUSH                        (1<<28) /* gen11+ */
 #define   PIPE_CONTROL_FLUSH_L3                                (1<<27)
 #define   PIPE_CONTROL_GLOBAL_GTT_IVB                  (1<<24) /* gen7+ */
 #define   PIPE_CONTROL_MMIO_WRITE                      (1<<23)
index 5c26c4ae139b08a21b1a66ecec8ea2d6f81061f6..6a27a897d7a63a15ef5ef985e7787228458b7f03 100644 (file)
@@ -2655,6 +2655,62 @@ static int gen8_emit_flush_render(struct i915_request *request,
        return 0;
 }
 
+static int gen11_emit_flush_render(struct i915_request *request,
+                                  u32 mode)
+{
+       struct intel_engine_cs *engine = request->engine;
+       const u32 scratch_addr =
+               intel_gt_scratch_offset(engine->gt,
+                                       INTEL_GT_SCRATCH_FIELD_RENDER_FLUSH);
+
+       if (mode & EMIT_FLUSH) {
+               u32 *cs;
+               u32 flags = 0;
+
+               flags |= PIPE_CONTROL_CS_STALL;
+
+               flags |= PIPE_CONTROL_TILE_CACHE_FLUSH;
+               flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
+               flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
+               flags |= PIPE_CONTROL_DC_FLUSH_ENABLE;
+               flags |= PIPE_CONTROL_FLUSH_ENABLE;
+               flags |= PIPE_CONTROL_QW_WRITE;
+               flags |= PIPE_CONTROL_GLOBAL_GTT_IVB;
+
+               cs = intel_ring_begin(request, 6);
+               if (IS_ERR(cs))
+                       return PTR_ERR(cs);
+
+               cs = gen8_emit_pipe_control(cs, flags, scratch_addr);
+               intel_ring_advance(request, cs);
+       }
+
+       if (mode & EMIT_INVALIDATE) {
+               u32 *cs;
+               u32 flags = 0;
+
+               flags |= PIPE_CONTROL_CS_STALL;
+
+               flags |= PIPE_CONTROL_TLB_INVALIDATE;
+               flags |= PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE;
+               flags |= PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE;
+               flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE;
+               flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE;
+               flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE;
+               flags |= PIPE_CONTROL_QW_WRITE;
+               flags |= PIPE_CONTROL_GLOBAL_GTT_IVB;
+
+               cs = intel_ring_begin(request, 6);
+               if (IS_ERR(cs))
+                       return PTR_ERR(cs);
+
+               cs = gen8_emit_pipe_control(cs, flags, scratch_addr);
+               intel_ring_advance(request, cs);
+       }
+
+       return 0;
+}
+
 /*
  * Reserve space for 2 NOOPs at the end of each request to be
  * used as a workaround for not being allowed to do lite
@@ -2829,7 +2885,10 @@ int intel_execlists_submission_setup(struct intel_engine_cs *engine)
        logical_ring_default_irqs(engine);
 
        if (engine->class == RENDER_CLASS) {
-               engine->emit_flush = gen8_emit_flush_render;
+               if (INTEL_GEN(engine->i915) >= 11)
+                       engine->emit_flush = gen11_emit_flush_render;
+               else
+                       engine->emit_flush = gen8_emit_flush_render;
                engine->emit_fini_breadcrumb = gen8_emit_fini_breadcrumb_rcs;
        }