@@ -2699,10 +2699,38 @@ xcs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
XEHP_BLITTER_ROUND_ROBIN_MODE);
}
+static void ccs_engine_wa_mode(struct intel_engine_cs *engine, struct i915_wa_list *wal)
+{
+ struct intel_gt *gt = engine->gt;
+ u32 mode;
+
+ /*
+ * This workaround should be applied only once across all
+ * CCS engines. Apply it to the first CCS encountered.
+ */
+ if (!FIRST_CCS(engine))
+ return;
+
+ /*
+ * Wa_14019159160: This workaround, along with others, leads to
+ * significant challenges in utilizing load balancing among the
+ * CCS slices. Consequently, an architectural decision has been
+ * made to completely disable automatic CCS load balancing.
+ */
+ wa_masked_en(wal, GEN12_RCU_MODE, XEHP_RCU_MODE_FIXED_SLICE_CCS_MODE);
+
+ /*
+ * After having disabled automatic load balancing we need to
+ * assign all slices to a single CCS. We will call it CCS mode 1
+ */
+ mode = intel_gt_apply_ccs_mode(gt);
+ wa_masked_en(wal, XEHP_CCS_MODE, mode);
+}
+
static void
ccs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
{
- /* boilerplate for any CCS engine workaround */
+ ccs_engine_wa_mode(engine, wal);
}
/*
@@ -2739,30 +2767,6 @@ add_render_compute_tuning_settings(struct intel_gt *gt,
wa_write_clr(wal, GEN8_GARBCNTL, GEN12_BUS_HASH_CTL_BIT_EXC);
}
-static void ccs_engine_wa_mode(struct intel_engine_cs *engine, struct i915_wa_list *wal)
-{
- struct intel_gt *gt = engine->gt;
- u32 mode;
-
- if (!IS_DG2(gt->i915))
- return;
-
- /*
- * Wa_14019159160: This workaround, along with others, leads to
- * significant challenges in utilizing load balancing among the
- * CCS slices. Consequently, an architectural decision has been
- * made to completely disable automatic CCS load balancing.
- */
- wa_masked_en(wal, GEN12_RCU_MODE, XEHP_RCU_MODE_FIXED_SLICE_CCS_MODE);
-
- /*
- * After having disabled automatic load balancing we need to
- * assign all slices to a single CCS. We will call it CCS mode 1
- */
- mode = intel_gt_apply_ccs_mode(gt);
- wa_masked_en(wal, XEHP_CCS_MODE, mode);
-}
-
/*
* The workarounds in this function apply to shared registers in
* the general render reset domain that aren't tied to a
@@ -2895,10 +2899,8 @@ engine_init_workarounds(struct intel_engine_cs *engine, struct i915_wa_list *wal
* to a single RCS/CCS engine's workaround list since
* they're reset as part of the general render domain reset.
*/
- if (engine->flags & I915_ENGINE_FIRST_RENDER_COMPUTE) {
+ if (engine->flags & I915_ENGINE_FIRST_RENDER_COMPUTE)
general_render_compute_wa_init(engine, wal);
- ccs_engine_wa_mode(engine, wal);
- }
if (engine->class == COMPUTE_CLASS)
ccs_engine_wa_init(engine, wal);
The CCS engine workaround was previously added in a section shared by both RCS and CCS engines. Move it to the proper CCS-specific section so that it's applied only once, avoiding unintended duplication caused by the first CCS/RCS detection check. To do this, the ccs_mode() function had to be moved earlier in the file to avoid the need for a forward declaration. Suggested-by: Arshad Mehmood <arshad.mehmood@intel.com> Signed-off-by: Andi Shyti <andi.shyti@linux.intel.com> --- drivers/gpu/drm/i915/gt/intel_workarounds.c | 58 +++++++++++---------- 1 file changed, 30 insertions(+), 28 deletions(-)