blob: 4a6d21bc846a5193d22a7c3be921518e29569a73 [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 */
Patrick Williams43fedab2025-02-03 14:28:05 -050052 types::JedecSpdMap readKeywords(
53 types::BinaryVector::const_iterator& i_iterator);
Sunny Srivastavafa5e4d32023-03-12 11:59:49 -050054
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 */
Patrick Williams43fedab2025-02-03 14:28:05 -050069 std::string_view getDDR4PartNumber(
70 types::BinaryVector::const_iterator& i_iterator);
Sunny Srivastavafa5e4d32023-03-12 11:59:49 -050071
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 */
Patrick Williams43fedab2025-02-03 14:28:05 -050078 std::string getDDR4SerialNumber(
79 types::BinaryVector::const_iterator& i_iterator);
Sunny Srivastavafa5e4d32023-03-12 11:59:49 -050080
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 */
Patrick Williams43fedab2025-02-03 14:28:05 -050091 std::string_view getDDR4FruNumber(
92 const std::string& i_partNumber,
93 types::BinaryVector::const_iterator& i_iterator);
Sunny Srivastavafa5e4d32023-03-12 11:59:49 -050094
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 /**
Priyanga Ramasamye606f062025-01-27 07:16:37 -0600104 * @brief This function returns manufacturer's ID for DDR4 DIMM.
105 *
106 * @return manufacturer ID.
107 */
108 types::BinaryVector getDDR4ManufacturerId();
109
110 /**
Sunny Srivastavafa5e4d32023-03-12 11:59:49 -0500111 * @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