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