Revamped code for VPD parser
The commit removes all the pre-existing code from the branch
and pushes the revamped code.
Major modification includes:
- Movement from multi exe to single daemon model.
- Multithreaded approach to parse FRU VPD.
- Better error handling.
- Refactored code for performance optimization.
Note: This code supports all the existing functionalities as it is.
Change-Id: I1ddce1f0725ac59020b72709689a1013643bda8b
Signed-off-by: Sunny Srivastava <sunnsr25@in.ibm.com>
diff --git a/vpd-manager/include/isdimm_parser.hpp b/vpd-manager/include/isdimm_parser.hpp
new file mode 100644
index 0000000..091285c
--- /dev/null
+++ b/vpd-manager/include/isdimm_parser.hpp
@@ -0,0 +1,150 @@
+#pragma once
+
+#include "parser_interface.hpp"
+#include "types.hpp"
+
+#include <string_view>
+
+namespace vpd
+{
+/**
+ * @brief Concrete class to implement JEDEC SPD parsing.
+ *
+ * The class inherits ParserInterface interface class and overrides the parser
+ * functionality to implement parsing logic for JEDEC SPD format.
+ */
+class JedecSpdParser : public ParserInterface
+{
+ public:
+ // Deleted API's
+ JedecSpdParser() = delete;
+ JedecSpdParser(const JedecSpdParser&) = delete;
+ JedecSpdParser& operator=(const JedecSpdParser&) = delete;
+ JedecSpdParser(JedecSpdParser&&) = delete;
+ JedecSpdParser& operator=(JedecSpdParser&&) = delete;
+ ~JedecSpdParser() = default;
+
+ /**
+ * @brief Constructor
+ *
+ * @param[in] i_spdVector - JEDEC SPD data.
+ */
+ explicit JedecSpdParser(const types::BinaryVector& i_spdVector) :
+ m_memSpd(i_spdVector)
+ {}
+
+ /**
+ * @brief Parse the memory SPD binary data.
+ *
+ * Collects and emplace the keyword-value pairs in map.
+ *
+ * @return map of keyword:value
+ */
+ types::VPDMapVariant parse();
+
+ private:
+ /**
+ * @brief An API to read keywords.
+ *
+ * @param[in] i_iterator - iterator to buffer containing SPD
+ * @return- map of kwd:value
+ */
+ types::JedecSpdMap
+ readKeywords(types::BinaryVector::const_iterator& i_iterator);
+
+ /**
+ * @brief This function calculates DIMM size from DDR4 SPD
+ *
+ * @param[in] i_iterator - iterator to buffer containing SPD
+ * @return calculated size or 0 in case of any error.
+ */
+ auto getDDR4DimmCapacity(types::BinaryVector::const_iterator& i_iterator);
+
+ /**
+ * @brief This function calculates part number from DDR4 SPD
+ *
+ * @param[in] i_iterator - iterator to buffer containing SPD
+ * @return calculated part number or a default value.
+ */
+ std::string_view
+ getDDR4PartNumber(types::BinaryVector::const_iterator& i_iterator);
+
+ /**
+ * @brief This function calculates serial number from DDR4 SPD
+ *
+ * @param[in] i_iterator - iterator to buffer containing SPD
+ * @return calculated serial number or a default value.
+ */
+ std::string
+ getDDR4SerialNumber(types::BinaryVector::const_iterator& i_iterator);
+
+ /**
+ * @brief This function allocates FRU number based on part number
+ *
+ * Mappings for FRU number from calculated part number is used
+ * for DDR4 ISDIMM.
+ *
+ * @param[in] i_partNumber - part number of the DIMM
+ * @param[in] i_iterator - iterator to buffer containing SPD
+ * @return allocated FRU number or a default value
+ */
+ std::string_view
+ getDDR4FruNumber(const std::string& i_partNumber,
+ types::BinaryVector::const_iterator& i_iterator);
+
+ /**
+ * @brief This function allocates CCIN based on part number for DDR4 SPD
+ *
+ * @param[in] i_partNumber - part number of the DIMM
+ * @return allocated CCIN or a default value.
+ */
+ std::string_view getDDR4CCIN(const std::string& i_partNumber);
+
+ /**
+ * @brief This function calculates DIMM size from DDR5 SPD
+ *
+ * @param[in] i_iterator - iterator to buffer containing SPD
+ * @return calculated size or 0 in case of any error.
+ */
+ auto getDDR5DimmCapacity(types::BinaryVector::const_iterator& i_iterator);
+
+ /**
+ * @brief This function calculates part number from DDR5 SPD
+ *
+ * @param[in] i_iterator - iterator to buffer containing SPD
+ * @return calculated part number or a default value.
+ */
+ auto getDDR5PartNumber(types::BinaryVector::const_iterator& i_iterator);
+
+ /**
+ * @brief This function calculates serial number from DDR5 SPD
+ *
+ * @param[in] i_iterator - iterator to buffer containing SPD
+ * @return calculated serial number.
+ */
+ auto getDDR5SerialNumber(types::BinaryVector::const_iterator& i_iterator);
+
+ /**
+ * @brief This function allocates FRU number based on part number
+ *
+ * Mappings for FRU number from calculated part number is used
+ * for DDR5 ISDIMM.
+ *
+ * @param[in] i_partNumber - part number of the DIMM
+ * @return allocated FRU number.
+ */
+ auto getDDR5FruNumber(const std::string& i_partNumber);
+
+ /**
+ * @brief This function allocates CCIN based on part number for DDR5 SPD
+ *
+ * @param[in] i_partNumber - part number of the DIMM
+ * @return allocated CCIN.
+ */
+ auto getDDR5CCIN(const std::string& i_partNumber);
+
+ // SPD file to be parsed
+ const types::BinaryVector& m_memSpd;
+};
+
+} // namespace vpd