diff mbox

[v4,4/8] drm/i915: add new pipe control helper for mmio writes

Message ID 20180509174851.13847-5-lionel.g.landwerlin@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Lionel Landwerlin May 9, 2018, 5:48 p.m. UTC
We'll use those helpers in the following commits. It's a good thing to
have them around as they need to apply a particular workaround on
Skylake.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
---
 drivers/gpu/drm/i915/intel_lrc.c        | 34 +++++++++++++++++++++++++
 drivers/gpu/drm/i915/intel_ringbuffer.h |  5 ++++
 2 files changed, 39 insertions(+)
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index e754e9d112a5..6fe0d668c023 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -2151,6 +2151,40 @@  static void gen8_emit_breadcrumb_rcs(struct i915_request *request, u32 *cs)
 }
 static const int gen8_emit_breadcrumb_rcs_sz = 8 + WA_TAIL_DWORDS;
 
+u32 gen8_lri_pipe_control_len(struct drm_i915_private *dev_priv)
+{
+	return IS_SKYLAKE(dev_priv) ? (7) : 5;
+}
+
+u32 *gen8_emit_lri_pipe_control(struct drm_i915_private *dev_priv,
+				u32 *cs, u32 flags, u32 offset,
+				u32 value)
+{
+	/*
+	 * Project: SKL
+	 *
+	 *  "PIPECONTROL command with "Command Streamer Stall Enable" must be
+	 *  programmed prior to programming a PIPECONTROL command with LRI
+	 *  Post Sync Operation in GPGPU mode of operation (i.e when
+	 *  PIPELINE_SELECT command is set to GPGPU mode of operation)."
+	 *
+	 *  Since the mode of operation is selected from userspace, we apply
+	 *  this workaround all the time one SKL.
+	 */
+	if (IS_SKYLAKE(dev_priv)) {
+		*cs++ = GFX_OP_PIPE_CONTROL(2);
+		*cs++ = PIPE_CONTROL_CS_STALL;
+	}
+
+	*cs++ = GFX_OP_PIPE_CONTROL(5);
+	*cs++ = PIPE_CONTROL_MMIO_WRITE | flags;
+	*cs++ = offset;
+	*cs++ = 0;
+	*cs++ = value;
+
+	return cs;
+}
+
 static int gen8_init_rcs_context(struct i915_request *rq)
 {
 	int ret;
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 010750e8ee44..aa643a1d69db 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -1042,6 +1042,11 @@  gen8_emit_ggtt_write(u32 *cs, u32 value, u32 gtt_offset)
 	return cs;
 }
 
+u32 gen8_lri_pipe_control_len(struct drm_i915_private *dev_priv);
+u32 *gen8_emit_lri_pipe_control(struct drm_i915_private *dev_priv,
+				u32 *cs, u32 flags, u32 offset,
+				u32 value);
+
 bool intel_engine_is_idle(struct intel_engine_cs *engine);
 bool intel_engines_are_idle(struct drm_i915_private *dev_priv);