xref: /openbmc/ipmi-fru-parser/frup.hpp (revision e4024bc3)
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