103c1d915SMatt Spinler #pragma once 203c1d915SMatt Spinler 3aadccc85SMatt Spinler #include "data_interface.hpp" 4fdb6a202SMatt Spinler #include "elog_entry.hpp" 5ad0e0476SAatir Manzur #include "pel_values.hpp" 6fdb6a202SMatt Spinler #include "registry.hpp" 703c1d915SMatt Spinler #include "section.hpp" 803c1d915SMatt Spinler #include "stream.hpp" 903c1d915SMatt Spinler 1003c1d915SMatt Spinler namespace openpower 1103c1d915SMatt Spinler { 1203c1d915SMatt Spinler namespace pels 1303c1d915SMatt Spinler { 1403c1d915SMatt Spinler 151a94cc38SMatt Spinler static constexpr uint8_t userHeaderVersion = 0x01; 16*1f93c590SMatt Spinler static constexpr uint16_t actionFlagsDefault = 0xFFFF; 1703c1d915SMatt Spinler 1803c1d915SMatt Spinler /** 1903c1d915SMatt Spinler * @class UserHeader 2003c1d915SMatt Spinler * 2103c1d915SMatt Spinler * This represents the User Header section in a PEL. It is required, 2203c1d915SMatt Spinler * and it is always the second section. 2303c1d915SMatt Spinler * 2403c1d915SMatt Spinler * The Section base class handles the section header structure that every 2503c1d915SMatt Spinler * PEL section has at offset zero. 2603c1d915SMatt Spinler * 2703c1d915SMatt Spinler * The fields in this class directly correspond to the order and sizes of 2803c1d915SMatt Spinler * the fields in the section. 2903c1d915SMatt Spinler */ 3003c1d915SMatt Spinler class UserHeader : public Section 3103c1d915SMatt Spinler { 3203c1d915SMatt Spinler public: 3303c1d915SMatt Spinler UserHeader() = delete; 3403c1d915SMatt Spinler ~UserHeader() = default; 3503c1d915SMatt Spinler UserHeader(const UserHeader&) = default; 3603c1d915SMatt Spinler UserHeader& operator=(const UserHeader&) = default; 3703c1d915SMatt Spinler UserHeader(UserHeader&&) = default; 3803c1d915SMatt Spinler UserHeader& operator=(UserHeader&&) = default; 3903c1d915SMatt Spinler 4003c1d915SMatt Spinler /** 4103c1d915SMatt Spinler * @brief Constructor 4203c1d915SMatt Spinler * 43fdb6a202SMatt Spinler * Creates a valid UserHeader with the passed in data. 44fdb6a202SMatt Spinler * 45fdb6a202SMatt Spinler * @param[in] entry - The message registry entry for this error 46fdb6a202SMatt Spinler * @param[in] severity - The OpenBMC event log severity for this error 47aadccc85SMatt Spinler * @param[in] dataIface - The DataInterface object 48fdb6a202SMatt Spinler */ 49fdb6a202SMatt Spinler UserHeader(const message::Entry& entry, 50aadccc85SMatt Spinler phosphor::logging::Entry::Level severity, 51aadccc85SMatt Spinler const DataInterfaceBase& dataIface); 52fdb6a202SMatt Spinler 53fdb6a202SMatt Spinler /** 54fdb6a202SMatt Spinler * @brief Constructor 55fdb6a202SMatt Spinler * 5603c1d915SMatt Spinler * Fills in this class's data fields from the stream. 5703c1d915SMatt Spinler * 5803c1d915SMatt Spinler * @param[in] pel - the PEL data stream 5903c1d915SMatt Spinler */ 6003c1d915SMatt Spinler explicit UserHeader(Stream& pel); 6103c1d915SMatt Spinler 6203c1d915SMatt Spinler /** 63cf5a8d0fSMatt Spinler * @brief Flatten the section into the stream 64cf5a8d0fSMatt Spinler * 65cf5a8d0fSMatt Spinler * @param[in] stream - The stream to write to 66cf5a8d0fSMatt Spinler */ 670688545bSMatt Spinler void flatten(Stream& stream) const override; 68cf5a8d0fSMatt Spinler 69cf5a8d0fSMatt Spinler /** 7003c1d915SMatt Spinler * @brief Returns the subsystem field. 7103c1d915SMatt Spinler * 7297d19b48SMatt Spinler * @return uint8_t - the subsystem 7303c1d915SMatt Spinler */ 7497d19b48SMatt Spinler uint8_t subsystem() const 7503c1d915SMatt Spinler { 7603c1d915SMatt Spinler return _eventSubsystem; 7703c1d915SMatt Spinler } 7803c1d915SMatt Spinler 7903c1d915SMatt Spinler /** 8003c1d915SMatt Spinler * @brief Returns the event scope field. 8103c1d915SMatt Spinler * 8297d19b48SMatt Spinler * @return uint8_t - the event scope 8303c1d915SMatt Spinler */ 8497d19b48SMatt Spinler uint8_t scope() const 8503c1d915SMatt Spinler { 8603c1d915SMatt Spinler return _eventScope; 8703c1d915SMatt Spinler } 8803c1d915SMatt Spinler 8903c1d915SMatt Spinler /** 9003c1d915SMatt Spinler * @brief Returns the severity field. 9103c1d915SMatt Spinler * 9297d19b48SMatt Spinler * @return uint8_t - the severity 9303c1d915SMatt Spinler */ 9497d19b48SMatt Spinler uint8_t severity() const 9503c1d915SMatt Spinler { 9603c1d915SMatt Spinler return _eventSeverity; 9703c1d915SMatt Spinler } 9803c1d915SMatt Spinler 9903c1d915SMatt Spinler /** 10003c1d915SMatt Spinler * @brief Returns the event type field. 10103c1d915SMatt Spinler * 10297d19b48SMatt Spinler * @return uint8_t - the event type 10303c1d915SMatt Spinler */ 10497d19b48SMatt Spinler uint8_t eventType() const 10503c1d915SMatt Spinler { 10603c1d915SMatt Spinler return _eventType; 10703c1d915SMatt Spinler } 10803c1d915SMatt Spinler 10903c1d915SMatt Spinler /** 110f1e85e20SMatt Spinler * @brief Set the event type field 111f1e85e20SMatt Spinler * 112f1e85e20SMatt Spinler * @param[in] type - the new event type 113f1e85e20SMatt Spinler */ 114f1e85e20SMatt Spinler void setEventType(uint8_t type) 115f1e85e20SMatt Spinler { 116f1e85e20SMatt Spinler _eventType = type; 117f1e85e20SMatt Spinler } 118f1e85e20SMatt Spinler 119f1e85e20SMatt Spinler /** 12003c1d915SMatt Spinler * @brief Returns the problem domain field. 12103c1d915SMatt Spinler * 12297d19b48SMatt Spinler * @return uint8_t - the problem domain 12303c1d915SMatt Spinler */ 12497d19b48SMatt Spinler uint8_t problemDomain() const 12503c1d915SMatt Spinler { 12603c1d915SMatt Spinler return _problemDomain; 12703c1d915SMatt Spinler } 12803c1d915SMatt Spinler 12903c1d915SMatt Spinler /** 13003c1d915SMatt Spinler * @brief Returns the problem vector field. 13103c1d915SMatt Spinler * 13297d19b48SMatt Spinler * @return uint8_t - the problem vector 13303c1d915SMatt Spinler */ 13497d19b48SMatt Spinler uint8_t problemVector() const 13503c1d915SMatt Spinler { 13603c1d915SMatt Spinler return _problemVector; 13703c1d915SMatt Spinler } 13803c1d915SMatt Spinler 13903c1d915SMatt Spinler /** 14003c1d915SMatt Spinler * @brief Returns the action flags field. 14103c1d915SMatt Spinler * 14297d19b48SMatt Spinler * @return uint16_t - the action flags 14303c1d915SMatt Spinler */ 14497d19b48SMatt Spinler uint16_t actionFlags() const 14503c1d915SMatt Spinler { 14603c1d915SMatt Spinler return _actionFlags; 14703c1d915SMatt Spinler } 14803c1d915SMatt Spinler 14903c1d915SMatt Spinler /** 150f1e85e20SMatt Spinler * @brief Sets the action flags field 151f1e85e20SMatt Spinler * 152f1e85e20SMatt Spinler * @param[in] flags - the new action flags 153f1e85e20SMatt Spinler */ 154f1e85e20SMatt Spinler void setActionFlags(uint16_t flags) 155f1e85e20SMatt Spinler { 156f1e85e20SMatt Spinler _actionFlags = flags; 157f1e85e20SMatt Spinler } 158f1e85e20SMatt Spinler 159f1e85e20SMatt Spinler /** 160eb111447SMatt Spinler * @brief Returns the host transmission state 161eb111447SMatt Spinler * 162eb111447SMatt Spinler * @return uint8_t - the host transmission state 163eb111447SMatt Spinler */ 164eb111447SMatt Spinler uint8_t hostTransmissionState() const 165eb111447SMatt Spinler { 166eb111447SMatt Spinler return _states & 0xFF; 167eb111447SMatt Spinler } 168eb111447SMatt Spinler 169eb111447SMatt Spinler /** 170eb111447SMatt Spinler * @brief Sets the host transmission state 171eb111447SMatt Spinler * 172eb111447SMatt Spinler * @param[in] state - the new state 173eb111447SMatt Spinler */ 174eb111447SMatt Spinler void setHostTransmissionState(uint8_t state) 175eb111447SMatt Spinler { 176eb111447SMatt Spinler _states &= 0xFFFFFF00; 177eb111447SMatt Spinler _states |= state; 178eb111447SMatt Spinler } 179eb111447SMatt Spinler 180eb111447SMatt Spinler /** 181eb111447SMatt Spinler * @brief Returns the HMC transmission state 182eb111447SMatt Spinler * 183eb111447SMatt Spinler * (HMC = Hardware Management Console) 184eb111447SMatt Spinler * 185eb111447SMatt Spinler * @return uint8_t - the HMC transmission state 186eb111447SMatt Spinler */ 187eb111447SMatt Spinler uint8_t hmcTransmissionState() const 188eb111447SMatt Spinler { 189eb111447SMatt Spinler return (_states & 0x0000FF00) >> 8; 190eb111447SMatt Spinler } 191eb111447SMatt Spinler 192eb111447SMatt Spinler /** 193eb111447SMatt Spinler * @brief Sets the HMC transmission state 194eb111447SMatt Spinler * 195eb111447SMatt Spinler * @param[in] state - the new state 196eb111447SMatt Spinler */ 197eb111447SMatt Spinler void setHMCTransmissionState(uint8_t state) 198eb111447SMatt Spinler { 199eb111447SMatt Spinler uint32_t newState = state << 8; 200eb111447SMatt Spinler _states &= 0xFFFF00FF; 201eb111447SMatt Spinler _states |= newState; 202eb111447SMatt Spinler } 203eb111447SMatt Spinler 204eb111447SMatt Spinler /** 20503c1d915SMatt Spinler * @brief Returns the size of this section when flattened into a PEL 20603c1d915SMatt Spinler * 20703c1d915SMatt Spinler * @return size_t - the size of the section 20803c1d915SMatt Spinler */ 20903c1d915SMatt Spinler static constexpr size_t flattenedSize() 21003c1d915SMatt Spinler { 21103c1d915SMatt Spinler return Section::flattenedSize() + sizeof(_eventSubsystem) + 21203c1d915SMatt Spinler sizeof(_eventScope) + sizeof(_eventSeverity) + 21303c1d915SMatt Spinler sizeof(_eventType) + sizeof(_reserved4Byte1) + 21403c1d915SMatt Spinler sizeof(_problemDomain) + sizeof(_problemVector) + 215eb111447SMatt Spinler sizeof(_actionFlags) + sizeof(_states); 21603c1d915SMatt Spinler } 21703c1d915SMatt Spinler 218ad0e0476SAatir Manzur /** 219ad0e0476SAatir Manzur * @brief Get section in JSON. 220c1489351SAatir * @return std::optional<std::string> -User header section's JSON 221ad0e0476SAatir Manzur */ 222ad0e0476SAatir Manzur std::optional<std::string> getJSON() const override; 223ad0e0476SAatir Manzur 22403c1d915SMatt Spinler private: 22503c1d915SMatt Spinler /** 226cf5a8d0fSMatt Spinler * @brief Fills in the object from the stream data 227cf5a8d0fSMatt Spinler * 228cf5a8d0fSMatt Spinler * @param[in] stream - The stream to read from 229cf5a8d0fSMatt Spinler */ 230cf5a8d0fSMatt Spinler void unflatten(Stream& stream); 231cf5a8d0fSMatt Spinler 232cf5a8d0fSMatt Spinler /** 23303c1d915SMatt Spinler * @brief Validates the section contents 23403c1d915SMatt Spinler * 23503c1d915SMatt Spinler * Updates _valid (in Section) with the results. 23603c1d915SMatt Spinler */ 23703c1d915SMatt Spinler void validate() override; 23803c1d915SMatt Spinler 23903c1d915SMatt Spinler /** 240aadccc85SMatt Spinler * @brief Returns the severity value to use from the list 241aadccc85SMatt Spinler * of them passed in based on the system type. 242aadccc85SMatt Spinler * 243aadccc85SMatt Spinler * If there isn't an entry found for the current system 244aadccc85SMatt Spinler * type then std::nullopt will be returned. 245aadccc85SMatt Spinler * 246aadccc85SMatt Spinler * @param[in] severities - The array of {systype, severity} 247aadccc85SMatt Spinler * structures to find an entry in. 2486ea4d5f7SMatt Spinler * @param[in] systemNames - List of compatible system type names 249aadccc85SMatt Spinler */ 250aadccc85SMatt Spinler std::optional<uint8_t> 251aadccc85SMatt Spinler getSeverity(const std::vector<message::RegistrySeverity>& severities, 2526ea4d5f7SMatt Spinler const std::vector<std::string>& systemNames) const; 253aadccc85SMatt Spinler /** 25403c1d915SMatt Spinler * @brief The subsystem associated with the event. 25503c1d915SMatt Spinler */ 25603c1d915SMatt Spinler uint8_t _eventSubsystem; 25703c1d915SMatt Spinler 25803c1d915SMatt Spinler /** 25903c1d915SMatt Spinler * @brief The event scope field. 26003c1d915SMatt Spinler */ 26103c1d915SMatt Spinler uint8_t _eventScope; 26203c1d915SMatt Spinler 26303c1d915SMatt Spinler /** 26403c1d915SMatt Spinler * @brief The event severity. 26503c1d915SMatt Spinler */ 26603c1d915SMatt Spinler uint8_t _eventSeverity; 26703c1d915SMatt Spinler 26803c1d915SMatt Spinler /** 26903c1d915SMatt Spinler * @brief The event type. 27003c1d915SMatt Spinler */ 27103c1d915SMatt Spinler uint8_t _eventType; 27203c1d915SMatt Spinler 27303c1d915SMatt Spinler /** 27403c1d915SMatt Spinler * @brief A reserved word placeholder 27503c1d915SMatt Spinler */ 27603c1d915SMatt Spinler uint32_t _reserved4Byte1; 27703c1d915SMatt Spinler 27803c1d915SMatt Spinler /** 27903c1d915SMatt Spinler * @brief The problem domain field. 28003c1d915SMatt Spinler */ 28103c1d915SMatt Spinler uint8_t _problemDomain; 28203c1d915SMatt Spinler 28303c1d915SMatt Spinler /** 28403c1d915SMatt Spinler * @brief The problem vector field. 28503c1d915SMatt Spinler */ 28603c1d915SMatt Spinler uint8_t _problemVector; 28703c1d915SMatt Spinler 28803c1d915SMatt Spinler /** 28903c1d915SMatt Spinler * @brief The action flags field. 29003c1d915SMatt Spinler */ 29103c1d915SMatt Spinler uint16_t _actionFlags; 29203c1d915SMatt Spinler 29303c1d915SMatt Spinler /** 294eb111447SMatt Spinler * @brief The second reserved word that we are 295eb111447SMatt Spinler * using for storing state information. 296eb111447SMatt Spinler * 297eb111447SMatt Spinler * 0x0000AABB 298eb111447SMatt Spinler * Where: 299eb111447SMatt Spinler * 0xAA = HMC transmission state 300eb111447SMatt Spinler * 0xBB = Host transmission state 30103c1d915SMatt Spinler */ 302eb111447SMatt Spinler uint32_t _states; 30303c1d915SMatt Spinler }; 30403c1d915SMatt Spinler 30503c1d915SMatt Spinler } // namespace pels 30603c1d915SMatt Spinler } // namespace openpower 307