190b4a0a0SMatt Spinler #pragma once 290b4a0a0SMatt Spinler 390b4a0a0SMatt Spinler #include "stream.hpp" 490b4a0a0SMatt Spinler 590b4a0a0SMatt Spinler namespace openpower 690b4a0a0SMatt Spinler { 790b4a0a0SMatt Spinler namespace pels 890b4a0a0SMatt Spinler { 990b4a0a0SMatt Spinler namespace src 1090b4a0a0SMatt Spinler { 1190b4a0a0SMatt Spinler 1290b4a0a0SMatt Spinler /** 1390b4a0a0SMatt Spinler * @class MRU 1490b4a0a0SMatt Spinler * 1590b4a0a0SMatt Spinler * This represents the MRU (Manufacturing Replaceable Unit) 1690b4a0a0SMatt Spinler * substructure in the callout subsection of the SRC PEL section. 1790b4a0a0SMatt Spinler * 1890b4a0a0SMatt Spinler * Manufacturing replaceable units have a finer granularity than 1990b4a0a0SMatt Spinler * a field replaceable unit, such as a chip on a card, and are 2090b4a0a0SMatt Spinler * intended to be used during manufacturing. 2190b4a0a0SMatt Spinler * 2290b4a0a0SMatt Spinler * This substructure can contain up to 128 MRU callouts, each 2390b4a0a0SMatt Spinler * containing a MRU ID and a callout priority value. 2490b4a0a0SMatt Spinler */ 2590b4a0a0SMatt Spinler class MRU 2690b4a0a0SMatt Spinler { 2790b4a0a0SMatt Spinler public: 2890b4a0a0SMatt Spinler /** 2990b4a0a0SMatt Spinler * @brief A single MRU callout, which contains a priority 3090b4a0a0SMatt Spinler * and a MRU ID. 3190b4a0a0SMatt Spinler * 3290b4a0a0SMatt Spinler * The priority value is the same priority type character 3390b4a0a0SMatt Spinler * value as in the parent callout structure. For alignment 3490b4a0a0SMatt Spinler * purposes it is a 4 byte field, though only the LSB contains 3590b4a0a0SMatt Spinler * the priority value. 3690b4a0a0SMatt Spinler */ 3790b4a0a0SMatt Spinler struct MRUCallout 3890b4a0a0SMatt Spinler { 3990b4a0a0SMatt Spinler uint32_t priority; 4090b4a0a0SMatt Spinler uint32_t id; 4190b4a0a0SMatt Spinler }; 4290b4a0a0SMatt Spinler 4390b4a0a0SMatt Spinler MRU() = delete; 4490b4a0a0SMatt Spinler ~MRU() = default; 4590b4a0a0SMatt Spinler MRU(const MRU&) = default; 4690b4a0a0SMatt Spinler MRU& operator=(const MRU&) = default; 4790b4a0a0SMatt Spinler MRU(MRU&&) = default; 4890b4a0a0SMatt Spinler MRU& operator=(MRU&&) = default; 4990b4a0a0SMatt Spinler 5090b4a0a0SMatt Spinler /** 5190b4a0a0SMatt Spinler * @brief Constructor 5290b4a0a0SMatt Spinler * 5390b4a0a0SMatt Spinler * Fills in this class's data fields from the stream. 5490b4a0a0SMatt Spinler * 5590b4a0a0SMatt Spinler * @param[in] pel - the PEL data stream 5690b4a0a0SMatt Spinler */ 5790b4a0a0SMatt Spinler explicit MRU(Stream& pel); 5890b4a0a0SMatt Spinler 5990b4a0a0SMatt Spinler /** 6090b4a0a0SMatt Spinler * @brief Flatten the object into the stream 6190b4a0a0SMatt Spinler * 6290b4a0a0SMatt Spinler * @param[in] stream - The stream to write to 6390b4a0a0SMatt Spinler */ 64*724d0d8cSMatt Spinler void flatten(Stream& pel) const; 6590b4a0a0SMatt Spinler 6690b4a0a0SMatt Spinler /** 6790b4a0a0SMatt Spinler * @brief Returns the size of this structure when flattened into a PEL 6890b4a0a0SMatt Spinler * 6990b4a0a0SMatt Spinler * @return size_t - The size of the section 7090b4a0a0SMatt Spinler */ 7190b4a0a0SMatt Spinler size_t flattenedSize() const 7290b4a0a0SMatt Spinler { 7390b4a0a0SMatt Spinler return _size; 7490b4a0a0SMatt Spinler } 7590b4a0a0SMatt Spinler 7690b4a0a0SMatt Spinler /** 7790b4a0a0SMatt Spinler * @brief Returns the contained MRU callouts. 7890b4a0a0SMatt Spinler * 7990b4a0a0SMatt Spinler * @return const std::vector<MRUCallout>& - The MRUs 8090b4a0a0SMatt Spinler */ 8190b4a0a0SMatt Spinler const std::vector<MRUCallout>& mrus() const 8290b4a0a0SMatt Spinler { 8390b4a0a0SMatt Spinler return _mrus; 8490b4a0a0SMatt Spinler } 8590b4a0a0SMatt Spinler 8690b4a0a0SMatt Spinler /** 8790b4a0a0SMatt Spinler * @brief The type identifier value of this structure. 8890b4a0a0SMatt Spinler */ 8990b4a0a0SMatt Spinler static const uint16_t substructureType = 0x4D52; // "MR" 9090b4a0a0SMatt Spinler 9190b4a0a0SMatt Spinler private: 9290b4a0a0SMatt Spinler /** 9390b4a0a0SMatt Spinler * @brief The callout substructure type field. Will be 'MR'. 9490b4a0a0SMatt Spinler */ 9590b4a0a0SMatt Spinler uint16_t _type; 9690b4a0a0SMatt Spinler 9790b4a0a0SMatt Spinler /** 9890b4a0a0SMatt Spinler * @brief The size of this callout structure. 9990b4a0a0SMatt Spinler */ 10090b4a0a0SMatt Spinler uint8_t _size; 10190b4a0a0SMatt Spinler 10290b4a0a0SMatt Spinler /** 10390b4a0a0SMatt Spinler * @brief The flags byte of this substructure. 10490b4a0a0SMatt Spinler * 10590b4a0a0SMatt Spinler * 0x0Y: Y = number of MRU callouts 10690b4a0a0SMatt Spinler */ 10790b4a0a0SMatt Spinler uint8_t _flags; 10890b4a0a0SMatt Spinler 10990b4a0a0SMatt Spinler /** 11090b4a0a0SMatt Spinler * @brief Reserved 4 bytes 11190b4a0a0SMatt Spinler */ 11290b4a0a0SMatt Spinler uint32_t _reserved4B; 11390b4a0a0SMatt Spinler 11490b4a0a0SMatt Spinler /* 11590b4a0a0SMatt Spinler * @brief The MRU callouts 11690b4a0a0SMatt Spinler */ 11790b4a0a0SMatt Spinler std::vector<MRUCallout> _mrus; 11890b4a0a0SMatt Spinler }; 11990b4a0a0SMatt Spinler 12090b4a0a0SMatt Spinler } // namespace src 12190b4a0a0SMatt Spinler } // namespace pels 12290b4a0a0SMatt Spinler } // namespace openpower 123