blob: 091285cbc79bb973bf54934bec6367672ff686bb [file] [log] [blame]
Sunny Srivastavafa5e4d32023-03-12 11:59:49 -05001#pragma once
2
3#include "parser_interface.hpp"
4#include "types.hpp"
5
6#include <string_view>
7
8namespace 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 */
16class 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 */
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
53 readKeywords(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
70 getDDR4PartNumber(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
79 getDDR4SerialNumber(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
92 getDDR4FruNumber(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 calculates DIMM size from DDR5 SPD
105 *
106 * @param[in] i_iterator - iterator to buffer containing SPD
107 * @return calculated size or 0 in case of any error.
108 */
109 auto getDDR5DimmCapacity(types::BinaryVector::const_iterator& i_iterator);
110
111 /**
112 * @brief This function calculates part number from DDR5 SPD
113 *
114 * @param[in] i_iterator - iterator to buffer containing SPD
115 * @return calculated part number or a default value.
116 */
117 auto getDDR5PartNumber(types::BinaryVector::const_iterator& i_iterator);
118
119 /**
120 * @brief This function calculates serial number from DDR5 SPD
121 *
122 * @param[in] i_iterator - iterator to buffer containing SPD
123 * @return calculated serial number.
124 */
125 auto getDDR5SerialNumber(types::BinaryVector::const_iterator& i_iterator);
126
127 /**
128 * @brief This function allocates FRU number based on part number
129 *
130 * Mappings for FRU number from calculated part number is used
131 * for DDR5 ISDIMM.
132 *
133 * @param[in] i_partNumber - part number of the DIMM
134 * @return allocated FRU number.
135 */
136 auto getDDR5FruNumber(const std::string& i_partNumber);
137
138 /**
139 * @brief This function allocates CCIN based on part number for DDR5 SPD
140 *
141 * @param[in] i_partNumber - part number of the DIMM
142 * @return allocated CCIN.
143 */
144 auto getDDR5CCIN(const std::string& i_partNumber);
145
146 // SPD file to be parsed
147 const types::BinaryVector& m_memSpd;
148};
149
150} // namespace vpd