#pragma once #include "mtms.hpp" #include "stream.hpp" namespace openpower { namespace pels { namespace src { /** * @class PCEIdentity * * This represents the PCE (Power Controlling Enclosure) Identity * substructure in the callout subsection of the SRC PEL section. * * It contains the name and machine type/model/SN of that enclosure. * * It is only used for errors in an I/O drawer where another enclosure * may control its power. It is not used in BMC errors and so will * never be created by the BMC, but only unflattened in errors it * receives from the host. */ class PCEIdentity { public: PCEIdentity() = delete; ~PCEIdentity() = default; PCEIdentity(const PCEIdentity&) = default; PCEIdentity& operator=(const PCEIdentity&) = default; PCEIdentity(PCEIdentity&&) = default; PCEIdentity& operator=(PCEIdentity&&) = default; /** * @brief Constructor * * Fills in this class's data fields from the stream. * * @param[in] pel - the PEL data stream */ explicit PCEIdentity(Stream& pel); /** * @brief Flatten the object into the stream * * @param[in] stream - The stream to write to */ void flatten(Stream& pel) const; /** * @brief Returns the size of this structure when flattened into a PEL * * @return size_t - The size of the structure */ size_t flattenedSize() { return _size; } /** * @brief The type identifier value of this structure. */ static const uint16_t substructureType = 0x5045; // "PE" /** * @brief Returns the enclosure name * * @return std::string - The enclosure name */ std::string enclosureName() const { // _pceName is NULL terminated std::string name{static_cast(_pceName.data())}; return name; } /** * @brief Returns the MTMS sub structure * * @return const MTMS& - The machine type/model/SN structure. */ const MTMS& mtms() const { return _mtms; } private: /** * @brief The callout substructure type field. Will be 'PE'. */ uint16_t _type; /** * @brief The size of this callout structure. * * Always a multiple of 4. */ uint8_t _size; /** * @brief The flags byte of this substructure. * * Always 0 for this structure. */ uint8_t _flags; /** * @brief The structure that holds the power controlling enclosure's * machine type, model, and serial number. */ MTMS _mtms; /** * @brief The name of the power controlling enclosure. * * Null terminated and padded with NULLs to a 4 byte boundary. */ std::vector _pceName; }; } // namespace src } // namespace pels } // namespace openpower