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