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