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