@@ -165,21 +165,47 @@ static u32 preparser_disable(bool state)
165
165
return MI_ARB_CHECK | 1 << 8 | state ;
166
166
}
167
167
168
+ static i915_reg_t gen12_get_aux_inv_reg (struct intel_engine_cs * engine )
169
+ {
170
+ switch (engine -> id ) {
171
+ case RCS0 :
172
+ return GEN12_CCS_AUX_INV ;
173
+ case BCS0 :
174
+ return GEN12_BCS0_AUX_INV ;
175
+ case VCS0 :
176
+ return GEN12_VD0_AUX_INV ;
177
+ case VCS2 :
178
+ return GEN12_VD2_AUX_INV ;
179
+ case VECS0 :
180
+ return GEN12_VE0_AUX_INV ;
181
+ case CCS0 :
182
+ return GEN12_CCS0_AUX_INV ;
183
+ default :
184
+ return INVALID_MMIO_REG ;
185
+ }
186
+ }
187
+
168
188
static bool gen12_needs_ccs_aux_inv (struct intel_engine_cs * engine )
169
189
{
190
+ i915_reg_t reg = gen12_get_aux_inv_reg (engine );
191
+
170
192
if (IS_PONTEVECCHIO (engine -> i915 ))
171
193
return false;
172
194
173
195
/*
174
- * so far platforms supported by i915 having
175
- * flat ccs do not require AUX invalidation
196
+ * So far platforms supported by i915 having flat ccs do not require
197
+ * AUX invalidation. Check also whether the engine requires it.
176
198
*/
177
- return !HAS_FLAT_CCS (engine -> i915 );
199
+ return i915_mmio_reg_valid ( reg ) && !HAS_FLAT_CCS (engine -> i915 );
178
200
}
179
201
180
- u32 * gen12_emit_aux_table_inv (struct intel_gt * gt , u32 * cs , const i915_reg_t inv_reg )
202
+ u32 * gen12_emit_aux_table_inv (struct intel_engine_cs * engine , u32 * cs )
181
203
{
182
- u32 gsi_offset = gt -> uncore -> gsi_offset ;
204
+ i915_reg_t inv_reg = gen12_get_aux_inv_reg (engine );
205
+ u32 gsi_offset = engine -> gt -> uncore -> gsi_offset ;
206
+
207
+ if (!gen12_needs_ccs_aux_inv (engine ))
208
+ return cs ;
183
209
184
210
* cs ++ = MI_LOAD_REGISTER_IMM (1 ) | MI_LRI_MMIO_REMAP_EN ;
185
211
* cs ++ = i915_mmio_reg_offset (inv_reg ) + gsi_offset ;
@@ -317,11 +343,7 @@ int gen12_emit_flush_rcs(struct i915_request *rq, u32 mode)
317
343
318
344
cs = gen8_emit_pipe_control (cs , flags , LRC_PPHWSP_SCRATCH_ADDR );
319
345
320
- if (gen12_needs_ccs_aux_inv (rq -> engine )) {
321
- /* hsdes: 1809175790 */
322
- cs = gen12_emit_aux_table_inv (rq -> engine -> gt , cs ,
323
- GEN12_CCS_AUX_INV );
324
- }
346
+ cs = gen12_emit_aux_table_inv (engine , cs );
325
347
326
348
* cs ++ = preparser_disable (false);
327
349
intel_ring_advance (rq , cs );
@@ -332,21 +354,14 @@ int gen12_emit_flush_rcs(struct i915_request *rq, u32 mode)
332
354
333
355
int gen12_emit_flush_xcs (struct i915_request * rq , u32 mode )
334
356
{
335
- intel_engine_mask_t aux_inv = 0 ;
336
- u32 cmd , * cs ;
357
+ u32 cmd = 4 ;
358
+ u32 * cs ;
337
359
338
- cmd = 4 ;
339
360
if (mode & EMIT_INVALIDATE ) {
340
361
cmd += 2 ;
341
362
342
- if (gen12_needs_ccs_aux_inv (rq -> engine ) &&
343
- (rq -> engine -> class == VIDEO_DECODE_CLASS ||
344
- rq -> engine -> class == VIDEO_ENHANCEMENT_CLASS )) {
345
- aux_inv = rq -> engine -> mask &
346
- ~GENMASK (_BCS (I915_MAX_BCS - 1 ), BCS0 );
347
- if (aux_inv )
348
- cmd += 8 ;
349
- }
363
+ if (gen12_needs_ccs_aux_inv (rq -> engine ))
364
+ cmd += 8 ;
350
365
}
351
366
352
367
cs = intel_ring_begin (rq , cmd );
@@ -381,14 +396,7 @@ int gen12_emit_flush_xcs(struct i915_request *rq, u32 mode)
381
396
* cs ++ = 0 ; /* upper addr */
382
397
* cs ++ = 0 ; /* value */
383
398
384
- if (aux_inv ) { /* hsdes: 1809175790 */
385
- if (rq -> engine -> class == VIDEO_DECODE_CLASS )
386
- cs = gen12_emit_aux_table_inv (rq -> engine -> gt ,
387
- cs , GEN12_VD0_AUX_INV );
388
- else
389
- cs = gen12_emit_aux_table_inv (rq -> engine -> gt ,
390
- cs , GEN12_VE0_AUX_INV );
391
- }
399
+ cs = gen12_emit_aux_table_inv (rq -> engine , cs );
392
400
393
401
if (mode & EMIT_INVALIDATE )
394
402
* cs ++ = preparser_disable (false);
0 commit comments