summaryrefslogtreecommitdiffstats
path: root/extensions/openpower-pels/fru_identity.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/openpower-pels/fru_identity.hpp')
-rw-r--r--extensions/openpower-pels/fru_identity.hpp222
1 files changed, 222 insertions, 0 deletions
diff --git a/extensions/openpower-pels/fru_identity.hpp b/extensions/openpower-pels/fru_identity.hpp
new file mode 100644
index 0000000..ecc2899
--- /dev/null
+++ b/extensions/openpower-pels/fru_identity.hpp
@@ -0,0 +1,222 @@
+#pragma once
+
+#include "stream.hpp"
+
+#include <optional>
+
+namespace openpower
+{
+namespace pels
+{
+namespace src
+{
+
+/**
+ * @class FRUIdentity
+ *
+ * This represents the FRU Identity substructure in the
+ * callout subsection of the SRC PEL section.
+ *
+ * It provides information about the FRU being called out,
+ * such as serial number and part number. A maintenance
+ * procedure name may be used instead of the part number,
+ * and this would be indicated in the flags field.
+ */
+class FRUIdentity
+{
+ public:
+ /**
+ * @brief The failing component type
+ *
+ * Upper nibble of the flags byte
+ */
+ enum FailingComponentType
+ {
+ hardwareFRU = 0x10,
+ codeFRU = 0x20,
+ configError = 0x30,
+ maintenanceProc = 0x40,
+ externalFRU = 0x90,
+ externalCodeFRU = 0xA0,
+ toolFRU = 0xB0,
+ symbolicFRU = 0xC0,
+ symbolicFRUTrustedLocCode = 0xE0
+ };
+
+ /**
+ * @brief The lower nibble of the flags byte
+ */
+ enum Flags
+ {
+ pnSupplied = 0x08,
+ ccinSupplied = 0x04,
+ maintProcSupplied = 0x02,
+ snSupplied = 0x01
+ };
+
+ FRUIdentity() = delete;
+ ~FRUIdentity() = default;
+ FRUIdentity(const FRUIdentity&) = default;
+ FRUIdentity& operator=(const FRUIdentity&) = default;
+ FRUIdentity(FRUIdentity&&) = default;
+ FRUIdentity& operator=(FRUIdentity&&) = default;
+
+ /**
+ * @brief Constructor
+ *
+ * Fills in this class's data fields from the stream.
+ *
+ * @param[in] pel - the PEL data stream
+ */
+ explicit FRUIdentity(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 section
+ */
+ size_t flattenedSize() const
+ {
+ return _size;
+ }
+
+ /**
+ * @brief The failing component type for this FRU callout.
+ *
+ * @return FailingComponentType
+ */
+ FailingComponentType failingComponentType() const
+ {
+ return static_cast<FailingComponentType>(_flags & 0xF0);
+ }
+
+ /**
+ * @brief Returns the part number, if supplied
+ *
+ * @return std::optional<std::string>
+ */
+ std::optional<std::string> getPN() const;
+
+ /**
+ * @brief Returns the maintenance procedure, if supplied
+ *
+ * @return std::optional<std::string>
+ */
+ std::optional<std::string> getMaintProc() const;
+
+ /**
+ * @brief Returns the CCIN, if supplied
+ *
+ * @return std::optional<std::string>
+ */
+ std::optional<std::string> getCCIN() const;
+
+ /**
+ * @brief Returns the serial number, if supplied
+ *
+ * @return std::optional<std::string>
+ */
+ std::optional<std::string> getSN() const;
+
+ /**
+ * @brief The type identifier value of this structure.
+ */
+ static const uint16_t substructureType = 0x4944; // "ID"
+
+ private:
+ /**
+ * @brief If the part number is contained in this structure.
+ *
+ * It takes the place of the maintenance procedure ID.
+ *
+ * @return bool
+ */
+ bool hasPN() const
+ {
+ return _flags & pnSupplied;
+ }
+
+ /**
+ * @brief If the CCIN is contained in this structure.
+ *
+ * @return bool
+ */
+ bool hasCCIN() const
+ {
+ return _flags & ccinSupplied;
+ }
+
+ /**
+ * @brief If a maintenance procedure is contained in this structure.
+ *
+ * It takes the place of the part number.
+ *
+ * @return bool
+ */
+ bool hasMP() const
+ {
+ return _flags & maintProcSupplied;
+ }
+
+ /**
+ * @brief If the serial number is contained in this structure.
+ *
+ * @return bool
+ */
+ bool hasSN() const
+ {
+ return _flags & snSupplied;
+ }
+
+ /**
+ * @brief The callout substructure type field. Will be "ID".
+ */
+ 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.
+ *
+ * See the FailingComponentType and Flags enums
+ */
+ uint8_t _flags;
+
+ /**
+ * @brief The part number OR maintenance procedure ID,
+ * depending on what the flags field specifies.
+ *
+ * A NULL terminated ASCII string.
+ */
+ std::array<char, 8> _pnOrProcedureID;
+
+ /**
+ * @brief The CCIN VPD keyword
+ *
+ * Four ASCII characters, not NULL terminated.
+ */
+ std::array<char, 4> _ccin;
+
+ /**
+ * @brief The serial number
+ *
+ * Twelve ASCII characters, not NULL terminated.
+ */
+ std::array<char, 12> _sn;
+};
+
+} // namespace src
+} // namespace pels
+} // namespace openpower
OpenPOWER on IntegriCloud