Skip to content

Commit d922b80

Browse files
tejasupAndi Shyti
authored andcommitted
drm/i915/gt: Add workaround 14016712196
For mtl, workaround suggests that, SW insert a dummy PIPE_CONTROL prior to PIPE_CONTROL which contains a post sync: Timestamp or Write Immediate. Bspec: 72197 V5: - Remove ret variable - Andi V4: - Update commit message, avoid returing cs - Andi/Matt V3: - Wrap dummy pipe control stuff in API - Andi V2: - Fix kernel test robot warnings Closes: https://lore.kernel.org/oe-kbuild-all/202305121525.3EWdGoBY-lkp@intel.com/ Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com> Reviewed-by: Andi Shyti <andi.shyti@linux.intel.com> Reviewed-by: Andrzej Hajda <andrzej.hajda@intel.com> Signed-off-by: Andi Shyti <andi.shyti@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20230601110959.1715927-1-tejas.upadhyay@intel.com
1 parent 5c31543 commit d922b80

1 file changed

Lines changed: 38 additions & 0 deletions

File tree

drivers/gpu/drm/i915/gt/gen8_engine_cs.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,14 +177,40 @@ u32 *gen12_emit_aux_table_inv(struct intel_gt *gt, u32 *cs, const i915_reg_t inv
177177
return cs;
178178
}
179179

180+
static int mtl_dummy_pipe_control(struct i915_request *rq)
181+
{
182+
/* Wa_14016712196 */
183+
if (IS_MTL_GRAPHICS_STEP(rq->engine->i915, M, STEP_A0, STEP_B0) ||
184+
IS_MTL_GRAPHICS_STEP(rq->engine->i915, P, STEP_A0, STEP_B0)) {
185+
u32 *cs;
186+
187+
/* dummy PIPE_CONTROL + depth flush */
188+
cs = intel_ring_begin(rq, 6);
189+
if (IS_ERR(cs))
190+
return PTR_ERR(cs);
191+
cs = gen12_emit_pipe_control(cs,
192+
0,
193+
PIPE_CONTROL_DEPTH_CACHE_FLUSH,
194+
LRC_PPHWSP_SCRATCH_ADDR);
195+
intel_ring_advance(rq, cs);
196+
}
197+
198+
return 0;
199+
}
200+
180201
int gen12_emit_flush_rcs(struct i915_request *rq, u32 mode)
181202
{
182203
struct intel_engine_cs *engine = rq->engine;
183204

184205
if (mode & EMIT_FLUSH) {
185206
u32 flags = 0;
207+
int err;
186208
u32 *cs;
187209

210+
err = mtl_dummy_pipe_control(rq);
211+
if (err)
212+
return err;
213+
188214
flags |= PIPE_CONTROL_TILE_CACHE_FLUSH;
189215
flags |= PIPE_CONTROL_FLUSH_L3;
190216
flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
@@ -217,6 +243,11 @@ int gen12_emit_flush_rcs(struct i915_request *rq, u32 mode)
217243
if (mode & EMIT_INVALIDATE) {
218244
u32 flags = 0;
219245
u32 *cs, count;
246+
int err;
247+
248+
err = mtl_dummy_pipe_control(rq);
249+
if (err)
250+
return err;
220251

221252
flags |= PIPE_CONTROL_COMMAND_CACHE_INVALIDATE;
222253
flags |= PIPE_CONTROL_TLB_INVALIDATE;
@@ -733,6 +764,13 @@ u32 *gen12_emit_fini_breadcrumb_rcs(struct i915_request *rq, u32 *cs)
733764
PIPE_CONTROL_DC_FLUSH_ENABLE |
734765
PIPE_CONTROL_FLUSH_ENABLE);
735766

767+
/* Wa_14016712196 */
768+
if (IS_MTL_GRAPHICS_STEP(i915, M, STEP_A0, STEP_B0) ||
769+
IS_MTL_GRAPHICS_STEP(i915, P, STEP_A0, STEP_B0))
770+
/* dummy PIPE_CONTROL + depth flush */
771+
cs = gen12_emit_pipe_control(cs, 0,
772+
PIPE_CONTROL_DEPTH_CACHE_FLUSH, 0);
773+
736774
if (GRAPHICS_VER(i915) == 12 && GRAPHICS_VER_FULL(i915) < IP_VER(12, 50))
737775
/* Wa_1409600907 */
738776
flags |= PIPE_CONTROL_DEPTH_STALL;

0 commit comments

Comments
 (0)