1 #pragma once
2 
3 #include "stream.hpp"
4 
5 #include <cstdint>
6 
7 namespace openpower
8 {
9 namespace pels
10 {
11 
12 /**
13  * @class SectionHeader
14  *
15  * This header is at the start of every PEL section.  It has a size
16  * of 8 bytes.
17  */
18 struct SectionHeader
19 {
20   public:
21     /**
22      * @brief Constructor
23      */
24     SectionHeader() : id(0), size(0), version(0), subType(0), componentID(0) {}
25 
26     /**
27      * @brief Constructor
28      *
29      * @param[in] id - the ID field
30      * @param[in] size - the size field
31      * @param[in] version - the version field
32      * @param[in] subType - the sub-type field
33      * @param[in] componentID - the component ID field
34      */
35     SectionHeader(uint16_t id, uint16_t size, uint8_t version, uint8_t subType,
36                   uint16_t componentID) :
37         id(id),
38         size(size), version(version), subType(subType), componentID(componentID)
39     {}
40 
41     /**
42      * @brief A two character ASCII field which identifies the section type.
43      */
44     uint16_t id;
45 
46     /**
47      * @brief The size of the section in bytes, including this section header.
48      */
49     uint16_t size;
50 
51     /**
52      * @brief The section format version.
53      */
54     uint8_t version;
55 
56     /**
57      * @brief The section sub-type.
58      */
59     uint8_t subType;
60 
61     /**
62      * @brief The component ID, which has various meanings depending on the
63      * section.
64      */
65     uint16_t componentID;
66 
67     /**
68      * @brief Returns the size of header when flattened into a PEL.
69      *
70      * @return size_t - the size of the header
71      */
72     static constexpr size_t flattenedSize()
73     {
74         return sizeof(id) + sizeof(size) + sizeof(version) + sizeof(subType) +
75                sizeof(componentID);
76     }
77 };
78 
79 /**
80  * @brief Stream extraction operator for the SectionHeader
81  *
82  * @param[in] s - the stream
83  * @param[out] header - the SectionHeader object
84  */
85 inline Stream& operator>>(Stream& s, SectionHeader& header)
86 {
87     s >> header.id >> header.size >> header.version >> header.subType >>
88         header.componentID;
89     return s;
90 }
91 
92 /**
93  * @brief Stream insertion operator for the section header
94  *
95  * @param[out] s - the stream
96  * @param[in] header - the SectionHeader object
97  */
98 inline Stream& operator<<(Stream& s, const SectionHeader& header)
99 {
100     s << header.id << header.size << header.version << header.subType
101       << header.componentID;
102     return s;
103 }
104 
105 } // namespace pels
106 } // namespace openpower
107