Memory VPD parser
This commit supports Implementation part of Memory vpd parser.
JSON support for DIMMs need to be done, so not tested.
Change-Id: I6bff9c75a335b0267d8f2b9fa4f1905953b24da5
Signed-off-by: Alpana Kumari <alpankum@in.ibm.com>
diff --git a/ibm_vpd_app.cpp b/ibm_vpd_app.cpp
index 24363d0..ac96295 100644
--- a/ibm_vpd_app.cpp
+++ b/ibm_vpd_app.cpp
@@ -2,6 +2,7 @@
#include "defines.hpp"
#include "keyword_vpd_parser.hpp"
+#include "memory_vpd_parser.hpp"
#include "parser.hpp"
#include "utils.hpp"
@@ -24,6 +25,7 @@
namespace fs = filesystem;
using json = nlohmann::json;
using namespace openpower::vpd::inventory;
+using namespace openpower::vpd::memory::parser;
/**
* @brief Expands location codes
@@ -475,10 +477,23 @@
KeywordVpdParser parserObj(move(vpdVector));
// Invoking KW Vpd Parser
const auto& kwValMap = parserObj.parseKwVpd();
- string preIntrStr = "com.ibm.kwvpd.KWVPD";
+ string preIntrStr = "com.ibm.ipzvpd.VINI";
populateDbus(kwValMap, js, file, preIntrStr);
}
break;
+
+ case MEMORY_VPD:
+ {
+ // Get an object to call API & get the key-value map
+ memoryVpdParser vpdParser(move(vpdVector));
+ const auto& memKwValMap = vpdParser.parseMemVpd();
+
+ string preIntrStr = "com.ibm.kwvpd.KWVPD";
+ // js(define dimm sys path in js), ObjPath(define in JS)
+ populateDbus(memKwValMap, js, file, preIntrStr);
+ }
+ break;
+
default:
throw std::runtime_error("Invalid VPD format");
}
diff --git a/memory_vpd_parser.cpp b/memory_vpd_parser.cpp
new file mode 100644
index 0000000..0fae663
--- /dev/null
+++ b/memory_vpd_parser.cpp
@@ -0,0 +1,60 @@
+#include "memory_vpd_parser.hpp"
+
+#include <iostream>
+#include <numeric>
+#include <string>
+
+namespace openpower
+{
+namespace vpd
+{
+namespace memory
+{
+namespace parser
+{
+using namespace inventory;
+using namespace parser;
+using namespace constants;
+using namespace std;
+
+KeywordVpdMap memoryVpdParser::readKeywords(Binary::const_iterator iterator)
+{
+ KeywordVpdMap map{};
+
+ vector<uint8_t> partNumber(iterator, iterator + PART_NUM_LEN);
+
+ advance(iterator, PART_NUM_LEN);
+ vector<uint8_t> serialNumber(iterator, iterator + SERIAL_NUM_LEN);
+
+ advance(iterator, SERIAL_NUM_LEN);
+ vector<uint8_t> ccin(iterator, iterator + CCIN_LEN);
+
+ map.emplace("PN", move(partNumber));
+ map.emplace("SN", move(serialNumber));
+ map.emplace("CC", move(ccin));
+
+ return map;
+}
+
+KeywordVpdMap memoryVpdParser::parseMemVpd()
+{
+ // check if vpd file is empty
+ if (memVpd.empty())
+ {
+ throw runtime_error("VPD file is empty.");
+ }
+
+ // Read the data and return the map
+ auto iterator = memVpd.cbegin();
+ // point the iterator to DIMM data and skip "11S"
+ advance(iterator, MEMORY_VPD_DATA_START + 3);
+
+ auto vpdDataMap = readKeywords(iterator);
+
+ return vpdDataMap;
+}
+
+} // namespace parser
+} // namespace memory
+} // namespace vpd
+} // namespace openpower
\ No newline at end of file
diff --git a/memory_vpd_parser.hpp b/memory_vpd_parser.hpp
new file mode 100644
index 0000000..18f4519
--- /dev/null
+++ b/memory_vpd_parser.hpp
@@ -0,0 +1,55 @@
+#pragma once
+
+#include "impl.hpp"
+#include "types.hpp"
+
+namespace openpower
+{
+namespace vpd
+{
+namespace memory
+{
+namespace parser
+{
+
+class memoryVpdParser
+{
+ public:
+ /**
+ * @brief Move Constructor
+ *
+ * Move kwVpdVector to parser object's kwVpdVector
+ */
+ memoryVpdParser(Binary&& memVpdVector) : memVpd(std::move(memVpdVector))
+ {
+ }
+
+ /**
+ * @brief Destructor
+ *
+ * Delete the parser object
+ */
+ ~memoryVpdParser(){};
+
+ /**
+ * @brief Parse the memory VPD binary data.
+ *
+ * Collects and emplace the keyword-value pairs in map.
+ *
+ * @return map of keyword:value
+ */
+ inventory::KeywordVpdMap parseMemVpd();
+
+ private:
+ /**
+ */
+ inventory::KeywordVpdMap readKeywords(Binary::const_iterator iterator);
+
+ /**
+ */
+ Binary memVpd;
+};
+} // namespace parser
+} // namespace memory
+} // namespace vpd
+} // namespace openpower
\ No newline at end of file
diff --git a/meson.build b/meson.build
index 7d76402..affd99f 100644
--- a/meson.build
+++ b/meson.build
@@ -46,7 +46,8 @@
'utils.cpp',
'keyword_vpd_parser.cpp',
'vpdecc/vpdecc.c',
- 'vpdecc/vpdecc_support.c'
+ 'vpdecc/vpdecc_support.c',
+ 'memory_vpd_parser.cpp'
]
ibm_vpd_exe = executable(