Blame SOURCES/0038-devtree-Report-memory-info-for-BMC-based-Power-Syste.patch

df7b7f
From f1cd42c0c6f434e15ba322970cfa4519ee1f523d Mon Sep 17 00:00:00 2001
df7b7f
From: Jack Miller <jack@codezen.org>
df7b7f
Date: Tue, 16 Aug 2016 15:08:51 -0500
df7b7f
Subject: [PATCH 38/43] devtree: Report memory info for BMC based Power System
df7b7f
df7b7f
Some variants of Power System (BMC service processor system) device tree
df7b7f
contains SPD information. Also it has memory-buffer representation in
df7b7f
device tree.
df7b7f
df7b7f
This patch adds support to display memory information on this system.
df7b7f
df7b7f
Sample output;
df7b7f
        *-bank:1
df7b7f
             description: RDIMM DDR3 1600 MHz (0.6ns)
df7b7f
             product: HMT42GR7BFR4A-PB
df7b7f
             vendor: Hynix Semiconductor (Hyundai Electronics)
df7b7f
             physical id: 1
df7b7f
             version: 5438,15 33,01
df7b7f
             serial: 0x10c0af2c
df7b7f
             slot: Physical:/Sys0/Node0/DIMM11
df7b7f
             size: 16GiB
df7b7f
             clock: 1333MHz (0.8ns)
df7b7f
             capabilities: ecc spd-1.3
df7b7f
             configuration: errordetection=ecc
df7b7f
df7b7f
Signed-off-by: Jack Miller <jack@codezen.org>
df7b7f
[Updated description, fixed minor issues - Vasant]
df7b7f
Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
df7b7f
---
df7b7f
 src/core/device-tree.cc | 71 +++++++++++++++++++++++++++++++++++++++++++++----
df7b7f
 1 file changed, 66 insertions(+), 5 deletions(-)
df7b7f
df7b7f
diff --git a/src/core/device-tree.cc b/src/core/device-tree.cc
df7b7f
index 41034e5..b7d0d57 100644
df7b7f
--- a/src/core/device-tree.cc
df7b7f
+++ b/src/core/device-tree.cc
df7b7f
@@ -753,6 +753,57 @@ static void scan_devtree_cpu_power(hwNode & core)
df7b7f
     delete it->second;
df7b7f
 }
df7b7f
 
df7b7f
+static bool add_memory_bank_mba_dimm(string path,
df7b7f
+				     unsigned long serial, hwNode & bank)
df7b7f
+{
df7b7f
+  bool found = false;
df7b7f
+  int n;
df7b7f
+  struct dirent **namelist;
df7b7f
+
df7b7f
+  pushd(path);
df7b7f
+  n = scandir(".", &namelist, selectdir, alphasort);
df7b7f
+  popd();
df7b7f
+
df7b7f
+  if (n < 0)
df7b7f
+    return found;
df7b7f
+
df7b7f
+  for (int i = 0; i < n; i++)
df7b7f
+  {
df7b7f
+    string sname = string(namelist[i]->d_name);
df7b7f
+    string fullpath = path + "/" + sname;
df7b7f
+
df7b7f
+    if (found)
df7b7f
+    {
df7b7f
+      free(namelist[i]);
df7b7f
+      continue;
df7b7f
+    }
df7b7f
+
df7b7f
+    if (sname.substr(0, 13) == "memory-buffer")
df7b7f
+    {
df7b7f
+      if (exists(fullpath + "/frequency-mhz"))
df7b7f
+      {
df7b7f
+        int hz = get_u32(fullpath + "/frequency-mhz") * 1000000;
df7b7f
+        bank.setClock(hz);
df7b7f
+      }
df7b7f
+      found = add_memory_bank_mba_dimm(fullpath, serial, bank);
df7b7f
+    } else if (sname.substr(0, 3) == "mba") {
df7b7f
+      found = add_memory_bank_mba_dimm(fullpath, serial, bank);
df7b7f
+    } else if ((sname.substr(0, 4) == "dimm") &&
df7b7f
+	       (get_u32(fullpath + "/serial-number") == serial)) {
df7b7f
+      vector < reg_entry > regs = get_reg_property(fullpath);
df7b7f
+      bank.setSize(regs[0].size);
df7b7f
+
df7b7f
+      bank.setSlot(hw::strip(get_string(fullpath + "/ibm,slot-location-code")));
df7b7f
+      found = true;
df7b7f
+    }
df7b7f
+    free(namelist[i]);
df7b7f
+  }
df7b7f
+
df7b7f
+  free(namelist);
df7b7f
+  return found;
df7b7f
+}
df7b7f
+
df7b7f
+
df7b7f
 static void add_memory_bank_spd(string path, hwNode & bank)
df7b7f
 {
df7b7f
   char dimmversion[20];
df7b7f
@@ -885,6 +936,8 @@ static void add_memory_bank_spd(string path, hwNode & bank)
df7b7f
   snprintf(buff, sizeof(buff), "0x%lx", serial);
df7b7f
   bank.setSerial(buff);
df7b7f
 
df7b7f
+  add_memory_bank_mba_dimm(DEVICETREE, serial, bank);
df7b7f
+
df7b7f
   snprintf(buff, sizeof(buff), "spd-%d.%d", (version & 0xF0) >> 4, version & 0x0F);
df7b7f
   bank.addCapability(buff);
df7b7f
 }
df7b7f
@@ -895,18 +948,17 @@ static void add_memory_bank(string name, string path, hwNode & core)
df7b7f
   string product;
df7b7f
   int n;
df7b7f
 
df7b7f
+  hwNode *memory = core.getChild("memory");
df7b7f
+  if(!memory)
df7b7f
+    memory = core.addChild(hwNode("memory", hw::memory));
df7b7f
+
df7b7f
   pushd(path + name);
df7b7f
   if(name.substr(0, 7) == "ms-dimm")
df7b7f
   {
df7b7f
-    hwNode *memory = core.getChild("memory");
df7b7f
-
df7b7f
     hwNode bank("bank", hw::memory);
df7b7f
     bank.claim(true);
df7b7f
     bank.addHint("icon", string("memory"));
df7b7f
 
df7b7f
-    if(!memory)
df7b7f
-      memory = core.addChild(hwNode("memory", hw::memory));
df7b7f
-
df7b7f
     if(exists("serial-number"))
df7b7f
       bank.setSerial(hw::strip(get_string("serial-number")));
df7b7f
 
df7b7f
@@ -926,6 +978,15 @@ static void add_memory_bank(string name, string path, hwNode & core)
df7b7f
       bank.setSize(size*1024*1024);
df7b7f
 
df7b7f
     memory->addChild(bank);
df7b7f
+  } else if(name.substr(0, 4) == "dimm") {
df7b7f
+    hwNode bank("bank", hw::memory);
df7b7f
+    bank.claim(true);
df7b7f
+    bank.addHint("icon", string("memory"));
df7b7f
+
df7b7f
+    // Parse Memory SPD data
df7b7f
+    add_memory_bank_spd(path + name + "/spd", bank);
df7b7f
+
df7b7f
+    memory->addChild(bank);
df7b7f
   }
df7b7f
 
df7b7f
   n = scandir(".", &dirlist, selectdir, alphasort);
df7b7f
-- 
df7b7f
2.10.2
df7b7f