xref: /openbmc/openpower-vpd-parser/vpd-manager/include/isdimm_parser.hpp (revision 43fedabc032ba7c209b58111b6c35c7d95a9f14e)
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