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