1 #pragma once 2 3 #include "parser_interface.hpp" 4 #include "types.hpp" 5 6 #include <string_view> 7 8 namespace vpd 9 { 10 /** 11 * @brief Concrete class to implement JEDEC SPD parsing. 12 * 13 * The class inherits ParserInterface interface class and overrides the parser 14 * functionality to implement parsing logic for JEDEC SPD format. 15 */ 16 class JedecSpdParser : public ParserInterface 17 { 18 public: 19 // Deleted API's 20 JedecSpdParser() = delete; 21 JedecSpdParser(const JedecSpdParser&) = delete; 22 JedecSpdParser& operator=(const JedecSpdParser&) = delete; 23 JedecSpdParser(JedecSpdParser&&) = delete; 24 JedecSpdParser& operator=(JedecSpdParser&&) = delete; 25 ~JedecSpdParser() = default; 26 27 /** 28 * @brief Constructor 29 * 30 * @param[in] i_spdVector - JEDEC SPD data. 31 */ JedecSpdParser(const types::BinaryVector & i_spdVector)32 explicit JedecSpdParser(const types::BinaryVector& i_spdVector) : 33 m_memSpd(i_spdVector) 34 {} 35 36 /** 37 * @brief Parse the memory SPD binary data. 38 * 39 * Collects and emplace the keyword-value pairs in map. 40 * 41 * @return map of keyword:value 42 */ 43 types::VPDMapVariant parse(); 44 45 private: 46 /** 47 * @brief An API to read keywords. 48 * 49 * @param[in] i_iterator - iterator to buffer containing SPD 50 * @return- map of kwd:value 51 */ 52 types::JedecSpdMap readKeywords( 53 types::BinaryVector::const_iterator& i_iterator); 54 55 /** 56 * @brief This function calculates DIMM size from DDR4 SPD 57 * 58 * @param[in] i_iterator - iterator to buffer containing SPD 59 * @return calculated size or 0 in case of any error. 60 */ 61 auto getDDR4DimmCapacity(types::BinaryVector::const_iterator& i_iterator); 62 63 /** 64 * @brief This function calculates part number from DDR4 SPD 65 * 66 * @param[in] i_iterator - iterator to buffer containing SPD 67 * @return calculated part number or a default value. 68 */ 69 std::string_view getDDR4PartNumber( 70 types::BinaryVector::const_iterator& i_iterator); 71 72 /** 73 * @brief This function calculates serial number from DDR4 SPD 74 * 75 * @param[in] i_iterator - iterator to buffer containing SPD 76 * @return calculated serial number or a default value. 77 */ 78 std::string getDDR4SerialNumber( 79 types::BinaryVector::const_iterator& i_iterator); 80 81 /** 82 * @brief This function allocates FRU number based on part number 83 * 84 * Mappings for FRU number from calculated part number is used 85 * for DDR4 ISDIMM. 86 * 87 * @param[in] i_partNumber - part number of the DIMM 88 * @param[in] i_iterator - iterator to buffer containing SPD 89 * @return allocated FRU number or a default value 90 */ 91 std::string_view getDDR4FruNumber( 92 const std::string& i_partNumber, 93 types::BinaryVector::const_iterator& i_iterator); 94 95 /** 96 * @brief This function allocates CCIN based on part number for DDR4 SPD 97 * 98 * @param[in] i_partNumber - part number of the DIMM 99 * @return allocated CCIN or a default value. 100 */ 101 std::string_view getDDR4CCIN(const std::string& i_partNumber); 102 103 /** 104 * @brief This function returns manufacturer's ID for DDR4 DIMM. 105 * 106 * @return manufacturer ID. 107 */ 108 types::BinaryVector getDDR4ManufacturerId(); 109 110 /** 111 * @brief This function calculates DIMM size from DDR5 SPD 112 * 113 * @param[in] i_iterator - iterator to buffer containing SPD 114 * @return calculated size or 0 in case of any error. 115 */ 116 auto getDDR5DimmCapacity(types::BinaryVector::const_iterator& i_iterator); 117 118 /** 119 * @brief This function calculates part number from DDR5 SPD 120 * 121 * @param[in] i_iterator - iterator to buffer containing SPD 122 * @return calculated part number or a default value. 123 */ 124 auto getDDR5PartNumber(types::BinaryVector::const_iterator& i_iterator); 125 126 /** 127 * @brief This function calculates serial number from DDR5 SPD 128 * 129 * @param[in] i_iterator - iterator to buffer containing SPD 130 * @return calculated serial number. 131 */ 132 auto getDDR5SerialNumber(types::BinaryVector::const_iterator& i_iterator); 133 134 /** 135 * @brief This function allocates FRU number based on part number 136 * 137 * Mappings for FRU number from calculated part number is used 138 * for DDR5 ISDIMM. 139 * 140 * @param[in] i_partNumber - part number of the DIMM 141 * @return allocated FRU number. 142 */ 143 auto getDDR5FruNumber(const std::string& i_partNumber); 144 145 /** 146 * @brief This function allocates CCIN based on part number for DDR5 SPD 147 * 148 * @param[in] i_partNumber - part number of the DIMM 149 * @return allocated CCIN. 150 */ 151 auto getDDR5CCIN(const std::string& i_partNumber); 152 153 // SPD file to be parsed 154 const types::BinaryVector& m_memSpd; 155 }; 156 157 } // namespace vpd 158