[Intel-gfx] [PATCH] drm/i915/tgl: Adjust the location of RING_MI_MODE in the context image

Rodrigo Vivi rodrigo.vivi at intel.com
Sat Oct 26 14:46:17 UTC 2019


On Sat, Oct 26, 2019 at 07:17:36AM +0100, Chris Wilson wrote:
> The location of RING_MI_MODE (used to stop the ring across resets) moved
> for Tigerlake. Fixup the new location and include a selftest to verify
> the location in the default context image.
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/gt/intel_lrc.c    | 18 +++++--
>  drivers/gpu/drm/i915/gt/selftest_lrc.c | 73 ++++++++++++++++++++++++++
>  2 files changed, 88 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
> index 523de1fd4452..09a12d20987b 100644
> --- a/drivers/gpu/drm/i915/gt/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
> @@ -2935,14 +2935,26 @@ static void reset_csb_pointers(struct intel_engine_cs *engine)
>  			       &execlists->csb_status[reset_value]);
>  }
>  
> +static int lrc_ring_mi_mode(const struct intel_engine_cs *engine)
> +{
> +	if (INTEL_GEN(engine->i915) >= 12)
> +		return 0x60;
> +	else if (INTEL_GEN(engine->i915) >= 9)
> +		return 0x54;
> +	else
> +		return 0x58;
> +}

where are those defined on spec so I could help on review?

anyway, it seems we want now:

intel_lrc_reg.h
- #define GEN9_CTX_RING_MI_MODE           0x54

> +
>  static void __execlists_reset_reg_state(const struct intel_context *ce,
>  					const struct intel_engine_cs *engine)
>  {
>  	u32 *regs = ce->lrc_reg_state;
> +	int x;
>  
> -	if (INTEL_GEN(engine->i915) >= 9) {
> -		regs[GEN9_CTX_RING_MI_MODE + 1] &= ~STOP_RING;
> -		regs[GEN9_CTX_RING_MI_MODE + 1] |= STOP_RING << 16;
> +	x = lrc_ring_mi_mode(engine);
> +	if (x != -1) {
> +		regs[x + 1] &= ~STOP_RING;
> +		regs[x + 1] |= STOP_RING << 16;
>  	}
>  }
>  
> diff --git a/drivers/gpu/drm/i915/gt/selftest_lrc.c b/drivers/gpu/drm/i915/gt/selftest_lrc.c
> index d5d268be554e..46fa17e9ae0b 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_lrc.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_lrc.c
> @@ -3165,6 +3165,78 @@ static int live_lrc_layout(void *arg)
>  	return err;
>  }
>  
> +static int find_offset(const u32 *lri, u32 offset)
> +{
> +	int i;
> +
> +	for (i = 0; i < PAGE_SIZE / sizeof(u32); i++)
> +		if (lri[i] == offset)
> +			return i;
> +
> +	return -1;
> +}
> +
> +static int live_lrc_fixed(void *arg)
> +{
> +	struct intel_gt *gt = arg;
> +	struct intel_engine_cs *engine;
> +	enum intel_engine_id id;
> +	int err;
> +
> +	/*
> +	 * Check the assumed register offsets match the actual locations in
> +	 * the context image.
> +	 */
> +
> +	err = 0;
> +	for_each_engine(engine, gt, id) {
> +		const struct {
> +			u32 reg;
> +			u32 offset;
> +			const char *name;
> +		} tbl[] = {
> +			{
> +				i915_mmio_reg_offset(RING_MI_MODE(engine->mmio_base)),
> +				lrc_ring_mi_mode(engine),
> +				"RING_MI_MODE",
> +			},
> +			{ },
> +		}, *t;
> +		u32 *hw;
> +
> +		if (!engine->default_state)
> +			continue;
> +
> +		hw = i915_gem_object_pin_map(engine->default_state,
> +					     I915_MAP_WB);
> +		if (IS_ERR(hw)) {
> +			err = PTR_ERR(hw);
> +			break;
> +		}
> +		hw += LRC_STATE_PN * PAGE_SIZE / sizeof(*hw);
> +
> +		for (t = tbl; t->name; t++) {
> +			int dw = find_offset(hw, t->reg);
> +
> +			if (dw != t->offset) {
> +				pr_err("%s: Offset for %s [0x%x] mismatch, found %x, expected %x\n",
> +				       engine->name,
> +				       t->name,
> +				       t->reg,
> +				       dw,
> +				       t->offset);
> +				err = -EINVAL;
> +			}
> +		}
> +
> +		i915_gem_object_unpin_map(engine->default_state);
> +		if (err)
> +			break;
> +	}
> +
> +	return err;
> +}
> +
>  static int __live_lrc_state(struct i915_gem_context *fixme,
>  			    struct intel_engine_cs *engine,
>  			    struct i915_vma *scratch)
> @@ -3437,6 +3509,7 @@ int intel_lrc_live_selftests(struct drm_i915_private *i915)
>  {
>  	static const struct i915_subtest tests[] = {
>  		SUBTEST(live_lrc_layout),
> +		SUBTEST(live_lrc_fixed),
>  		SUBTEST(live_lrc_state),
>  		SUBTEST(live_gpr_clear),
>  	};
> -- 
> 2.24.0.rc1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx


More information about the Intel-gfx mailing list