blob: 2fa75211cce9b6588a4fb7291f8a1d03030cf6f0 [file] [log] [blame]
George Liua881c172021-06-21 18:28:11 +08001#pragma once
2
George Liua881c172021-06-21 18:28:11 +08003#include "../oem/ibm/libpldmresponder/file_io.hpp"
4#include "../oem/ibm/libpldmresponder/fru_oem_ibm.hpp"
5#include "../oem/ibm/libpldmresponder/oem_ibm_handler.hpp"
6#include "common/utils.hpp"
7#include "dbus_impl_requester.hpp"
8#include "host-bmc/dbus_to_event_handler.hpp"
9#include "invoker.hpp"
10#include "libpldmresponder/fru.hpp"
11#include "requester/request.hpp"
12
Andrew Jeffery41ca40d2024-06-19 16:52:21 +093013#include <libpldm/pdr.h>
14
George Liua881c172021-06-21 18:28:11 +080015namespace pldm
16{
17namespace oem_ibm
18{
19
20using namespace pldm::state_sensor;
21using namespace pldm::dbus_api;
22
23/**
24 * @class OemIBM
25 *
26 * @brief class for creating all the OEM IBM handlers
27 *
28 * Only in case of OEM_IBM this class object will be instantiated
29 */
30class OemIBM
31{
32 public:
33 OemIBM() = delete;
34 OemIBM(const Pdr&) = delete;
35 OemIBM& operator=(const OemIBM&) = delete;
36 OemIBM(OemIBM&&) = delete;
37 OemIBM& operator=(OemIBM&&) = delete;
38
39 public:
40 /** Constructs OemIBM object
41 *
42 * @param[in] dBusIntf - D-Bus handler
43 * @param[in] mctp_fd - fd of MCTP communications socket
44 * @param[in] mctp_eid - MCTP EID of remote host firmware
45 * @param[in] repo - pointer to BMC's primary PDR repo
46 * @param[in] instanceIdDb - pointer to an InstanceIdDb object
47 * @param[in] event - sd_event handler
48 * @param[in] invoker - invoker handler
49 * @param[in] hostPDRHandler - hostPDRHandler handler
50 * @param[in] platformHandler - platformHandler handler
51 * @param[in] fruHandler - fruHandler handler
52 * @param[in] baseHandler - baseHandler handler
53 * @param[in] reqHandler - reqHandler handler
54 */
55 explicit OemIBM(
56 const pldm::utils::DBusHandler* dBusIntf, int mctp_fd, uint8_t mctp_eid,
57 pldm_pdr* repo, pldm::InstanceIdDb& instanceIdDb,
58 sdeventplus::Event& event, Invoker& invoker,
59 HostPDRHandler* hostPDRHandler, platform::Handler* platformHandler,
60 fru::Handler* fruHandler, base::Handler* baseHandler,
61 pldm::requester::Handler<pldm::requester::Request>* reqHandler) :
62 dBusIntf(dBusIntf),
63 mctp_fd(mctp_fd), mctp_eid(mctp_eid), repo(repo),
64 instanceIdDb(instanceIdDb), event(event), invoker(invoker),
65 reqHandler(reqHandler)
66 {
67 createOemFruHandler();
68 fruHandler->setOemFruHandler(oemFruHandler.get());
69
70 createOemIbmFruHandler();
71 oemIbmFruHandler->setIBMFruHandler(fruHandler);
72
73 createCodeUpdate();
74 createOemPlatformHandler();
75 codeUpdate->setOemPlatformHandler(oemPlatformHandler.get());
76 hostPDRHandler->setOemPlatformHandler(oemPlatformHandler.get());
77 platformHandler->setOemPlatformHandler(oemPlatformHandler.get());
78 baseHandler->setOemPlatformHandler(oemPlatformHandler.get());
79
80 createOemIbmPlatformHandler();
81 oemIbmPlatformHandler->setPlatformHandler(platformHandler);
82
83 registerHandler();
84 }
85
86 private:
87 /** @brief Method for creating codeUpdate handler */
88 void createCodeUpdate()
89 {
90 codeUpdate = std::make_unique<pldm::responder::CodeUpdate>(dBusIntf);
91 codeUpdate->clearDirPath(LID_STAGING_DIR);
92 }
93
94 /** @brief Method for creating oemPlatformHandler
95 *
96 * This method also assigns the oemPlatformHandler to the below
97 * different handlers.
98 */
99 void createOemPlatformHandler()
100 {
101 oemPlatformHandler = std::make_unique<oem_ibm_platform::Handler>(
102 dBusIntf, codeUpdate.get(), mctp_fd, mctp_eid, instanceIdDb, event,
103 reqHandler);
104 }
105
106 /** @brief Method for creating oemIbmPlatformHandler */
107 void createOemIbmPlatformHandler()
108 {
109 oemIbmPlatformHandler =
110 dynamic_cast<pldm::responder::oem_ibm_platform::Handler*>(
111 oemPlatformHandler.get());
112 }
113
114 /** @brief Method for creating oemFruHandler */
115 void createOemFruHandler()
116 {
117 oemFruHandler = std::make_unique<oem_ibm_fru::Handler>(repo);
118 }
119
120 /** @brief Method for creating oemIbmFruHandler */
121 void createOemIbmFruHandler()
122 {
123 oemIbmFruHandler = dynamic_cast<pldm::responder::oem_ibm_fru::Handler*>(
124 oemFruHandler.get());
125 }
126
127 /** @brief Method for registering PLDM OEM handler */
128 void registerHandler()
129 {
130 invoker.registerHandler(
131 PLDM_OEM, std::make_unique<pldm::responder::oem_ibm::Handler>(
132 oemPlatformHandler.get(), mctp_fd, mctp_eid,
133 &instanceIdDb, reqHandler));
134 }
135
136 private:
137 /** @brief D-Bus handler */
138 const pldm::utils::DBusHandler* dBusIntf;
139
140 /** @brief fd of MCTP communications socket */
141 int mctp_fd;
142
143 /** @brief MCTP EID of remote host firmware */
144 uint8_t mctp_eid;
145
146 /** @brief pointer to BMC's primary PDR repo */
147 pldm_pdr* repo;
148
149 /** @brief reference to an Instance ID database object, used to obtain PLDM
150 * instance IDs
151 */
152 pldm::InstanceIdDb& instanceIdDb;
153
154 /** @brief reference of main event loop of pldmd, primarily used to schedule
155 * work
156 */
157 sdeventplus::Event& event;
158
159 /** @brief Object to the invoker class*/
160 Invoker& invoker;
161
162 /** @brief pointer to the requester class*/
163 requester::Handler<requester::Request>* reqHandler;
164
165 /** @brief pointer to the oem_ibm_handler class*/
166 std::unique_ptr<oem_platform::Handler> oemPlatformHandler{};
167
168 /** @brief pointer to the oem_ibm_fru class*/
169 std::unique_ptr<oem_fru::Handler> oemFruHandler{};
170
171 /** @brief pointer to the CodeUpdate class*/
172 std::unique_ptr<pldm::responder::CodeUpdate> codeUpdate{};
173
174 /** @brief oem IBM Platform handler*/
175 pldm::responder::oem_ibm_platform::Handler* oemIbmPlatformHandler = nullptr;
176
177 /** @brief oem IBM Fru handler*/
178 pldm::responder::oem_ibm_fru::Handler* oemIbmFruHandler = nullptr;
179};
180
181} // namespace oem_ibm
182} // namespace pldm