All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jani Nikula <jani.nikula@linux.intel.com>
To: "Ville Syrjälä" <ville.syrjala@linux.intel.com>,
	"Lucas De Marchi" <lucas.demarchi@intel.com>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 3/3] drm/i915/dram: Fix ICL DIMM_S decoding
Date: Wed, 19 Nov 2025 10:05:57 +0200	[thread overview]
Message-ID: <f1180282dbadaaab11c8d9426acdcc7bed2179d1@intel.com> (raw)
In-Reply-To: <aQ32K_njWN_lEZ4-@intel.com>

On Fri, 07 Nov 2025, Ville Syrjälä <ville.syrjala@linux.intel.com> wrote:
> On Wed, Nov 05, 2025 at 04:25:49PM -0600, Lucas De Marchi wrote:
>> On Wed, Oct 29, 2025 at 10:42:15PM +0200, Ville Syrjälä wrote:
>> >From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>> >
>> >Unfortunately the MAD_DIMM DIMM_S and DIMM_L bits on ICL are
>> >not idential, so we are currently decoding DIMM_S incorrectly.
>> >
>> >Fix the problem by defining the DIMM_S and DIMM_L bits separately.
>> >And for consistency do that same for SKL, even though there the
>> >bits do match between the two DIMMs. The result is rather
>> >repetitive in places, but I didn't feel like obfuscatign things
>> >with cpp macros/etc.
>> >
>> >Broken decoding on Dell XPS 13 7390 2-in-1:
>> > CH0 DIMM L size: 32 Gb, width: X16, ranks: 2, 16Gb+ DIMMs: no
>> > CH0 DIMM S size: 32 Gb, width: X32, ranks: 3, 16Gb+ DIMMs: no
>> > CH0 ranks: 2, 16Gb+ DIMMs: no
>> > CH1 DIMM L size: 32 Gb, width: X16, ranks: 2, 16Gb+ DIMMs: no
>> > CH1 DIMM S size: 32 Gb, width: X32, ranks: 3, 16Gb+ DIMMs: no
>> > CH1 ranks: 2, 16Gb+ DIMMs: no
>> > Memory configuration is symmetric? no
>> >
>> >Fixed decoding on Dell XPS 13 7390 2-in-1:
>> > CH0 DIMM L size: 32 Gb, width: X16, ranks: 2, 16Gb+ DIMMs: no
>> > CH0 DIMM S size: 32 Gb, width: X16, ranks: 2, 16Gb+ DIMMs: no
>> > CH0 ranks: 2, 16Gb+ DIMMs: no
>> > CH1 DIMM L size: 32 Gb, width: X16, ranks: 2, 16Gb+ DIMMs: no
>> > CH1 DIMM S size: 32 Gb, width: X16, ranks: 2, 16Gb+ DIMMs: no
>> > CH1 ranks: 2, 16Gb+ DIMMs: no
>> > Memory configuration is symmetric? yes
>> >
>> >Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
>> >---
>> > drivers/gpu/drm/i915/intel_mchbar_regs.h |  53 +++++---
>> > drivers/gpu/drm/i915/soc/intel_dram.c    | 166 +++++++++++++++++------
>> > 2 files changed, 155 insertions(+), 64 deletions(-)
>> >
>> >diff --git a/drivers/gpu/drm/i915/intel_mchbar_regs.h b/drivers/gpu/drm/i915/intel_mchbar_regs.h
>> >index a46a45b9d2e1..614d4017b57b 100644
>> >--- a/drivers/gpu/drm/i915/intel_mchbar_regs.h
>> >+++ b/drivers/gpu/drm/i915/intel_mchbar_regs.h
>> >@@ -160,25 +160,40 @@
>> >
>> > #define SKL_MAD_DIMM_CH0_0_0_0_MCHBAR_MCMAIN	_MMIO(MCHBAR_MIRROR_BASE_SNB + 0x500C)
>> > #define SKL_MAD_DIMM_CH1_0_0_0_MCHBAR_MCMAIN	_MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5010)
>> >-#define   SKL_DRAM_S_SHIFT			16
>> >-#define   SKL_DRAM_RANK_MASK			REG_GENMASK(10, 10)
>> >-#define   SKL_DRAM_RANK_1			REG_FIELD_PREP(SKL_DRAM_RANK_MASK, 0)
>> >-#define   SKL_DRAM_RANK_2			REG_FIELD_PREP(SKL_DRAM_RANK_MASK, 1)
>> >-#define   SKL_DRAM_WIDTH_MASK			REG_GENMASK(9, 8)
>> >-#define   SKL_DRAM_WIDTH_X8			REG_FIELD_PREP(SKL_DRAM_WIDTH_MASK, 0)
>> >-#define   SKL_DRAM_WIDTH_X16			REG_FIELD_PREP(SKL_DRAM_WIDTH_MASK, 1)
>> >-#define   SKL_DRAM_WIDTH_X32			REG_FIELD_PREP(SKL_DRAM_WIDTH_MASK, 2)
>> >-#define   SKL_DRAM_SIZE_MASK			REG_GENMASK(5, 0)
>> >-#define   ICL_DRAM_RANK_MASK			REG_GENMASK(10, 9)
>> >-#define   ICL_DRAM_RANK_1			REG_FIELD_PREP(ICL_DRAM_RANK_MASK, 0)
>> >-#define   ICL_DRAM_RANK_2			REG_FIELD_PREP(ICL_DRAM_RANK_MASK, 1)
>> >-#define   ICL_DRAM_RANK_3			REG_FIELD_PREP(ICL_DRAM_RANK_MASK, 2)
>> >-#define   ICL_DRAM_RANK_4			REG_FIELD_PREP(ICL_DRAM_RANK_MASK, 3)
>> >-#define   ICL_DRAM_WIDTH_MASK			REG_GENMASK(8, 7)
>> >-#define   ICL_DRAM_WIDTH_X8			REG_FIELD_PREP(ICL_DRAM_WIDTH_MASK, 0)
>> >-#define   ICL_DRAM_WIDTH_X16			REG_FIELD_PREP(ICL_DRAM_WIDTH_MASK, 1)
>> >-#define   ICL_DRAM_WIDTH_X32			REG_FIELD_PREP(ICL_DRAM_WIDTH_MASK, 2)
>> >-#define   ICL_DRAM_SIZE_MASK			REG_GENMASK(6, 0)
>> >+#define   SKL_DIMM_S_RANK_MASK			REG_GENMASK(26, 26)
>> >+#define   SKL_DIMM_S_RANK_1			REG_FIELD_PREP(SKL_DIMM_S_RANK_MASK, 0)
>> >+#define   SKL_DIMM_S_RANK_2			REG_FIELD_PREP(SKL_DIMM_S_RANK_MASK, 1)
>> >+#define   SKL_DIMM_S_WIDTH_MASK			REG_GENMASK(25, 24)
>> >+#define   SKL_DIMM_S_WIDTH_X8			REG_FIELD_PREP(SKL_DIMM_S_WIDTH_MASK, 0)
>> >+#define   SKL_DIMM_S_WIDTH_X16			REG_FIELD_PREP(SKL_DIMM_S_WIDTH_MASK, 1)
>> >+#define   SKL_DIMM_S_WIDTH_X32			REG_FIELD_PREP(SKL_DIMM_S_WIDTH_MASK, 2)
>> >+#define   SKL_DIMM_S_SIZE_MASK			REG_GENMASK(21, 16)
>> >+#define   SKL_DIMM_L_RANK_MASK			REG_GENMASK(10, 10)
>> >+#define   SKL_DIMM_L_RANK_1			REG_FIELD_PREP(SKL_DIMM_L_RANK_MASK, 0)
>> >+#define   SKL_DIMM_L_RANK_2			REG_FIELD_PREP(SKL_DIMM_L_RANK_MASK, 1)
>> >+#define   SKL_DIMM_L_WIDTH_MASK			REG_GENMASK(9, 8)
>> >+#define   SKL_DIMM_L_WIDTH_X8			REG_FIELD_PREP(SKL_DIMM_L_WIDTH_MASK, 0)
>> >+#define   SKL_DIMM_L_WIDTH_X16			REG_FIELD_PREP(SKL_DIMM_L_WIDTH_MASK, 1)
>> >+#define   SKL_DIMM_L_WIDTH_X32			REG_FIELD_PREP(SKL_DIMM_L_WIDTH_MASK, 2)
>> >+#define   SKL_DIMM_L_SIZE_MASK			REG_GENMASK(5, 0)
>> >+#define   ICL_DIMM_S_RANK_MASK			REG_GENMASK(27, 26)
>> >+#define   ICL_DIMM_S_RANK_1			REG_FIELD_PREP(ICL_DIMM_S_RANK_MASK, 0)
>> >+#define   ICL_DIMM_S_RANK_2			REG_FIELD_PREP(ICL_DIMM_S_RANK_MASK, 1)
>> >+#define   ICL_DIMM_S_WIDTH_MASK			REG_GENMASK(25, 24)
>> >+#define   ICL_DIMM_S_WIDTH_X8			REG_FIELD_PREP(ICL_DIMM_S_WIDTH_MASK, 0)
>> >+#define   ICL_DIMM_S_WIDTH_X16			REG_FIELD_PREP(ICL_DIMM_S_WIDTH_MASK, 1)
>> >+#define   ICL_DIMM_S_WIDTH_X32			REG_FIELD_PREP(ICL_DIMM_S_WIDTH_MASK, 2)
>> >+#define   ICL_DIMM_S_SIZE_MASK			REG_GENMASK(22, 16)
>> >+#define   ICL_DIMM_L_RANK_MASK			REG_GENMASK(10, 9)
>> >+#define   ICL_DIMM_L_RANK_1			REG_FIELD_PREP(ICL_DIMM_L_RANK_MASK, 0)
>> >+#define   ICL_DIMM_L_RANK_2			REG_FIELD_PREP(ICL_DIMM_L_RANK_MASK, 1)
>> >+#define   ICL_DIMM_L_RANK_3			REG_FIELD_PREP(ICL_DIMM_L_RANK_MASK, 2)
>> >+#define   ICL_DIMM_L_RANK_4			REG_FIELD_PREP(ICL_DIMM_L_RANK_MASK, 3)
>> >+#define   ICL_DIMM_L_WIDTH_MASK			REG_GENMASK(8, 7)
>> >+#define   ICL_DIMM_L_WIDTH_X8			REG_FIELD_PREP(ICL_DIMM_L_WIDTH_MASK, 0)
>> >+#define   ICL_DIMM_L_WIDTH_X16			REG_FIELD_PREP(ICL_DIMM_L_WIDTH_MASK, 1)
>> >+#define   ICL_DIMM_L_WIDTH_X32			REG_FIELD_PREP(ICL_DIMM_L_WIDTH_MASK, 2)
>> >+#define   ICL_DIMM_L_SIZE_MASK			REG_GENMASK(6, 0)
>> 
>> so we have:
>> 
>> ICL_DIMM_L_RANK_MASK			REG_GENMASK(10     , 9)
>> ICL_DIMM_L_WIDTH_MASK			REG_GENMASK(8      , 7)
>> ICL_DIMM_L_SIZE_MASK			REG_GENMASK(6      , 0)
>> 
>> vs
>> 
>> ICL_DIMM_S_RANK_MASK			REG_GENMASK(11 + 16, 10 + 16)
>> ICL_DIMM_S_WIDTH_MASK			REG_GENMASK(9  + 16, 8  + 16)
>> ICL_DIMM_S_SIZE_MASK			REG_GENMASK(6  + 16, 0  + 16)
>> 
>> 
>> I can't really check the soc spec right now, but this fix seems very
>> verbose. Maybe the first patch could fix the bug in the simple way and
>> then have these refactors on top?
>> 
>> u16 lval = val & 0xffff;
>> u16 sval = val >> 16;
>> 
>> /*
>>   * Some cursing here for format change - "fix" it up by making it compatible
>>   * with the lower bits by doing shr where appropriate
>>   */
>> sval = (sval & ICL_DIMM_L_SIZE_MASK) |
>>         ((sval >> 1) & ICL_DIMM_L_WIDTH_MASK) |
>>         ((sval >> 1) & ICL_DIMM_L_RANK_MASK);
>> 
>> ...
>> 
>> > static int
>> > skl_dram_get_channel_info(struct drm_i915_private *i915,
>> > 			  struct dram_channel_info *ch,
>> > 			  int channel, u32 val)
>> > {
>> >-	skl_dram_get_dimm_info(i915, &ch->dimm_l,
>> >-			       channel, 'L', val & 0xffff);
>> >-	skl_dram_get_dimm_info(i915, &ch->dimm_s,
>> >-			       channel, 'S', val >> 16);
>> 
>> Which would mean basically changing this function to derive sval and
>> lval as above (untested). This could easily propagate to through stable.
>
> Meh. We have no know issues that this fixes so wasn't planning on
> a stable backport anyway.

I'm fine with backporting the deps if we end up having to backport this.

It's a hard diff to read, but I couldn't spot any issues.

Reviewed-by: Jani Nikula <jani.nikula@intel.com>


-- 
Jani Nikula, Intel

  reply	other threads:[~2025-11-19  8:06 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-29 20:42 [PATCH 0/3] drm/1915/dram: Fix DIMM_S decoding on ICL Ville Syrjala
2025-10-29 20:42 ` [PATCH 1/3] drm/i915/dram: Use REG_GENMASK() & co. for the SKL+ DIMM regs Ville Syrjala
2025-11-05 20:45   ` Lucas De Marchi
2025-10-29 20:42 ` [PATCH 2/3] drm/i915/dram: Sort SKL+ DIMM register bits Ville Syrjala
2025-11-05 20:48   ` Lucas De Marchi
2025-10-29 20:42 ` [PATCH 3/3] drm/i915/dram: Fix ICL DIMM_S decoding Ville Syrjala
2025-11-05 22:25   ` Lucas De Marchi
2025-11-07 13:37     ` Ville Syrjälä
2025-11-19  8:05       ` Jani Nikula [this message]
2025-10-30 22:43 ` ✓ i915.CI.BAT: success for drm/1915/dram: Fix DIMM_S decoding on ICL Patchwork
2025-10-31 11:53 ` ✓ i915.CI.Full: " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=f1180282dbadaaab11c8d9426acdcc7bed2179d1@intel.com \
    --to=jani.nikula@linux.intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=lucas.demarchi@intel.com \
    --cc=ville.syrjala@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.