blob: 993b32bcc1b58723e30ea145cfd51487755be7a3 [file] [log] [blame]
Matt Spinlera906c942019-10-08 13:42:05 -05001#pragma once
2
Matt Spinlerba0ee002020-03-13 11:24:14 -05003#include "pel_types.hpp"
Matt Spinlera906c942019-10-08 13:42:05 -05004#include "stream.hpp"
5
Matt Spinler46139b02022-06-03 13:25:41 -05006#include <array>
Matt Spinlera906c942019-10-08 13:42:05 -05007#include <optional>
8
9namespace openpower
10{
11namespace pels
12{
13namespace src
14{
15
16/**
Matt Spinler468aab52020-08-13 11:04:31 -050017 * @brief Specifies if the incoming maintenance procedure or
18 * symbolic FRU is the registry name or the raw name.
19 */
20enum class CalloutValueType
21{
22 raw,
23 registryName
24};
25
26/**
Matt Spinlera906c942019-10-08 13:42:05 -050027 * @class FRUIdentity
28 *
29 * This represents the FRU Identity substructure in the
30 * callout subsection of the SRC PEL section.
31 *
32 * It provides information about the FRU being called out,
33 * such as serial number and part number. A maintenance
34 * procedure name may be used instead of the part number,
35 * and this would be indicated in the flags field.
36 */
37class FRUIdentity
38{
39 public:
40 /**
41 * @brief The failing component type
42 *
43 * Upper nibble of the flags byte
44 */
45 enum FailingComponentType
46 {
47 hardwareFRU = 0x10,
48 codeFRU = 0x20,
49 configError = 0x30,
50 maintenanceProc = 0x40,
51 externalFRU = 0x90,
52 externalCodeFRU = 0xA0,
53 toolFRU = 0xB0,
54 symbolicFRU = 0xC0,
55 symbolicFRUTrustedLocCode = 0xE0
56 };
57
58 /**
59 * @brief The lower nibble of the flags byte
60 */
61 enum Flags
62 {
63 pnSupplied = 0x08,
64 ccinSupplied = 0x04,
65 maintProcSupplied = 0x02,
66 snSupplied = 0x01
67 };
68
69 FRUIdentity() = delete;
70 ~FRUIdentity() = default;
71 FRUIdentity(const FRUIdentity&) = default;
72 FRUIdentity& operator=(const FRUIdentity&) = default;
73 FRUIdentity(FRUIdentity&&) = default;
74 FRUIdentity& operator=(FRUIdentity&&) = default;
75
76 /**
77 * @brief Constructor
78 *
79 * Fills in this class's data fields from the stream.
80 *
81 * @param[in] pel - the PEL data stream
82 */
83 explicit FRUIdentity(Stream& pel);
84
85 /**
Matt Spinlerba0ee002020-03-13 11:24:14 -050086 * Constructor
87 *
88 * Creates the object as a hardware callout with the part number,
89 * CCIN, and serial number fields supplied.
90 *
91 * @param[in] partNumber - The part number of the FRU
92 * @param[in] ccin - The CCIN of the FRU
93 * @param[in] serialNumber - The serial number of the FRU
94 */
95 FRUIdentity(const std::string& partNumber, const std::string& ccin,
96 const std::string& serialNumber);
97
98 /**
99 * @brief Constructor
100 *
101 * Creates the object with a maintenance procedure callout.
102 *
Matt Spinlera27e2e52020-04-09 11:06:11 -0500103 * @param[in] procedureFromRegistry - The maintenance procedure name
104 * as defined in the message registry.
Matt Spinlerba0ee002020-03-13 11:24:14 -0500105 */
Matt Spinler45796e82022-07-01 11:25:27 -0500106 explicit FRUIdentity(const std::string& procedureFromRegistry) :
Matt Spinler468aab52020-08-13 11:04:31 -0500107 FRUIdentity(procedureFromRegistry, CalloutValueType::registryName)
108 {
109 }
110
111 /**
112 * @brief Constructor
113 *
114 * Creates the object with a maintenance procedure callout.
115 *
116 * @param[in] procedure - The maintenance procedure name.
117 * @param[in] type - If the procedure is the raw name or the registry name.
118 */
119 FRUIdentity(const std::string& procedure, CalloutValueType type);
Matt Spinlerba0ee002020-03-13 11:24:14 -0500120
121 /**
Matt Spinler2b6dfa02020-04-09 11:39:05 -0500122 * @brief Constructor
123 *
124 * Creates the object with a symbolic FRU callout.
125 *
126 * @param[in] symbolicFRUFromRegistry - The symbolic FRU name as
127 * defined in the message registry.
128 * @param[in] trustedLocationCode - If this FRU callout's location code
129 * can be trusted to be correct.
130 */
131 FRUIdentity(const std::string& symbolicFRUFromRegistry,
Matt Spinler468aab52020-08-13 11:04:31 -0500132 bool trustedLocationCode) :
133 FRUIdentity(symbolicFRUFromRegistry, CalloutValueType::registryName,
134 trustedLocationCode)
135 {
136 }
137
138 /**
139 * @brief Constructor
140 *
141 * Creates the object with a symbolic FRU callout.
142 *
143 * @param[in] fru - The symbolic FRU name.
144 * @param[in] type - If the FRU is the raw name or the registry name.
145 * @param[in] trustedLocationCode - If this FRU callout's location code
146 * can be trusted to be correct.
147 */
148 FRUIdentity(const std::string& fru, CalloutValueType type,
Matt Spinler2b6dfa02020-04-09 11:39:05 -0500149 bool trustedLocationCode);
150
151 /**
Matt Spinlera906c942019-10-08 13:42:05 -0500152 * @brief Flatten the object into the stream
153 *
154 * @param[in] stream - The stream to write to
155 */
Matt Spinler724d0d82019-11-06 10:05:36 -0600156 void flatten(Stream& pel) const;
Matt Spinlera906c942019-10-08 13:42:05 -0500157
158 /**
159 * @brief Returns the size of this structure when flattened into a PEL
160 *
161 * @return size_t - The size of the section
162 */
Matt Spinlera09354b2020-03-13 10:24:52 -0500163 size_t flattenedSize() const;
Matt Spinlera906c942019-10-08 13:42:05 -0500164
165 /**
Matt Spinlerba0ee002020-03-13 11:24:14 -0500166 * @brief Returns the type field
167 *
168 * @return uint16_t - The type, always 0x4944 "ID".
169 */
170 uint16_t type() const
171 {
172 return _type;
173 }
174 /**
Matt Spinlera906c942019-10-08 13:42:05 -0500175 * @brief The failing component type for this FRU callout.
176 *
177 * @return FailingComponentType
178 */
179 FailingComponentType failingComponentType() const
180 {
181 return static_cast<FailingComponentType>(_flags & 0xF0);
182 }
183
184 /**
185 * @brief Returns the part number, if supplied
186 *
187 * @return std::optional<std::string>
188 */
189 std::optional<std::string> getPN() const;
190
191 /**
192 * @brief Returns the maintenance procedure, if supplied
193 *
194 * @return std::optional<std::string>
195 */
196 std::optional<std::string> getMaintProc() const;
197
198 /**
199 * @brief Returns the CCIN, if supplied
200 *
201 * @return std::optional<std::string>
202 */
203 std::optional<std::string> getCCIN() const;
204
205 /**
206 * @brief Returns the serial number, if supplied
207 *
208 * @return std::optional<std::string>
209 */
210 std::optional<std::string> getSN() const;
211
212 /**
213 * @brief The type identifier value of this structure.
214 */
215 static const uint16_t substructureType = 0x4944; // "ID"
216
217 private:
218 /**
219 * @brief If the part number is contained in this structure.
220 *
221 * It takes the place of the maintenance procedure ID.
222 *
223 * @return bool
224 */
225 bool hasPN() const
226 {
227 return _flags & pnSupplied;
228 }
229
230 /**
231 * @brief If the CCIN is contained in this structure.
232 *
233 * @return bool
234 */
235 bool hasCCIN() const
236 {
237 return _flags & ccinSupplied;
238 }
239
240 /**
241 * @brief If a maintenance procedure is contained in this structure.
242 *
243 * It takes the place of the part number.
244 *
245 * @return bool
246 */
247 bool hasMP() const
248 {
249 return _flags & maintProcSupplied;
250 }
251
252 /**
253 * @brief If the serial number is contained in this structure.
254 *
255 * @return bool
256 */
257 bool hasSN() const
258 {
259 return _flags & snSupplied;
260 }
261
262 /**
Matt Spinlerba0ee002020-03-13 11:24:14 -0500263 * @brief Sets the 8 character null terminated part
264 * number field to the string passed in.
265 *
266 * @param[in] partNumber - The part number string.
267 */
268 void setPartNumber(const std::string& partNumber);
269
270 /**
271 * @brief Sets the 4 character CCIN field.
272 *
273 * @param[in] ccin - The CCIN string
274 */
275 void setCCIN(const std::string& ccin);
276
277 /**
278 * @brief Sets the 12 character serial number field.
279 *
280 * @param[in] serialNumber - The serial number string
281 */
282 void setSerialNumber(const std::string& serialNumber);
283
284 /**
285 * @brief Sets the 8 character null terminated procedure
286 * field. This is in the same field as the part
287 * number since they are mutually exclusive.
Matt Spinlera27e2e52020-04-09 11:06:11 -0500288 *
Matt Spinler468aab52020-08-13 11:04:31 -0500289 * @param procedure - The procedure name.
290 * @param[in] type - If the procedure is the raw name or
291 * the registry name.
Matt Spinlerba0ee002020-03-13 11:24:14 -0500292 */
Matt Spinler468aab52020-08-13 11:04:31 -0500293 void setMaintenanceProcedure(const std::string& procedure,
294 CalloutValueType type);
Matt Spinlerba0ee002020-03-13 11:24:14 -0500295
296 /**
Matt Spinler2b6dfa02020-04-09 11:39:05 -0500297 * @brief Sets the 8 character null terminated symbolic FRU
298 * field. This is in the same field as the part
299 * number since they are mutually exclusive.
300 *
Matt Spinler468aab52020-08-13 11:04:31 -0500301 * @param[in] symbolicFRU - The symbolic FRU name.
302 * @param[in] type - If the FRU is the raw name or
303 * the registry name.
Matt Spinler2b6dfa02020-04-09 11:39:05 -0500304 */
Matt Spinler468aab52020-08-13 11:04:31 -0500305 void setSymbolicFRU(const std::string& symbolicFRU, CalloutValueType type);
Matt Spinler2b6dfa02020-04-09 11:39:05 -0500306
307 /**
Matt Spinlera906c942019-10-08 13:42:05 -0500308 * @brief The callout substructure type field. Will be "ID".
309 */
310 uint16_t _type;
311
312 /**
313 * @brief The size of this callout structure.
314 *
315 * Always a multiple of 4.
316 */
317 uint8_t _size;
318
319 /**
320 * @brief The flags byte of this substructure.
321 *
322 * See the FailingComponentType and Flags enums
323 */
324 uint8_t _flags;
325
326 /**
327 * @brief The part number OR maintenance procedure ID,
328 * depending on what the flags field specifies.
329 *
330 * A NULL terminated ASCII string.
331 */
332 std::array<char, 8> _pnOrProcedureID;
333
334 /**
335 * @brief The CCIN VPD keyword
336 *
337 * Four ASCII characters, not NULL terminated.
338 */
339 std::array<char, 4> _ccin;
340
341 /**
342 * @brief The serial number
343 *
344 * Twelve ASCII characters, not NULL terminated.
345 */
346 std::array<char, 12> _sn;
347};
348
349} // namespace src
350} // namespace pels
351} // namespace openpower