blob: fe8723d398e6b8d6943657b429d185d0da3c0461 [file] [log] [blame]
Matt Spinlerb6664332019-09-10 15:24:10 -05001#pragma once
2
3#include "stream.hpp"
4
5#include <string>
6
7namespace openpower
8{
9namespace pels
10{
11
12/** @class MTMS
13 *
14 * (M)achine (T)ype-(M)odel (S)erialNumber
15 *
16 * Represents the PEL's Machine Type / Model / Serial Number
17 * structure, which shows up in multiple places in a PEL.
18 *
19 * It holds 8 bytes for the Type+Model, and 12 for the SN.
20 * Unused bytes are set to 0s.
21 *
22 * The type and model are combined into a single field.
23 */
24class MTMS
25{
26 public:
27 MTMS(const MTMS&) = default;
28 MTMS& operator=(const MTMS&) = default;
29 MTMS(MTMS&&) = default;
30 MTMS& operator=(MTMS&&) = default;
31 ~MTMS() = default;
32
33 enum
34 {
35 mtmSize = 8,
36 snSize = 12
37 };
38
39 /**
40 * @brief Constructor
41 */
42 MTMS();
43
44 /**
45 * @brief Constructor
46 *
47 * @param[in] typeModel - The machine type+model
48 * @param[in] serialNumber - The machine serial number
49 */
50 MTMS(const std::string& typeModel, const std::string& serialNumber);
51
52 /**
53 * @brief Constructor
54 *
55 * Fills in this class's data fields from the stream.
56 *
57 * @param[in] pel - the PEL data stream
58 */
59 explicit MTMS(Stream& stream);
60
61 /**
62 * @brief Returns the machine type/model value
63 *
64 * @return std::array<uint8_t, mtmSize>& - The TM value
65 */
66 std::array<uint8_t, mtmSize>& machineTypeAndModel()
67 {
68 return _machineTypeAndModel;
69 }
70
71 /**
72 * @brief Returns the machine serial number value
73 *
74 * @return std::array<uint8_t, snSize>& - The SN value
75 */
76 std::array<uint8_t, snSize>& machineSerialNumber()
77 {
78 return _serialNumber;
79 }
80
81 /**
82 * @brief Returns the size of the data when flattened
83 *
84 * @return size_t - The size of the data
85 */
86 static constexpr size_t flattenedSize()
87 {
88 return mtmSize + snSize;
89 }
90
91 private:
92 /**
93 * @brief The type+model value
94 *
95 * Of the form TTTT-MMM where:
96 * TTTT = machine type
97 * MMM = machine model
98 */
99 std::array<uint8_t, mtmSize> _machineTypeAndModel;
100
101 /**
102 * @brief Machine Serial Number
103 */
104 std::array<uint8_t, snSize> _serialNumber;
105};
106
107/**
108 * @brief Stream extraction operator for MTMS
109 *
110 * @param[in] s - the stream
111 * @param[out] mtms - the MTMS object
112 *
113 * @return Stream&
114 */
115Stream& operator>>(Stream& s, MTMS& mtms);
116
117/**
118 * @brief Stream insertion operator for MTMS
119 *
120 * @param[out] s - the stream
121 * @param[in] mtms - the MTMS object
122 *
123 * @return Stream&
124 */
125Stream& operator<<(Stream& s, MTMS& mtms);
126
127} // namespace pels
128} // namespace openpower