[PATCH v2 2/6] drm/i915/gt: Move CCS workaround to the correct section

Lucas De Marchi lucas.demarchi at intel.com
Wed Apr 23 14:06:32 UTC 2025


On Thu, Mar 27, 2025 at 12:40:01AM +0100, Andi Shyti wrote:
>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 at intel.com>
>Signed-off-by: Andi Shyti <andi.shyti at linux.intel.com>

I'm not sure about this one. I think it was done like this because
the register exists on render and has no side effect setting it there.

>---
> drivers/gpu/drm/i915/gt/intel_workarounds.c | 58 +++++++++++----------
> 1 file changed, 30 insertions(+), 28 deletions(-)
>
>diff --git a/drivers/gpu/drm/i915/gt/intel_workarounds.c b/drivers/gpu/drm/i915/gt/intel_workarounds.c
>index 116683ebe074..bedd88a15959 100644
>--- a/drivers/gpu/drm/i915/gt/intel_workarounds.c
>+++ b/drivers/gpu/drm/i915/gt/intel_workarounds.c
>@@ -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))

the problem you'd face is that if you fix this macro to also include
render, then you break it here.

Lucas De Marchi

>+		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);
>-- 
>2.47.2
>


More information about the dri-devel mailing list