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