Blame SOURCES/0034-devtree-Refactor-SPD-handling-code.patch

df7b7f
From 20872dd40742dc7f59c338e1575765cb2c88e6c6 Mon Sep 17 00:00:00 2001
df7b7f
From: Jack Miller <jack@codezen.org>
df7b7f
Date: Tue, 16 Aug 2016 14:03:47 -0500
df7b7f
Subject: [PATCH 34/43] devtree: Refactor SPD handling code
df7b7f
df7b7f
Some variants of IBM Power Systems has SPD property in device tree.
df7b7f
Hence move SPD reading code to separate function. Following patch
df7b7f
makes use of this changes.
df7b7f
df7b7f
Also minor cleanup included, mostly trying to reduce nested scopes.
df7b7f
df7b7f
No functionality changes.
df7b7f
df7b7f
Signed-off-by: Jack Miller <jack@codezen.org>
df7b7f
[Fixed minor issues, updated description - Vasant]
df7b7f
Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
df7b7f
---
df7b7f
 src/core/device-tree.cc | 227 ++++++++++++++++++++++++------------------------
df7b7f
 1 file changed, 114 insertions(+), 113 deletions(-)
df7b7f
df7b7f
diff --git a/src/core/device-tree.cc b/src/core/device-tree.cc
df7b7f
index 05db9f3..2d908d2 100644
df7b7f
--- a/src/core/device-tree.cc
df7b7f
+++ b/src/core/device-tree.cc
df7b7f
@@ -752,6 +752,98 @@ static void scan_devtree_cpu_power(hwNode & core)
df7b7f
     delete it->second;
df7b7f
 }
df7b7f
 
df7b7f
+static void add_memory_bank_spd(string path, hwNode & bank)
df7b7f
+{
df7b7f
+  char dimmversion[20];
df7b7f
+  unsigned char mfg_loc_offset;
df7b7f
+  unsigned char rev_offset1;
df7b7f
+  unsigned char rev_offset2;
df7b7f
+  unsigned char year_offset;
df7b7f
+  unsigned char week_offset;
df7b7f
+  unsigned char partno_offset;
df7b7f
+  unsigned char ver_offset;
df7b7f
+  int fd;
df7b7f
+  dimminfo_buf dimminfo;
df7b7f
+
df7b7f
+  fd = open(path.c_str(), O_RDONLY);
df7b7f
+  if (fd < 0)
df7b7f
+    return;
df7b7f
+
df7b7f
+  if (read(fd, &dimminfo, 0x80) != 0x80)
df7b7f
+  {
df7b7f
+    close(fd);
df7b7f
+    return;
df7b7f
+  }
df7b7f
+
df7b7f
+  /* Read entire SPD eeprom */
df7b7f
+  if (dimminfo[2] >= 9) /* DDR3 */
df7b7f
+  {
df7b7f
+    read(fd, &dimminfo[0x80], (64 << ((dimminfo[0] & 0x70) >> 4)));
df7b7f
+  } else if (dimminfo[0] < 15) { /* DDR 2 */
df7b7f
+    read(fd, &dimminfo[0x80], (1 << (dimminfo[1])));
df7b7f
+  }
df7b7f
+
df7b7f
+  close(fd);
df7b7f
+
df7b7f
+  if (dimminfo[2] >= 9) {
df7b7f
+    mfg_loc_offset = 0x77;
df7b7f
+    rev_offset1 = 0x92;
df7b7f
+    rev_offset2 = 0x93;
df7b7f
+    year_offset = 0x78;
df7b7f
+    week_offset = 0x79;
df7b7f
+    partno_offset = 0x80;
df7b7f
+    ver_offset = 0x01;
df7b7f
+
df7b7f
+    switch ((dimminfo[0x8] >> 3) & 0x3) // DDR3 error detection and correction scheme
df7b7f
+    {
df7b7f
+      case 0x00:
df7b7f
+        bank.setConfig("errordetection", "none");
df7b7f
+        break;
df7b7f
+      case 0x01:
df7b7f
+        bank.addCapability("ecc");
df7b7f
+        bank.setConfig("errordetection", "ecc");
df7b7f
+        break;
df7b7f
+    }
df7b7f
+  } else {
df7b7f
+    mfg_loc_offset = 0x48;
df7b7f
+    rev_offset1 = 0x5b;
df7b7f
+    rev_offset2 = 0x5c;
df7b7f
+    year_offset = 0x5d;
df7b7f
+    week_offset = 0x5e;
df7b7f
+    partno_offset = 0x49;
df7b7f
+    ver_offset = 0x3e;
df7b7f
+
df7b7f
+    switch (dimminfo[0xb] & 0x3) // DDR2 error detection and correction scheme
df7b7f
+    {
df7b7f
+      case 0x00:
df7b7f
+        bank.setConfig("errordetection", "none");
df7b7f
+        break;
df7b7f
+      case 0x01:
df7b7f
+        bank.addCapability("parity");
df7b7f
+        bank.setConfig("errordetection", "parity");
df7b7f
+        break;
df7b7f
+      case 0x02:
df7b7f
+      case 0x03:
df7b7f
+        bank.addCapability("ecc");
df7b7f
+        bank.setConfig("errordetection", "ecc");
df7b7f
+        break;
df7b7f
+    }
df7b7f
+  }
df7b7f
+
df7b7f
+  snprintf(dimmversion, sizeof(dimmversion),
df7b7f
+    "%02X%02X,%02X %02X,%02X", dimminfo[rev_offset1],
df7b7f
+    dimminfo[rev_offset2], dimminfo[year_offset], dimminfo[week_offset],
df7b7f
+    dimminfo[mfg_loc_offset]);
df7b7f
+  bank.setSerial(string((char *) &dimminfo[partno_offset], 18));
df7b7f
+  bank.setVersion(dimmversion);
df7b7f
+
df7b7f
+  int version = dimminfo[ver_offset];
df7b7f
+  char buff[32];
df7b7f
+
df7b7f
+  snprintf(buff, sizeof(buff), "spd-%d.%d", (version & 0xF0) >> 4, version & 0x0F);
df7b7f
+  bank.addCapability(buff);
df7b7f
+}
df7b7f
+
df7b7f
 static void add_memory_bank(string name, string path, hwNode & core)
df7b7f
 {
df7b7f
   struct dirent **dirlist;
df7b7f
@@ -872,123 +964,32 @@ static void scan_devtree_memory(hwNode & core)
df7b7f
       memory = core.addChild(hwNode("memory", hw::memory));
df7b7f
     }
df7b7f
 
df7b7f
-    if (memory)
df7b7f
-    {
df7b7f
-      int fd = open(dimminfo.c_str(), O_RDONLY);
df7b7f
+    if (!memory)
df7b7f
+      break;
df7b7f
 
df7b7f
-      if (regs.size() == slotnames.size())
df7b7f
+    if (regs.size() == slotnames.size())
df7b7f
+    {
df7b7f
+      for (unsigned int i = 0; i < slotnames.size(); i++)
df7b7f
       {
df7b7f
-        for (unsigned int i = 0; i < slotnames.size(); i++)
df7b7f
-        {
df7b7f
-          uint64_t size = regs[i].size;
df7b7f
-          hwNode bank("bank",
df7b7f
-            hw::memory);
df7b7f
-
df7b7f
-          if (fd >= 0)
df7b7f
-          {
df7b7f
-            dimminfo_buf dimminfo;
df7b7f
-	    
df7b7f
-            if (read(fd, &dimminfo, 0x80) == 0x80)
df7b7f
-            {
df7b7f
-
df7b7f
-              /* Read entire SPD eeprom */
df7b7f
-              if (dimminfo[2] >= 9) /* DDR3 */
df7b7f
-              {
df7b7f
-                read(fd, &dimminfo[0x80], (64 << ((dimminfo[0] & 0x70) >> 4)));
df7b7f
-              } else if (dimminfo[0] < 15) { /* DDR 2 */
df7b7f
-                read(fd, &dimminfo[0x80], (1 << (dimminfo[1]) ));
df7b7f
-              }
df7b7f
-
df7b7f
-              if (size > 0)
df7b7f
-              {
df7b7f
-                char dimmversion[20];
df7b7f
-                unsigned char mfg_loc_offset;
df7b7f
-                unsigned char rev_offset1;
df7b7f
-                unsigned char rev_offset2;
df7b7f
-                unsigned char year_offset;
df7b7f
-                unsigned char week_offset;
df7b7f
-                unsigned char partno_offset;
df7b7f
-                unsigned char ver_offset;
df7b7f
-
df7b7f
-                if (dimminfo[2] >= 9) {
df7b7f
-                  mfg_loc_offset = 0x77;
df7b7f
-                  rev_offset1 = 0x92;
df7b7f
-                  rev_offset2 = 0x93;
df7b7f
-                  year_offset = 0x78;
df7b7f
-                  week_offset = 0x79;
df7b7f
-                  partno_offset = 0x80;
df7b7f
-                  ver_offset = 0x01;
df7b7f
-
df7b7f
-                  switch ((dimminfo[0x8] >> 3) & 0x3) // DDR3 error detection and correction scheme
df7b7f
-                  {
df7b7f
-                    case 0x00:
df7b7f
-                      bank.setConfig("errordetection", "none");
df7b7f
-                      break;
df7b7f
-                    case 0x01:
df7b7f
-                      bank.addCapability("ecc");
df7b7f
-                      bank.setConfig("errordetection", "ecc");
df7b7f
-                      break;
df7b7f
-                  }
df7b7f
-                } else {
df7b7f
-                  mfg_loc_offset = 0x48;
df7b7f
-                  rev_offset1 = 0x5b;
df7b7f
-                  rev_offset2 = 0x5c;
df7b7f
-                  year_offset = 0x5d;
df7b7f
-                  week_offset = 0x5e;
df7b7f
-                  partno_offset = 0x49;
df7b7f
-                  ver_offset = 0x3e;
df7b7f
-
df7b7f
-                  switch (dimminfo[0xb] & 0x3) // DDR2 error detection and correction scheme
df7b7f
-                  {
df7b7f
-                    case 0x00:
df7b7f
-                      bank.setConfig("errordetection", "none");
df7b7f
-                      break;
df7b7f
-                    case 0x01:
df7b7f
-                      bank.addCapability("parity");
df7b7f
-                      bank.setConfig("errordetection", "parity");
df7b7f
-                      break;
df7b7f
-                    case 0x02:
df7b7f
-                    case 0x03:
df7b7f
-                      bank.addCapability("ecc");
df7b7f
-                      bank.setConfig("errordetection", "ecc");
df7b7f
-                      break;
df7b7f
-                  }
df7b7f
-                }
df7b7f
-                snprintf(dimmversion, sizeof(dimmversion),
df7b7f
-                  "%02X%02X,%02X %02X,%02X", dimminfo[rev_offset1],
df7b7f
-                  dimminfo[rev_offset2], dimminfo[year_offset], dimminfo[week_offset],
df7b7f
-                  dimminfo[mfg_loc_offset]);
df7b7f
-                bank.setSerial(string((char *) &dimminfo[partno_offset], 18));
df7b7f
-                bank.setVersion(dimmversion);
df7b7f
-
df7b7f
-                int version = dimminfo[ver_offset];
df7b7f
-                char buff[32];
df7b7f
-
df7b7f
-                snprintf(buff, sizeof(buff), "spd-%d.%d", (version & 0xF0) >> 4, version & 0x0F);
df7b7f
-                bank.addCapability(buff);
df7b7f
-              }
df7b7f
-            }
df7b7f
-          }
df7b7f
-
df7b7f
-          if(size>0)
df7b7f
-            bank.addHint("icon", string("memory"));
df7b7f
-          bank.setDescription("Memory bank");
df7b7f
-          bank.setSlot(slotnames[i]);
df7b7f
-          if (i < dimmtypes.size())
df7b7f
-            bank.setDescription(dimmtypes[i]);
df7b7f
-          if (i < dimmspeeds.size())
df7b7f
-            bank.setProduct(hw::strip(dimmspeeds[i]));
df7b7f
-          bank.setSize(size);
df7b7f
-          memory->addChild(bank);
df7b7f
-        }
df7b7f
+        uint64_t size = regs[i].size;
df7b7f
+        hwNode bank("bank", hw::memory);
df7b7f
+
df7b7f
+	// Parse Memory SPD data
df7b7f
+        add_memory_bank_spd(dimminfo, bank);
df7b7f
+
df7b7f
+        if (size > 0)
df7b7f
+          bank.addHint("icon", string("memory"));
df7b7f
+        bank.setDescription("Memory bank");
df7b7f
+        bank.setSlot(slotnames[i]);
df7b7f
+        if (i < dimmtypes.size())
df7b7f
+          bank.setDescription(dimmtypes[i]);
df7b7f
+        if (i < dimmspeeds.size())
df7b7f
+          bank.setProduct(hw::strip(dimmspeeds[i]));
df7b7f
+        bank.setSize(size);
df7b7f
+        memory->addChild(bank);
df7b7f
       }
df7b7f
-
df7b7f
-      if (fd >= 0)
df7b7f
-        close(fd);
df7b7f
-      currentmc++;
df7b7f
     }
df7b7f
-    else
df7b7f
-      break;
df7b7f
+    currentmc++;
df7b7f
 
df7b7f
     memory = NULL;
df7b7f
   }
df7b7f
-- 
df7b7f
2.10.2
df7b7f