[Intel-gfx] [PATCH 4/4] drm/i915: Rewrite CL/CTG L-shaped memory detection

Daniel Vetter daniel at ffwll.ch
Thu Apr 22 09:49:43 UTC 2021


On Wed, Apr 21, 2021 at 06:34:01PM +0300, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> Currently we try to detect a symmetric memory configurations
> using a magic DCC2_MODIFIED_ENHANCED_DISABLE bit. That bit is
> either only set on a very specific subset of machines or it
> just does not exist (it's not mentioned in any public chipset
> datasheets I've found). As it happens my CL/CTG machines never
> set said bit, even if I populate the channels with identical
> sticks.
> 
> So let's do the L-shaped memory detection the same way as the
> desktop variants, ie. just look at the DRAM rank boundary
> registers to see if both channels have an identical size.
> 
> With this my CL/CTG no longer claim L-shaped memory when I use
> identical sticks. Also tested with non-matching sticks just to
> make sure the L-shaped memory is still properly detected.
> 
> And for completeness let's update the debugfs code to dump
> the correct set of registers on each platform.
> 
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

Did you check this with the swapping igt? I have some vague memories of
bug reports where somehow the machine was acting like it's L-shaped memory
despite that banks were populated equally. I've iirc tried all kinds of
tricks to figure it out, all to absolutely no avail.

tbh I'd just not touch this, not really worth it.
-Daniel
> ---
>  drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c | 15 ++++++++-------
>  drivers/gpu/drm/i915/i915_debugfs.c          | 16 ++++++++++++----
>  drivers/gpu/drm/i915/i915_reg.h              |  4 ++++
>  3 files changed, 24 insertions(+), 11 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c b/drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c
> index 0fa6c38893f7..754f20768de5 100644
> --- a/drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c
> +++ b/drivers/gpu/drm/i915/gt/intel_ggtt_fencing.c
> @@ -693,14 +693,15 @@ static void detect_bit_6_swizzle(struct i915_ggtt *ggtt)
>  				swizzle_x = I915_BIT_6_SWIZZLE_9_10_17;
>  				swizzle_y = I915_BIT_6_SWIZZLE_9_17;
>  			}
> -			break;
> -		}
>  
> -		/* check for L-shaped memory aka modified enhanced addressing */
> -		if (IS_GEN(i915, 4) &&
> -		    !(intel_uncore_read(uncore, DCC2) & DCC2_MODIFIED_ENHANCED_DISABLE)) {
> -			swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN;
> -			swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN;
> +			/* check for L-shaped memory aka modified enhanced addressing */
> +			if (IS_GEN(i915, 4) &&
> +			    intel_uncore_read16(uncore, C0DRB3_CL) !=
> +			    intel_uncore_read16(uncore, C1DRB3_CL)) {
> +				swizzle_x = I915_BIT_6_SWIZZLE_UNKNOWN;
> +				swizzle_y = I915_BIT_6_SWIZZLE_UNKNOWN;
> +			}
> +			break;
>  		}
>  
>  		if (dcc == 0xffffffff) {
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> index 8dd374691102..6de11ffcde38 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -621,10 +621,18 @@ static int i915_swizzle_info(struct seq_file *m, void *data)
>  			   intel_uncore_read(uncore, DCC));
>  		seq_printf(m, "DDC2 = 0x%08x\n",
>  			   intel_uncore_read(uncore, DCC2));
> -		seq_printf(m, "C0DRB3 = 0x%04x\n",
> -			   intel_uncore_read16(uncore, C0DRB3_BW));
> -		seq_printf(m, "C1DRB3 = 0x%04x\n",
> -			   intel_uncore_read16(uncore, C1DRB3_BW));
> +
> +		if (IS_G45(dev_priv) || IS_I965G(dev_priv) || IS_G33(dev_priv)) {
> +			seq_printf(m, "C0DRB3 = 0x%04x\n",
> +				   intel_uncore_read16(uncore, C0DRB3_BW));
> +			seq_printf(m, "C1DRB3 = 0x%04x\n",
> +				   intel_uncore_read16(uncore, C1DRB3_BW));
> +		} else if (IS_GEN(dev_priv, 4)) {
> +			seq_printf(m, "C0DRB3 = 0x%04x\n",
> +				   intel_uncore_read16(uncore, C0DRB3_CL));
> +			seq_printf(m, "C1DRB3 = 0x%04x\n",
> +				   intel_uncore_read16(uncore, C1DRB3_CL));
> +		}
>  	} else if (INTEL_GEN(dev_priv) >= 6) {
>  		seq_printf(m, "MAD_DIMM_C0 = 0x%08x\n",
>  			   intel_uncore_read(uncore, MAD_DIMM_C0));
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 0587b2455ea1..055c258179a1 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -3790,6 +3790,10 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
>  #define C0DRB3_BW		_MMIO(MCHBAR_MIRROR_BASE + 0x206)
>  #define C1DRB3_BW		_MMIO(MCHBAR_MIRROR_BASE + 0x606)
>  
> +/* 965gm,ctg DRAM channel configuration */
> +#define C0DRB3_CL		_MMIO(MCHBAR_MIRROR_BASE + 0x1206)
> +#define C1DRB3_CL		_MMIO(MCHBAR_MIRROR_BASE + 0x1306)
> +
>  /* snb MCH registers for reading the DRAM channel configuration */
>  #define MAD_DIMM_C0			_MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5004)
>  #define MAD_DIMM_C1			_MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5008)
> -- 
> 2.26.3
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list