xref: /openbmc/openpower-vpd-parser/vpd-manager/include/types.hpp (revision a88a298f0756a525b4d628cda2fb77b8e74a283f)
1fa5e4d32SSunny Srivastava #pragma once
2fa5e4d32SSunny Srivastava 
3fa5e4d32SSunny Srivastava #include <phosphor-logging/elog-errors.hpp>
4fa5e4d32SSunny Srivastava #include <sdbusplus/asio/property.hpp>
5fa5e4d32SSunny Srivastava #include <sdbusplus/server.hpp>
6fa5e4d32SSunny Srivastava #include <xyz/openbmc_project/Common/Device/error.hpp>
7fa5e4d32SSunny Srivastava #include <xyz/openbmc_project/Common/error.hpp>
8fa5e4d32SSunny Srivastava 
9fa5e4d32SSunny Srivastava #include <tuple>
10fa5e4d32SSunny Srivastava #include <unordered_map>
11fa5e4d32SSunny Srivastava #include <variant>
12fa5e4d32SSunny Srivastava 
13fa5e4d32SSunny Srivastava namespace vpd
14fa5e4d32SSunny Srivastava {
15fa5e4d32SSunny Srivastava namespace types
16fa5e4d32SSunny Srivastava {
17fa5e4d32SSunny Srivastava 
18fa5e4d32SSunny Srivastava using BiosProperty = std::tuple<
19fa5e4d32SSunny Srivastava     std::string, bool, std::string, std::string, std::string,
20fa5e4d32SSunny Srivastava     std::variant<int64_t, std::string>, std::variant<int64_t, std::string>,
21fa5e4d32SSunny Srivastava     std::vector<std::tuple<std::string, std::variant<int64_t, std::string>,
22fa5e4d32SSunny Srivastava                            std::string>>>;
23fa5e4d32SSunny Srivastava using BiosBaseTable =
24fa5e4d32SSunny Srivastava     std::variant<std::monostate, std::map<std::string, BiosProperty>>;
25fa5e4d32SSunny Srivastava using BiosBaseTableType = std::map<std::string, BiosBaseTable>;
26fa5e4d32SSunny Srivastava using BiosAttributeCurrentValue =
27fa5e4d32SSunny Srivastava     std::variant<std::monostate, int64_t, std::string>;
28fa5e4d32SSunny Srivastava using BiosAttributePendingValue = std::variant<int64_t, std::string>;
29fa5e4d32SSunny Srivastava using BiosGetAttrRetType = std::tuple<std::string, BiosAttributeCurrentValue,
30fa5e4d32SSunny Srivastava                                       BiosAttributePendingValue>;
31fa5e4d32SSunny Srivastava using PendingBIOSAttrItem =
32fa5e4d32SSunny Srivastava     std::pair<std::string, std::tuple<std::string, BiosAttributePendingValue>>;
33fa5e4d32SSunny Srivastava using PendingBIOSAttrs = std::vector<PendingBIOSAttrItem>;
34fa5e4d32SSunny Srivastava 
35fa5e4d32SSunny Srivastava using BinaryVector = std::vector<uint8_t>;
36fa5e4d32SSunny Srivastava 
37fa5e4d32SSunny Srivastava // This covers mostly all the data type supported over Dbus for a property.
38fa5e4d32SSunny Srivastava // clang-format off
39fa5e4d32SSunny Srivastava using DbusVariantType = std::variant<
40fa5e4d32SSunny Srivastava     std::vector<std::tuple<std::string, std::string, std::string>>,
41fa5e4d32SSunny Srivastava     std::vector<std::string>,
42fa5e4d32SSunny Srivastava     std::vector<double>,
43fa5e4d32SSunny Srivastava     std::string,
44fa5e4d32SSunny Srivastava     int64_t,
45fa5e4d32SSunny Srivastava     uint64_t,
46fa5e4d32SSunny Srivastava     double,
47fa5e4d32SSunny Srivastava     int32_t,
48fa5e4d32SSunny Srivastava     uint32_t,
49fa5e4d32SSunny Srivastava     int16_t,
50fa5e4d32SSunny Srivastava     uint16_t,
51fa5e4d32SSunny Srivastava     uint8_t,
52fa5e4d32SSunny Srivastava     bool,
53fa5e4d32SSunny Srivastava     BinaryVector,
54fa5e4d32SSunny Srivastava     std::vector<uint32_t>,
55fa5e4d32SSunny Srivastava     std::vector<uint16_t>,
56fa5e4d32SSunny Srivastava     sdbusplus::message::object_path,
57fa5e4d32SSunny Srivastava     std::tuple<uint64_t, std::vector<std::tuple<std::string, std::string, double, uint64_t>>>,
58fa5e4d32SSunny Srivastava     std::vector<std::tuple<std::string, std::string>>,
59fa5e4d32SSunny Srivastava     std::vector<std::tuple<uint32_t, std::vector<uint32_t>>>,
60fa5e4d32SSunny Srivastava     std::vector<std::tuple<uint32_t, size_t>>,
61fa5e4d32SSunny Srivastava     std::vector<std::tuple<sdbusplus::message::object_path, std::string,
62fa5e4d32SSunny Srivastava                            std::string, std::string>>,
63fa5e4d32SSunny Srivastava     PendingBIOSAttrs
64fa5e4d32SSunny Srivastava  >;
65fa5e4d32SSunny Srivastava 
66fa5e4d32SSunny Srivastava using MapperGetObject =
67fa5e4d32SSunny Srivastava     std::vector<std::pair<std::string, std::vector<std::string>>>;
68fa5e4d32SSunny Srivastava using MapperGetSubTree = std::map<std::string, std::map<std::string, std::vector<std::string>>>;
69fa5e4d32SSunny Srivastava 
70fa5e4d32SSunny Srivastava /* A type for holding the innermost map of property::value.*/
71fa5e4d32SSunny Srivastava using IPZKwdValueMap = std::unordered_map<std::string, std::string>;
72fa5e4d32SSunny Srivastava /*IPZ VPD Map of format <Record name, <keyword, value>>*/
73fa5e4d32SSunny Srivastava using IPZVpdMap = std::unordered_map<std::string, IPZKwdValueMap>;
74fa5e4d32SSunny Srivastava 
75fa5e4d32SSunny Srivastava /*Value types supported by Keyword VPD*/
76fa5e4d32SSunny Srivastava using KWdVPDValueType = std::variant<BinaryVector,std::string, size_t>;
77fa5e4d32SSunny Srivastava /* This hold map of parsed data of keyword VPD type*/
78fa5e4d32SSunny Srivastava using KeywordVpdMap = std::unordered_map<std::string, KWdVPDValueType>;
79fa5e4d32SSunny Srivastava 
80fa5e4d32SSunny Srivastava /**
81fa5e4d32SSunny Srivastava  * Both Keyword VPD parser and DDIMM parser stores the
82fa5e4d32SSunny Srivastava  * parsed VPD in the same format.
83fa5e4d32SSunny Srivastava  * To have better readability, two types are defined for underneath data structure.
84fa5e4d32SSunny Srivastava */
85fa5e4d32SSunny Srivastava using DdimmVpdMap = KeywordVpdMap;
86fa5e4d32SSunny Srivastava 
87fa5e4d32SSunny Srivastava /**
88fa5e4d32SSunny Srivastava  * Both Keyword VPD parser and ISDIMM parser stores the
89fa5e4d32SSunny Srivastava  * parsed SPD in the same format.
90fa5e4d32SSunny Srivastava */
91fa5e4d32SSunny Srivastava using JedecSpdMap = KeywordVpdMap;
92fa5e4d32SSunny Srivastava 
93fa5e4d32SSunny Srivastava /**
94fa5e4d32SSunny Srivastava  * Type to hold keyword::value map of a VPD.
95fa5e4d32SSunny Srivastava  * Variant can be extended to support additional type.
96fa5e4d32SSunny Srivastava */
97fa5e4d32SSunny Srivastava using VPDKWdValueMap = std::variant<IPZKwdValueMap, KeywordVpdMap>;
98fa5e4d32SSunny Srivastava 
99fa5e4d32SSunny Srivastava /* Map<Property, Value>*/
100fa5e4d32SSunny Srivastava using PropertyMap = std::map<std::string, DbusVariantType>;
101fa5e4d32SSunny Srivastava /* Map<Interface<Property, Value>>*/
102fa5e4d32SSunny Srivastava using InterfaceMap = std::map<std::string, PropertyMap>;
103fa5e4d32SSunny Srivastava using ObjectMap = std::map<sdbusplus::message::object_path, InterfaceMap>;
104fa5e4d32SSunny Srivastava 
105fa5e4d32SSunny Srivastava using KwSize = uint8_t;
106fa5e4d32SSunny Srivastava using RecordId = uint8_t;
107fa5e4d32SSunny Srivastava using RecordSize = uint16_t;
108fa5e4d32SSunny Srivastava using RecordType = uint16_t;
109fa5e4d32SSunny Srivastava using RecordOffset = uint16_t;
110fa5e4d32SSunny Srivastava using RecordLength = uint16_t;
111fa5e4d32SSunny Srivastava using ECCOffset = uint16_t;
112fa5e4d32SSunny Srivastava using ECCLength = uint16_t;
113fa5e4d32SSunny Srivastava using PoundKwSize = uint16_t;
114fa5e4d32SSunny Srivastava 
115fa5e4d32SSunny Srivastava using RecordOffsetList = std::vector<uint32_t>;
116fa5e4d32SSunny Srivastava 
117fa5e4d32SSunny Srivastava using VPDMapVariant = std::variant<std::monostate, IPZVpdMap, KeywordVpdMap>;
118fa5e4d32SSunny Srivastava 
119fa5e4d32SSunny Srivastava using HWVerList = std::vector<std::pair<std::string, std::string>>;
120fa5e4d32SSunny Srivastava /**
121fa5e4d32SSunny Srivastava  * Map of <systemIM, pair<Default version, vector<HW version, JSON suffix>>>
122fa5e4d32SSunny Srivastava */
123fa5e4d32SSunny Srivastava using SystemTypeMap =
124fa5e4d32SSunny Srivastava     std::unordered_map<std::string, std::pair<std::string, HWVerList>>;
125fa5e4d32SSunny Srivastava 
126fa5e4d32SSunny Srivastava using Path = std::string;
127fa5e4d32SSunny Srivastava using Record = std::string;
128fa5e4d32SSunny Srivastava using Keyword = std::string;
129fa5e4d32SSunny Srivastava 
130fa5e4d32SSunny Srivastava using IpzData = std::tuple<Record, Keyword, BinaryVector>;
131fa5e4d32SSunny Srivastava using KwData = std::tuple<Keyword, BinaryVector>;
132fa5e4d32SSunny Srivastava using VpdData = std::variant<IpzData, KwData>;
133fa5e4d32SSunny Srivastava 
134fa5e4d32SSunny Srivastava using IpzType = std::tuple<Record, Keyword>;
135fa5e4d32SSunny Srivastava using ReadVpdParams = std::variant<IpzType, Keyword>;
136fa5e4d32SSunny Srivastava using WriteVpdParams = std::variant<IpzData, KwData>;
137fa5e4d32SSunny Srivastava 
138fa5e4d32SSunny Srivastava using ListOfPaths = std::vector<sdbusplus::message::object_path>;
139fa5e4d32SSunny Srivastava using RecordData = std::tuple<RecordOffset, RecordLength, ECCOffset, ECCLength>;
140fa5e4d32SSunny Srivastava 
141fa5e4d32SSunny Srivastava using DbusInvalidArgument =
142fa5e4d32SSunny Srivastava     sdbusplus::xyz::openbmc_project::Common::Error::InvalidArgument;
143fa5e4d32SSunny Srivastava using DbusNotAllowed = sdbusplus::xyz::openbmc_project::Common::Error::NotAllowed;
144fa5e4d32SSunny Srivastava 
145fa5e4d32SSunny Srivastava using InvalidArgument = phosphor::logging::xyz::openbmc_project::Common::InvalidArgument;
146fa5e4d32SSunny Srivastava 
147fa5e4d32SSunny Srivastava namespace DeviceError = sdbusplus::xyz::openbmc_project::Common::Device::Error;
148fa5e4d32SSunny Srivastava 
149fa5e4d32SSunny Srivastava /* PEL Severity enum as defined in [xyz.openbmc_project.Logging.Entry.Level]log.hpp from 'phosphor-logging' repo. */
150fa5e4d32SSunny Srivastava enum SeverityType
151fa5e4d32SSunny Srivastava {
152fa5e4d32SSunny Srivastava     Notice,
153fa5e4d32SSunny Srivastava     Informational,
154fa5e4d32SSunny Srivastava     Debug,
155fa5e4d32SSunny Srivastava     Warning,
156fa5e4d32SSunny Srivastava     Critical,
157fa5e4d32SSunny Srivastava     Emergency,
158fa5e4d32SSunny Srivastava     Alert,
159fa5e4d32SSunny Srivastava     Error
160fa5e4d32SSunny Srivastava };
161fa5e4d32SSunny Srivastava 
162fa5e4d32SSunny Srivastava /* PEL callout priority from 'phosphor-logging' pel_types.hpp. If any change in 'phosphor-logging', it needs update here as well. */
163fa5e4d32SSunny Srivastava enum CalloutPriority
164fa5e4d32SSunny Srivastava {
165fa5e4d32SSunny Srivastava     High,
166fa5e4d32SSunny Srivastava     Medium,
167fa5e4d32SSunny Srivastava     MediumGroupA,
168fa5e4d32SSunny Srivastava     MediumGroupB,
169fa5e4d32SSunny Srivastava     MediumGroupC,
170fa5e4d32SSunny Srivastava     Low
171fa5e4d32SSunny Srivastava };
172fa5e4d32SSunny Srivastava 
173fa5e4d32SSunny Srivastava /* The Message property of the event entry for creating PEL, to introduce new message needs to be added in 'phosphor-logging' message_registry.json as well. */
174fa5e4d32SSunny Srivastava enum ErrorType
175fa5e4d32SSunny Srivastava {
176fa5e4d32SSunny Srivastava     DefaultValue,
177fa5e4d32SSunny Srivastava     InvalidVpdMessage,
178fa5e4d32SSunny Srivastava     VpdMismatch,
179fa5e4d32SSunny Srivastava     InvalidEeprom,
180fa5e4d32SSunny Srivastava     EccCheckFailed,
181fa5e4d32SSunny Srivastava     JsonFailure,
182fa5e4d32SSunny Srivastava     DbusFailure,
183fa5e4d32SSunny Srivastava     InvalidSystem,
184fa5e4d32SSunny Srivastava     EssentialFru,
185*a88a298fSSunny Srivastava     GpioError,
186*a88a298fSSunny Srivastava     InternalFailure, /* Should be used for any generic firmware failure */
187*a88a298fSSunny Srivastava     FruMissing /* Should be used in case of presence failure */
188fa5e4d32SSunny Srivastava };
189fa5e4d32SSunny Srivastava 
190fa5e4d32SSunny Srivastava using InventoryCalloutData = std::tuple<std::string, CalloutPriority>;
191fa5e4d32SSunny Srivastava using DeviceCalloutData = std::tuple<std::string, std::string>;
192fa5e4d32SSunny Srivastava using I2cBusCalloutData = std::tuple<std::string, std::string, std::string>;
193fa5e4d32SSunny Srivastava } // namespace types
194fa5e4d32SSunny Srivastava } // namespace vpd
195