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 /** 60*5ab39978SMatt Spinler * @brief Constructor 61*5ab39978SMatt Spinler * 62*5ab39978SMatt Spinler * Creates the object using the passed in MRUs 63*5ab39978SMatt Spinler * 64*5ab39978SMatt Spinler * @param[in] mrus - The MRUs 65*5ab39978SMatt Spinler */ 66*5ab39978SMatt Spinler explicit MRU(const std::vector<MRUCallout>& mrus); 67*5ab39978SMatt Spinler 68*5ab39978SMatt Spinler /** 6990b4a0a0SMatt Spinler * @brief Flatten the object into the stream 7090b4a0a0SMatt Spinler * 7190b4a0a0SMatt Spinler * @param[in] stream - The stream to write to 7290b4a0a0SMatt Spinler */ 73724d0d8cSMatt Spinler void flatten(Stream& pel) const; 7490b4a0a0SMatt Spinler 7590b4a0a0SMatt Spinler /** 7690b4a0a0SMatt Spinler * @brief Returns the size of this structure when flattened into a PEL 7790b4a0a0SMatt Spinler * 7890b4a0a0SMatt Spinler * @return size_t - The size of the section 7990b4a0a0SMatt Spinler */ flattenedSize() const8090b4a0a0SMatt Spinler size_t flattenedSize() const 8190b4a0a0SMatt Spinler { 8290b4a0a0SMatt Spinler return _size; 8390b4a0a0SMatt Spinler } 8490b4a0a0SMatt Spinler 8590b4a0a0SMatt Spinler /** 8690b4a0a0SMatt Spinler * @brief Returns the contained MRU callouts. 8790b4a0a0SMatt Spinler * 8890b4a0a0SMatt Spinler * @return const std::vector<MRUCallout>& - The MRUs 8990b4a0a0SMatt Spinler */ mrus() const9090b4a0a0SMatt Spinler const std::vector<MRUCallout>& mrus() const 9190b4a0a0SMatt Spinler { 9290b4a0a0SMatt Spinler return _mrus; 9390b4a0a0SMatt Spinler } 9490b4a0a0SMatt Spinler 9590b4a0a0SMatt Spinler /** 96*5ab39978SMatt Spinler * @brief Returns the size field 97*5ab39978SMatt Spinler * 98*5ab39978SMatt Spinler * @return size_t - The size of the MRU substructure 99*5ab39978SMatt Spinler */ size() const100*5ab39978SMatt Spinler size_t size() const 101*5ab39978SMatt Spinler { 102*5ab39978SMatt Spinler return _size; 103*5ab39978SMatt Spinler } 104*5ab39978SMatt Spinler 105*5ab39978SMatt Spinler /** 106*5ab39978SMatt Spinler * @brief Returns the flags field 107*5ab39978SMatt Spinler * 108*5ab39978SMatt Spinler * @return uint8_t - The flags 109*5ab39978SMatt Spinler */ flags() const110*5ab39978SMatt Spinler uint8_t flags() const 111*5ab39978SMatt Spinler { 112*5ab39978SMatt Spinler return _flags; 113*5ab39978SMatt Spinler } 114*5ab39978SMatt Spinler 115*5ab39978SMatt Spinler /** 11690b4a0a0SMatt Spinler * @brief The type identifier value of this structure. 11790b4a0a0SMatt Spinler */ 11890b4a0a0SMatt Spinler static const uint16_t substructureType = 0x4D52; // "MR" 11990b4a0a0SMatt Spinler 12090b4a0a0SMatt Spinler private: 12190b4a0a0SMatt Spinler /** 12290b4a0a0SMatt Spinler * @brief The callout substructure type field. Will be 'MR'. 12390b4a0a0SMatt Spinler */ 12490b4a0a0SMatt Spinler uint16_t _type; 12590b4a0a0SMatt Spinler 12690b4a0a0SMatt Spinler /** 12790b4a0a0SMatt Spinler * @brief The size of this callout structure. 12890b4a0a0SMatt Spinler */ 12990b4a0a0SMatt Spinler uint8_t _size; 13090b4a0a0SMatt Spinler 13190b4a0a0SMatt Spinler /** 13290b4a0a0SMatt Spinler * @brief The flags byte of this substructure. 13390b4a0a0SMatt Spinler * 13490b4a0a0SMatt Spinler * 0x0Y: Y = number of MRU callouts 13590b4a0a0SMatt Spinler */ 13690b4a0a0SMatt Spinler uint8_t _flags; 13790b4a0a0SMatt Spinler 13890b4a0a0SMatt Spinler /** 13990b4a0a0SMatt Spinler * @brief Reserved 4 bytes 14090b4a0a0SMatt Spinler */ 14190b4a0a0SMatt Spinler uint32_t _reserved4B; 14290b4a0a0SMatt Spinler 14390b4a0a0SMatt Spinler /* 14490b4a0a0SMatt Spinler * @brief The MRU callouts 14590b4a0a0SMatt Spinler */ 14690b4a0a0SMatt Spinler std::vector<MRUCallout> _mrus; 14790b4a0a0SMatt Spinler }; 14890b4a0a0SMatt Spinler 14990b4a0a0SMatt Spinler } // namespace src 15090b4a0a0SMatt Spinler } // namespace pels 15190b4a0a0SMatt Spinler } // namespace openpower 152