1*e12b181bSSunnySrivastava1984 #pragma once
2*e12b181bSSunnySrivastava1984 
3*e12b181bSSunnySrivastava1984 #include "parser_interface.hpp"
4*e12b181bSSunnySrivastava1984 #include "types.hpp"
5*e12b181bSSunnySrivastava1984 
6*e12b181bSSunnySrivastava1984 namespace vpd
7*e12b181bSSunnySrivastava1984 {
8*e12b181bSSunnySrivastava1984 namespace keyword
9*e12b181bSSunnySrivastava1984 {
10*e12b181bSSunnySrivastava1984 namespace parser
11*e12b181bSSunnySrivastava1984 {
12*e12b181bSSunnySrivastava1984 
13*e12b181bSSunnySrivastava1984 using ParserInterface = openpower::vpd::parser::interface::ParserInterface;
14*e12b181bSSunnySrivastava1984 using kwdVpdMap = openpower::vpd::inventory::KeywordVpdMap;
15*e12b181bSSunnySrivastava1984 using store = openpower::vpd::Store;
16*e12b181bSSunnySrivastava1984 
17*e12b181bSSunnySrivastava1984 /**
18*e12b181bSSunnySrivastava1984  * @class KeywordVpdParser
19*e12b181bSSunnySrivastava1984  * @brief Implements parser for Keyword VPD
20*e12b181bSSunnySrivastava1984  *
21*e12b181bSSunnySrivastava1984  * KeywordVpdParser object must be constructed by passing in
22*e12b181bSSunnySrivastava1984  * Keyword VPD in binary format. To parse the VPD, call the
23*e12b181bSSunnySrivastava1984  * kwVpdParser() method. The kwVpdParser() method returns
24*e12b181bSSunnySrivastava1984  * a map of keyword-value pairs.
25*e12b181bSSunnySrivastava1984  *
26*e12b181bSSunnySrivastava1984  * Following is the algorithm used to parse Keyword VPD data:
27*e12b181bSSunnySrivastava1984  * 1) Validate if the first byte is 'largeResourceIdentifierString'.
28*e12b181bSSunnySrivastava1984  * 2) Validate the byte after the description is 'vendor defined large resource
29*e12b181bSSunnySrivastava1984  * type tag'.
30*e12b181bSSunnySrivastava1984  * 3) For each keyword-value pairs :
31*e12b181bSSunnySrivastava1984  * 	3.1) Parse the 2 byte length keyword and emplace it in the map as 'key'.
32*e12b181bSSunnySrivastava1984  * 	3.2) Parse over the value bytes corresponding to the keyword and
33*e12b181bSSunnySrivastava1984  * 	     emplace it in the map as 'value' for the key inserted in 3.1.
34*e12b181bSSunnySrivastava1984  * 4) Validate the byte before checksum byte is 'small resource type end tag'.
35*e12b181bSSunnySrivastava1984  * 5) Validate the checksum.
36*e12b181bSSunnySrivastava1984  * 6) Validate the 'small resource type last end tag'.
37*e12b181bSSunnySrivastava1984  * 7) Return the keyword-value map.
38*e12b181bSSunnySrivastava1984  */
39*e12b181bSSunnySrivastava1984 class KeywordVpdParser : public ParserInterface
40*e12b181bSSunnySrivastava1984 {
41*e12b181bSSunnySrivastava1984   public:
42*e12b181bSSunnySrivastava1984     KeywordVpdParser() = delete;
43*e12b181bSSunnySrivastava1984     KeywordVpdParser(const KeywordVpdParser&) = delete;
44*e12b181bSSunnySrivastava1984     KeywordVpdParser(KeywordVpdParser&&) = delete;
45*e12b181bSSunnySrivastava1984     ~KeywordVpdParser() = default;
46*e12b181bSSunnySrivastava1984 
47*e12b181bSSunnySrivastava1984     /**
48*e12b181bSSunnySrivastava1984      * @brief Constructor
49*e12b181bSSunnySrivastava1984      *
50*e12b181bSSunnySrivastava1984      * Move kwVpdVector to parser object's kwVpdVector
51*e12b181bSSunnySrivastava1984      */
52*e12b181bSSunnySrivastava1984     KeywordVpdParser(openpower::vpd::Binary&& kwVpdVector) :
53*e12b181bSSunnySrivastava1984         keywordVpdVector(std::move(kwVpdVector))
54*e12b181bSSunnySrivastava1984     {
55*e12b181bSSunnySrivastava1984     }
56*e12b181bSSunnySrivastava1984 
57*e12b181bSSunnySrivastava1984     /**
58*e12b181bSSunnySrivastava1984      * @brief Parse the keyword VPD binary data.
59*e12b181bSSunnySrivastava1984      * Calls the sub functions to emplace the
60*e12b181bSSunnySrivastava1984      * keyword-value pairs in map and to validate
61*e12b181bSSunnySrivastava1984      * certain tags and checksum data.
62*e12b181bSSunnySrivastava1984      *
63*e12b181bSSunnySrivastava1984      * @return map of keyword:value
64*e12b181bSSunnySrivastava1984      */
65*e12b181bSSunnySrivastava1984     std::variant<kwdVpdMap, store> parse();
66*e12b181bSSunnySrivastava1984 
67*e12b181bSSunnySrivastava1984     /**
68*e12b181bSSunnySrivastava1984      * @brief An api to return interface name with respect to
69*e12b181bSSunnySrivastava1984      * the parser selected.
70*e12b181bSSunnySrivastava1984      *
71*e12b181bSSunnySrivastava1984      * @return - Interface name for that vpd type.
72*e12b181bSSunnySrivastava1984      */
73*e12b181bSSunnySrivastava1984     std::string getInterfaceName() const;
74*e12b181bSSunnySrivastava1984 
75*e12b181bSSunnySrivastava1984   private:
76*e12b181bSSunnySrivastava1984     openpower::vpd::Binary::iterator
77*e12b181bSSunnySrivastava1984         checkSumStart; //!< Pointer to the start byte from where
78*e12b181bSSunnySrivastava1984                        //!< the checksum need to be calculated
79*e12b181bSSunnySrivastava1984     openpower::vpd::Binary::iterator
80*e12b181bSSunnySrivastava1984         checkSumEnd; //!< Pointer to the end byte until which the
81*e12b181bSSunnySrivastava1984                      //!< checksum need to be calculated
82*e12b181bSSunnySrivastava1984     openpower::vpd::Binary::iterator
83*e12b181bSSunnySrivastava1984         kwVpdIterator; //!< Iterator to parse the vector
84*e12b181bSSunnySrivastava1984     openpower::vpd::Binary
85*e12b181bSSunnySrivastava1984         keywordVpdVector; //!< Vector which stores keyword VPD data
86*e12b181bSSunnySrivastava1984 
87*e12b181bSSunnySrivastava1984     /**
88*e12b181bSSunnySrivastava1984      * @brief Validate the large resource identifier string
89*e12b181bSSunnySrivastava1984      */
90*e12b181bSSunnySrivastava1984     void validateLargeResourceIdentifierString();
91*e12b181bSSunnySrivastava1984 
92*e12b181bSSunnySrivastava1984     /**
93*e12b181bSSunnySrivastava1984      * @brief Validate the type of keyword VPD
94*e12b181bSSunnySrivastava1984      *
95*e12b181bSSunnySrivastava1984      * @return integer representing the type of kw VPD.
96*e12b181bSSunnySrivastava1984      */
97*e12b181bSSunnySrivastava1984     int validateTheTypeOfKwVpd();
98*e12b181bSSunnySrivastava1984 
99*e12b181bSSunnySrivastava1984     /**
100*e12b181bSSunnySrivastava1984      * @brief Parsing keyword-value pairs and emplace into Map.
101*e12b181bSSunnySrivastava1984      *
102*e12b181bSSunnySrivastava1984      * @return map of keyword:value
103*e12b181bSSunnySrivastava1984      */
104*e12b181bSSunnySrivastava1984     openpower::vpd::inventory::KeywordVpdMap kwValParser();
105*e12b181bSSunnySrivastava1984 
106*e12b181bSSunnySrivastava1984     /**
107*e12b181bSSunnySrivastava1984      * @brief Validate small resource type end tag
108*e12b181bSSunnySrivastava1984      */
109*e12b181bSSunnySrivastava1984     void validateSmallResourceTypeEnd();
110*e12b181bSSunnySrivastava1984 
111*e12b181bSSunnySrivastava1984     /**
112*e12b181bSSunnySrivastava1984      * @brief Validate checksum.
113*e12b181bSSunnySrivastava1984      *
114*e12b181bSSunnySrivastava1984      * Finding the 2's complement of sum of all the
115*e12b181bSSunnySrivastava1984      * keywords,values and large resource identifier string.
116*e12b181bSSunnySrivastava1984      */
117*e12b181bSSunnySrivastava1984     void validateChecksum();
118*e12b181bSSunnySrivastava1984 
119*e12b181bSSunnySrivastava1984     /**
120*e12b181bSSunnySrivastava1984      * @brief Validate small resource type last end tag
121*e12b181bSSunnySrivastava1984      */
122*e12b181bSSunnySrivastava1984     void validateSmallResourceTypeLastEnd();
123*e12b181bSSunnySrivastava1984 
124*e12b181bSSunnySrivastava1984     /**
125*e12b181bSSunnySrivastava1984      * @brief Get the size of the keyword
126*e12b181bSSunnySrivastava1984      *
127*e12b181bSSunnySrivastava1984      * @return one byte length size data
128*e12b181bSSunnySrivastava1984      */
129*e12b181bSSunnySrivastava1984     size_t getKwDataSize();
130*e12b181bSSunnySrivastava1984 
131*e12b181bSSunnySrivastava1984     /**
132*e12b181bSSunnySrivastava1984      * @brief Check for iterator Out of Bound exception
133*e12b181bSSunnySrivastava1984      *
134*e12b181bSSunnySrivastava1984      * Check if no.of elements from (begining of the vector) to (iterator +
135*e12b181bSSunnySrivastava1984      * incVar) is lesser than or equal to the total no.of elements in the
136*e12b181bSSunnySrivastava1984      * vector. This check is performed before the advancement of the iterator.
137*e12b181bSSunnySrivastava1984      *
138*e12b181bSSunnySrivastava1984      * @param[incVar] - no.of positions the iterator is going to be iterated
139*e12b181bSSunnySrivastava1984      */
140*e12b181bSSunnySrivastava1984     void itrOutOfBoundCheck(uint8_t incVar);
141*e12b181bSSunnySrivastava1984 };
142*e12b181bSSunnySrivastava1984 } // namespace parser
143*e12b181bSSunnySrivastava1984 } // namespace keyword
144*e12b181bSSunnySrivastava1984 } // namespace vpd
145