blob: 0a0dd7654d93dbc3f2ca1ebeb49f03fb3aa3b258 [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 Williamsa71d0f12017-06-01 19:19:09 -05009#include <vector>
Chris Austenb45c4cb2015-11-01 06:34:56 -060010
Hariharasubramanian Ra032c772015-10-20 07:28:19 -050011enum ipmi_fru_area_type
Hariharasubramanian Rc2d79462015-10-16 06:47:56 -050012{
13 IPMI_FRU_AREA_INTERNAL_USE = 0x00,
14 IPMI_FRU_AREA_CHASSIS_INFO,
15 IPMI_FRU_AREA_BOARD_INFO,
16 IPMI_FRU_AREA_PRODUCT_INFO,
17 IPMI_FRU_AREA_MULTI_RECORD,
18 IPMI_FRU_AREA_TYPE_MAX
Hariharasubramanian Ra032c772015-10-20 07:28:19 -050019};
Hariharasubramanian R44473092015-10-15 08:25:28 -050020
Ratan Guptacb0d4e52016-12-22 19:05:57 +053021enum openbmc_vpd_key_id
22{
Patrick Venturec9508db2018-10-16 17:18:43 -070023 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 */
Ratan Guptacb0d4e52016-12-22 19:05:57 +053036
Patrick Venturec9508db2018-10-16 17:18:43 -070037 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 */
Ratan Guptacb0d4e52016-12-22 19:05:57 +053053
Patrick Venturec9508db2018-10-16 17:18:43 -070054 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,
Ratan Guptacb0d4e52016-12-22 19:05:57 +053070
Patrick Venturec9508db2018-10-16 17:18:43 -070071 OPENBMC_VPD_KEY_MAX,
72 OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX = 8,
Ratan Guptacb0d4e52016-12-22 19:05:57 +053073
74};
75
Patrick Venturec9508db2018-10-16 17:18:43 -070076using IPMIFruInfo =
77 std::array<std::pair<std::string, std::string>, OPENBMC_VPD_KEY_MAX>;
Ratan Guptacb0d4e52016-12-22 19:05:57 +053078
Patrick Williamsaeb726d2017-06-01 19:00:43 -050079struct IPMIFruData
80{
81 std::string section;
82 std::string property;
83 std::string delimiter;
84};
Ratan Gupta6eed4032017-02-10 15:59:31 +053085
86using DbusProperty = std::string;
Ratan Guptac19c0542018-02-04 23:24:44 +053087using DbusPropertyVec = std::vector<std::pair<DbusProperty, IPMIFruData>>;
Ratan Gupta6eed4032017-02-10 15:59:31 +053088
89using DbusInterface = std::string;
Ratan Guptac19c0542018-02-04 23:24:44 +053090using DbusInterfaceVec = std::vector<std::pair<DbusInterface, DbusPropertyVec>>;
Ratan Gupta6eed4032017-02-10 15:59:31 +053091
92using FruInstancePath = std::string;
Ratan Guptac19c0542018-02-04 23:24:44 +053093
94struct FruInstance
95{
96 uint8_t entityID;
97 uint8_t entityInstance;
98 FruInstancePath path;
99 DbusInterfaceVec interfaces;
100};
101
102using FruInstanceVec = std::vector<FruInstance>;
Ratan Gupta6eed4032017-02-10 15:59:31 +0530103
104using FruId = uint32_t;
Ratan Guptac19c0542018-02-04 23:24:44 +0530105using FruMap = std::map<FruId, FruInstanceVec>;
Ratan Guptacb0d4e52016-12-22 19:05:57 +0530106
Patrick Venturec9508db2018-10-16 17:18:43 -0700107/* Parse an IPMI write fru data message into a dictionary containing name value
108 * pair of VPD entries.*/
109int parse_fru(const void* msgbuf, sd_bus_message* vpdtbl);
Ratan Guptacb0d4e52016-12-22 19:05:57 +0530110
Patrick Venturec9508db2018-10-16 17:18:43 -0700111int parse_fru_area(const uint8_t area, const void* msgbuf, const size_t len,
112 IPMIFruInfo& info);
Ratan Guptacb0d4e52016-12-22 19:05:57 +0530113
Hariharasubramanian R44473092015-10-15 08:25:28 -0500114#endif