summaryrefslogtreecommitdiffstats
path: root/extensions/openpower-pels/callout.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'extensions/openpower-pels/callout.hpp')
-rw-r--r--extensions/openpower-pels/callout.hpp183
1 files changed, 183 insertions, 0 deletions
diff --git a/extensions/openpower-pels/callout.hpp b/extensions/openpower-pels/callout.hpp
new file mode 100644
index 0000000..caf3aec
--- /dev/null
+++ b/extensions/openpower-pels/callout.hpp
@@ -0,0 +1,183 @@
+#pragma once
+
+#include "fru_identity.hpp"
+#include "mru.hpp"
+#include "pce_identity.hpp"
+#include "stream.hpp"
+
+namespace openpower
+{
+namespace pels
+{
+namespace src
+{
+
+/**
+ * @class Callout
+ *
+ * Represents a single FRU callout in the SRC's FRU callout
+ * subsection.
+ *
+ * The 'Callouts' class holds a list of these objects.
+ *
+ * The callout priority and location code are in this structure.
+ *
+ * There can also be up to one each of three types of substructures
+ * in a single callout:
+ * * FRU Identity (must be first if present)
+ * * Power Controlling Enclosure (PCE)
+ * * Manufacturing Replaceable Unit (MRU)
+ *
+ * These substructures have their own objects managed by unique_ptrs
+ * which will only be allocated if those substructures exist.
+ */
+class Callout
+{
+ public:
+ Callout() = delete;
+ ~Callout() = default;
+ Callout(const Callout&) = delete;
+ Callout& operator=(const Callout&) = delete;
+ Callout(Callout&&) = delete;
+ Callout& operator=(Callout&&) = delete;
+
+ /**
+ * @brief Constructor
+ *
+ * Fills in this class's data fields from the stream.
+ *
+ * @param[in] pel - the PEL data stream
+ */
+ explicit Callout(Stream& pel);
+
+ /**
+ * @brief Returns the size of this object when flattened into a PEL
+ *
+ * @return size_t - The size of the section
+ */
+ size_t flattenedSize();
+
+ /**
+ * @brief Flatten the object into the stream
+ *
+ * @param[in] stream - The stream to write to
+ */
+ void flatten(Stream& pel) const;
+
+ /**
+ * @brief Returns the flags field of a callout
+ *
+ * @return uint8_t - The flags
+ */
+ uint8_t flags() const
+ {
+ return _flags;
+ }
+
+ /**
+ * @brief Returns the priority field of a callout
+ *
+ * @return uint8_t - The priority
+ */
+ uint8_t priority() const
+ {
+ return _priority;
+ }
+
+ /**
+ * @brief Returns the location code of the callout
+ *
+ * @return std::string - The location code
+ */
+ std::string locationCode() const
+ {
+ std::string lc;
+ if (!_locationCode.empty())
+ {
+ // NULL terminated
+ lc = static_cast<const char*>(_locationCode.data());
+ }
+ return lc;
+ }
+
+ /**
+ * @brief Returns the FRU identity substructure
+ *
+ * @return const std::unique_ptr<FRUIdentity>&
+ */
+ const std::unique_ptr<FRUIdentity>& fruIdentity() const
+ {
+ return _fruIdentity;
+ }
+
+ /**
+ * @brief Returns the PCE identity substructure
+ *
+ * @return const std::unique_ptr<PCEIdentity>&
+ */
+ const std::unique_ptr<PCEIdentity>& pceIdentity() const
+ {
+ return _pceIdentity;
+ }
+
+ /**
+ * @brief Returns the MRU identity substructure
+ *
+ * @return const std::unique_ptr<FRUIdentity>&
+ */
+ const std::unique_ptr<MRU>& mru() const
+ {
+ return _mru;
+ }
+
+ private:
+ /**
+ * @brief The size of this structure in the PEL
+ */
+ uint8_t _size;
+
+ /**
+ * @brief The flags byte of this structure
+ */
+ uint8_t _flags;
+
+ /**
+ * @brief The replacement priority
+ */
+ uint8_t _priority;
+
+ /**
+ * @brief The length of the location code field.
+ *
+ * Includes the NULL termination, and must be a
+ * multiple of 4 (padded with zeros)
+ */
+ uint8_t _locationCodeSize;
+
+ /**
+ * @brief NULL terminated location code
+ *
+ * Includes the NULL termination, and must be a
+ * multiple of 4 (padded with zeros)
+ */
+ std::vector<char> _locationCode;
+
+ /**
+ * @brief FRU (Field Replaceable Unit) Identity substructure
+ */
+ std::unique_ptr<FRUIdentity> _fruIdentity;
+
+ /**
+ * @brief PCE (Power Controlling Enclosure) Identity substructure
+ */
+ std::unique_ptr<PCEIdentity> _pceIdentity;
+
+ /**
+ * @brief MRU (Manufacturing Replaceable Unit) substructure
+ */
+ std::unique_ptr<MRU> _mru;
+};
+
+} // namespace src
+} // namespace pels
+} // namespace openpower
OpenPOWER on IntegriCloud