* [lm-sensors] [PATCH] sensors-detect: DDR3 SPD EEPROM support
@ 2011-02-11 9:06 Clemens Ladisch
2011-02-15 1:23 ` Guenter Roeck
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Clemens Ladisch @ 2011-02-11 9:06 UTC (permalink / raw)
To: lm-sensors
This adds CRC-16 calculation, needed to correctly detect DDR3 SPD EEPROMs.
--- a/prog/detect/sensors-detect
+++ b/prog/detect/sensors-detect
@@ -5265,18 +5265,43 @@
# Registers used:
# 0-63: SPD Data and Checksum
+# 0-127: SPD data and CRC (DDR3)
sub eeprom_detect
{
my ($file, $addr) = @_;
+ my $device_type = i2c_smbus_read_byte_data($file, 2);
my $checksum = 0;
# Check the checksum for validity (works for most DIMMs and RIMMs)
- for (my $i = 0; $i <= 62; $i++) {
- $checksum += i2c_smbus_read_byte_data($file, $i);
+ if ($device_type >= 1 and $device_type <= 10) {
+ for (my $i = 0; $i <= 62; $i++) {
+ $checksum += i2c_smbus_read_byte_data($file, $i);
+ }
+ $checksum &= 255;
+
+ return 8 if $checksum = i2c_smbus_read_byte_data($file, 63);
+ } elsif ($device_type = 11) {
+ # see JEDEC 21-C 4.1.2.11 2.4
+ my $crc_coverage = i2c_smbus_read_byte_data($file, 0);
+ $crc_coverage = ($crc_coverage & 0x80) ? 117 : 126;
+ for (my $i = 0; $i < $crc_coverage; $i++) {
+ $checksum ^= i2c_smbus_read_byte_data($file, $i) << 8;
+ for (my $bit = 0; $bit < 8; $bit++) {
+ if ($checksum & 0x8000) {
+ $checksum = ($checksum << 1) ^ 0x1021;
+ } else {
+ $checksum <<= 1;
+ }
+ }
+ }
+ $checksum &= 0xffff;
+
+ return 8 if ($checksum & 0xff) = i2c_smbus_read_byte_data($file, 126) and
+ ($checksum >> 8) = i2c_smbus_read_byte_data($file, 127);
+
+ # note: if bit 7 of byte 32 is set, a jc42 sensor is at $addr-0x38
}
- $checksum &= 255;
- return 8 if $checksum = i2c_smbus_read_byte_data($file, 63);
return;
}
_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [lm-sensors] [PATCH] sensors-detect: DDR3 SPD EEPROM support
2011-02-11 9:06 [lm-sensors] [PATCH] sensors-detect: DDR3 SPD EEPROM support Clemens Ladisch
@ 2011-02-15 1:23 ` Guenter Roeck
2011-02-16 15:11 ` Jean Delvare
2011-02-16 15:25 ` Clemens Ladisch
2 siblings, 0 replies; 4+ messages in thread
From: Guenter Roeck @ 2011-02-15 1:23 UTC (permalink / raw)
To: lm-sensors
On Fri, Feb 11, 2011 at 04:06:08AM -0500, Clemens Ladisch wrote:
> This adds CRC-16 calculation, needed to correctly detect DDR3 SPD EEPROMs.
>
For DDR3: Tested-by: Guenter Roeck <guenter.roeck@ericsson.com>
> --- a/prog/detect/sensors-detect
> +++ b/prog/detect/sensors-detect
> @@ -5265,18 +5265,43 @@
>
> # Registers used:
> # 0-63: SPD Data and Checksum
> +# 0-127: SPD data and CRC (DDR3)
> sub eeprom_detect
> {
> my ($file, $addr) = @_;
> + my $device_type = i2c_smbus_read_byte_data($file, 2);
> my $checksum = 0;
>
> # Check the checksum for validity (works for most DIMMs and RIMMs)
> - for (my $i = 0; $i <= 62; $i++) {
> - $checksum += i2c_smbus_read_byte_data($file, $i);
> + if ($device_type >= 1 and $device_type <= 10) {
> + for (my $i = 0; $i <= 62; $i++) {
> + $checksum += i2c_smbus_read_byte_data($file, $i);
> + }
> + $checksum &= 255;
> +
> + return 8 if $checksum = i2c_smbus_read_byte_data($file, 63);
> + } elsif ($device_type = 11) {
> + # see JEDEC 21-C 4.1.2.11 2.4
> + my $crc_coverage = i2c_smbus_read_byte_data($file, 0);
> + $crc_coverage = ($crc_coverage & 0x80) ? 117 : 126;
> + for (my $i = 0; $i < $crc_coverage; $i++) {
> + $checksum ^= i2c_smbus_read_byte_data($file, $i) << 8;
> + for (my $bit = 0; $bit < 8; $bit++) {
> + if ($checksum & 0x8000) {
> + $checksum = ($checksum << 1) ^ 0x1021;
> + } else {
> + $checksum <<= 1;
> + }
> + }
> + }
> + $checksum &= 0xffff;
> +
> + return 8 if ($checksum & 0xff) = i2c_smbus_read_byte_data($file, 126) and
> + ($checksum >> 8) = i2c_smbus_read_byte_data($file, 127);
> +
> + # note: if bit 7 of byte 32 is set, a jc42 sensor is at $addr-0x38
> }
> - $checksum &= 255;
>
> - return 8 if $checksum = i2c_smbus_read_byte_data($file, 63);
> return;
> }
>
>
> _______________________________________________
> lm-sensors mailing list
> lm-sensors@lm-sensors.org
> http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [lm-sensors] [PATCH] sensors-detect: DDR3 SPD EEPROM support
2011-02-11 9:06 [lm-sensors] [PATCH] sensors-detect: DDR3 SPD EEPROM support Clemens Ladisch
2011-02-15 1:23 ` Guenter Roeck
@ 2011-02-16 15:11 ` Jean Delvare
2011-02-16 15:25 ` Clemens Ladisch
2 siblings, 0 replies; 4+ messages in thread
From: Jean Delvare @ 2011-02-16 15:11 UTC (permalink / raw)
To: lm-sensors
Hi Clemens,
On Fri, 11 Feb 2011 10:06:08 +0100, Clemens Ladisch wrote:
> This adds CRC-16 calculation, needed to correctly detect DDR3 SPD EEPROMs.
>
> --- a/prog/detect/sensors-detect
> +++ b/prog/detect/sensors-detect
> @@ -5265,18 +5265,43 @@
>
> # Registers used:
> # 0-63: SPD Data and Checksum
> +# 0-127: SPD data and CRC (DDR3)
> sub eeprom_detect
> {
> my ($file, $addr) = @_;
> + my $device_type = i2c_smbus_read_byte_data($file, 2);
> my $checksum = 0;
>
> # Check the checksum for validity (works for most DIMMs and RIMMs)
> - for (my $i = 0; $i <= 62; $i++) {
> - $checksum += i2c_smbus_read_byte_data($file, $i);
> + if ($device_type >= 1 and $device_type <= 10) {
Device type 9 (FB-DIMM) also uses the CRC16, so this test is not
correct. Not sure about type 10 (what the hell is "FB-DIMM Probe"?)
> + for (my $i = 0; $i <= 62; $i++) {
> + $checksum += i2c_smbus_read_byte_data($file, $i);
> + }
> + $checksum &= 255;
> +
> + return 8 if $checksum = i2c_smbus_read_byte_data($file, 63);
> + } elsif ($device_type = 11) {
> + # see JEDEC 21-C 4.1.2.11 2.4
> + my $crc_coverage = i2c_smbus_read_byte_data($file, 0);
> + $crc_coverage = ($crc_coverage & 0x80) ? 117 : 126;
> + for (my $i = 0; $i < $crc_coverage; $i++) {
> + $checksum ^= i2c_smbus_read_byte_data($file, $i) << 8;
> + for (my $bit = 0; $bit < 8; $bit++) {
> + if ($checksum & 0x8000) {
> + $checksum = ($checksum << 1) ^ 0x1021;
> + } else {
> + $checksum <<= 1;
> + }
> + }
> + }
> + $checksum &= 0xffff;
> +
> + return 8 if ($checksum & 0xff) = i2c_smbus_read_byte_data($file, 126) and
> + ($checksum >> 8) = i2c_smbus_read_byte_data($file, 127);
> +
> + # note: if bit 7 of byte 32 is set, a jc42 sensor is at $addr-0x38
> }
> - $checksum &= 255;
>
> - return 8 if $checksum = i2c_smbus_read_byte_data($file, 63);
> return;
> }
Other than this, your patch looks good and works for me. So I've
applied it with just the device type checks changed. Thanks for your
contribution!
--
Jean Delvare
_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [lm-sensors] [PATCH] sensors-detect: DDR3 SPD EEPROM support
2011-02-11 9:06 [lm-sensors] [PATCH] sensors-detect: DDR3 SPD EEPROM support Clemens Ladisch
2011-02-15 1:23 ` Guenter Roeck
2011-02-16 15:11 ` Jean Delvare
@ 2011-02-16 15:25 ` Clemens Ladisch
2 siblings, 0 replies; 4+ messages in thread
From: Clemens Ladisch @ 2011-02-16 15:25 UTC (permalink / raw)
To: lm-sensors
Jean Delvare wrote:
> On Fri, 11 Feb 2011 10:06:08 +0100, Clemens Ladisch wrote:
> > + if ($device_type >= 1 and $device_type <= 10) {
>
> Device type 9 (FB-DIMM) also uses the CRC16, so this test is not
> correct. Not sure about type 10 (what the hell is "FB-DIMM Probe"?)
4.1.2 7.3:
| This field identifies the fundamental type of memory used on the
| assembly. The fundamental type of memory for FBDIMMs are DDR2 or
| FB-DIMM Probe (a unique Fundamental Type value to indicate logic
| analysis probe boards).
I don't think that such boards pretend to be memory modules (or that
somebody who uses them would expect sensors-detect to know about them).
Regards,
Clemens
_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2011-02-16 15:25 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-02-11 9:06 [lm-sensors] [PATCH] sensors-detect: DDR3 SPD EEPROM support Clemens Ladisch
2011-02-15 1:23 ` Guenter Roeck
2011-02-16 15:11 ` Jean Delvare
2011-02-16 15:25 ` Clemens Ladisch
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.