1 #ifndef OPENBMC_IPMI_FRU_PARSER_H 2 #define OPENBMC_IPMI_FRU_PARSER_H 3 4 #include <systemd/sd-bus.h> 5 #include <array> 6 #include <string> 7 #include <map> 8 9 enum ipmi_fru_area_type 10 { 11 IPMI_FRU_AREA_INTERNAL_USE = 0x00, 12 IPMI_FRU_AREA_CHASSIS_INFO, 13 IPMI_FRU_AREA_BOARD_INFO, 14 IPMI_FRU_AREA_PRODUCT_INFO, 15 IPMI_FRU_AREA_MULTI_RECORD, 16 IPMI_FRU_AREA_TYPE_MAX 17 }; 18 19 20 enum openbmc_vpd_key_id 21 { 22 OPENBMC_VPD_KEY_CHASSIS_TYPE = 1, /* not a type/len */ 23 OPENBMC_VPD_KEY_CHASSIS_PART_NUM, 24 OPENBMC_VPD_KEY_CHASSIS_SERIAL_NUM, 25 OPENBMC_VPD_KEY_CHASSIS_CUSTOM1, 26 OPENBMC_VPD_KEY_CHASSIS_CUSTOM2, 27 OPENBMC_VPD_KEY_CHASSIS_CUSTOM3, 28 OPENBMC_VPD_KEY_CHASSIS_CUSTOM4, 29 OPENBMC_VPD_KEY_CHASSIS_CUSTOM5, 30 OPENBMC_VPD_KEY_CHASSIS_CUSTOM6, 31 OPENBMC_VPD_KEY_CHASSIS_CUSTOM7, 32 OPENBMC_VPD_KEY_CHASSIS_CUSTOM8, 33 OPENBMC_VPD_KEY_CHASSIS_MAX = OPENBMC_VPD_KEY_CHASSIS_CUSTOM8, 34 /* TODO: chassis_custom_fields */ 35 36 OPENBMC_VPD_KEY_BOARD_MFG_DATE, /* not a type/len */ 37 OPENBMC_VPD_KEY_BOARD_MFR, 38 OPENBMC_VPD_KEY_BOARD_NAME, 39 OPENBMC_VPD_KEY_BOARD_SERIAL_NUM, 40 OPENBMC_VPD_KEY_BOARD_PART_NUM, 41 OPENBMC_VPD_KEY_BOARD_FRU_FILE_ID, 42 OPENBMC_VPD_KEY_BOARD_CUSTOM1, 43 OPENBMC_VPD_KEY_BOARD_CUSTOM2, 44 OPENBMC_VPD_KEY_BOARD_CUSTOM3, 45 OPENBMC_VPD_KEY_BOARD_CUSTOM4, 46 OPENBMC_VPD_KEY_BOARD_CUSTOM5, 47 OPENBMC_VPD_KEY_BOARD_CUSTOM6, 48 OPENBMC_VPD_KEY_BOARD_CUSTOM7, 49 OPENBMC_VPD_KEY_BOARD_CUSTOM8, 50 OPENBMC_VPD_KEY_BOARD_MAX = OPENBMC_VPD_KEY_BOARD_CUSTOM8, 51 /* TODO: board_custom_fields */ 52 53 OPENBMC_VPD_KEY_PRODUCT_MFR, 54 OPENBMC_VPD_KEY_PRODUCT_NAME, 55 OPENBMC_VPD_KEY_PRODUCT_PART_MODEL_NUM, 56 OPENBMC_VPD_KEY_PRODUCT_VER, 57 OPENBMC_VPD_KEY_PRODUCT_SERIAL_NUM, 58 OPENBMC_VPD_KEY_PRODUCT_ASSET_TAG, 59 OPENBMC_VPD_KEY_PRODUCT_FRU_FILE_ID, 60 OPENBMC_VPD_KEY_PRODUCT_CUSTOM1, 61 OPENBMC_VPD_KEY_PRODUCT_CUSTOM2, 62 OPENBMC_VPD_KEY_PRODUCT_CUSTOM3, 63 OPENBMC_VPD_KEY_PRODUCT_CUSTOM4, 64 OPENBMC_VPD_KEY_PRODUCT_CUSTOM5, 65 OPENBMC_VPD_KEY_PRODUCT_CUSTOM6, 66 OPENBMC_VPD_KEY_PRODUCT_CUSTOM7, 67 OPENBMC_VPD_KEY_PRODUCT_CUSTOM8, 68 OPENBMC_VPD_KEY_PRODUCT_MAX = OPENBMC_VPD_KEY_PRODUCT_CUSTOM8, 69 70 OPENBMC_VPD_KEY_MAX, 71 OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX=8, 72 73 }; 74 75 using IPMIFruInfo = std::array<std::pair<std::string,std::string>, 76 OPENBMC_VPD_KEY_MAX>; 77 78 struct IPMIFruData 79 { 80 std::string section; 81 std::string property; 82 std::string delimiter; 83 }; 84 85 using DbusProperty = std::string; 86 using DbusPropertyMap = std::map<DbusProperty,IPMIFruData>; 87 88 using DbusInterface = std::string; 89 using DbusInterfaceMap = std::map<DbusInterface,DbusPropertyMap>; 90 91 using FruInstancePath = std::string; 92 using FruInstanceMap = std::map<FruInstancePath,DbusInterfaceMap>; 93 94 using FruId = uint32_t; 95 using FruMap = std::map<FruId,FruInstanceMap>; 96 97 /* Parse an IPMI write fru data message into a dictionary containing name value pair of VPD entries.*/ 98 int parse_fru (const void* msgbuf, sd_bus_message* vpdtbl); 99 100 int parse_fru_area (const uint8_t area, const void* msgbuf, 101 const size_t len, IPMIFruInfo& info); 102 103 #endif 104