1 #pragma once
2 
3 #include "stream.hpp"
4 
5 namespace openpower
6 {
7 namespace pels
8 {
9 namespace src
10 {
11 
12 /**
13  * @class MRU
14  *
15  * This represents the MRU (Manufacturing Replaceable Unit)
16  * substructure in the callout subsection of the SRC PEL section.
17  *
18  * Manufacturing replaceable units have a finer granularity than
19  * a field replaceable unit, such as a chip on a card, and are
20  * intended to be used during manufacturing.
21  *
22  * This substructure can contain up to 128 MRU callouts, each
23  * containing a MRU ID and a callout priority value.
24  */
25 class MRU
26 {
27   public:
28     /**
29      * @brief A single MRU callout, which contains a priority
30      *        and a MRU ID.
31      *
32      * The priority value is the same priority type character
33      * value as in the parent callout structure. For alignment
34      * purposes it is a 4 byte field, though only the LSB contains
35      * the priority value.
36      */
37     struct MRUCallout
38     {
39         uint32_t priority;
40         uint32_t id;
41     };
42 
43     MRU() = delete;
44     ~MRU() = default;
45     MRU(const MRU&) = default;
46     MRU& operator=(const MRU&) = default;
47     MRU(MRU&&) = default;
48     MRU& operator=(MRU&&) = default;
49 
50     /**
51      * @brief Constructor
52      *
53      * Fills in this class's data fields from the stream.
54      *
55      * @param[in] pel - the PEL data stream
56      */
57     explicit MRU(Stream& pel);
58 
59     /**
60      * @brief Flatten the object into the stream
61      *
62      * @param[in] stream - The stream to write to
63      */
64     void flatten(Stream& pel) const;
65 
66     /**
67      * @brief Returns the size of this structure when flattened into a PEL
68      *
69      * @return size_t - The size of the section
70      */
71     size_t flattenedSize() const
72     {
73         return _size;
74     }
75 
76     /**
77      * @brief Returns the contained MRU callouts.
78      *
79      * @return const std::vector<MRUCallout>& - The MRUs
80      */
81     const std::vector<MRUCallout>& mrus() const
82     {
83         return _mrus;
84     }
85 
86     /**
87      * @brief The type identifier value of this structure.
88      */
89     static const uint16_t substructureType = 0x4D52; // "MR"
90 
91   private:
92     /**
93      * @brief The callout substructure type field. Will be 'MR'.
94      */
95     uint16_t _type;
96 
97     /**
98      * @brief The size of this callout structure.
99      */
100     uint8_t _size;
101 
102     /**
103      * @brief The flags byte of this substructure.
104      *
105      * 0x0Y: Y = number of MRU callouts
106      */
107     uint8_t _flags;
108 
109     /**
110      * @brief Reserved 4 bytes
111      */
112     uint32_t _reserved4B;
113 
114     /*
115      * @brief The MRU callouts
116      */
117     std::vector<MRUCallout> _mrus;
118 };
119 
120 } // namespace src
121 } // namespace pels
122 } // namespace openpower
123