Changeset 5548

Show
Ignore:
Timestamp:
12/10/08 16:34:55 (6 years ago)
Author:
khali
Message:

Read the remainder of the EEPROM data if more than 128 bytes are used.
Patch from Paul Goyette.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • i2c-tools/trunk/eeprom/decode-dimms

    r5547 r5548  
    12691269} 
    12701270 
    1271 sub readspd($$) # reads bytes from SPD-EEPROM 
    1272 { 
    1273         my ($size, $dimm_i) = @_; 
     1271# Read bytes from SPD-EEPROM 
     1272# Note: offset must be a multiple of 16! 
     1273sub readspd($$$) 
     1274{ 
     1275        my ($offset, $size, $dimm_i) = @_; 
    12741276        my @bytes; 
    12751277        if ($use_hexdump) { 
    12761278                @bytes = read_hexdump($dimm_i); 
    1277                 return @bytes[0..($size-1)]; 
     1279                return @bytes[$offset..($offset + $size - 1)]; 
    12781280        } elsif ($use_sysfs) { 
    12791281                # Kernel 2.6 with sysfs 
     
    12811283                        or die "Cannot open /sys/bus/i2c/drivers/eeprom/$dimm_i/eeprom"; 
    12821284                binmode HANDLE; 
    1283                 sysseek(HANDLE, 0, SEEK_SET); 
     1285                sysseek(HANDLE, $offset, SEEK_SET); 
    12841286                sysread(HANDLE, my $eeprom, $size); 
    12851287                close HANDLE; 
     
    12881290                # Kernel 2.4 with procfs 
    12891291                for my $i (0 .. ($size-1)/16) { 
    1290                         my $hexoff = sprintf('%02x', $i * 16); 
     1292                        my $hexoff = sprintf('%02x', $offset + $i * 16); 
    12911293                        push @bytes, split(" ", `cat /proc/sys/dev/sensors/$dimm_i/$hexoff`); 
    12921294                } 
     
    14251427         || (!$use_sysfs && /^eeprom-/) 
    14261428         || $use_hexdump) { 
    1427                 my @bytes = readspd(128, $dimm_list[$i]); 
     1429                my @bytes = readspd(0, 128, $dimm_list[$i]); 
    14281430                my $is_rambus = $bytes[0] < 4;          # Simple heuristic 
    14291431                my ($l, $chk_valid, $chk_spd, $chk_calc); 
     
    14731475                        printl "# of bytes written to SDRAM EEPROM", $spd_used; 
    14741476                        printl "Total number of bytes in EEPROM", $spd_size; 
     1477 
     1478                        # If there's more data than what we've read, let's 
     1479                        # read it now.  DDR3 will need this data. 
     1480                        if ($spd_used > @bytes) { 
     1481                                push (@bytes, 
     1482                                      readspd(@bytes, $spd_used - @bytes, 
     1483                                              $dimm_list[$i])); 
     1484                        } 
    14751485                } 
    14761486