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