1 #pragma once 2 3 #include "mtms.hpp" 4 #include "stream.hpp" 5 6 namespace openpower 7 { 8 namespace pels 9 { 10 namespace src 11 { 12 13 /** 14 * @class PCEIdentity 15 * 16 * This represents the PCE (Power Controlling Enclosure) Identity 17 * substructure in the callout subsection of the SRC PEL section. 18 * 19 * It contains the name and machine type/model/SN of that enclosure. 20 * 21 * It is only used for errors in an I/O drawer where another enclosure 22 * may control its power. It is not used in BMC errors and so will 23 * never be created by the BMC, but only unflattened in errors it 24 * receives from the host. 25 */ 26 class PCEIdentity 27 { 28 public: 29 PCEIdentity() = delete; 30 ~PCEIdentity() = default; 31 PCEIdentity(const PCEIdentity&) = default; 32 PCEIdentity& operator=(const PCEIdentity&) = default; 33 PCEIdentity(PCEIdentity&&) = default; 34 PCEIdentity& operator=(PCEIdentity&&) = default; 35 36 /** 37 * @brief Constructor 38 * 39 * Fills in this class's data fields from the stream. 40 * 41 * @param[in] pel - the PEL data stream 42 */ 43 explicit PCEIdentity(Stream& pel); 44 45 /** 46 * @brief Flatten the object into the stream 47 * 48 * @param[in] stream - The stream to write to 49 */ 50 void flatten(Stream& pel) const; 51 52 /** 53 * @brief Returns the size of this structure when flattened into a PEL 54 * 55 * @return size_t - The size of the structure 56 */ 57 size_t flattenedSize() 58 { 59 return _size; 60 } 61 62 /** 63 * @brief The type identifier value of this structure. 64 */ 65 static const uint16_t substructureType = 0x5045; // "PE" 66 67 /** 68 * @brief Returns the enclosure name 69 * 70 * @return std::string - The enclosure name 71 */ 72 std::string enclosureName() const 73 { 74 // _pceName is NULL terminated 75 std::string name{static_cast<const char*>(_pceName.data())}; 76 return name; 77 } 78 79 /** 80 * @brief Returns the MTMS sub structure 81 * 82 * @return const MTMS& - The machine type/model/SN structure. 83 */ 84 const MTMS& mtms() const 85 { 86 return _mtms; 87 } 88 89 private: 90 /** 91 * @brief The callout substructure type field. Will be 'PE'. 92 */ 93 uint16_t _type; 94 95 /** 96 * @brief The size of this callout structure. 97 * 98 * Always a multiple of 4. 99 */ 100 uint8_t _size; 101 102 /** 103 * @brief The flags byte of this substructure. 104 * 105 * Always 0 for this structure. 106 */ 107 uint8_t _flags; 108 109 /** 110 * @brief The structure that holds the power controlling enclosure's 111 * machine type, model, and serial number. 112 */ 113 MTMS _mtms; 114 115 /** 116 * @brief The name of the power controlling enclosure. 117 * 118 * Null terminated and padded with NULLs to a 4 byte boundary. 119 */ 120 std::vector<char> _pceName; 121 }; 122 123 } // namespace src 124 } // namespace pels 125 } // namespace openpower 126