xref: /openbmc/openpower-vpd-parser/vpd-manager/src/isdimm_parser.cpp (revision e606f0611e0dba5243fd07cc82db23c31bcb1905)
1fa5e4d32SSunny Srivastava #include "isdimm_parser.hpp"
2fa5e4d32SSunny Srivastava 
3fa5e4d32SSunny Srivastava #include "constants.hpp"
4fa5e4d32SSunny Srivastava #include "logger.hpp"
5fa5e4d32SSunny Srivastava 
6fa5e4d32SSunny Srivastava #include <algorithm>
7fa5e4d32SSunny Srivastava #include <iostream>
8fa5e4d32SSunny Srivastava #include <numeric>
9fa5e4d32SSunny Srivastava #include <optional>
10fa5e4d32SSunny Srivastava #include <string>
11fa5e4d32SSunny Srivastava #include <unordered_map>
12fa5e4d32SSunny Srivastava 
13fa5e4d32SSunny Srivastava namespace vpd
14fa5e4d32SSunny Srivastava {
15fa5e4d32SSunny Srivastava 
16fa5e4d32SSunny Srivastava // Constants
17fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_SDRAM_CAP_MASK = 0x0F;
18fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_PRI_BUS_WIDTH_MASK = 0x07;
19fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_SDRAM_WIDTH_MASK = 0x07;
20fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_NUM_RANKS_MASK = 0x38;
21fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_DIE_COUNT_MASK = 0x70;
22fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_SINGLE_LOAD_STACK = 0x02;
23fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_SIGNAL_LOADING_MASK = 0x03;
24fa5e4d32SSunny Srivastava 
25fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_SDRAMCAP_MULTIPLIER = 256;
26fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_PRI_BUS_WIDTH_MULTIPLIER = 8;
27fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_SDRAM_WIDTH_MULTIPLIER = 4;
28fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_SDRAMCAP_RESERVED = 8;
29fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_4_RESERVED_BITS = 4;
30fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_3_RESERVED_BITS = 3;
31fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_DIE_COUNT_RIGHT_SHIFT = 4;
32fa5e4d32SSunny Srivastava 
33fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_MFG_ID_MSB_OFFSET = 321;
34fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_MFG_ID_LSB_OFFSET = 320;
35fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_SN_BYTE0_OFFSET = 325;
36fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_SN_BYTE1_OFFSET = 326;
37fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_SN_BYTE2_OFFSET = 327;
38fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_SN_BYTE3_OFFSET = 328;
39fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_SDRAM_DENSITY_BANK_OFFSET = 4;
40fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_SDRAM_ADDR_OFFSET = 5;
41fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_DRAM_PRI_PACKAGE_OFFSET = 6;
42fa5e4d32SSunny Srivastava constexpr auto SPD_JEDEC_DDR4_DRAM_MODULE_ORG_OFFSET = 12;
43*e606f061SPriyanga Ramasamy static constexpr auto SPD_JEDEC_DDR4_DRAM_MANUFACTURER_ID_OFFSET = 320;
44*e606f061SPriyanga Ramasamy static constexpr auto SPD_JEDEC_DRAM_MANUFACTURER_ID_LENGTH = 2;
45fa5e4d32SSunny Srivastava 
46fa5e4d32SSunny Srivastava // Lookup tables
47fa5e4d32SSunny Srivastava const std::map<std::tuple<std::string, uint8_t>, std::string> pnFreqFnMap = {
48fa5e4d32SSunny Srivastava     {std::make_tuple("8421000", 6), "78P4191"},
49fa5e4d32SSunny Srivastava     {std::make_tuple("8421008", 6), "78P4192"},
50fa5e4d32SSunny Srivastava     {std::make_tuple("8529000", 6), "78P4197"},
51fa5e4d32SSunny Srivastava     {std::make_tuple("8529008", 6), "78P4198"},
52fa5e4d32SSunny Srivastava     {std::make_tuple("8529928", 6), "78P4199"},
53fa5e4d32SSunny Srivastava     {std::make_tuple("8529B28", 6), "78P4200"},
54fa5e4d32SSunny Srivastava     {std::make_tuple("8631928", 6), "78P6925"},
55fa5e4d32SSunny Srivastava     {std::make_tuple("8529000", 5), "78P7317"},
56fa5e4d32SSunny Srivastava     {std::make_tuple("8529008", 5), "78P7318"},
57fa5e4d32SSunny Srivastava     {std::make_tuple("8631008", 5), "78P6815"}};
58fa5e4d32SSunny Srivastava 
59fa5e4d32SSunny Srivastava const std::unordered_map<std::string, std::string> pnCCINMap = {
60fa5e4d32SSunny Srivastava     {"78P4191", "324D"}, {"78P4192", "324E"}, {"78P4197", "324E"},
61fa5e4d32SSunny Srivastava     {"78P4198", "324F"}, {"78P4199", "325A"}, {"78P4200", "324C"},
62fa5e4d32SSunny Srivastava     {"78P6925", "32BC"}, {"78P7317", "331A"}, {"78P7318", "331F"},
63fa5e4d32SSunny Srivastava     {"78P6815", "32BB"}};
64fa5e4d32SSunny Srivastava 
getDDR4DimmCapacity(types::BinaryVector::const_iterator & i_iterator)65fa5e4d32SSunny Srivastava auto JedecSpdParser::getDDR4DimmCapacity(
66fa5e4d32SSunny Srivastava     types::BinaryVector::const_iterator& i_iterator)
67fa5e4d32SSunny Srivastava {
68fa5e4d32SSunny Srivastava     size_t l_tmp = 0, l_dimmSize = 0;
69fa5e4d32SSunny Srivastava 
70fa5e4d32SSunny Srivastava     size_t l_sdramCap = 1, l_priBusWid = 1, l_sdramWid = 1,
71fa5e4d32SSunny Srivastava            l_logicalRanksPerDimm = 1;
72fa5e4d32SSunny Srivastava     size_t l_dieCount = 1;
73fa5e4d32SSunny Srivastava 
74fa5e4d32SSunny Srivastava     // NOTE: This calculation is Only for DDR4
75fa5e4d32SSunny Srivastava 
76fa5e4d32SSunny Srivastava     // Calculate SDRAM  capacity
77fa5e4d32SSunny Srivastava     l_tmp = i_iterator[constants::SPD_BYTE_4] & SPD_JEDEC_DDR4_SDRAM_CAP_MASK;
78fa5e4d32SSunny Srivastava 
79fa5e4d32SSunny Srivastava     /* Make sure the bits are not Reserved */
80fa5e4d32SSunny Srivastava     if (l_tmp >= SPD_JEDEC_DDR4_SDRAMCAP_RESERVED)
81fa5e4d32SSunny Srivastava     {
82fa5e4d32SSunny Srivastava         logging::logMessage(
83fa5e4d32SSunny Srivastava             "Bad data in spd byte 4. Can't calculate SDRAM capacity "
84fa5e4d32SSunny Srivastava             "and so dimm size.\n ");
85fa5e4d32SSunny Srivastava         return l_dimmSize;
86fa5e4d32SSunny Srivastava     }
87fa5e4d32SSunny Srivastava     l_sdramCap = (l_sdramCap << l_tmp) * SPD_JEDEC_DDR4_SDRAMCAP_MULTIPLIER;
88fa5e4d32SSunny Srivastava 
89fa5e4d32SSunny Srivastava     /* Calculate Primary bus width */
90fa5e4d32SSunny Srivastava     l_tmp = i_iterator[constants::SPD_BYTE_13] &
91fa5e4d32SSunny Srivastava             SPD_JEDEC_DDR4_PRI_BUS_WIDTH_MASK;
92fa5e4d32SSunny Srivastava     if (l_tmp >= SPD_JEDEC_DDR4_4_RESERVED_BITS)
93fa5e4d32SSunny Srivastava     {
94fa5e4d32SSunny Srivastava         logging::logMessage(
95fa5e4d32SSunny Srivastava             "Bad data in spd byte 13. Can't calculate primary bus "
96fa5e4d32SSunny Srivastava             "width and so dimm size.\n ");
97fa5e4d32SSunny Srivastava         return l_dimmSize;
98fa5e4d32SSunny Srivastava     }
99fa5e4d32SSunny Srivastava     l_priBusWid = (l_priBusWid << l_tmp) *
100fa5e4d32SSunny Srivastava                   SPD_JEDEC_DDR4_PRI_BUS_WIDTH_MULTIPLIER;
101fa5e4d32SSunny Srivastava 
102fa5e4d32SSunny Srivastava     /* Calculate SDRAM width */
103fa5e4d32SSunny Srivastava     l_tmp = i_iterator[constants::SPD_BYTE_12] &
104fa5e4d32SSunny Srivastava             SPD_JEDEC_DDR4_SDRAM_WIDTH_MASK;
105fa5e4d32SSunny Srivastava     if (l_tmp >= SPD_JEDEC_DDR4_4_RESERVED_BITS)
106fa5e4d32SSunny Srivastava     {
107fa5e4d32SSunny Srivastava         logging::logMessage(
108fa5e4d32SSunny Srivastava             "Bad data in spd byte 12. Can't calculate SDRAM width and "
109fa5e4d32SSunny Srivastava             "so dimm size.\n ");
110fa5e4d32SSunny Srivastava         return l_dimmSize;
111fa5e4d32SSunny Srivastava     }
112fa5e4d32SSunny Srivastava     l_sdramWid = (l_sdramWid << l_tmp) * SPD_JEDEC_DDR4_SDRAM_WIDTH_MULTIPLIER;
113fa5e4d32SSunny Srivastava 
114fa5e4d32SSunny Srivastava     l_tmp = i_iterator[constants::SPD_BYTE_6] &
115fa5e4d32SSunny Srivastava             SPD_JEDEC_DDR4_SIGNAL_LOADING_MASK;
116fa5e4d32SSunny Srivastava     if (l_tmp == SPD_JEDEC_DDR4_SINGLE_LOAD_STACK)
117fa5e4d32SSunny Srivastava     {
118fa5e4d32SSunny Srivastava         // Fetch die count
119fa5e4d32SSunny Srivastava         l_tmp = i_iterator[constants::SPD_BYTE_6] &
120fa5e4d32SSunny Srivastava                 SPD_JEDEC_DDR4_DIE_COUNT_MASK;
121fa5e4d32SSunny Srivastava         l_tmp >>= SPD_JEDEC_DDR4_DIE_COUNT_RIGHT_SHIFT;
122fa5e4d32SSunny Srivastava         l_dieCount = l_tmp + 1;
123fa5e4d32SSunny Srivastava     }
124fa5e4d32SSunny Srivastava 
125fa5e4d32SSunny Srivastava     /* Calculate Number of ranks */
126fa5e4d32SSunny Srivastava     l_tmp = i_iterator[constants::SPD_BYTE_12] & SPD_JEDEC_DDR4_NUM_RANKS_MASK;
127fa5e4d32SSunny Srivastava     l_tmp >>= SPD_JEDEC_DDR4_3_RESERVED_BITS;
128fa5e4d32SSunny Srivastava 
129fa5e4d32SSunny Srivastava     if (l_tmp >= SPD_JEDEC_DDR4_4_RESERVED_BITS)
130fa5e4d32SSunny Srivastava     {
131fa5e4d32SSunny Srivastava         logging::logMessage(
132fa5e4d32SSunny Srivastava             "Can't calculate number of ranks. Invalid data found.\n ");
133fa5e4d32SSunny Srivastava         return l_dimmSize;
134fa5e4d32SSunny Srivastava     }
135fa5e4d32SSunny Srivastava     l_logicalRanksPerDimm = (l_tmp + 1) * l_dieCount;
136fa5e4d32SSunny Srivastava 
137fa5e4d32SSunny Srivastava     l_dimmSize = (l_sdramCap / SPD_JEDEC_DDR4_PRI_BUS_WIDTH_MULTIPLIER) *
138fa5e4d32SSunny Srivastava                  (l_priBusWid / l_sdramWid) * l_logicalRanksPerDimm;
139fa5e4d32SSunny Srivastava 
140fa5e4d32SSunny Srivastava     return l_dimmSize;
141fa5e4d32SSunny Srivastava }
142fa5e4d32SSunny Srivastava 
getDDR4PartNumber(types::BinaryVector::const_iterator & i_iterator)143fa5e4d32SSunny Srivastava std::string_view JedecSpdParser::getDDR4PartNumber(
144fa5e4d32SSunny Srivastava     types::BinaryVector::const_iterator& i_iterator)
145fa5e4d32SSunny Srivastava {
146fa5e4d32SSunny Srivastava     char l_tmpPN[constants::PART_NUM_LEN + 1] = {'\0'};
147fa5e4d32SSunny Srivastava     sprintf(l_tmpPN, "%02X%02X%02X%X",
148fa5e4d32SSunny Srivastava             i_iterator[SPD_JEDEC_DDR4_SDRAM_DENSITY_BANK_OFFSET],
149fa5e4d32SSunny Srivastava             i_iterator[SPD_JEDEC_DDR4_SDRAM_ADDR_OFFSET],
150fa5e4d32SSunny Srivastava             i_iterator[SPD_JEDEC_DDR4_DRAM_PRI_PACKAGE_OFFSET],
151fa5e4d32SSunny Srivastava             i_iterator[SPD_JEDEC_DDR4_DRAM_MODULE_ORG_OFFSET] & 0x0F);
152fa5e4d32SSunny Srivastava     std::string l_partNumber(l_tmpPN, sizeof(l_tmpPN) - 1);
153fa5e4d32SSunny Srivastava     return l_partNumber;
154fa5e4d32SSunny Srivastava }
155fa5e4d32SSunny Srivastava 
getDDR4SerialNumber(types::BinaryVector::const_iterator & i_iterator)156fa5e4d32SSunny Srivastava std::string JedecSpdParser::getDDR4SerialNumber(
157fa5e4d32SSunny Srivastava     types::BinaryVector::const_iterator& i_iterator)
158fa5e4d32SSunny Srivastava {
159fa5e4d32SSunny Srivastava     char l_tmpSN[constants::SERIAL_NUM_LEN + 1] = {'\0'};
160fa5e4d32SSunny Srivastava     sprintf(l_tmpSN, "%02X%02X%02X%02X%02X%02X",
161fa5e4d32SSunny Srivastava             i_iterator[SPD_JEDEC_DDR4_MFG_ID_MSB_OFFSET],
162fa5e4d32SSunny Srivastava             i_iterator[SPD_JEDEC_DDR4_MFG_ID_LSB_OFFSET],
163fa5e4d32SSunny Srivastava             i_iterator[SPD_JEDEC_DDR4_SN_BYTE0_OFFSET],
164fa5e4d32SSunny Srivastava             i_iterator[SPD_JEDEC_DDR4_SN_BYTE1_OFFSET],
165fa5e4d32SSunny Srivastava             i_iterator[SPD_JEDEC_DDR4_SN_BYTE2_OFFSET],
166fa5e4d32SSunny Srivastava             i_iterator[SPD_JEDEC_DDR4_SN_BYTE3_OFFSET]);
167fa5e4d32SSunny Srivastava     std::string l_serialNumber(l_tmpSN, sizeof(l_tmpSN) - 1);
168fa5e4d32SSunny Srivastava     return l_serialNumber;
169fa5e4d32SSunny Srivastava }
170fa5e4d32SSunny Srivastava 
getDDR4FruNumber(const std::string & i_partNumber,types::BinaryVector::const_iterator & i_iterator)171fa5e4d32SSunny Srivastava std::string_view JedecSpdParser::getDDR4FruNumber(
172fa5e4d32SSunny Srivastava     const std::string& i_partNumber,
173fa5e4d32SSunny Srivastava     types::BinaryVector::const_iterator& i_iterator)
174fa5e4d32SSunny Srivastava {
175fa5e4d32SSunny Srivastava     // check for 128GB ISRDIMM not implemented
176fa5e4d32SSunny Srivastava     //(128GB 2RX4(8GX72) IS RDIMM 36*(16GBIT, 2H),1.2V 288PIN,1.2" ROHS) - NA
177fa5e4d32SSunny Srivastava 
178fa5e4d32SSunny Srivastava     // MTB Units is used in deciding the frequency of the DIMM
179fa5e4d32SSunny Srivastava     // This is applicable only for DDR4 specification
180fa5e4d32SSunny Srivastava     // 10 - DDR4-1600
181fa5e4d32SSunny Srivastava     // 9  - DDR4-1866
182fa5e4d32SSunny Srivastava     // 8  - DDR4-2133
183fa5e4d32SSunny Srivastava     // 7  - DDR4-2400
184fa5e4d32SSunny Srivastava     // 6  - DDR4-2666
185fa5e4d32SSunny Srivastava     // 5  - DDR4-3200
186fa5e4d32SSunny Srivastava     // pnFreqFnMap < tuple <partNumber, MTBUnits>, fruNumber>
187fa5e4d32SSunny Srivastava     uint8_t l_mtbUnits = i_iterator[constants::SPD_BYTE_18] &
188fa5e4d32SSunny Srivastava                          constants::SPD_BYTE_MASK;
189fa5e4d32SSunny Srivastava     std::string l_fruNumber = "FFFFFFF";
190fa5e4d32SSunny Srivastava     auto it = pnFreqFnMap.find({i_partNumber, l_mtbUnits});
191fa5e4d32SSunny Srivastava     if (it != pnFreqFnMap.end())
192fa5e4d32SSunny Srivastava     {
193fa5e4d32SSunny Srivastava         l_fruNumber = it->second;
194fa5e4d32SSunny Srivastava     }
195fa5e4d32SSunny Srivastava 
196fa5e4d32SSunny Srivastava     return l_fruNumber;
197fa5e4d32SSunny Srivastava }
198fa5e4d32SSunny Srivastava 
getDDR4CCIN(const std::string & i_fruNumber)199fa5e4d32SSunny Srivastava std::string_view JedecSpdParser::getDDR4CCIN(const std::string& i_fruNumber)
200fa5e4d32SSunny Srivastava {
201fa5e4d32SSunny Srivastava     auto it = pnCCINMap.find(i_fruNumber);
202fa5e4d32SSunny Srivastava     if (it != pnCCINMap.end())
203fa5e4d32SSunny Srivastava     {
204fa5e4d32SSunny Srivastava         return it->second;
205fa5e4d32SSunny Srivastava     }
206fa5e4d32SSunny Srivastava     return "XXXX"; // Return default value as XXXX
207fa5e4d32SSunny Srivastava }
208fa5e4d32SSunny Srivastava 
getDDR4ManufacturerId()209*e606f061SPriyanga Ramasamy types::BinaryVector JedecSpdParser::getDDR4ManufacturerId()
210*e606f061SPriyanga Ramasamy {
211*e606f061SPriyanga Ramasamy     types::BinaryVector l_mfgId(SPD_JEDEC_DRAM_MANUFACTURER_ID_LENGTH);
212*e606f061SPriyanga Ramasamy 
213*e606f061SPriyanga Ramasamy     if (m_memSpd.size() < (SPD_JEDEC_DDR4_DRAM_MANUFACTURER_ID_OFFSET +
214*e606f061SPriyanga Ramasamy                            SPD_JEDEC_DRAM_MANUFACTURER_ID_LENGTH))
215*e606f061SPriyanga Ramasamy     {
216*e606f061SPriyanga Ramasamy         logging::logMessage(
217*e606f061SPriyanga Ramasamy             "VPD length is less than the offset of Manufacturer ID. Can't fetch it");
218*e606f061SPriyanga Ramasamy         return l_mfgId;
219*e606f061SPriyanga Ramasamy     }
220*e606f061SPriyanga Ramasamy 
221*e606f061SPriyanga Ramasamy     std::copy_n((m_memSpd.cbegin() +
222*e606f061SPriyanga Ramasamy                  SPD_JEDEC_DDR4_DRAM_MANUFACTURER_ID_OFFSET),
223*e606f061SPriyanga Ramasamy                 SPD_JEDEC_DRAM_MANUFACTURER_ID_LENGTH, l_mfgId.begin());
224*e606f061SPriyanga Ramasamy     return l_mfgId;
225*e606f061SPriyanga Ramasamy }
226*e606f061SPriyanga Ramasamy 
getDDR5DimmCapacity(types::BinaryVector::const_iterator & i_iterator)227fa5e4d32SSunny Srivastava auto JedecSpdParser::getDDR5DimmCapacity(
228fa5e4d32SSunny Srivastava     types::BinaryVector::const_iterator& i_iterator)
229fa5e4d32SSunny Srivastava {
230fa5e4d32SSunny Srivastava     // dummy implementation to be updated when required
231fa5e4d32SSunny Srivastava     size_t dimmSize = 0;
232fa5e4d32SSunny Srivastava     (void)i_iterator;
233fa5e4d32SSunny Srivastava     return dimmSize;
234fa5e4d32SSunny Srivastava }
235fa5e4d32SSunny Srivastava 
getDDR5PartNumber(types::BinaryVector::const_iterator & i_iterator)236fa5e4d32SSunny Srivastava auto JedecSpdParser::getDDR5PartNumber(
237fa5e4d32SSunny Srivastava     types::BinaryVector::const_iterator& i_iterator)
238fa5e4d32SSunny Srivastava {
239fa5e4d32SSunny Srivastava     // dummy implementation to be updated when required
240fa5e4d32SSunny Srivastava     std::string l_partNumber;
241fa5e4d32SSunny Srivastava     (void)i_iterator;
242fa5e4d32SSunny Srivastava     l_partNumber = "0123456";
243fa5e4d32SSunny Srivastava     return l_partNumber;
244fa5e4d32SSunny Srivastava }
245fa5e4d32SSunny Srivastava 
getDDR5SerialNumber(types::BinaryVector::const_iterator & i_iterator)246fa5e4d32SSunny Srivastava auto JedecSpdParser::getDDR5SerialNumber(
247fa5e4d32SSunny Srivastava     types::BinaryVector::const_iterator& i_iterator)
248fa5e4d32SSunny Srivastava {
249fa5e4d32SSunny Srivastava     // dummy implementation to be updated when required
250fa5e4d32SSunny Srivastava     std::string l_serialNumber;
251fa5e4d32SSunny Srivastava     (void)i_iterator;
252fa5e4d32SSunny Srivastava     l_serialNumber = "444444444444";
253fa5e4d32SSunny Srivastava     return l_serialNumber;
254fa5e4d32SSunny Srivastava }
255fa5e4d32SSunny Srivastava 
getDDR5FruNumber(const std::string & i_partNumber)256fa5e4d32SSunny Srivastava auto JedecSpdParser::getDDR5FruNumber(const std::string& i_partNumber)
257fa5e4d32SSunny Srivastava {
258fa5e4d32SSunny Srivastava     // dummy implementation to be updated when required
259fa5e4d32SSunny Srivastava     static std::unordered_map<std::string, std::string> pnFruMap = {
260fa5e4d32SSunny Srivastava         {"1234567", "XXXXXXX"}};
261fa5e4d32SSunny Srivastava 
262fa5e4d32SSunny Srivastava     std::string l_fruNumber;
263fa5e4d32SSunny Srivastava     auto itr = pnFruMap.find(i_partNumber);
264fa5e4d32SSunny Srivastava     if (itr != pnFruMap.end())
265fa5e4d32SSunny Srivastava     {
266fa5e4d32SSunny Srivastava         l_fruNumber = itr->second;
267fa5e4d32SSunny Srivastava     }
268fa5e4d32SSunny Srivastava     else
269fa5e4d32SSunny Srivastava     {
270fa5e4d32SSunny Srivastava         l_fruNumber = "FFFFFFF";
271fa5e4d32SSunny Srivastava     }
272fa5e4d32SSunny Srivastava     return l_fruNumber;
273fa5e4d32SSunny Srivastava }
274fa5e4d32SSunny Srivastava 
getDDR5CCIN(const std::string & i_partNumber)275fa5e4d32SSunny Srivastava auto JedecSpdParser::getDDR5CCIN(const std::string& i_partNumber)
276fa5e4d32SSunny Srivastava {
277fa5e4d32SSunny Srivastava     // dummy implementation to be updated when required
278fa5e4d32SSunny Srivastava     static std::unordered_map<std::string, std::string> pnCCINMap = {
279fa5e4d32SSunny Srivastava         {"1234567", "XXXX"}};
280fa5e4d32SSunny Srivastava 
281fa5e4d32SSunny Srivastava     std::string ccin = "XXXX";
282fa5e4d32SSunny Srivastava     auto itr = pnCCINMap.find(i_partNumber);
283fa5e4d32SSunny Srivastava     if (itr != pnCCINMap.end())
284fa5e4d32SSunny Srivastava     {
285fa5e4d32SSunny Srivastava         ccin = itr->second;
286fa5e4d32SSunny Srivastava     }
287fa5e4d32SSunny Srivastava     return ccin;
288fa5e4d32SSunny Srivastava }
289fa5e4d32SSunny Srivastava 
readKeywords(types::BinaryVector::const_iterator & i_iterator)290fa5e4d32SSunny Srivastava types::JedecSpdMap JedecSpdParser::readKeywords(
291fa5e4d32SSunny Srivastava     types::BinaryVector::const_iterator& i_iterator)
292fa5e4d32SSunny Srivastava {
293fa5e4d32SSunny Srivastava     types::JedecSpdMap l_keywordValueMap{};
294fa5e4d32SSunny Srivastava     size_t dimmSize = getDDR4DimmCapacity(i_iterator);
295fa5e4d32SSunny Srivastava     if (!dimmSize)
296fa5e4d32SSunny Srivastava     {
297fa5e4d32SSunny Srivastava         logging::logMessage("Error: Calculated dimm size is 0.");
298fa5e4d32SSunny Srivastava     }
299fa5e4d32SSunny Srivastava     else
300fa5e4d32SSunny Srivastava     {
301fa5e4d32SSunny Srivastava         l_keywordValueMap.emplace("MemorySizeInKB",
302fa5e4d32SSunny Srivastava                                   dimmSize * constants::CONVERT_MB_TO_KB);
303fa5e4d32SSunny Srivastava     }
304fa5e4d32SSunny Srivastava 
305fa5e4d32SSunny Srivastava     auto l_partNumber = getDDR4PartNumber(i_iterator);
306fa5e4d32SSunny Srivastava     auto l_fruNumber = getDDR4FruNumber(
307fa5e4d32SSunny Srivastava         std::string(l_partNumber.begin(), l_partNumber.end()), i_iterator);
308fa5e4d32SSunny Srivastava     auto l_serialNumber = getDDR4SerialNumber(i_iterator);
309fa5e4d32SSunny Srivastava     auto ccin =
310fa5e4d32SSunny Srivastava         getDDR4CCIN(std::string(l_fruNumber.begin(), l_fruNumber.end()));
311fa5e4d32SSunny Srivastava     // PN value is made same as FN value
312fa5e4d32SSunny Srivastava     auto l_displayPartNumber = l_fruNumber;
313*e606f061SPriyanga Ramasamy     auto l_mfgId = getDDR4ManufacturerId();
314*e606f061SPriyanga Ramasamy 
315fa5e4d32SSunny Srivastava     l_keywordValueMap.emplace("PN",
316fa5e4d32SSunny Srivastava                               move(std::string(l_displayPartNumber.begin(),
317fa5e4d32SSunny Srivastava                                                l_displayPartNumber.end())));
318fa5e4d32SSunny Srivastava     l_keywordValueMap.emplace(
319fa5e4d32SSunny Srivastava         "FN", move(std::string(l_fruNumber.begin(), l_fruNumber.end())));
320fa5e4d32SSunny Srivastava     l_keywordValueMap.emplace("SN", move(l_serialNumber));
321fa5e4d32SSunny Srivastava     l_keywordValueMap.emplace("CC",
322fa5e4d32SSunny Srivastava                               move(std::string(ccin.begin(), ccin.end())));
323*e606f061SPriyanga Ramasamy     l_keywordValueMap.emplace("DI", move(l_mfgId));
324fa5e4d32SSunny Srivastava 
325fa5e4d32SSunny Srivastava     return l_keywordValueMap;
326fa5e4d32SSunny Srivastava }
327fa5e4d32SSunny Srivastava 
parse()328fa5e4d32SSunny Srivastava types::VPDMapVariant JedecSpdParser::parse()
329fa5e4d32SSunny Srivastava {
330fa5e4d32SSunny Srivastava     // Read the data and return the map
331fa5e4d32SSunny Srivastava     auto l_iterator = m_memSpd.cbegin();
332fa5e4d32SSunny Srivastava     auto l_spdDataMap = readKeywords(l_iterator);
333fa5e4d32SSunny Srivastava     return l_spdDataMap;
334fa5e4d32SSunny Srivastava }
335fa5e4d32SSunny Srivastava 
336fa5e4d32SSunny Srivastava } // namespace vpd
337