|
|
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 |
|