xref: /openbmc/ipmi-fru-parser/frup.hpp (revision 6eed4032cb2b08a8b9d41329fc3553a65269cbde)
119c617b7SRatan Gupta #ifndef OPENBMC_IPMI_FRU_PARSER_H
219c617b7SRatan Gupta #define OPENBMC_IPMI_FRU_PARSER_H
319c617b7SRatan Gupta 
419c617b7SRatan Gupta #include <systemd/sd-bus.h>
519c617b7SRatan Gupta #include <array>
6*6eed4032SRatan Gupta #include <string>
7*6eed4032SRatan Gupta #include <map>
819c617b7SRatan Gupta 
919c617b7SRatan Gupta enum ipmi_fru_area_type
1019c617b7SRatan Gupta {
1119c617b7SRatan Gupta     IPMI_FRU_AREA_INTERNAL_USE = 0x00,
1219c617b7SRatan Gupta     IPMI_FRU_AREA_CHASSIS_INFO,
1319c617b7SRatan Gupta     IPMI_FRU_AREA_BOARD_INFO,
1419c617b7SRatan Gupta     IPMI_FRU_AREA_PRODUCT_INFO,
1519c617b7SRatan Gupta     IPMI_FRU_AREA_MULTI_RECORD,
1619c617b7SRatan Gupta     IPMI_FRU_AREA_TYPE_MAX
1719c617b7SRatan Gupta };
1819c617b7SRatan Gupta 
1919c617b7SRatan Gupta 
2019c617b7SRatan Gupta enum openbmc_vpd_key_id
2119c617b7SRatan Gupta {
2219c617b7SRatan Gupta   OPENBMC_VPD_KEY_CHASSIS_TYPE = 1, /* not a type/len */
2319c617b7SRatan Gupta   OPENBMC_VPD_KEY_CHASSIS_PART_NUM,
2419c617b7SRatan Gupta   OPENBMC_VPD_KEY_CHASSIS_SERIAL_NUM,
2519c617b7SRatan Gupta   OPENBMC_VPD_KEY_CHASSIS_CUSTOM1,
2619c617b7SRatan Gupta   OPENBMC_VPD_KEY_CHASSIS_CUSTOM2,
2719c617b7SRatan Gupta   OPENBMC_VPD_KEY_CHASSIS_CUSTOM3,
2819c617b7SRatan Gupta   OPENBMC_VPD_KEY_CHASSIS_CUSTOM4,
2919c617b7SRatan Gupta   OPENBMC_VPD_KEY_CHASSIS_CUSTOM5,
3019c617b7SRatan Gupta   OPENBMC_VPD_KEY_CHASSIS_CUSTOM6,
3119c617b7SRatan Gupta   OPENBMC_VPD_KEY_CHASSIS_CUSTOM7,
3219c617b7SRatan Gupta   OPENBMC_VPD_KEY_CHASSIS_CUSTOM8,
3319c617b7SRatan Gupta   OPENBMC_VPD_KEY_CHASSIS_MAX = OPENBMC_VPD_KEY_CHASSIS_CUSTOM8,
3419c617b7SRatan Gupta   /* TODO: chassis_custom_fields */
3519c617b7SRatan Gupta 
3619c617b7SRatan Gupta   OPENBMC_VPD_KEY_BOARD_MFG_DATE, /* not a type/len */
3719c617b7SRatan Gupta   OPENBMC_VPD_KEY_BOARD_MFR,
3819c617b7SRatan Gupta   OPENBMC_VPD_KEY_BOARD_NAME,
3919c617b7SRatan Gupta   OPENBMC_VPD_KEY_BOARD_SERIAL_NUM,
4019c617b7SRatan Gupta   OPENBMC_VPD_KEY_BOARD_PART_NUM,
4119c617b7SRatan Gupta   OPENBMC_VPD_KEY_BOARD_FRU_FILE_ID,
4219c617b7SRatan Gupta   OPENBMC_VPD_KEY_BOARD_CUSTOM1,
4319c617b7SRatan Gupta   OPENBMC_VPD_KEY_BOARD_CUSTOM2,
4419c617b7SRatan Gupta   OPENBMC_VPD_KEY_BOARD_CUSTOM3,
4519c617b7SRatan Gupta   OPENBMC_VPD_KEY_BOARD_CUSTOM4,
4619c617b7SRatan Gupta   OPENBMC_VPD_KEY_BOARD_CUSTOM5,
4719c617b7SRatan Gupta   OPENBMC_VPD_KEY_BOARD_CUSTOM6,
4819c617b7SRatan Gupta   OPENBMC_VPD_KEY_BOARD_CUSTOM7,
4919c617b7SRatan Gupta   OPENBMC_VPD_KEY_BOARD_CUSTOM8,
5019c617b7SRatan Gupta   OPENBMC_VPD_KEY_BOARD_MAX = OPENBMC_VPD_KEY_BOARD_CUSTOM8,
5119c617b7SRatan Gupta   /* TODO: board_custom_fields */
5219c617b7SRatan Gupta 
5319c617b7SRatan Gupta   OPENBMC_VPD_KEY_PRODUCT_MFR,
5419c617b7SRatan Gupta   OPENBMC_VPD_KEY_PRODUCT_NAME,
5519c617b7SRatan Gupta   OPENBMC_VPD_KEY_PRODUCT_PART_MODEL_NUM,
5619c617b7SRatan Gupta   OPENBMC_VPD_KEY_PRODUCT_VER,
5719c617b7SRatan Gupta   OPENBMC_VPD_KEY_PRODUCT_SERIAL_NUM,
5819c617b7SRatan Gupta   OPENBMC_VPD_KEY_PRODUCT_ASSET_TAG,
5919c617b7SRatan Gupta   OPENBMC_VPD_KEY_PRODUCT_FRU_FILE_ID,
6019c617b7SRatan Gupta   OPENBMC_VPD_KEY_PRODUCT_CUSTOM1,
6119c617b7SRatan Gupta   OPENBMC_VPD_KEY_PRODUCT_CUSTOM2,
6219c617b7SRatan Gupta   OPENBMC_VPD_KEY_PRODUCT_CUSTOM3,
6319c617b7SRatan Gupta   OPENBMC_VPD_KEY_PRODUCT_CUSTOM4,
6419c617b7SRatan Gupta   OPENBMC_VPD_KEY_PRODUCT_CUSTOM5,
6519c617b7SRatan Gupta   OPENBMC_VPD_KEY_PRODUCT_CUSTOM6,
6619c617b7SRatan Gupta   OPENBMC_VPD_KEY_PRODUCT_CUSTOM7,
6719c617b7SRatan Gupta   OPENBMC_VPD_KEY_PRODUCT_CUSTOM8,
6819c617b7SRatan Gupta   OPENBMC_VPD_KEY_PRODUCT_MAX = OPENBMC_VPD_KEY_PRODUCT_CUSTOM8,
6919c617b7SRatan Gupta 
7019c617b7SRatan Gupta   OPENBMC_VPD_KEY_MAX,
7119c617b7SRatan Gupta   OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX=8,
7219c617b7SRatan Gupta 
7319c617b7SRatan Gupta };
7419c617b7SRatan Gupta 
7519c617b7SRatan Gupta using IPMIFruInfo = std::array<std::pair<std::string,std::string>,
7619c617b7SRatan Gupta                            OPENBMC_VPD_KEY_MAX>;
7719c617b7SRatan Gupta 
78*6eed4032SRatan Gupta using IPMIFruMetadata = std::string;
79*6eed4032SRatan Gupta using IPMIFruMetadataValue = std::string;
80*6eed4032SRatan Gupta using IPMIFruMap = std::map<IPMIFruMetadata,IPMIFruMetadataValue>;
81*6eed4032SRatan Gupta 
82*6eed4032SRatan Gupta using DbusProperty = std::string;
83*6eed4032SRatan Gupta using DbusPropertyMap = std::map<DbusProperty,IPMIFruMap>;
84*6eed4032SRatan Gupta 
85*6eed4032SRatan Gupta using DbusInterface = std::string;
86*6eed4032SRatan Gupta using DbusInterfaceMap = std::map<DbusInterface,DbusPropertyMap>;
87*6eed4032SRatan Gupta 
88*6eed4032SRatan Gupta using FruInstancePath = std::string;
89*6eed4032SRatan Gupta using FruInstanceMap = std::map<FruInstancePath,DbusInterfaceMap>;
90*6eed4032SRatan Gupta 
91*6eed4032SRatan Gupta using FruId = uint32_t;
92*6eed4032SRatan Gupta using FruMap = std::map<FruId,FruInstanceMap>;
9319c617b7SRatan Gupta 
9419c617b7SRatan Gupta /* Parse an IPMI write fru data message into a dictionary containing name value pair of VPD entries.*/
9519c617b7SRatan Gupta int parse_fru (const void* msgbuf, sd_bus_message* vpdtbl);
9619c617b7SRatan Gupta 
9719c617b7SRatan Gupta int parse_fru_area (const uint8_t area, const void* msgbuf,
9819c617b7SRatan Gupta                     const size_t len, IPMIFruInfo& info);
9919c617b7SRatan Gupta 
10019c617b7SRatan Gupta #endif
101