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