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) {
next prev parent 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