From 2c84941819da11626ecaee1d2a10abc852cfff3d Mon Sep 17 00:00:00 2001 From: Lyonel Vincent Date: Sat, 9 May 2015 10:18:17 +0000 Subject: [PATCH 1/1] update PowerPC device-tree memory detection (cf. #686) git-svn-id: http://ezix.org/source/packages/lshw/development@2576 811e2811-9fd9-0310-a116-b6e8ac943c8b --- src/core/device-tree.cc | 90 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 63 insertions(+), 27 deletions(-) diff --git a/src/core/device-tree.cc b/src/core/device-tree.cc index 6d93ab8..0b3d814 100644 --- a/src/core/device-tree.cc +++ b/src/core/device-tree.cc @@ -9,6 +9,7 @@ * */ +#include #include #include "version.h" #include "device-tree.h" @@ -35,6 +36,7 @@ struct dimminfo }; #define DEVICETREE "/proc/device-tree" +#define DEVICETREEVPD "/proc/device-tree/vpd/" static unsigned long get_long(const string & path) { @@ -284,46 +286,80 @@ static void scan_devtree_cpu(hwNode & core) } } +void add_memory_bank(string name, string path, hwNode & core) +{ + struct dirent **dirlist; + string product; + int n; + + pushd(path + name); + if(name.substr(0, 7) == "ms-dimm") + { + replace(name.begin(), name.end(), '@', ':'); + hwNode *memory = core.getChild("memory"); + + hwNode bank("bank", hw::memory); + bank.claim(true); + bank.addHint("icon", string("memory")); + + if(!memory) + memory = core.addChild(hwNode("memory", hw::memory)); + + if(exists("serial-number")) + bank.setSerial(get_string("serial-number")); + + product = get_string("part-number"); + if(exists("fru-number")) + { + product += " FRU#" + get_string("fru-number"); + } + if(product != "") + bank.setProduct(product); + + if(exists("description")) + bank.setDescription(get_string("description")); + if(exists("ibm,loc-code")) + bank.setSlot(get_string("ibm,loc-code")); + if(unsigned long size = get_number("size")) + bank.setSize(size*1024*1024); + + memory->addChild(bank); + } + + n = scandir(".", &dirlist, selectdir, alphasort); + popd(); + + if (n < 0) + return; + + for (int i = 0; i < n; i++) + { + add_memory_bank(dirlist[i]->d_name, path + name + "/", core); + free(dirlist[i]); + } + free(dirlist); +} + + static void scan_devtree_memory_powernv(hwNode & core) { struct dirent **namelist; - hwNode *memory = core.getChild("memory"); int n; + string path = DEVICETREEVPD; - pushd(DEVICETREE "/vpd"); + pushd(DEVICETREEVPD); n = scandir(".", &namelist, selectdir, alphasort); popd(); + if (n < 0) return; + for (int i = 0; i < n; i++) { - string basepath; - unsigned long size = 0; - string sizestr; - - if (strncmp(namelist[i]->d_name, "ms-dimm@", 8) == 0) - { - hwNode bank("bank", hw::memory); - - if (!memory) - memory = core.addChild(hwNode("memory", hw::memory)); - - basepath = string(DEVICETREE "/vpd/") + string(namelist[i]->d_name); - bank.setSerial(get_string(basepath + string("/serial-number"))); - bank.setProduct(get_string(basepath + string("/part-number")) + " FRU#" + get_string(basepath + string("/fru-number"))); - bank.setDescription(get_string(basepath + string("/description"))); - bank.setSlot(get_string(basepath + string("/ibm,loc-code"))); - sizestr = get_string(basepath + string("/size")); - errno = 0; - size = strtoul(sizestr.c_str(), NULL, 10); - if (!errno) - bank.setSize(size*1024*1024); - bank.addHint("icon", string("memory")); - - memory->addChild(bank); - } + add_memory_bank(namelist[i]->d_name, path, core); free(namelist[i]); } + free(namelist); } -- 2.4.3