diff --git a/eeprom/decode-dimms b/eeprom/decode-dimms index 966f029..cceb6bd 100755 --- a/eeprom/decode-dimms +++ b/eeprom/decode-dimms @@ -1268,26 +1268,28 @@ sub spd_sizes($) } } -sub readspd($$) # reads bytes from SPD-EEPROM +# Read bytes from SPD-EEPROM +# Note: offset must be a multiple of 16! +sub readspd($$$) { - my ($size, $dimm_i) = @_; + my ($offset, $size, $dimm_i) = @_; my @bytes; if ($use_hexdump) { @bytes = read_hexdump($dimm_i); - return @bytes[0..($size-1)]; + return @bytes[$offset..($offset + $size - 1)]; } elsif ($use_sysfs) { # Kernel 2.6 with sysfs sysopen(HANDLE, "/sys/bus/i2c/drivers/eeprom/$dimm_i/eeprom", O_RDONLY) or die "Cannot open /sys/bus/i2c/drivers/eeprom/$dimm_i/eeprom"; binmode HANDLE; - sysseek(HANDLE, 0, SEEK_SET); + sysseek(HANDLE, $offset, SEEK_SET); sysread(HANDLE, my $eeprom, $size); close HANDLE; @bytes = unpack("C*", $eeprom); } else { # Kernel 2.4 with procfs for my $i (0 .. ($size-1)/16) { - my $hexoff = sprintf('%02x', $i * 16); + my $hexoff = sprintf('%02x', $offset + $i * 16); push @bytes, split(" ", `cat /proc/sys/dev/sensors/$dimm_i/$hexoff`); } } @@ -1424,7 +1426,7 @@ for my $i ( 0 .. $#dimm_list ) { if (($use_sysfs && /^\d+-\d+$/) || (!$use_sysfs && /^eeprom-/) || $use_hexdump) { - my @bytes = readspd(128, $dimm_list[$i]); + my @bytes = readspd(0, 128, $dimm_list[$i]); my $is_rambus = $bytes[0] < 4; # Simple heuristic my ($l, $chk_valid, $chk_spd, $chk_calc); if ($is_rambus || $bytes[2] < 9) { @@ -1472,6 +1474,14 @@ for my $i ( 0 .. $#dimm_list ) { my ($spd_size, $spd_used) = spd_sizes(\@bytes); printl "# of bytes written to SDRAM EEPROM", $spd_used; printl "Total number of bytes in EEPROM", $spd_size; + + # If there's more data than what we've read, let's + # read it now. DDR3 will need this data. + if ($spd_used > @bytes) { + push (@bytes, + readspd(@bytes, $spd_used - @bytes, + $dimm_list[$i])); + } } $l = "Fundamental Memory type";