|
@@ -1328,6 +1328,40 @@ static u32 *gen9_init_indirectctx_bb(struct intel_engine_cs *engine, u32 *batch)
|
|
|
return batch;
|
|
|
}
|
|
|
|
|
|
+static u32 *
|
|
|
+gen10_init_indirectctx_bb(struct intel_engine_cs *engine, u32 *batch)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * WaPipeControlBefore3DStateSamplePattern: cnl
|
|
|
+ *
|
|
|
+ * Ensure the engine is idle prior to programming a
|
|
|
+ * 3DSTATE_SAMPLE_PATTERN during a context restore.
|
|
|
+ */
|
|
|
+ batch = gen8_emit_pipe_control(batch,
|
|
|
+ PIPE_CONTROL_CS_STALL,
|
|
|
+ 0);
|
|
|
+ /*
|
|
|
+ * WaPipeControlBefore3DStateSamplePattern says we need 4 dwords for
|
|
|
+ * the PIPE_CONTROL followed by 12 dwords of 0x0, so 16 dwords in
|
|
|
+ * total. However, a PIPE_CONTROL is 6 dwords long, not 4, which is
|
|
|
+ * confusing. Since gen8_emit_pipe_control() already advances the
|
|
|
+ * batch by 6 dwords, we advance the other 10 here, completing a
|
|
|
+ * cacheline. It's not clear if the workaround requires this padding
|
|
|
+ * before other commands, or if it's just the regular padding we would
|
|
|
+ * already have for the workaround bb, so leave it here for now.
|
|
|
+ */
|
|
|
+ for (i = 0; i < 10; i++)
|
|
|
+ *batch++ = MI_NOOP;
|
|
|
+
|
|
|
+ /* Pad to end of cacheline */
|
|
|
+ while ((unsigned long)batch % CACHELINE_BYTES)
|
|
|
+ *batch++ = MI_NOOP;
|
|
|
+
|
|
|
+ return batch;
|
|
|
+}
|
|
|
+
|
|
|
#define CTX_WA_BB_OBJ_SIZE (PAGE_SIZE)
|
|
|
|
|
|
static int lrc_setup_wa_ctx(struct intel_engine_cs *engine)
|
|
@@ -1381,7 +1415,9 @@ static int intel_init_workaround_bb(struct intel_engine_cs *engine)
|
|
|
|
|
|
switch (INTEL_GEN(engine->i915)) {
|
|
|
case 10:
|
|
|
- return 0;
|
|
|
+ wa_bb_fn[0] = gen10_init_indirectctx_bb;
|
|
|
+ wa_bb_fn[1] = NULL;
|
|
|
+ break;
|
|
|
case 9:
|
|
|
wa_bb_fn[0] = gen9_init_indirectctx_bb;
|
|
|
wa_bb_fn[1] = NULL;
|