#pragma once #include "parser_interface.hpp" #include "types.hpp" #include 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 returns manufacturer's ID for DDR4 DIMM. * * @return manufacturer ID. */ types::BinaryVector getDDR4ManufacturerId(); /** * @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