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