xref: /openbmc/openpower-hw-diags/attn/pel/primary_src.hpp (revision 27dd6368d4e6b1fd03610503356f24eb08a16c02)
1f5210bb6SBen Tyner #pragma once
2f5210bb6SBen Tyner 
3f5210bb6SBen Tyner #include "pel_common.hpp"
4f5210bb6SBen Tyner #include "pel_section.hpp"
5f5210bb6SBen Tyner #include "stream.hpp"
6f5210bb6SBen Tyner 
7*4efca280SAndrew Geissler #include <array>
8*4efca280SAndrew Geissler 
9f5210bb6SBen Tyner namespace attn
10f5210bb6SBen Tyner {
11f5210bb6SBen Tyner namespace pel
12f5210bb6SBen Tyner {
13f5210bb6SBen Tyner 
14f5210bb6SBen Tyner /**
15f5210bb6SBen Tyner  * @class PrimarySrc
16f5210bb6SBen Tyner  *
17f5210bb6SBen Tyner  * @brief This class represents the primary SRC sections in the PEL.
18f5210bb6SBen Tyner  *
19f5210bb6SBen Tyner  * |--------+--------------------------------------------|
20f5210bb6SBen Tyner  * | length | field                                      |
21f5210bb6SBen Tyner  * |--------+--------------------------------------------|
22f5210bb6SBen Tyner  * | 1      | Version = 0x02                             |
23f5210bb6SBen Tyner  * |--------+--------------------------------------------|
24f5210bb6SBen Tyner  * | 1      | Flags = 0x00 (no additional data sections) |
25f5210bb6SBen Tyner  * |--------+--------------------------------------------|
26f5210bb6SBen Tyner  * | 1      | reserved                                   |
27f5210bb6SBen Tyner  * |--------+--------------------------------------------|
28f5210bb6SBen Tyner  * | 1      | Number of words of hex data + 1 = 0x09     |
29f5210bb6SBen Tyner  * |--------+--------------------------------------------|
30f5210bb6SBen Tyner  * | 2      | reserved                                   |
31f5210bb6SBen Tyner  * |--------+--------------------------------------------|
32f5210bb6SBen Tyner  * | 2      | Total length of SRC in bytes = 0x48        |
33f5210bb6SBen Tyner  * |--------+--------------------------------------------|
34f5210bb6SBen Tyner  * | 4      | Hex Word 2 (word 1 intentionally skipped)  |
35f5210bb6SBen Tyner  * |--------+--------------------------------------------|
36f5210bb6SBen Tyner  * | 4      | Hex Word 3                                 |
37f5210bb6SBen Tyner  * |--------+--------------------------------------------|
38f5210bb6SBen Tyner  * | 4      | Hex Word 4                                 |
39f5210bb6SBen Tyner  * |--------+--------------------------------------------|
40f5210bb6SBen Tyner  * | 4      | Hex Word 5                                 |
41f5210bb6SBen Tyner  * |--------+--------------------------------------------|
42f5210bb6SBen Tyner  * | 4      | Hex Word 6                                 |
43f5210bb6SBen Tyner  * |--------+--------------------------------------------|
44f5210bb6SBen Tyner  * | 4      | Hex Word 7                                 |
45f5210bb6SBen Tyner  * |--------+--------------------------------------------|
46f5210bb6SBen Tyner  * | 4      | Hex Word 8                                 |
47f5210bb6SBen Tyner  * |--------+--------------------------------------------|
48f5210bb6SBen Tyner  * | 4      | Hex Word 9                                 |
49f5210bb6SBen Tyner  * |--------+--------------------------------------------|
50f5210bb6SBen Tyner  * | 32     | ASCII String                               |
51f5210bb6SBen Tyner  * |--------+--------------------------------------------|
52f5210bb6SBen Tyner  */
53f5210bb6SBen Tyner class PrimarySrc : public Section
54f5210bb6SBen Tyner {
55f5210bb6SBen Tyner   public:
56f5210bb6SBen Tyner     enum HeaderFlags
57f5210bb6SBen Tyner     {
58f5210bb6SBen Tyner         additionalSections = 0x01,
59f5210bb6SBen Tyner         powerFaultEvent = 0x02,
60f5210bb6SBen Tyner         hypDumpInit = 0x04,
61f5210bb6SBen Tyner         i5OSServiceEventBit = 0x10,
62f5210bb6SBen Tyner         virtualProgressSRC = 0x80
63f5210bb6SBen Tyner     };
64f5210bb6SBen Tyner 
65f5210bb6SBen Tyner     PrimarySrc() = delete;
66f5210bb6SBen Tyner     ~PrimarySrc() = default;
67f5210bb6SBen Tyner     PrimarySrc(const PrimarySrc&) = delete;
68f5210bb6SBen Tyner     PrimarySrc& operator=(const PrimarySrc&) = delete;
69f5210bb6SBen Tyner     PrimarySrc(PrimarySrc&&) = delete;
70f5210bb6SBen Tyner     PrimarySrc& operator=(PrimarySrc&&) = delete;
71f5210bb6SBen Tyner 
72f5210bb6SBen Tyner     /**
73f5210bb6SBen Tyner      * @brief Constructor
74f5210bb6SBen Tyner      *
75f5210bb6SBen Tyner      * Fills in this class's data fields from raw data.
76f5210bb6SBen Tyner      *
77f5210bb6SBen Tyner      * @param[in] pel - the PEL data stream
78f5210bb6SBen Tyner      */
79f5210bb6SBen Tyner     explicit PrimarySrc(Stream& pel);
80f5210bb6SBen Tyner 
81f5210bb6SBen Tyner     /**
82f5210bb6SBen Tyner      * @brief Flatten the section into the stream
83f5210bb6SBen Tyner      *
84f5210bb6SBen Tyner      * @param[in] stream - The stream to write to
85f5210bb6SBen Tyner      */
86f5210bb6SBen Tyner     void flatten(Stream& stream) const override;
87f5210bb6SBen Tyner 
88f5210bb6SBen Tyner     /**
89f5210bb6SBen Tyner      * @brief Fills in the object from the stream data
90f5210bb6SBen Tyner      *
91f5210bb6SBen Tyner      * @param[in] stream - The stream to read from
92f5210bb6SBen Tyner      */
93f5210bb6SBen Tyner     void unflatten(Stream& stream);
94f5210bb6SBen Tyner 
95f5210bb6SBen Tyner     /**
96f5210bb6SBen Tyner      * @brief Set the SRC words
97f5210bb6SBen Tyner      *
98f5210bb6SBen Tyner      * @param[in] srcWords - The SRC words
99f5210bb6SBen Tyner      */
100f5210bb6SBen Tyner     void setSrcWords(std::array<uint32_t, numSrcWords> srcWords);
101f5210bb6SBen Tyner 
102f5210bb6SBen Tyner     /**
103f5210bb6SBen Tyner      * @brief Set the ascii string field
104f5210bb6SBen Tyner      *
105f5210bb6SBen Tyner      * @param[in]  asciiString - The ascii string
106f5210bb6SBen Tyner      */
107f5210bb6SBen Tyner     void setAsciiString(std::array<char, asciiStringSize> asciiString);
108f5210bb6SBen Tyner 
109f5210bb6SBen Tyner   private:
110f5210bb6SBen Tyner     /**
111f5210bb6SBen Tyner      * @brief The SRC version field
112f5210bb6SBen Tyner      */
113f5210bb6SBen Tyner     uint8_t _version = 0x02;
114f5210bb6SBen Tyner 
115f5210bb6SBen Tyner     /**
116f5210bb6SBen Tyner      * @brief The SRC flags field
117f5210bb6SBen Tyner      */
118f5210bb6SBen Tyner     uint8_t _flags = 0;
119f5210bb6SBen Tyner 
120f5210bb6SBen Tyner     /**
121f5210bb6SBen Tyner      * @brief A byte of reserved data after the flags field
122f5210bb6SBen Tyner      */
123f5210bb6SBen Tyner     uint8_t _reserved1B = 0;
124f5210bb6SBen Tyner 
125f5210bb6SBen Tyner     /**
126f5210bb6SBen Tyner      * @brief The hex data word count.
127f5210bb6SBen Tyner      */
128f5210bb6SBen Tyner     uint8_t _wordCount = numSrcWords + 1; // +1 for backward compatability
129f5210bb6SBen Tyner 
130f5210bb6SBen Tyner     /**
131f5210bb6SBen Tyner      * @brief Two bytes of reserved data after the hex word count
132f5210bb6SBen Tyner      */
133f5210bb6SBen Tyner     uint16_t _reserved2B = 0;
134f5210bb6SBen Tyner 
135f5210bb6SBen Tyner     /**
136f5210bb6SBen Tyner      * @brief The total size of the SRC section (w/o section header)
137f5210bb6SBen Tyner      */
138f5210bb6SBen Tyner     uint16_t _size = 72; // 72 (bytes) = size of basic SRC section
139f5210bb6SBen Tyner 
140f5210bb6SBen Tyner     /**
141f5210bb6SBen Tyner      * @brief The SRC 'hex words'.
142f5210bb6SBen Tyner      */
143f5210bb6SBen Tyner     std::array<uint32_t, numSrcWords> _srcWords;
144f5210bb6SBen Tyner 
145f5210bb6SBen Tyner     /**
146f5210bb6SBen Tyner      * @brief The 32 byte ASCII character string of the SRC
147f5210bb6SBen Tyner      */
148f5210bb6SBen Tyner     std::array<char, asciiStringSize> _asciiString;
149f5210bb6SBen Tyner };
150f5210bb6SBen Tyner 
151f5210bb6SBen Tyner } // namespace pel
152f5210bb6SBen Tyner } // namespace attn
153