1 #pragma once
2 
3 #include "bcd_time.hpp"
4 #include "section.hpp"
5 #include "stream.hpp"
6 
7 namespace openpower
8 {
9 namespace pels
10 {
11 
12 struct CreatorVersion
13 {
14     uint8_t version[8];
15 };
16 
17 static constexpr uint16_t privateHeaderSectionID = 0x5048; // 'PH'
18 static constexpr uint16_t privateHeaderVersion = 0x01;
19 static constexpr uint8_t minSectionCount = 2;
20 
21 /**
22  * @class PrivateHeader
23  *
24  * This represents the Private Header section in a PEL.  It is required,
25  * and it is always the first section.
26  *
27  * The Section base class handles the section header structure that every
28  * PEL section has at offset zero.
29  *
30  * The fields in this class directly correspond to the order and sizes of
31  * the fields in the section.
32  */
33 class PrivateHeader : public Section
34 {
35   public:
36     PrivateHeader() = delete;
37     ~PrivateHeader() = default;
38     PrivateHeader(const PrivateHeader&) = default;
39     PrivateHeader& operator=(const PrivateHeader&) = default;
40     PrivateHeader(PrivateHeader&&) = default;
41     PrivateHeader& operator=(PrivateHeader&&) = default;
42 
43     /**
44      * @brief Constructor
45      *
46      * Fills in this class's data fields from the stream.
47      *
48      * @param[in] pel - the PEL data stream
49      *
50      */
51     explicit PrivateHeader(Stream& pel);
52 
53     /**
54      * @brief Returns the creation timestamp
55      *
56      * @return BCDTime& - the timestamp
57      */
58     BCDTime& createTimestamp()
59     {
60         return _createTimestamp;
61     }
62 
63     /**
64      * @brief Returns the commit time timestamp
65      *
66      * @return BCDTime& - the timestamp
67      */
68     BCDTime& commitTimestamp()
69     {
70         return _commitTimestamp;
71     }
72 
73     /**
74      * @brief Returns the creator ID field
75      *
76      * @return uint8_t& - the creator ID
77      */
78     uint8_t& creatorID()
79     {
80         return _creatorID;
81     }
82 
83     /**
84      * @brief Returns the log type field
85      *
86      * @return uint8_t& - the log type
87      */
88     uint8_t& logType()
89     {
90         return _logType;
91     }
92 
93     /**
94      * @brief Returns the section count field
95      *
96      * @return uint8_t& - the section count
97      */
98     uint8_t& sectionCount()
99     {
100         return _sectionCount;
101     }
102 
103     /**
104      * @brief Returns the OpenBMC log ID field
105      *
106      * This is the ID the OpenBMC event log that corresponds
107      * to this PEL.
108      *
109      * @return uint32_t& - the OpenBMC event log ID
110      */
111     uint32_t& obmcLogID()
112     {
113         return _obmcLogID;
114     }
115 
116     /**
117      * @brief Returns the Creator Version field
118      *
119      * @return CreatorVersion& - the creator version
120      */
121     CreatorVersion& creatorVersion()
122     {
123         return _creatorVersion;
124     }
125 
126     /**
127      * @brief Returns the error log ID field
128      *
129      * @return uint32_t& - the error log ID
130      */
131     uint32_t& id()
132     {
133         return _id;
134     }
135 
136     /**
137      * @brief Returns the platform log ID field
138      *
139      * @return uint32_t& - the platform log ID
140      */
141     uint32_t& plid()
142     {
143         return _plid;
144     }
145 
146     /**
147      * @brief Returns the size of this section when flattened into a PEL
148      *
149      * @return size_t - the size of the section
150      */
151     static constexpr size_t flattenedSize()
152     {
153         return Section::flattenedSize() + sizeof(_createTimestamp) +
154                sizeof(_commitTimestamp) + sizeof(_creatorID) +
155                sizeof(_logType) + sizeof(_reservedByte) +
156                sizeof(_sectionCount) + sizeof(_obmcLogID) +
157                sizeof(_creatorVersion) + sizeof(_plid) + sizeof(_id);
158     }
159 
160     friend Stream& operator>>(Stream& s, PrivateHeader& ph);
161     friend Stream& operator<<(Stream& s, PrivateHeader& ph);
162 
163   private:
164     /**
165      * @brief Validates the section contents
166      *
167      * Updates _valid (in Section) with the results.
168      */
169     void validate() override;
170 
171     /**
172      * @brief The creation time timestamp
173      */
174     BCDTime _createTimestamp;
175 
176     /**
177      * @brief The commit time timestamp
178      */
179     BCDTime _commitTimestamp;
180 
181     /**
182      * @brief The creator ID field
183      */
184     uint8_t _creatorID;
185 
186     /**
187      * @brief The log type field
188      */
189     uint8_t _logType;
190 
191     /**
192      * @brief A reserved byte.
193      */
194     uint8_t _reservedByte;
195 
196     /**
197      * @brief The section count field, which is the total number
198      * of sections in the PEL.
199      */
200     uint8_t _sectionCount;
201 
202     /**
203      * @brief The OpenBMC event log ID that corresponds to this PEL.
204      */
205     uint32_t _obmcLogID;
206 
207     /**
208      * @brief The creator subsystem version field
209      */
210     CreatorVersion _creatorVersion;
211 
212     /**
213      * @brief The platform log ID field
214      */
215     uint32_t _plid;
216 
217     /**
218      * @brief The log entry ID field
219      */
220     uint32_t _id;
221 };
222 
223 /**
224  * @brief Stream extraction operator for the PrivateHeader
225  *
226  * @param[in] s - the stream
227  * @param[out] ph - the PrivateHeader object
228  */
229 Stream& operator>>(Stream& s, PrivateHeader& ph);
230 
231 /**
232  * @brief Stream insertion operator for the PrivateHeader
233  *
234  * @param[out] s - the stream
235  * @param[in] ph - the PrivateHeader object
236  */
237 Stream& operator<<(Stream& s, PrivateHeader& ph);
238 
239 /**
240  * @brief Stream extraction operator for the CreatorVersion
241  *
242  * @param[in] s - the stream
243  * @param[out] cv - the CreatorVersion object
244  */
245 Stream& operator>>(Stream& s, CreatorVersion& cv);
246 
247 /**
248  * @brief Stream insertion operator for the CreatorVersion
249  *
250  * @param[out] s - the stream
251  * @param[in] cv - the CreatorVersion object
252  */
253 Stream& operator<<(Stream& s, CreatorVersion& cv);
254 
255 } // namespace pels
256 } // namespace openpower
257