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

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