Linux Hardware Monitor development
 help / color / mirror / Atom feed
From: Guenter Roeck <linux@roeck-us.net>
To: Paul Menzel <pmenzel@molgen.mpg.de>
Cc: linux-hwmon@vger.kernel.org, linux-i2c@vger.kernel.org,
	linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
	"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
	"Wolfram Sang" <wsa+renesas@sang-engineering.com>,
	"René Rebe" <rene@exactcode.de>,
	"Thomas Weißschuh" <linux@weissschuh.net>,
	"Armin Wolf" <W_Armin@gmx.de>,
	"Stephen Horvath" <s.horvath@outlook.com.au>
Subject: Re: [PATCH v4 5/6] i2c: smbus: Support DDR5 SPD EEPROMs
Date: Wed, 5 Jun 2024 06:56:08 -0700	[thread overview]
Message-ID: <efb77b37-30e5-48a8-b4af-eb9995a2882b@roeck-us.net> (raw)
In-Reply-To: <a5aa120d-8497-4ca8-9752-7d800240b999@molgen.mpg.de>

Hi Paul,

On Wed, Jun 05, 2024 at 02:21:50PM +0200, Paul Menzel wrote:
> Dear Guenter,
> 
> 
> Thank you so much for taking this on.
> 
> Am 04.06.24 um 06:02 schrieb Guenter Roeck:
> > Detect DDR5 memory and instantiate the SPD5118 driver automatically.
> > 
> > Suggested-by: Thomas Weißschuh <linux@weissschuh.net>
> > Cc: Wolfram Sang <wsa+renesas@sang-engineering.com>
> > Signed-off-by: Guenter Roeck <linux@roeck-us.net>
> > ---
> > v5: New patch
> > 
> >   drivers/i2c/i2c-smbus.c | 4 ++++
> >   1 file changed, 4 insertions(+)
> > 
> > diff --git a/drivers/i2c/i2c-smbus.c b/drivers/i2c/i2c-smbus.c
> > index 97f338b123b1..8a0dab835761 100644
> > --- a/drivers/i2c/i2c-smbus.c
> > +++ b/drivers/i2c/i2c-smbus.c
> > @@ -382,6 +382,10 @@ void i2c_register_spd(struct i2c_adapter *adap)
> >   	case 0x1E:	/* LPDDR4 */
> >   		name = "ee1004";
> >   		break;
> > +	case 0x22:	/* DDR5 */
> > +	case 0x23:	/* LPDDR5 */
> > +		name = "spd5118";
> > +		break;
> >   	default:
> >   		dev_info(&adap->dev,
> >   			 "Memory type 0x%02x not supported yet, not instantiating SPD\n",
> 
> Testing this on top of 6.10-rc2+ on a Supermicro X13SAE, Linux logs:
> 
>     $ dmesg | grep -e "DMI:" -e "Linux version" -e i2c-0
>     [    0.000000] Linux version 6.10.0-rc2.mx64.461-00036-g151dfab265df
> (pmenzel@foreveralone.molgen.mpg.de) (gcc (GCC) 12.3.0, GNU ld (GNU
> Binutils) 2.41) #74 SMP PREEMPT_DYNAMIC Wed Jun  5 08:24:59 CEST 2024
>     [    0.000000] DMI: Supermicro Super Server/X13SAE, BIOS 2.0 10/17/2022
>     [    0.000000] DMI: Memory slots populated: 4/4
>     [    5.434488] i2c i2c-0: Successfully instantiated SPD at 0x50
>     [    5.443848] i2c i2c-0: Successfully instantiated SPD at 0x51
>     [    5.450033] i2c i2c-0: Successfully instantiated SPD at 0x52
>     [    5.459378] i2c i2c-0: Successfully instantiated SPD at 0x53
> 
> Then with `sudo modprobe at24` and `sudo modprobe ee1004`, `decode-dimms`
> shows:
> 
You'd actually have to load the spd5118 driver.

>     $ sudo ./eeprom/decode-dimms
>     # decode-dimms version 4.3
> 
>     Memory Serial Presence Detect Decoder
>     By Philip Edelbrock, Christian Zuckschwerdt, Burkart Lingner,
>     Jean Delvare, Trent Piepho and others
> 
> 
>     Number of SDRAM DIMMs detected and decoded: 0
> 
> This might be expected, and `decode-dimms` also needs to be updated.
> 

Correct. The hack below makes it detect the DIMMs, but the data format
is all different, so it is only really useful to validate reading
the EEPROM (i.e., the checksum over the first 512 bytes of the eeprom
is correct). With that patch applied, I get

Decoding EEPROM: /sys/bus/i2c/drivers/spd5118/0-0050
Guessing DIMM is in                              bank 1
Kernel driver used                               spd5118

---=== SPD EEPROM Information ===---
EEPROM CRC of bytes 0-509 48 1                   OK (0x47A2)
# of bytes written to SDRAM EEPROM               1024
Total number of bytes in EEPROM                  1024
Fundamental Memory type                          DDR5 SDRAM

---=== Manufacturing Information ===---
Manufacturer                                     Invalid
Custom Manufacturer Data                         00 00 00 00 00 88 13 ("???????")
Manufacturing Location Code                      0x08
Part Number                                      Undefined
Revision Code                                    0x4C1D
Manufacturing Date                               0x0C00

and so on.

Thanks,
Guenter

---
diff --git a/eeprom/decode-dimms b/eeprom/decode-dimms
index 787b6f5..64b6e81 100755
--- a/eeprom/decode-dimms
+++ b/eeprom/decode-dimms
@@ -2407,7 +2407,12 @@ sub spd_sizes($)
 	my $bytes = shift;
 	my $type = $bytes->[2];
 
-	if ($type == 12 || $type == 14 || $type == 16 || $type == 17) {
+	if ($type == 18 || $type == 19 || $type == 20 || $type == 21) {
+		# DDR5
+		my $spd_len = 256 * ((($bytes->[0] >> 4) & 7) + 1);
+		my $used = $spd_len;
+		return ($spd_len, $used);
+	} elsif ($type == 12 || $type == 14 || $type == 16 || $type == 17) {
 		# DDR4
 		my $spd_len = 256 * (($bytes->[0] >> 4) & 7);
 		my $used = 128 * ($bytes->[0] & 15);
@@ -2516,11 +2521,17 @@ sub calculate_crc($$$)
 sub check_crc($)
 {
 	my $bytes = shift;
+	my $is_ddr5 = ($bytes->[0] & 0x70) == 0x30;
 	my $crc_cover = $bytes->[0] & 0x80 ? 116 : 125;
+	my $crc_start = 126;
+	if ($is_ddr5) {
+	    $crc_cover = 509;
+	    $crc_start = 510;
+	}
 	my $crc = calculate_crc($bytes, 0, $crc_cover + 1);
 
-	my $dimm_crc = ($bytes->[127] << 8) | $bytes->[126];
-	return ("EEPROM CRC of bytes 0-$crc_cover",
+	my $dimm_crc = ($bytes->[$crc_start + 1] << 8) | $bytes->[$crc_start];
+	return ("EEPROM CRC of bytes 0-$crc_cover $bytes->[0] $is_ddr5",
 		($dimm_crc == $crc) ? 1 : 0,
 		sprintf("0x%04X", $dimm_crc),
 		sprintf("0x%04X", $crc));
@@ -2622,6 +2633,7 @@ sub get_dimm_list
 	if ($use_sysfs) {
 		@drivers = ('eeprom',
 			    'at24',
+			    'spd5118',
 			    'ee1004');	# DDR4
 	} else {
 		@drivers = ('eeprom');
@@ -2640,14 +2652,13 @@ sub get_dimm_list
 				# We look for I2C devices like 0-0050 or 2-0051
 				next unless $file =~ /^\d+-[\da-f]+$/i;
 				next unless -d "$dir/$file";
-
 				# Device name must be eeprom (driver eeprom)
 				# spd (driver at24) or ee1004 (driver ee1004)
 				my $attr = sysfs_device_attribute("$dir/$file", "name");
 				next unless defined $attr &&
 					    ($attr eq "eeprom" ||
 					     $attr eq "spd" ||
-					     $attr eq "ee1004");	# DDR4
+					     $attr eq "spd5118" || $attr eq "ee1004");	# DDR4
 			} else {
 				next unless $file =~ /^eeprom-/;
 			}
@@ -2681,7 +2692,7 @@ sub get_dimm_list
 @dimm = get_dimm_list() unless $use_hexdump;
 
 for my $i (0 .. $#dimm) {
-	my @bytes = readspd(0, 128, $dimm[$i]->{file});
+	my @bytes = readspd(0, 512, $dimm[$i]->{file});
 	$dimm[$i]->{bytes} = \@bytes;
 	$dimm[$i]->{is_rambus} = $bytes[0] < 4;		# Simple heuristic
 	if ($dimm[$i]->{is_rambus} || $bytes[2] < 9) {


  reply	other threads:[~2024-06-05 13:56 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-04  4:02 [PATCH v4 0/6] hwmon: Add support for SPD5118 compliant chips Guenter Roeck
2024-06-04  4:02 ` [PATCH v4 1/6] dt-bindings: trivial-devices: Add jedec,spd5118 Guenter Roeck
2024-06-04  4:02 ` [PATCH v4 2/6] hwmon: Add support for SPD5118 compliant temperature sensors Guenter Roeck
2024-06-04  8:48   ` Stephen Horvath
2024-06-04 14:31     ` Guenter Roeck
2024-06-07 15:55   ` Armin Wolf
2024-06-04  4:02 ` [PATCH v4 3/6] hwmon: (spd5118) Add suspend/resume support Guenter Roeck
2024-06-04  8:45   ` Stephen Horvath
2024-06-04 14:31     ` Guenter Roeck
2024-06-07 15:57   ` Armin Wolf
2024-06-04  4:02 ` [PATCH v4 4/6] hwmon: (spd5118) Add support for reading SPD data Guenter Roeck
2024-06-04 11:58   ` Armin Wolf
2024-06-04 14:30     ` Guenter Roeck
2024-06-07 15:59       ` Armin Wolf
2024-06-04  4:02 ` [PATCH v4 5/6] i2c: smbus: Support DDR5 SPD EEPROMs Guenter Roeck
2024-06-04  7:32   ` Wolfram Sang
2024-06-05 12:21   ` Paul Menzel
2024-06-05 13:56     ` Guenter Roeck [this message]
2024-06-17 14:42       ` Paul Menzel
2024-06-17 15:49         ` Guenter Roeck
2024-06-18 10:25           ` Paul Menzel
2024-06-18 13:32             ` Guenter Roeck
2024-06-18 13:51               ` Paul Menzel
2024-06-18 14:23                 ` Guenter Roeck
2024-06-18 14:59                   ` Paul Menzel
2024-06-18 15:10                     ` Guenter Roeck
2024-06-18 15:25                       ` Paul Menzel
2024-06-18 15:43                         ` Guenter Roeck
2024-06-18 18:16                         ` Guenter Roeck
2024-06-18 18:59                           ` Paul Menzel
2024-06-18 19:31                             ` Guenter Roeck
2024-06-18 15:12                     ` Guenter Roeck
2024-06-18 15:27                       ` Paul Menzel
2024-06-07 16:06   ` Armin Wolf
2024-06-07 18:00     ` Wolfram Sang
2024-06-10 13:52       ` Guenter Roeck
2024-06-10 14:52         ` Wolfram Sang
2024-06-10 15:55           ` Guenter Roeck
2024-06-12 16:19             ` Wolfram Sang
2024-06-24 20:06               ` Heiner Kallweit
2024-06-24 20:30                 ` Guenter Roeck
2024-06-04  4:02 ` [PATCH v4 6/6] hwmon: (spd5118) Add configuration option for auto-detection Guenter Roeck
2024-06-04  4:37   ` Thomas Weißschuh
2024-06-04 14:04     ` Guenter Roeck
2024-06-04  7:44   ` Wolfram Sang
2024-06-04 14:04     ` Guenter Roeck
2024-06-05  2:19   ` [PATCH v4a " Guenter Roeck
2024-06-05  9:22     ` Thomas Weißschuh
2024-06-05 14:04       ` Guenter Roeck
2024-06-07 16:08     ` Armin Wolf

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=efb77b37-30e5-48a8-b4af-eb9995a2882b@roeck-us.net \
    --to=linux@roeck-us.net \
    --cc=W_Armin@gmx.de \
    --cc=devicetree@vger.kernel.org \
    --cc=krzk+dt@kernel.org \
    --cc=linux-hwmon@vger.kernel.org \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@weissschuh.net \
    --cc=pmenzel@molgen.mpg.de \
    --cc=rene@exactcode.de \
    --cc=s.horvath@outlook.com.au \
    --cc=wsa+renesas@sang-engineering.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox