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];
15289aa477SMatt Spinler 
CreatorVersionopenpower::pels::CreatorVersion16289aa477SMatt Spinler     CreatorVersion()
17289aa477SMatt Spinler     {
18289aa477SMatt Spinler         memset(version, '\0', sizeof(version));
19289aa477SMatt 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      *
50289aa477SMatt Spinler      * Creates a valid PrivateHeader with the passed in data
51289aa477SMatt Spinler      *
52289aa477SMatt Spinler      * @param[in] componentID - the creator's component ID
53289aa477SMatt Spinler      * @param[in] obmcLogID - the corresponding OpenBMC event log ID
54289aa477SMatt Spinler      * @param[in] timestamp - the creation timestamp, in epoch milliseconds
55289aa477SMatt Spinler      */
56289aa477SMatt Spinler     PrivateHeader(uint16_t componentID, uint32_t obmcLogID, uint64_t timestamp);
57289aa477SMatt Spinler 
58289aa477SMatt Spinler     /**
59289aa477SMatt Spinler      * @brief Constructor
60289aa477SMatt 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      */
730688545bSMatt Spinler     void flatten(Stream& stream) const override;
74cf5a8d0fSMatt Spinler 
75cf5a8d0fSMatt Spinler     /**
76d3335dfaSMatt Spinler      * @brief Returns the creation timestamp
77d3335dfaSMatt Spinler      *
7897d19b48SMatt Spinler      * @return const BCDTime& - the timestamp
79d3335dfaSMatt Spinler      */
createTimestamp() const8097d19b48SMatt Spinler     const BCDTime& createTimestamp() const
81d3335dfaSMatt Spinler     {
82d3335dfaSMatt Spinler         return _createTimestamp;
83d3335dfaSMatt Spinler     }
84d3335dfaSMatt Spinler 
85d3335dfaSMatt Spinler     /**
86d3335dfaSMatt Spinler      * @brief Returns the commit time timestamp
87d3335dfaSMatt Spinler      *
8897d19b48SMatt Spinler      * @return const BCDTime& - the timestamp
89d3335dfaSMatt Spinler      */
commitTimestamp() const9097d19b48SMatt Spinler     const BCDTime& commitTimestamp() const
91d3335dfaSMatt Spinler     {
92d3335dfaSMatt Spinler         return _commitTimestamp;
93d3335dfaSMatt Spinler     }
94d3335dfaSMatt Spinler 
95d3335dfaSMatt Spinler     /**
9697d19b48SMatt Spinler      * @brief Sets the commit timestamp
9797d19b48SMatt Spinler      *
9897d19b48SMatt Spinler      * @param[in] time - the new timestamp
9997d19b48SMatt Spinler      */
setCommitTimestamp(const BCDTime & time)10097d19b48SMatt Spinler     void setCommitTimestamp(const BCDTime& time)
10197d19b48SMatt Spinler     {
10297d19b48SMatt Spinler         _commitTimestamp = time;
10397d19b48SMatt Spinler     }
10497d19b48SMatt Spinler 
10597d19b48SMatt Spinler     /**
106d3335dfaSMatt Spinler      * @brief Returns the creator ID field
107d3335dfaSMatt Spinler      *
10897d19b48SMatt Spinler      * @return uint8_t - the creator ID
109d3335dfaSMatt Spinler      */
creatorID() const11097d19b48SMatt Spinler     uint8_t creatorID() const
111d3335dfaSMatt Spinler     {
112d3335dfaSMatt Spinler         return _creatorID;
113d3335dfaSMatt Spinler     }
114d3335dfaSMatt Spinler 
115d3335dfaSMatt Spinler     /**
116d3335dfaSMatt Spinler      * @brief Returns the log type field
117d3335dfaSMatt Spinler      *
11897d19b48SMatt Spinler      * @return uint8_t - the log type
119d3335dfaSMatt Spinler      */
logType() const12097d19b48SMatt Spinler     uint8_t logType() const
121d3335dfaSMatt Spinler     {
122d3335dfaSMatt Spinler         return _logType;
123d3335dfaSMatt Spinler     }
124d3335dfaSMatt Spinler 
125d3335dfaSMatt Spinler     /**
126d3335dfaSMatt Spinler      * @brief Returns the section count field
127d3335dfaSMatt Spinler      *
12897d19b48SMatt Spinler      * @return uint8_t - the section count
129d3335dfaSMatt Spinler      */
sectionCount() const13097d19b48SMatt Spinler     uint8_t sectionCount() const
131d3335dfaSMatt Spinler     {
132d3335dfaSMatt Spinler         return _sectionCount;
133d3335dfaSMatt Spinler     }
134d3335dfaSMatt Spinler 
135d3335dfaSMatt Spinler     /**
13697d19b48SMatt Spinler      * @brief Sets the section count field
13797d19b48SMatt Spinler      *
13897d19b48SMatt Spinler      * @param[in] count - the new section count
13997d19b48SMatt Spinler      */
setSectionCount(uint8_t count)14097d19b48SMatt Spinler     void setSectionCount(uint8_t count)
14197d19b48SMatt Spinler     {
14297d19b48SMatt Spinler         _sectionCount = count;
14397d19b48SMatt Spinler     }
14497d19b48SMatt Spinler 
14597d19b48SMatt Spinler     /**
146d3335dfaSMatt Spinler      * @brief Returns the OpenBMC log ID field
147d3335dfaSMatt Spinler      *
148d3335dfaSMatt Spinler      * This is the ID the OpenBMC event log that corresponds
149d3335dfaSMatt Spinler      * to this PEL.
150d3335dfaSMatt Spinler      *
15197d19b48SMatt Spinler      * @return uint32_t - the OpenBMC event log ID
152d3335dfaSMatt Spinler      */
obmcLogID() const15397d19b48SMatt Spinler     uint32_t obmcLogID() const
154d3335dfaSMatt Spinler     {
155d3335dfaSMatt Spinler         return _obmcLogID;
156d3335dfaSMatt Spinler     }
157d3335dfaSMatt Spinler 
158d3335dfaSMatt Spinler     /**
15997d19b48SMatt Spinler      * @brief Sets the OpenBMC log ID field
16097d19b48SMatt Spinler      *
16197d19b48SMatt Spinler      * @param[in] id - the new ID
16297d19b48SMatt Spinler      */
setOBMCLogID(uint32_t id)16397d19b48SMatt Spinler     void setOBMCLogID(uint32_t id)
16497d19b48SMatt Spinler     {
16597d19b48SMatt Spinler         _obmcLogID = id;
16697d19b48SMatt Spinler     }
16797d19b48SMatt Spinler 
16897d19b48SMatt Spinler     /**
169d3335dfaSMatt Spinler      * @brief Returns the Creator Version field
170d3335dfaSMatt Spinler      *
171d3335dfaSMatt Spinler      * @return CreatorVersion& - the creator version
172d3335dfaSMatt Spinler      */
creatorVersion() const1730688545bSMatt Spinler     const CreatorVersion& creatorVersion() const
174d3335dfaSMatt Spinler     {
175d3335dfaSMatt Spinler         return _creatorVersion;
176d3335dfaSMatt Spinler     }
177d3335dfaSMatt Spinler 
178d3335dfaSMatt Spinler     /**
179d3335dfaSMatt Spinler      * @brief Returns the error log ID field
180d3335dfaSMatt Spinler      *
18197d19b48SMatt Spinler      * @return uint32_t - the error log ID
182d3335dfaSMatt Spinler      */
id() const18397d19b48SMatt Spinler     uint32_t id() const
184d3335dfaSMatt Spinler     {
185d3335dfaSMatt Spinler         return _id;
186d3335dfaSMatt Spinler     }
187d3335dfaSMatt Spinler 
188d3335dfaSMatt Spinler     /**
18997d19b48SMatt Spinler      * @brief Sets the ID field
19097d19b48SMatt Spinler      *
19197d19b48SMatt Spinler      * @param[in] id - the new ID
19297d19b48SMatt Spinler      */
setID(uint32_t id)19397d19b48SMatt Spinler     void setID(uint32_t id)
19497d19b48SMatt Spinler     {
19597d19b48SMatt Spinler         _id = id;
19697d19b48SMatt Spinler     }
19797d19b48SMatt Spinler 
19897d19b48SMatt Spinler     /**
199d3335dfaSMatt Spinler      * @brief Returns the platform log ID field
200d3335dfaSMatt Spinler      *
20197d19b48SMatt Spinler      * @return uint32_t - the platform log ID
202d3335dfaSMatt Spinler      */
plid() const20397d19b48SMatt Spinler     uint32_t plid() const
204d3335dfaSMatt Spinler     {
205d3335dfaSMatt Spinler         return _plid;
206d3335dfaSMatt Spinler     }
207d3335dfaSMatt Spinler 
208d3335dfaSMatt Spinler     /**
209d3335dfaSMatt Spinler      * @brief Returns the size of this section when flattened into a PEL
210d3335dfaSMatt Spinler      *
211d3335dfaSMatt Spinler      * @return size_t - the size of the section
212d3335dfaSMatt Spinler      */
flattenedSize()213d3335dfaSMatt Spinler     static constexpr size_t flattenedSize()
214d3335dfaSMatt Spinler     {
215d3335dfaSMatt Spinler         return Section::flattenedSize() + sizeof(_createTimestamp) +
216d3335dfaSMatt Spinler                sizeof(_commitTimestamp) + sizeof(_creatorID) +
217d3335dfaSMatt Spinler                sizeof(_logType) + sizeof(_reservedByte) +
218d3335dfaSMatt Spinler                sizeof(_sectionCount) + sizeof(_obmcLogID) +
219d3335dfaSMatt Spinler                sizeof(_creatorVersion) + sizeof(_plid) + sizeof(_id);
220d3335dfaSMatt Spinler     }
221d3335dfaSMatt Spinler 
222c92b4eb4SAatir     /**
223c92b4eb4SAatir      * @brief Get section in JSON.
224*b832aa5eSMatt Spinler      *
225*b832aa5eSMatt Spinler      * @param[in] creatorID - The creator ID for the PEL
226*b832aa5eSMatt Spinler      *
227c92b4eb4SAatir      * @return std::optional<std::string> - Private header section's JSON
228c92b4eb4SAatir      */
229*b832aa5eSMatt Spinler     std::optional<std::string> getJSON(uint8_t creatorID) const override;
230c92b4eb4SAatir 
231d3335dfaSMatt Spinler   private:
232d3335dfaSMatt Spinler     /**
233cf5a8d0fSMatt Spinler      * @brief Fills in the object from the stream data
234cf5a8d0fSMatt Spinler      *
235cf5a8d0fSMatt Spinler      * @param[in] stream - The stream to read from
236cf5a8d0fSMatt Spinler      */
237cf5a8d0fSMatt Spinler     void unflatten(Stream& stream);
238cf5a8d0fSMatt Spinler 
239cf5a8d0fSMatt Spinler     /**
240d3335dfaSMatt Spinler      * @brief Validates the section contents
241d3335dfaSMatt Spinler      *
242d3335dfaSMatt Spinler      * Updates _valid (in Section) with the results.
243d3335dfaSMatt Spinler      */
244d3335dfaSMatt Spinler     void validate() override;
245d3335dfaSMatt Spinler 
246d3335dfaSMatt Spinler     /**
247d3335dfaSMatt Spinler      * @brief The creation time timestamp
248d3335dfaSMatt Spinler      */
249d3335dfaSMatt Spinler     BCDTime _createTimestamp;
250d3335dfaSMatt Spinler 
251d3335dfaSMatt Spinler     /**
252d3335dfaSMatt Spinler      * @brief The commit time timestamp
253d3335dfaSMatt Spinler      */
254d3335dfaSMatt Spinler     BCDTime _commitTimestamp;
255d3335dfaSMatt Spinler 
256d3335dfaSMatt Spinler     /**
257d3335dfaSMatt Spinler      * @brief The creator ID field
258d3335dfaSMatt Spinler      */
259d3335dfaSMatt Spinler     uint8_t _creatorID;
260d3335dfaSMatt Spinler 
261d3335dfaSMatt Spinler     /**
262d3335dfaSMatt Spinler      * @brief The log type field
263d3335dfaSMatt Spinler      */
264d3335dfaSMatt Spinler     uint8_t _logType;
265d3335dfaSMatt Spinler 
266d3335dfaSMatt Spinler     /**
267d3335dfaSMatt Spinler      * @brief A reserved byte.
268d3335dfaSMatt Spinler      */
269d3335dfaSMatt Spinler     uint8_t _reservedByte;
270d3335dfaSMatt Spinler 
271d3335dfaSMatt Spinler     /**
272d3335dfaSMatt Spinler      * @brief The section count field, which is the total number
273d3335dfaSMatt Spinler      * of sections in the PEL.
274d3335dfaSMatt Spinler      */
275d3335dfaSMatt Spinler     uint8_t _sectionCount;
276d3335dfaSMatt Spinler 
277d3335dfaSMatt Spinler     /**
278d3335dfaSMatt Spinler      * @brief The OpenBMC event log ID that corresponds to this PEL.
279d3335dfaSMatt Spinler      */
280d3335dfaSMatt Spinler     uint32_t _obmcLogID;
281d3335dfaSMatt Spinler 
282d3335dfaSMatt Spinler     /**
283d3335dfaSMatt Spinler      * @brief The creator subsystem version field
284d3335dfaSMatt Spinler      */
285d3335dfaSMatt Spinler     CreatorVersion _creatorVersion;
286d3335dfaSMatt Spinler 
287d3335dfaSMatt Spinler     /**
288d3335dfaSMatt Spinler      * @brief The platform log ID field
289d3335dfaSMatt Spinler      */
290d3335dfaSMatt Spinler     uint32_t _plid;
291d3335dfaSMatt Spinler 
292d3335dfaSMatt Spinler     /**
293d3335dfaSMatt Spinler      * @brief The log entry ID field
294d3335dfaSMatt Spinler      */
295d3335dfaSMatt Spinler     uint32_t _id;
296d3335dfaSMatt Spinler };
297d3335dfaSMatt Spinler 
298d3335dfaSMatt Spinler /**
299d3335dfaSMatt Spinler  * @brief Stream extraction operator for the CreatorVersion
300d3335dfaSMatt Spinler  *
301d3335dfaSMatt Spinler  * @param[in] s - the stream
302d3335dfaSMatt Spinler  * @param[out] cv - the CreatorVersion object
303d3335dfaSMatt Spinler  */
304d3335dfaSMatt Spinler Stream& operator>>(Stream& s, CreatorVersion& cv);
305d3335dfaSMatt Spinler 
306d3335dfaSMatt Spinler /**
307d3335dfaSMatt Spinler  * @brief Stream insertion operator for the CreatorVersion
308d3335dfaSMatt Spinler  *
309d3335dfaSMatt Spinler  * @param[out] s - the stream
310d3335dfaSMatt Spinler  * @param[in] cv - the CreatorVersion object
311d3335dfaSMatt Spinler  */
3120688545bSMatt Spinler Stream& operator<<(Stream& s, const CreatorVersion& cv);
313d3335dfaSMatt Spinler 
314d3335dfaSMatt Spinler } // namespace pels
315d3335dfaSMatt Spinler } // namespace openpower
316