xref: /openbmc/pldm/fw-update/manager.hpp (revision 38e12aa2bb59ea10bda8f859b8f98ba0370926f9)
1fb3bc06fSTom Joseph #pragma once
2fb3bc06fSTom Joseph 
3fb3bc06fSTom Joseph #include "activation.hpp"
42abbce76SAndrew Jeffery #include "common/instance_id.hpp"
5fb3bc06fSTom Joseph #include "common/types.hpp"
6fb3bc06fSTom Joseph #include "device_updater.hpp"
7fb3bc06fSTom Joseph #include "inventory_manager.hpp"
8fb3bc06fSTom Joseph #include "requester/handler.hpp"
944524a5fSGilbert Chen #include "requester/mctp_endpoint_discovery.hpp"
10fb3bc06fSTom Joseph #include "update_manager.hpp"
11fb3bc06fSTom Joseph 
12fb3bc06fSTom Joseph #include <unordered_map>
13fb3bc06fSTom Joseph #include <vector>
14fb3bc06fSTom Joseph 
15fb3bc06fSTom Joseph namespace pldm
16fb3bc06fSTom Joseph {
17fb3bc06fSTom Joseph 
18fb3bc06fSTom Joseph namespace fw_update
19fb3bc06fSTom Joseph {
20fb3bc06fSTom Joseph 
21fb3bc06fSTom Joseph /** @class Manager
22fb3bc06fSTom Joseph  *
23fb3bc06fSTom Joseph  * This class handles all the aspects of the PLDM FW update specification for
24fb3bc06fSTom Joseph  * the MCTP devices
25fb3bc06fSTom Joseph  */
2644524a5fSGilbert Chen class Manager : public pldm::MctpDiscoveryHandlerIntf
27fb3bc06fSTom Joseph {
28fb3bc06fSTom Joseph   public:
29fb3bc06fSTom Joseph     Manager() = delete;
30fb3bc06fSTom Joseph     Manager(const Manager&) = delete;
31fb3bc06fSTom Joseph     Manager(Manager&&) = delete;
32fb3bc06fSTom Joseph     Manager& operator=(const Manager&) = delete;
33fb3bc06fSTom Joseph     Manager& operator=(Manager&&) = delete;
34fb3bc06fSTom Joseph     ~Manager() = default;
35fb3bc06fSTom Joseph 
36fb3bc06fSTom Joseph     /** @brief Constructor
37fb3bc06fSTom Joseph      *
38fb3bc06fSTom Joseph      *  @param[in] handler - PLDM request handler
39fb3bc06fSTom Joseph      */
Manager(Event & event,requester::Handler<requester::Request> & handler,pldm::InstanceIdDb & instanceIdDb)40fb3bc06fSTom Joseph     explicit Manager(Event& event,
41fb3bc06fSTom Joseph                      requester::Handler<requester::Request>& handler,
42a330b2f0SAndrew Jeffery                      pldm::InstanceIdDb& instanceIdDb) :
438b169dc5SUnive Tien         inventoryMgr(handler, instanceIdDb, descriptorMap,
448b169dc5SUnive Tien                      downstreamDescriptorMap, componentInfoMap),
45a330b2f0SAndrew Jeffery         updateManager(event, handler, instanceIdDb, descriptorMap,
46fb3bc06fSTom Joseph                       componentInfoMap)
47fb3bc06fSTom Joseph     {}
48fb3bc06fSTom Joseph 
4944524a5fSGilbert Chen     /** @brief Helper function to invoke registered handlers for
5044524a5fSGilbert Chen      *         the added MCTP endpoints
51fb3bc06fSTom Joseph      *
5244524a5fSGilbert Chen      *  @param[in] mctpInfos - information of discovered MCTP endpoints
53fb3bc06fSTom Joseph      */
handleMctpEndpoints(const MctpInfos & mctpInfos)5444524a5fSGilbert Chen     void handleMctpEndpoints(const MctpInfos& mctpInfos)
55fb3bc06fSTom Joseph     {
5644524a5fSGilbert Chen         std::vector<mctp_eid_t> eids;
5744524a5fSGilbert Chen         for (const auto& mctpInfo : mctpInfos)
5844524a5fSGilbert Chen         {
5944524a5fSGilbert Chen             eids.emplace_back(std::get<mctp_eid_t>(mctpInfo));
6044524a5fSGilbert Chen         }
6144524a5fSGilbert Chen 
62fb3bc06fSTom Joseph         inventoryMgr.discoverFDs(eids);
63fb3bc06fSTom Joseph     }
64fb3bc06fSTom Joseph 
6544524a5fSGilbert Chen     /** @brief Helper function to invoke registered handlers for
6644524a5fSGilbert Chen      *         the removed MCTP endpoints
6744524a5fSGilbert Chen      *
6844524a5fSGilbert Chen      *  @param[in] mctpInfos - information of removed MCTP endpoints
6944524a5fSGilbert Chen      */
handleRemovedMctpEndpoints(const MctpInfos &)7044524a5fSGilbert Chen     void handleRemovedMctpEndpoints(const MctpInfos&)
7144524a5fSGilbert Chen     {
7244524a5fSGilbert Chen         return;
7344524a5fSGilbert Chen     }
7444524a5fSGilbert Chen 
7575e00422SChau Ly     /** @brief Helper function to invoke registered handlers for
7675e00422SChau Ly      *  updating the availability status of the MCTP endpoint
7775e00422SChau Ly      *
7875e00422SChau Ly      *  @param[in] mctpInfo - information of the target endpoint
7975e00422SChau Ly      *  @param[in] availability - new availability status
8075e00422SChau Ly      */
updateMctpEndpointAvailability(const MctpInfo &,Availability)8175e00422SChau Ly     void updateMctpEndpointAvailability(const MctpInfo&, Availability)
8275e00422SChau Ly     {
8375e00422SChau Ly         return;
8475e00422SChau Ly     }
8575e00422SChau Ly 
86fb3bc06fSTom Joseph     /** @brief Handle PLDM request for the commands in the FW update
87fb3bc06fSTom Joseph      *         specification
88fb3bc06fSTom Joseph      *
89fb3bc06fSTom Joseph      *  @param[in] eid - Remote MCTP Endpoint ID
90fb3bc06fSTom Joseph      *  @param[in] command - PLDM command code
91fb3bc06fSTom Joseph      *  @param[in] request - PLDM request message
92fb3bc06fSTom Joseph      *  @param[in] requestLen - PLDM request message length
93fb3bc06fSTom Joseph      *  @return PLDM response message
94fb3bc06fSTom Joseph      */
handleRequest(mctp_eid_t eid,Command command,const pldm_msg * request,size_t reqMsgLen)95fb3bc06fSTom Joseph     Response handleRequest(mctp_eid_t eid, Command command,
96fb3bc06fSTom Joseph                            const pldm_msg* request, size_t reqMsgLen)
97fb3bc06fSTom Joseph     {
98fb3bc06fSTom Joseph         return updateManager.handleRequest(eid, command, request, reqMsgLen);
99fb3bc06fSTom Joseph     }
100fb3bc06fSTom Joseph 
101*38e12aa2SThu Nguyen     /** @brief Get Active EIDs.
102*38e12aa2SThu Nguyen      *
103*38e12aa2SThu Nguyen      *  @param[in] addr - MCTP address of terminus
104*38e12aa2SThu Nguyen      *  @param[in] terminiNames - MCTP terminus name
105*38e12aa2SThu Nguyen      */
getActiveEidByName(const std::string &)106*38e12aa2SThu Nguyen     std::optional<mctp_eid_t> getActiveEidByName(const std::string&)
107*38e12aa2SThu Nguyen     {
108*38e12aa2SThu Nguyen         return std::nullopt;
109*38e12aa2SThu Nguyen     }
110*38e12aa2SThu Nguyen 
111fb3bc06fSTom Joseph   private:
112fb3bc06fSTom Joseph     /** Descriptor information of all the discovered MCTP endpoints */
113fb3bc06fSTom Joseph     DescriptorMap descriptorMap;
114fb3bc06fSTom Joseph 
1158b169dc5SUnive Tien     /** Downstream descriptor information of all the discovered MCTP endpoints
1168b169dc5SUnive Tien      */
1178b169dc5SUnive Tien     DownstreamDescriptorMap downstreamDescriptorMap;
1188b169dc5SUnive Tien 
119fb3bc06fSTom Joseph     /** Component information of all the discovered MCTP endpoints */
120fb3bc06fSTom Joseph     ComponentInfoMap componentInfoMap;
121fb3bc06fSTom Joseph 
122fb3bc06fSTom Joseph     /** @brief PLDM firmware inventory manager */
123fb3bc06fSTom Joseph     InventoryManager inventoryMgr;
124fb3bc06fSTom Joseph 
125fb3bc06fSTom Joseph     /** @brief PLDM firmware update manager */
126fb3bc06fSTom Joseph     UpdateManager updateManager;
127fb3bc06fSTom Joseph };
128fb3bc06fSTom Joseph 
129fb3bc06fSTom Joseph } // namespace fw_update
130fb3bc06fSTom Joseph 
131fb3bc06fSTom Joseph } // namespace pldm
132