diff options
author | Matt Spinler <spinler@us.ibm.com> | 2019-10-09 10:08:43 -0500 |
---|---|---|
committer | Matt Spinler <spinler@us.ibm.com> | 2019-10-22 14:09:56 +0000 |
commit | 90b4a0a0682cb596fdaf0eabbaccd2735e52bd89 (patch) | |
tree | 4dad7d467d899035af02a6d77df38eea83b2ceda /extensions/openpower-pels/mru.hpp | |
parent | 5b3a11db9c1f9715cc6371ecdcaa6bc54343ecc0 (diff) | |
download | phosphor-logging-90b4a0a0682cb596fdaf0eabbaccd2735e52bd89.tar.gz phosphor-logging-90b4a0a0682cb596fdaf0eabbaccd2735e52bd89.zip |
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 <priority, MRU ID> 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 <spinler@us.ibm.com>
Change-Id: I6352e1a3cb84db0516902786faca4c387afef411
Diffstat (limited to 'extensions/openpower-pels/mru.hpp')
-rw-r--r-- | extensions/openpower-pels/mru.hpp | 122 |
1 files changed, 122 insertions, 0 deletions
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<MRUCallout>& - The MRUs + */ + const std::vector<MRUCallout>& 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<MRUCallout> _mrus; +}; + +} // namespace src +} // namespace pels +} // namespace openpower |