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