From 90b4a0a0682cb596fdaf0eabbaccd2735e52bd89 Mon Sep 17 00:00:00 2001 From: Matt Spinler Date: Wed, 9 Oct 2019 10:08:43 -0500 Subject: PEL: MRU callout SRC substructure This substructure is part of the callout subsection in the SRC section of a PEL, and contains information about Manufacturing Replaceable Units (MRUs). MRUs are components on a parent FRU (Field Replaceable Unit) that may be able to be replaced in a manufacturing environment, hence the name. This substructure includes a list of pairs, where the priority is the same priority value type as used elsewhere in the SRC section ('H', 'M', 'L', etc), and the MRU ID is a 4B ID that development will tell manufacturing the meanings of. This commit only adds support for creating an object from a flattened PEL, such as one that comes down from the host. A future commit will handle creating it from scratch for BMC errors. Signed-off-by: Matt Spinler Change-Id: I6352e1a3cb84db0516902786faca4c387afef411 --- extensions/openpower-pels/mru.hpp | 122 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 extensions/openpower-pels/mru.hpp (limited to 'extensions/openpower-pels/mru.hpp') diff --git a/extensions/openpower-pels/mru.hpp b/extensions/openpower-pels/mru.hpp new file mode 100644 index 0000000..8ad3e3c --- /dev/null +++ b/extensions/openpower-pels/mru.hpp @@ -0,0 +1,122 @@ +#pragma once + +#include "stream.hpp" + +namespace openpower +{ +namespace pels +{ +namespace src +{ + +/** + * @class MRU + * + * This represents the MRU (Manufacturing Replaceable Unit) + * substructure in the callout subsection of the SRC PEL section. + * + * Manufacturing replaceable units have a finer granularity than + * a field replaceable unit, such as a chip on a card, and are + * intended to be used during manufacturing. + * + * This substructure can contain up to 128 MRU callouts, each + * containing a MRU ID and a callout priority value. + */ +class MRU +{ + public: + /** + * @brief A single MRU callout, which contains a priority + * and a MRU ID. + * + * The priority value is the same priority type character + * value as in the parent callout structure. For alignment + * purposes it is a 4 byte field, though only the LSB contains + * the priority value. + */ + struct MRUCallout + { + uint32_t priority; + uint32_t id; + }; + + MRU() = delete; + ~MRU() = default; + MRU(const MRU&) = default; + MRU& operator=(const MRU&) = default; + MRU(MRU&&) = default; + MRU& operator=(MRU&&) = default; + + /** + * @brief Constructor + * + * Fills in this class's data fields from the stream. + * + * @param[in] pel - the PEL data stream + */ + explicit MRU(Stream& pel); + + /** + * @brief Flatten the object into the stream + * + * @param[in] stream - The stream to write to + */ + void flatten(Stream& pel); + + /** + * @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 Returns the contained MRU callouts. + * + * @return const std::vector& - The MRUs + */ + const std::vector& mrus() const + { + return _mrus; + } + + /** + * @brief The type identifier value of this structure. + */ + static const uint16_t substructureType = 0x4D52; // "MR" + + private: + /** + * @brief The callout substructure type field. Will be 'MR'. + */ + uint16_t _type; + + /** + * @brief The size of this callout structure. + */ + uint8_t _size; + + /** + * @brief The flags byte of this substructure. + * + * 0x0Y: Y = number of MRU callouts + */ + uint8_t _flags; + + /** + * @brief Reserved 4 bytes + */ + uint32_t _reserved4B; + + /* + * @brief The MRU callouts + */ + std::vector _mrus; +}; + +} // namespace src +} // namespace pels +} // namespace openpower -- cgit v1.2.1