blob: c47d94c739934316e9434d75cf51967b68472e1c [file] [log] [blame]
Deepak Kodihalli70e8db02019-10-21 00:59:46 -05001#pragma once
2
Deepak Kodihalli70e8db02019-10-21 00:59:46 -05003#include "fru_parser.hpp"
Deepak Kodihalli1521f6d2020-06-16 08:51:02 -05004#include "pldmd/handler.hpp"
Deepak Kodihalli70e8db02019-10-21 00:59:46 -05005
George Liuc453e162022-12-21 17:16:23 +08006#include <libpldm/fru.h>
7#include <libpldm/pdr.h>
8
Deepak Kodihalli70e8db02019-10-21 00:59:46 -05009#include <sdbusplus/message.hpp>
George Liu6492f522020-06-16 10:34:05 +080010
11#include <map>
Deepak Kodihalli70e8db02019-10-21 00:59:46 -050012#include <string>
13#include <variant>
14#include <vector>
15
Deepak Kodihalli70e8db02019-10-21 00:59:46 -050016namespace pldm
17{
18
19namespace responder
20{
21
22namespace dbus
23{
24
25using Value =
26 std::variant<bool, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t,
27 uint64_t, double, std::string, std::vector<uint8_t>>;
28using PropertyMap = std::map<Property, Value>;
29using InterfaceMap = std::map<Interface, PropertyMap>;
30using ObjectValueTree = std::map<sdbusplus::message::object_path, InterfaceMap>;
Deepak Kodihalli3cd61812020-03-10 06:38:45 -050031using ObjectPath = std::string;
George Liuc4ea6a92020-07-14 15:48:44 +080032using AssociatedEntityMap = std::map<ObjectPath, pldm_entity>;
Deepak Kodihalli70e8db02019-10-21 00:59:46 -050033
34} // namespace dbus
35
36/** @class FruImpl
37 *
38 * @brief Builds the PLDM FRU table containing the FRU records
39 */
40class FruImpl
41{
42 public:
43 /* @brief Header size for FRU record, it includes the FRU record set
44 * identifier, FRU record type, Number of FRU fields, Encoding type
45 * of FRU fields
46 */
47 static constexpr size_t recHeaderSize =
48 sizeof(struct pldm_fru_record_data_format) -
49 sizeof(struct pldm_fru_record_tlv);
50
Tom Joseph33e9c7e2020-06-11 22:09:52 +053051 /** @brief Constructor for FruImpl, the configPath is consumed to build the
52 * FruParser object.
Deepak Kodihalli70e8db02019-10-21 00:59:46 -050053 *
54 * @param[in] configPath - path to the directory containing config files
Tom Joseph33e9c7e2020-06-11 22:09:52 +053055 * for PLDM FRU
Manojkiran Eda03b01ca2021-06-29 08:55:09 +053056 * @param[in] fruMasterJsonPath - path to the file containing the FRU D-Bus
57 * Lookup Map
Tom Joseph33e9c7e2020-06-11 22:09:52 +053058 * @param[in] pdrRepo - opaque pointer to PDR repository
59 * @param[in] entityTree - opaque pointer to the entity association tree
Sampa Misrac073a202021-05-08 10:56:05 -050060 * @param[in] bmcEntityTree - opaque pointer to bmc's entity association
61 * tree
Deepak Kodihalli70e8db02019-10-21 00:59:46 -050062 */
Manojkiran Eda03b01ca2021-06-29 08:55:09 +053063 FruImpl(const std::string& configPath,
64 const std::filesystem::path& fruMasterJsonPath, pldm_pdr* pdrRepo,
Sampa Misrac073a202021-05-08 10:56:05 -050065 pldm_entity_association_tree* entityTree,
66 pldm_entity_association_tree* bmcEntityTree) :
Manojkiran Eda03b01ca2021-06-29 08:55:09 +053067 parser(configPath, fruMasterJsonPath),
Sampa Misrac073a202021-05-08 10:56:05 -050068 pdrRepo(pdrRepo), entityTree(entityTree), bmcEntityTree(bmcEntityTree)
Tom Joseph33e9c7e2020-06-11 22:09:52 +053069 {}
Deepak Kodihalli70e8db02019-10-21 00:59:46 -050070
71 /** @brief Total length of the FRU table in bytes, this excludes the pad
72 * bytes and the checksum.
73 *
74 * @return size of the FRU table
75 */
76 uint32_t size() const
77 {
78 return table.size() - padBytes;
79 }
80
81 /** @brief The checksum of the contents of the FRU table
82 *
83 * @return checksum
84 */
85 uint32_t checkSum() const
86 {
87 return checksum;
88 }
89
90 /** @brief Number of record set identifiers in the FRU tables
91 *
92 * @return number of record set identifiers
93 */
94 uint16_t numRSI() const
95 {
96 return rsi;
97 }
98
99 /** @brief The number of FRU records in the table
100 *
101 * @return number of FRU records
102 */
103 uint16_t numRecords() const
104 {
105 return numRecs;
106 }
107
108 /** @brief Get the FRU table
109 *
110 * @param[out] - Populate response with the FRU table
111 */
112 void getFRUTable(Response& response);
113
John Wang9e82ad12020-06-12 10:53:32 +0800114 /** @brief Get FRU Record Table By Option
115 * @param[out] response - Populate response with the FRU table got by
116 * options
117 * @param[in] fruTableHandle - The fru table handle
118 * @param[in] recordSetIdentifer - The record set identifier
119 * @param[in] recordType - The record type
120 * @param[in] fieldType - The field type
121 */
122 int getFRURecordByOption(Response& response, uint16_t fruTableHandle,
123 uint16_t recordSetIdentifer, uint8_t recordType,
124 uint8_t fieldType);
125
Tom Joseph33e9c7e2020-06-11 22:09:52 +0530126 /** @brief FRU table is built by processing the D-Bus inventory namespace
127 * based on the config files for FRU. The table is populated based
128 * on the isBuilt flag.
129 */
130 void buildFRUTable();
131
George Liuc4ea6a92020-07-14 15:48:44 +0800132 /** @brief Get std::map associated with the entity
133 * key: object path
134 * value: pldm_entity
135 *
136 * @return std::map<ObjectPath, pldm_entity>
137 */
138 inline const pldm::responder::dbus::AssociatedEntityMap&
139 getAssociateEntityMap() const
140 {
141 return associatedEntityMap;
142 }
143
Pavithra Barithaya47180ac2020-10-28 02:12:05 -0500144 /* @brief Method to populate the firmware version ID
145 *
146 * @return firmware version ID
147 */
148 std::string populatefwVersion();
149
Deepak Kodihalli70e8db02019-10-21 00:59:46 -0500150 private:
151 uint16_t nextRSI()
152 {
153 return ++rsi;
154 }
155
Pavithra Barithaya4f2538a2021-03-05 07:32:15 -0600156 uint32_t nextRecordHandle()
157 {
158 return ++rh;
159 }
160
161 uint32_t rh = 0;
Deepak Kodihalli70e8db02019-10-21 00:59:46 -0500162 uint16_t rsi = 0;
163 uint16_t numRecs = 0;
164 uint8_t padBytes = 0;
165 std::vector<uint8_t> table;
166 uint32_t checksum = 0;
Tom Joseph33e9c7e2020-06-11 22:09:52 +0530167 bool isBuilt = false;
Deepak Kodihalli70e8db02019-10-21 00:59:46 -0500168
Tom Joseph33e9c7e2020-06-11 22:09:52 +0530169 fru_parser::FruParser parser;
Deepak Kodihalli3cd61812020-03-10 06:38:45 -0500170 pldm_pdr* pdrRepo;
171 pldm_entity_association_tree* entityTree;
Sampa Misrac073a202021-05-08 10:56:05 -0500172 pldm_entity_association_tree* bmcEntityTree;
Deepak Kodihalli3cd61812020-03-10 06:38:45 -0500173
174 std::map<dbus::ObjectPath, pldm_entity_node*> objToEntityNode{};
175
Deepak Kodihalli70e8db02019-10-21 00:59:46 -0500176 /** @brief populateRecord builds the FRU records for an instance of FRU and
177 * updates the FRU table with the FRU records.
178 *
179 * @param[in] interfaces - D-Bus interfaces and the associated property
180 * values for the FRU
181 * @param[in] recordInfos - FRU record info to build the FRU records
Deepak Kodihalli3cd61812020-03-10 06:38:45 -0500182 * @param[in/out] entity - PLDM entity corresponding to FRU instance
Deepak Kodihalli70e8db02019-10-21 00:59:46 -0500183 */
George Liuc4ea6a92020-07-14 15:48:44 +0800184 void populateRecords(const dbus::InterfaceMap& interfaces,
Deepak Kodihalli3cd61812020-03-10 06:38:45 -0500185 const fru_parser::FruRecordInfos& recordInfos,
186 const pldm_entity& entity);
George Liuc4ea6a92020-07-14 15:48:44 +0800187
188 /** @brief Associate sensor/effecter to FRU entity
189 */
190 dbus::AssociatedEntityMap associatedEntityMap;
Deepak Kodihalli70e8db02019-10-21 00:59:46 -0500191};
192
Deepak Kodihallie60c5822019-10-23 03:26:15 -0500193namespace fru
194{
195
196class Handler : public CmdHandler
197{
Deepak Kodihallie60c5822019-10-23 03:26:15 -0500198 public:
Manojkiran Eda03b01ca2021-06-29 08:55:09 +0530199 Handler(const std::string& configPath,
200 const std::filesystem::path& fruMasterJsonPath, pldm_pdr* pdrRepo,
Sampa Misrac073a202021-05-08 10:56:05 -0500201 pldm_entity_association_tree* entityTree,
202 pldm_entity_association_tree* bmcEntityTree) :
Manojkiran Eda03b01ca2021-06-29 08:55:09 +0530203 impl(configPath, fruMasterJsonPath, pdrRepo, entityTree, bmcEntityTree)
Deepak Kodihallie60c5822019-10-23 03:26:15 -0500204 {
205 handlers.emplace(PLDM_GET_FRU_RECORD_TABLE_METADATA,
206 [this](const pldm_msg* request, size_t payloadLength) {
Patrick Williams6da4f912023-05-10 07:50:53 -0500207 return this->getFRURecordTableMetadata(request, payloadLength);
208 });
Deepak Kodihallie60c5822019-10-23 03:26:15 -0500209
210 handlers.emplace(PLDM_GET_FRU_RECORD_TABLE,
211 [this](const pldm_msg* request, size_t payloadLength) {
Patrick Williams6da4f912023-05-10 07:50:53 -0500212 return this->getFRURecordTable(request, payloadLength);
213 });
John Wang9e82ad12020-06-12 10:53:32 +0800214 handlers.emplace(PLDM_GET_FRU_RECORD_BY_OPTION,
215 [this](const pldm_msg* request, size_t payloadLength) {
Patrick Williams6da4f912023-05-10 07:50:53 -0500216 return this->getFRURecordByOption(request, payloadLength);
217 });
Deepak Kodihallie60c5822019-10-23 03:26:15 -0500218 }
219
Deepak Kodihallie60c5822019-10-23 03:26:15 -0500220 /** @brief Handler for Get FRURecordTableMetadata
221 *
222 * @param[in] request - Request message payload
223 * @param[in] payloadLength - Request payload length
224 *
225 * @return PLDM response message
226 */
227 Response getFRURecordTableMetadata(const pldm_msg* request,
228 size_t payloadLength);
229
230 /** @brief Handler for GetFRURecordTable
231 *
232 * @param[in] request - Request message payload
233 * @param[in] payloadLength - Request payload length
234 *
235 * @return PLDM response message
236 */
237 Response getFRURecordTable(const pldm_msg* request, size_t payloadLength);
Deepak Kodihalli3cd61812020-03-10 06:38:45 -0500238
Tom Joseph33e9c7e2020-06-11 22:09:52 +0530239 /** @brief Build FRU table is bnot already built
240 *
241 */
242 void buildFRUTable()
243 {
244 impl.buildFRUTable();
245 }
246
George Liuc4ea6a92020-07-14 15:48:44 +0800247 /** @brief Get std::map associated with the entity
248 * key: object path
249 * value: pldm_entity
250 *
251 * @return std::map<ObjectPath, pldm_entity>
252 */
253 const pldm::responder::dbus::AssociatedEntityMap&
254 getAssociateEntityMap() const
255 {
256 return impl.getAssociateEntityMap();
257 }
258
John Wang9e82ad12020-06-12 10:53:32 +0800259 /** @brief Handler for GetFRURecordByOption
260 *
261 * @param[in] request - Request message payload
262 * @param[in] payloadLength - Request payload length
263 *
264 * @return PLDM response message
265 */
266 Response getFRURecordByOption(const pldm_msg* request,
267 size_t payloadLength);
268
Deepak Kodihalli3cd61812020-03-10 06:38:45 -0500269 private:
270 FruImpl impl;
Deepak Kodihallie60c5822019-10-23 03:26:15 -0500271};
272
273} // namespace fru
274
Deepak Kodihalli70e8db02019-10-21 00:59:46 -0500275} // namespace responder
276
277} // namespace pldm