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