@@ -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;
@@ -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);
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(+)