diff options
Diffstat (limited to 'extensions/openpower-pels/pce_identity.hpp')
-rw-r--r-- | extensions/openpower-pels/pce_identity.hpp | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/extensions/openpower-pels/pce_identity.hpp b/extensions/openpower-pels/pce_identity.hpp new file mode 100644 index 0000000..60c878e --- /dev/null +++ b/extensions/openpower-pels/pce_identity.hpp @@ -0,0 +1,125 @@ +#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<const char*>(_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<char> _pceName; +}; + +} // namespace src +} // namespace pels +} // namespace openpower |