1 #pragma once
2 
3 #include "fru_identity.hpp"
4 #include "mru.hpp"
5 #include "pce_identity.hpp"
6 #include "pel_types.hpp"
7 #include "stream.hpp"
8 
9 namespace openpower
10 {
11 namespace pels
12 {
13 namespace src
14 {
15 
16 /**
17  * @class Callout
18  *
19  * Represents a single FRU callout in the SRC's FRU callout
20  * subsection.
21  *
22  * The 'Callouts' class holds a list of these objects.
23  *
24  * The callout priority and location code are in this structure.
25  *
26  * There can also be up to one each of three types of substructures
27  * in a single callout:
28  *  * FRU Identity  (must be first if present)
29  *  * Power Controlling Enclosure (PCE)
30  *  * Manufacturing Replaceable Unit (MRU)
31  *
32  * These substructures have their own objects managed by unique_ptrs
33  * which will only be allocated if those substructures exist.
34  */
35 class Callout
36 {
37   public:
38     /**
39      * @brief Which callout substructures are included.
40      */
41     enum calloutFlags
42     {
43         calloutType = 0b0010'0000,
44         fruIdentIncluded = 0b0000'1000,
45         mruIncluded = 0b0000'0100
46 
47         // Leaving out the various PCE identity ones since
48         // we don't use them.
49     };
50 
51     Callout() = delete;
52     ~Callout() = default;
53     Callout(const Callout&) = delete;
54     Callout& operator=(const Callout&) = delete;
55     Callout(Callout&&) = delete;
56     Callout& operator=(Callout&&) = delete;
57 
58     /**
59      * @brief Constructor
60      *
61      * Fills in this class's data fields from the stream.
62      *
63      * @param[in] pel - the PEL data stream
64      */
65     explicit Callout(Stream& pel);
66 
67     /**
68      * @brief Constructor
69      *
70      * Creates the objects with a FRUIdentity substructure that calls
71      * out a normal hardware FRU.
72      *
73      * @param[in] priority - The priority of the callout
74      * @param[in] locationCode - The location code of the callout
75      * @param[in] partNumber - The part number of the callout
76      * @param[in] ccin - The CCIN of the callout
77      * @param[in] serialNumber - The serial number of the callout
78      */
79     Callout(CalloutPriority priority, const std::string& locationCode,
80             const std::string& partNumber, const std::string& ccin,
81             const std::string& serialNumber);
82 
83     /**
84      * @brief Constructor
85      *
86      * Creates the objects with a FRUIdentity substructure that calls
87      * out a maintenance procedure.
88      *
89      * @param[in] priority - The priority of the callout
90      * @param[in] procedureFromRegistry - The maintenance procedure name
91      *                                    as defined in the message registry.
92      */
93     Callout(CalloutPriority priority, const std::string& procedureFromRegistry);
94 
95     /**
96      * @brief Constructor
97      *
98      * Creates the objects with a FRUIdentity substructure that calls
99      * out a symbolic FRU.
100      *
101      * @param[in] priority - The priority of the callout
102      * @param[in] symbolicFRUFromRegistry - The symbolic FRU name as
103      *                                      defined in the message registry.
104      * @param[in] locationCode - The location code of the callout
105      * @param[in] trustedLocationCode - If the location is trusted
106      */
107     Callout(CalloutPriority priority,
108             const std::string& symbolicFRUFromRegistry,
109             const std::string& locationCode, bool trustedLocationCode);
110 
111     /**
112      * @brief Returns the size of this object when flattened into a PEL
113      *
114      * @return size_t - The size of the section
115      */
116     size_t flattenedSize() const;
117 
118     /**
119      * @brief Flatten the object into the stream
120      *
121      * @param[in] stream - The stream to write to
122      */
123     void flatten(Stream& pel) const;
124 
125     /**
126      * @brief Returns the flags field of a callout
127      *
128      * @return uint8_t - The flags
129      */
130     uint8_t flags() const
131     {
132         return _flags;
133     }
134 
135     /**
136      * @brief Returns the priority field of a callout
137      *
138      * @return uint8_t - The priority
139      */
140     uint8_t priority() const
141     {
142         return _priority;
143     }
144 
145     /**
146      * @brief Returns the location code of the callout
147      *
148      * @return std::string - The location code
149      */
150     std::string locationCode() const
151     {
152         std::string lc;
153         if (!_locationCode.empty())
154         {
155             // NULL terminated
156             lc = static_cast<const char*>(_locationCode.data());
157         }
158         return lc;
159     }
160 
161     /**
162      * @brief Returns the location code size
163      *
164      * @return size_t - The size, including the terminating null.
165      */
166     size_t locationCodeSize() const
167     {
168         return _locationCodeSize;
169     }
170 
171     /**
172      * @brief Returns the FRU identity substructure
173      *
174      * @return const std::unique_ptr<FRUIdentity>&
175      */
176     const std::unique_ptr<FRUIdentity>& fruIdentity() const
177     {
178         return _fruIdentity;
179     }
180 
181     /**
182      * @brief Returns the PCE identity substructure
183      *
184      * @return const std::unique_ptr<PCEIdentity>&
185      */
186     const std::unique_ptr<PCEIdentity>& pceIdentity() const
187     {
188         return _pceIdentity;
189     }
190 
191     /**
192      * @brief Returns the MRU identity substructure
193      *
194      * @return const std::unique_ptr<MRU>&
195      */
196     const std::unique_ptr<MRU>& mru() const
197     {
198         return _mru;
199     }
200 
201   private:
202     /**
203      * @brief Sets the location code field
204      *
205      * @param[in] locationCode - The location code string
206      */
207     void setLocationCode(const std::string& locationCode);
208 
209     /**
210      * @brief The size of this structure in the PEL
211      */
212     uint8_t _size;
213 
214     /**
215      * @brief The flags byte of this structure
216      */
217     uint8_t _flags;
218 
219     /**
220      * @brief The replacement priority
221      */
222     uint8_t _priority;
223 
224     /**
225      * @brief The length of the location code field.
226      *
227      * Includes the NULL termination, and must be a
228      * multiple of 4 (padded with zeros)
229      */
230     uint8_t _locationCodeSize = 0;
231 
232     /**
233      * @brief NULL terminated location code
234      *
235      * Includes the NULL termination, and must be a
236      * multiple of 4 (padded with zeros)
237      */
238     std::vector<char> _locationCode;
239 
240     /**
241      * @brief FRU (Field Replaceable Unit) Identity substructure
242      */
243     std::unique_ptr<FRUIdentity> _fruIdentity;
244 
245     /**
246      * @brief PCE (Power Controlling Enclosure) Identity substructure
247      */
248     std::unique_ptr<PCEIdentity> _pceIdentity;
249 
250     /**
251      * @brief MRU (Manufacturing Replaceable Unit) substructure
252      */
253     std::unique_ptr<MRU> _mru;
254 };
255 
256 } // namespace src
257 } // namespace pels
258 } // namespace openpower
259