All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.