blob: 6afd6212e542873ac13656fc48b9061c2563dc33 [file] [log] [blame]
Hariharasubramanian R44473092015-10-15 08:25:28 -05001#ifndef OPENBMC_IPMI_FRU_PARSER_H
2#define OPENBMC_IPMI_FRU_PARSER_H
3
Vishwa4be4b7a2015-10-31 22:55:50 -05004#include <systemd/sd-bus.h>
Patrick Venturec9508db2018-10-16 17:18:43 -07005
Ratan Guptacb0d4e52016-12-22 19:05:57 +05306#include <array>
Ratan Gupta6eed4032017-02-10 15:59:31 +05307#include <map>
Patrick Venturec9508db2018-10-16 17:18:43 -07008#include <string>
Patrick Venturee4024bc2018-10-20 09:13:04 -07009#include <utility>
Patrick Williamsa71d0f12017-06-01 19:19:09 -050010#include <vector>
Chris Austenb45c4cb2015-11-01 06:34:56 -060011
Hariharasubramanian Ra032c772015-10-20 07:28:19 -050012enum ipmi_fru_area_type
Hariharasubramanian Rc2d79462015-10-16 06:47:56 -050013{
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
Hariharasubramanian Ra032c772015-10-20 07:28:19 -050020};
Hariharasubramanian R44473092015-10-15 08:25:28 -050021
Ratan Guptacb0d4e52016-12-22 19:05:57 +053022enum openbmc_vpd_key_id
23{
Patrick Venturec9508db2018-10-16 17:18:43 -070024 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 */
Ratan Guptacb0d4e52016-12-22 19:05:57 +053037
Patrick Venturec9508db2018-10-16 17:18:43 -070038 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 */
Ratan Guptacb0d4e52016-12-22 19:05:57 +053054
Patrick Venturec9508db2018-10-16 17:18:43 -070055 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,
Ratan Guptacb0d4e52016-12-22 19:05:57 +053071
Patrick Venturec9508db2018-10-16 17:18:43 -070072 OPENBMC_VPD_KEY_MAX,
73 OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX = 8,
Ratan Guptacb0d4e52016-12-22 19:05:57 +053074
75};
76
Patrick Venturec9508db2018-10-16 17:18:43 -070077using IPMIFruInfo =
78 std::array<std::pair<std::string, std::string>, OPENBMC_VPD_KEY_MAX>;
Ratan Guptacb0d4e52016-12-22 19:05:57 +053079
Patrick Williamsaeb726d2017-06-01 19:00:43 -050080struct IPMIFruData
81{
82 std::string section;
83 std::string property;
84 std::string delimiter;
85};
Ratan Gupta6eed4032017-02-10 15:59:31 +053086
87using DbusProperty = std::string;
Ratan Guptac19c0542018-02-04 23:24:44 +053088using DbusPropertyVec = std::vector<std::pair<DbusProperty, IPMIFruData>>;
Ratan Gupta6eed4032017-02-10 15:59:31 +053089
90using DbusInterface = std::string;
Ratan Guptac19c0542018-02-04 23:24:44 +053091using DbusInterfaceVec = std::vector<std::pair<DbusInterface, DbusPropertyVec>>;
Ratan Gupta6eed4032017-02-10 15:59:31 +053092
93using FruInstancePath = std::string;
Ratan Guptac19c0542018-02-04 23:24:44 +053094
95struct FruInstance
96{
97 uint8_t entityID;
98 uint8_t entityInstance;
99 FruInstancePath path;
100 DbusInterfaceVec interfaces;
101};
102
103using FruInstanceVec = std::vector<FruInstance>;
Ratan Gupta6eed4032017-02-10 15:59:31 +0530104
105using FruId = uint32_t;
Ratan Guptac19c0542018-02-04 23:24:44 +0530106using FruMap = std::map<FruId, FruInstanceVec>;
Ratan Guptacb0d4e52016-12-22 19:05:57 +0530107
Patrick Venturec9508db2018-10-16 17:18:43 -0700108/* Parse an IPMI write fru data message into a dictionary containing name value
109 * pair of VPD entries.*/
110int parse_fru(const void* msgbuf, sd_bus_message* vpdtbl);
Ratan Guptacb0d4e52016-12-22 19:05:57 +0530111
Patrick Venturec9508db2018-10-16 17:18:43 -0700112int parse_fru_area(const uint8_t area, const void* msgbuf, const size_t len,
113 IPMIFruInfo& info);
Ratan Guptacb0d4e52016-12-22 19:05:57 +0530114
Hariharasubramanian R44473092015-10-15 08:25:28 -0500115#endif