xref: /openbmc/openpower-vpd-parser/vpd-manager/include/ddimm_parser.hpp (revision fa5e4d325ef9cea3c841fe89d202c340f92bd8c6)
1 #pragma once
2 
3 #include "constants.hpp"
4 #include "exceptions.hpp"
5 #include "logger.hpp"
6 #include "parser_interface.hpp"
7 #include "types.hpp"
8 
9 namespace vpd
10 {
11 /**
12  * @brief Concrete class to implement DDIMM VPD parsing.
13  *
14  * The class inherits ParserInterface interface class and overrides the parser
15  * functionality to implement parsing logic for DDIMM VPD format.
16  */
17 class DdimmVpdParser : public ParserInterface
18 {
19   public:
20     // Deleted API's
21     DdimmVpdParser() = delete;
22     DdimmVpdParser(const DdimmVpdParser&) = delete;
23     DdimmVpdParser& operator=(const DdimmVpdParser&) = delete;
24     DdimmVpdParser(DdimmVpdParser&&) = delete;
25     DdimmVpdParser& operator=(DdimmVpdParser&&) = delete;
26 
27     /**
28      * @brief Defaul destructor.
29      */
30     ~DdimmVpdParser() = default;
31 
32     /**
33      * @brief Constructor
34      *
35      * @param[in] i_vpdVector - VPD data.
36      */
DdimmVpdParser(const types::BinaryVector & i_vpdVector)37     DdimmVpdParser(const types::BinaryVector& i_vpdVector) :
38         m_vpdVector(i_vpdVector)
39     {
40         if ((constants::DDIMM_11S_BARCODE_START +
41              constants::DDIMM_11S_BARCODE_LEN) > m_vpdVector.size())
42         {
43             throw(DataException("Malformed DDIMM VPD"));
44         }
45     }
46 
47     /**
48      * @brief API to parse DDIMM VPD file.
49      *
50      * @return parsed VPD data
51      */
52     virtual types::VPDMapVariant parse() override;
53 
54   private:
55     /**
56      * @brief API to read keyword data based on the type DDR4/DDR5.
57      *
58      * Updates the m_parsedVpdMap with read keyword data.
59      * @param[in] i_iterator - iterator to buffer containing VPD
60      */
61     void readKeywords(types::BinaryVector::const_iterator i_iterator);
62 
63     /**
64      * @brief API to calculate DDIMM size from DDIMM VPD
65      *
66      * @param[in] i_iterator - iterator to buffer containing VPD
67      * @return calculated size or 0 in case of any error.
68      */
69     size_t getDdimmSize(types::BinaryVector::const_iterator i_iterator);
70 
71     /**
72      * @brief This function calculates DDR5 based DDIMM's capacity
73      *
74      * @param[in] i_iterator - iterator to buffer containing VPD
75      * @return calculated size or 0 in case of any error.
76      */
77     size_t
78         getDdr5BasedDdimmSize(types::BinaryVector::const_iterator i_iterator);
79 
80     /**
81      * @brief This function calculates DDR4 based DDIMM's capacity
82      *
83      * @param[in] i_iterator - iterator to buffer containing VPD
84      * @return calculated size or 0 in case of any error.
85      */
86     size_t
87         getDdr4BasedDdimmSize(types::BinaryVector::const_iterator i_iterator);
88 
89     /**
90      * @brief This function calculates DDR5 based die per package
91      *
92      * @param[in] i_ByteValue - the bit value for calculation
93      * @return die per package value.
94      */
95     uint8_t getDdr5DiePerPackage(uint8_t i_ByteValue);
96 
97     /**
98      * @brief This function calculates DDR5 based density per die
99      *
100      * @param[in] i_ByteValue - the bit value for calculation
101      * @return density per die.
102      */
103     uint8_t getDdr5DensityPerDie(uint8_t i_ByteValue);
104 
105     /**
106      * @brief This function checks the validity of the bits
107      *
108      * @param[in] i_ByteValue - the byte value with relevant bits
109      * @param[in] i_shift - shifter value to selects needed bits
110      * @param[in] i_minValue - minimum value it can contain
111      * @param[in] i_maxValue - maximum value it can contain
112      * @return true if valid else false.
113      */
114     bool checkValidValue(uint8_t i_ByteValue, uint8_t i_shift,
115                          uint8_t i_minValue, uint8_t i_maxValue);
116 
117     // VPD file to be parsed
118     const types::BinaryVector& m_vpdVector;
119 
120     // Stores parsed VPD data.
121     types::DdimmVpdMap m_parsedVpdMap{};
122 };
123 } // namespace vpd
124