[Intel-gfx] [PATCH v2 12/13] drm/i915/xehp: Add compute workarounds

Ceraolo Spurio, Daniele daniele.ceraolospurio at intel.com
Tue Mar 1 19:31:44 UTC 2022



On 2/28/2022 9:42 AM, Matt Roper wrote:
> Additional workarounds are required once we start exposing CCS engines.
>
> Note that we have a number of workarounds that update registers in the
> shared render/compute reset domain.  Historically we've just added such
> registers to the RCS engine's workaround list.  But going forward we
> should be more careful to place such workarounds on a wa_list for an
> engine that definitely exists and is not fused off (e.g., a platform
> with no RCS would never apply the RCS wa_list).  We'll keep
> rcs_engine_wa_init() focused on RCS-specific workarounds that only need
> to be applied if the RCS engine is present.  A separate
> general_render_compute_wa_init() function will be used to define
> workarounds that touch registers in the shared render/compute reset
> domain and that we need to apply regardless of what render and/or
> compute engines actually exist.  Any workarounds defined in this new
> function will internally be added to the first present RCS or CCS
> engine's workaround list to ensure they get applied (and only get
> applied once rather than being needlessly re-applied several times).
>
> Co-author: Srinivasan Shanmugam
> Signed-off-by: Matt Roper <matthew.d.roper at intel.com>
> ---
>   drivers/gpu/drm/i915/gt/intel_gt_regs.h     |  1 +
>   drivers/gpu/drm/i915/gt/intel_lrc.c         |  6 +++
>   drivers/gpu/drm/i915/gt/intel_workarounds.c | 47 +++++++++++++++++++++
>   3 files changed, 54 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_gt_regs.h b/drivers/gpu/drm/i915/gt/intel_gt_regs.h
> index e629443e07ae..19cd34f24263 100644
> --- a/drivers/gpu/drm/i915/gt/intel_gt_regs.h
> +++ b/drivers/gpu/drm/i915/gt/intel_gt_regs.h
> @@ -1060,6 +1060,7 @@
>   #define   FLOW_CONTROL_ENABLE			REG_BIT(15)
>   #define   UGM_BACKUP_MODE			REG_BIT(13)
>   #define   MDQ_ARBITRATION_MODE			REG_BIT(12)
> +#define   SYSTOLIC_DOP_CLOCK_GATING_DIS		REG_BIT(10)
>   #define   PARTIAL_INSTRUCTION_SHOOTDOWN_DISABLE	REG_BIT(8)
>   #define   STALL_DOP_GATING_DISABLE		REG_BIT(5)
>   #define   THROTTLE_12_5				REG_GENMASK(4, 2)
> diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
> index d333400d29fe..e9ea576b96a4 100644
> --- a/drivers/gpu/drm/i915/gt/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
> @@ -1217,6 +1217,12 @@ gen12_emit_indirect_ctx_xcs(const struct intel_context *ce, u32 *cs)
>   	cs = gen12_emit_timestamp_wa(ce, cs);
>   	cs = gen12_emit_restore_scratch(ce, cs);
>   
> +	/* Wa_16013000631:dg2 */
> +	if (IS_DG2_GRAPHICS_STEP(ce->engine->i915, G10, STEP_B0, STEP_C0) ||
> +	    IS_DG2_G11(ce->engine->i915))
> +		if (ce->engine->class == COMPUTE_CLASS)
> +			cs = gen8_emit_pipe_control(cs, PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE, 0);
> +
>   	return cs;
>   }
>   
> diff --git a/drivers/gpu/drm/i915/gt/intel_workarounds.c b/drivers/gpu/drm/i915/gt/intel_workarounds.c
> index 0471d475e680..0b9435d62808 100644
> --- a/drivers/gpu/drm/i915/gt/intel_workarounds.c
> +++ b/drivers/gpu/drm/i915/gt/intel_workarounds.c
> @@ -1921,6 +1921,11 @@ static void dg2_whitelist_build(struct intel_engine_cs *engine)
>   					  RING_FORCE_TO_NONPRIV_RANGE_4);
>   
>   		break;
> +	case COMPUTE_CLASS:
> +		/* Wa_16011157294:dg2_g10 */
> +		if (IS_DG2_GRAPHICS_STEP(engine->i915, G10, STEP_A0, STEP_B0))
> +			whitelist_reg(w, GEN9_CTX_PREEMPT_REG);
> +		break;
>   	default:
>   		break;
>   	}
> @@ -2581,6 +2586,40 @@ xcs_engine_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
>   	}
>   }
>   
> +/*
> + * The workarounds in this function apply to shared registers in
> + * the general render reset domain that aren't tied to a
> + * specific engine.  Since all render+compute engines get reset
> + * together, and the contents of these registers are lost during
> + * the shared render domain reset, we'll define such workarounds
> + * here and then add them to just a single RCS or CCS engine's
> + * workaround list (whichever engine has the XXXX flag).
> + */
> +static void
> +general_render_compute_wa_init(struct intel_engine_cs *engine, struct i915_wa_list *wal)
> +{
> +	struct drm_i915_private *i915 = engine->i915;
> +
> +	if (IS_XEHPSDV(i915)) {
> +		/* Wa_1409954639 */
> +		wa_masked_en(wal,
> +			     GEN8_ROW_CHICKEN,
> +			     SYSTOLIC_DOP_CLOCK_GATING_DIS);
> +
> +		/* Wa_1607196519 */
> +		wa_masked_en(wal,
> +			     GEN9_ROW_CHICKEN4,
> +			     GEN12_DISABLE_GRF_CLEAR);
> +
> +		/* Wa_14010670810:xehpsdv */
> +		wa_write_or(wal, XEHP_L3NODEARBCFG, XEHP_LNESPARE);

These 2 WAs are also implemented for DG2 (with different IDs). Are you 
planning to move them over to this function as a follow up?
All the WA implementations match the specs, so as long as there is a 
plan for DG2 this is:

Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>

Daniele


> +
> +		/* Wa_14010449647:xehpsdv */
> +		wa_masked_en(wal, GEN7_HALF_SLICE_CHICKEN1,
> +			     GEN7_PSD_SINGLE_PORT_DISPATCH_ENABLE);
> +	}
> +}
> +
>   static void
>   engine_init_workarounds(struct intel_engine_cs *engine, struct i915_wa_list *wal)
>   {
> @@ -2589,6 +2628,14 @@ engine_init_workarounds(struct intel_engine_cs *engine, struct i915_wa_list *wal
>   
>   	engine_fake_wa_init(engine, wal);
>   
> +	/*
> +	 * These are common workarounds that just need to applied
> +	 * to a single RCS/CCS engine's workaround list since
> +	 * they're reset as part of the general render domain reset.
> +	 */
> +	if (engine->class == RENDER_CLASS)
> +		general_render_compute_wa_init(engine, wal);
> +
>   	if (engine->class == RENDER_CLASS)
>   		rcs_engine_wa_init(engine, wal);
>   	else



More information about the dri-devel mailing list