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