From ab43c697ebaff3e5138c43a39a17f69859cde87d Mon Sep 17 00:00:00 2001 From: Jeremy Kerr Date: Tue, 6 Sep 2016 14:11:34 +0800 Subject: [PATCH 39/43] devtree: Correctly read size for DDR4 SPD We may have up to 512 bytes of SPD now, so bump dimminfo_buf. This will mean our offsets can be larger than 256 bytes, so use a uint16_t here. Signed-off-by: Jeremy Kerr Signed-off-by: Vasant Hegde --- src/core/device-tree.cc | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/core/device-tree.cc b/src/core/device-tree.cc index b7d0d57..2672b53 100644 --- a/src/core/device-tree.cc +++ b/src/core/device-tree.cc @@ -32,7 +32,7 @@ __ID("@(#) $Id$"); -#define DIMMINFOSIZE 0x100 +#define DIMMINFOSIZE 0x200 typedef uint8_t dimminfo_buf[DIMMINFOSIZE]; struct dimminfo @@ -807,14 +807,14 @@ static bool add_memory_bank_mba_dimm(string path, static void add_memory_bank_spd(string path, hwNode & bank) { char dimmversion[20]; - unsigned char mfg_loc_offset; - unsigned char rev_offset1; - unsigned char rev_offset2; - unsigned char year_offset; - unsigned char week_offset; - unsigned char partno_offset; - unsigned char ver_offset; - unsigned char serial_offset; + uint16_t mfg_loc_offset; + uint16_t rev_offset1; + uint16_t rev_offset2; + uint16_t year_offset; + uint16_t week_offset; + uint16_t partno_offset; + uint16_t ver_offset; + uint16_t serial_offset; int fd; size_t len = 0; dimminfo_buf dimminfo; @@ -830,9 +830,13 @@ static void add_memory_bank_spd(string path, hwNode & bank) } /* Read entire SPD eeprom */ - if (dimminfo[2] >= 9) /* DDR3 */ + if (dimminfo[2] >= 9) /* DDR3 & DDR4 */ { - len = 64 << ((dimminfo[0] & 0x70) >> 4); + uint8_t val = (dimminfo[0] >> 4) & 0x7; + if (val == 1) + len = 256; + else if (val == 2) + len = 512; } else if (dimminfo[0] < 15) { /* DDR 2 */ len = 1 << dimminfo[1]; } -- 2.10.2