From 2c191a89d230652e63b38612cacac90d9eebb38e Mon Sep 17 00:00:00 2001 From: Jean Delvare Date: Mon, 8 Dec 2008 17:29:23 +0000 Subject: [PATCH] Read all EEPROM bytes at once, this is easier and even more efficient in the general case. git-svn-id: http://lm-sensors.org/svn/i2c-tools/trunk@5540 7894878c-1315-0410-8ee3-d5d059ff63e0 --- eeprom/decode-dimms | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/eeprom/decode-dimms b/eeprom/decode-dimms index 797797b..ba4195f 100755 --- a/eeprom/decode-dimms +++ b/eeprom/decode-dimms @@ -1221,26 +1221,26 @@ sub read_hexdump($) return @bytes; } -sub readspd64($$) # reads 64 bytes from SPD-EEPROM +sub readspd($$) # reads bytes from SPD-EEPROM { - my ($offset, $dimm_i) = @_; + my ($size, $dimm_i) = @_; my @bytes; if ($use_hexdump) { @bytes = read_hexdump($dimm_i); - return @bytes[$offset..($offset+63)]; + return @bytes[0..($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, $offset, SEEK_SET); - sysread(HANDLE, my $eeprom, 64); + sysseek(HANDLE, 0, SEEK_SET); + sysread(HANDLE, my $eeprom, $size); close HANDLE; - @bytes = unpack("C64", $eeprom); + @bytes = unpack("C*", $eeprom); } else { # Kernel 2.4 with procfs - for my $i (0 .. 3) { - my $hexoff = sprintf('%02x', $offset + $i * 16); + for my $i (0 .. ($size-1)/16) { + my $hexoff = sprintf('%02x', $i * 16); push @bytes, split(" ", `cat /proc/sys/dev/sensors/$dimm_i/$hexoff`); } } @@ -1332,7 +1332,7 @@ for my $i ( 0 .. $#dimm_list ) { if (($use_sysfs && /^\d+-\d+$/) || (!$use_sysfs && /^eeprom-/) || $use_hexdump) { - my @bytes = readspd64(0, $dimm_list[$i]); + my @bytes = readspd(128, $dimm_list[$i]); my $dimm_checksum = 0; $dimm_checksum += $bytes[$_] foreach (0 .. 62); $dimm_checksum &= 0xff; @@ -1407,7 +1407,7 @@ for my $i ( 0 .. $#dimm_list ) { if exists $decode_callback{$type}; # Decode next 35 bytes (64-98, common to all memory types) - @bytes = readspd64(64, $dimm_list[$i]); + splice(@bytes, 0, 64); decode_manufacturing_information(\@bytes); # Next 27 bytes (99-125) are manufacturer specific, can't decode