xref: /openbmc/pldm/fw-update/device_updater.hpp (revision 16c2a0a03e5daac77e204eb99e00711490fb6e26)
1ef90b0d3STom Joseph #pragma once
2ef90b0d3STom Joseph 
3ef90b0d3STom Joseph #include "common/types.hpp"
4ef90b0d3STom Joseph #include "requester/handler.hpp"
5ef90b0d3STom Joseph #include "requester/request.hpp"
6ef90b0d3STom Joseph 
7ef90b0d3STom Joseph #include <sdeventplus/event.hpp>
8ef90b0d3STom Joseph #include <sdeventplus/source/event.hpp>
9ef90b0d3STom Joseph 
10ef90b0d3STom Joseph #include <fstream>
11ef90b0d3STom Joseph 
12ef90b0d3STom Joseph namespace pldm
13ef90b0d3STom Joseph {
14ef90b0d3STom Joseph 
15ef90b0d3STom Joseph namespace fw_update
16ef90b0d3STom Joseph {
17ef90b0d3STom Joseph 
18ef90b0d3STom Joseph class UpdateManager;
19ef90b0d3STom Joseph 
20ef90b0d3STom Joseph /** @class DeviceUpdater
21ef90b0d3STom Joseph  *
22ef90b0d3STom Joseph  *  DeviceUpdater orchestrates the firmware update of the firmware device and
23ef90b0d3STom Joseph  *  updates the UpdateManager about the status once it is complete.
24ef90b0d3STom Joseph  */
25ef90b0d3STom Joseph class DeviceUpdater
26ef90b0d3STom Joseph {
27ef90b0d3STom Joseph   public:
28ef90b0d3STom Joseph     DeviceUpdater() = delete;
29ef90b0d3STom Joseph     DeviceUpdater(const DeviceUpdater&) = delete;
30ef90b0d3STom Joseph     DeviceUpdater(DeviceUpdater&&) = default;
31ef90b0d3STom Joseph     DeviceUpdater& operator=(const DeviceUpdater&) = delete;
32a7dbca53SPavithra Barithaya     DeviceUpdater& operator=(DeviceUpdater&&) = delete;
33ef90b0d3STom Joseph     ~DeviceUpdater() = default;
34ef90b0d3STom Joseph 
35ef90b0d3STom Joseph     /** @brief Constructor
36ef90b0d3STom Joseph      *
37ef90b0d3STom Joseph      *  @param[in] eid - Endpoint ID of the firmware device
38ef90b0d3STom Joseph      *  @param[in] package - File stream for firmware update package
39ef90b0d3STom Joseph      *  @param[in] fwDeviceIDRecord - FirmwareDeviceIDRecord in the fw update
40ef90b0d3STom Joseph      *                                package that matches this firmware device
41ef90b0d3STom Joseph      *  @param[in] compImageInfos - Component image information for all the
42ef90b0d3STom Joseph      *                              components in the fw update package
43ef90b0d3STom Joseph      *  @param[in] compInfo - Component info for the components in this FD
44ef90b0d3STom Joseph      *                        derived from GetFirmwareParameters response
45ef90b0d3STom Joseph      *  @param[in] maxTransferSize - Maximum size in bytes of the variable
46ef90b0d3STom Joseph      *                               payload allowed to be requested by the FD
47ef90b0d3STom Joseph      *  @param[in] updateManager - To update the status of fw update of the
48ef90b0d3STom Joseph      *                             device
49ef90b0d3STom Joseph      */
DeviceUpdater(mctp_eid_t eid,std::ifstream & package,const FirmwareDeviceIDRecord & fwDeviceIDRecord,const ComponentImageInfos & compImageInfos,const ComponentInfo & compInfo,uint32_t maxTransferSize,UpdateManager * updateManager)50b7e083eaSTom Joseph     explicit DeviceUpdater(mctp_eid_t eid, std::ifstream& package,
51b7e083eaSTom Joseph                            const FirmwareDeviceIDRecord& fwDeviceIDRecord,
52ef90b0d3STom Joseph                            const ComponentImageInfos& compImageInfos,
53b7e083eaSTom Joseph                            const ComponentInfo& compInfo,
54b7e083eaSTom Joseph                            uint32_t maxTransferSize,
55ef90b0d3STom Joseph                            UpdateManager* updateManager) :
56*16c2a0a0SPatrick Williams         eid(eid), package(package), fwDeviceIDRecord(fwDeviceIDRecord),
57b7e083eaSTom Joseph         compImageInfos(compImageInfos), compInfo(compInfo),
58b7e083eaSTom Joseph         maxTransferSize(maxTransferSize), updateManager(updateManager)
59ef90b0d3STom Joseph     {}
60ef90b0d3STom Joseph 
61ef90b0d3STom Joseph     /** @brief Start the firmware update flow for the FD
62ef90b0d3STom Joseph      *
63ef90b0d3STom Joseph      *  To start the update flow RequestUpdate command is sent to the FD.
64ef90b0d3STom Joseph      *
65ef90b0d3STom Joseph      */
66ef90b0d3STom Joseph     void startFwUpdateFlow();
67ef90b0d3STom Joseph 
68ef90b0d3STom Joseph     /** @brief Handler for RequestUpdate command response
69ef90b0d3STom Joseph      *
70ef90b0d3STom Joseph      *  The response of the RequestUpdate is processed and if the response
71ef90b0d3STom Joseph      *  is success, send PassComponentTable request to FD.
72ef90b0d3STom Joseph      *
73ef90b0d3STom Joseph      *  @param[in] eid - Remote MCTP endpoint
74ef90b0d3STom Joseph      *  @param[in] response - PLDM response message
75ef90b0d3STom Joseph      *  @param[in] respMsgLen - Response message length
76ef90b0d3STom Joseph      */
77ef90b0d3STom Joseph     void requestUpdate(mctp_eid_t eid, const pldm_msg* response,
78ef90b0d3STom Joseph                        size_t respMsgLen);
79ef90b0d3STom Joseph 
80ef90b0d3STom Joseph     /** @brief Handler for PassComponentTable command response
81ef90b0d3STom Joseph      *
82ef90b0d3STom Joseph      *  The response of the PassComponentTable is processed. If the response
83ef90b0d3STom Joseph      *  indicates component can be updated, continue with either a) or b).
84ef90b0d3STom Joseph      *
85ef90b0d3STom Joseph      *  a. Send PassComponentTable request for the next component if
86ef90b0d3STom Joseph      *     applicable
87ef90b0d3STom Joseph      *  b. UpdateComponent command to request updating a specific
88ef90b0d3STom Joseph      *     firmware component
89ef90b0d3STom Joseph      *
90ef90b0d3STom Joseph      *  If the response indicates component may be updateable, continue
91ef90b0d3STom Joseph      *  based on the policy in DeviceUpdateOptionFlags.
92ef90b0d3STom Joseph      *
93ef90b0d3STom Joseph      *  @param[in] eid - Remote MCTP endpoint
94ef90b0d3STom Joseph      *  @param[in] response - PLDM response message
95ef90b0d3STom Joseph      *  @param[in] respMsgLen - Response message length
96ef90b0d3STom Joseph      */
97ef90b0d3STom Joseph     void passCompTable(mctp_eid_t eid, const pldm_msg* response,
98ef90b0d3STom Joseph                        size_t respMsgLen);
99ef90b0d3STom Joseph 
100ef90b0d3STom Joseph     /** @brief Handler for UpdateComponent command response
101ef90b0d3STom Joseph      *
102ef90b0d3STom Joseph      *  The response of the UpdateComponent is processed and will wait for
103ef90b0d3STom Joseph      *  FD to request the firmware data.
104ef90b0d3STom Joseph      *
105ef90b0d3STom Joseph      *  @param[in] eid - Remote MCTP endpoint
106ef90b0d3STom Joseph      *  @param[in] response - PLDM response message
107ef90b0d3STom Joseph      *  @param[in] respMsgLen - Response message length
108ef90b0d3STom Joseph      */
109ef90b0d3STom Joseph     void updateComponent(mctp_eid_t eid, const pldm_msg* response,
110ef90b0d3STom Joseph                          size_t respMsgLen);
111ef90b0d3STom Joseph 
112ef90b0d3STom Joseph     /** @brief Handler for RequestFirmwareData request
113ef90b0d3STom Joseph      *
114ef90b0d3STom Joseph      *  @param[in] request - Request message
115ef90b0d3STom Joseph      *  @param[in] payload_length - Request message payload length
116ef90b0d3STom Joseph      *  @return Response - PLDM Response message
117ef90b0d3STom Joseph      */
118ef90b0d3STom Joseph     Response requestFwData(const pldm_msg* request, size_t payloadLength);
119ef90b0d3STom Joseph 
120ef90b0d3STom Joseph     /** @brief Handler for TransferComplete request
121ef90b0d3STom Joseph      *
122ef90b0d3STom Joseph      *  @param[in] request - Request message
123ef90b0d3STom Joseph      *  @param[in] payload_length - Request message payload length
124ef90b0d3STom Joseph      *  @return Response - PLDM Response message
125ef90b0d3STom Joseph      */
126ef90b0d3STom Joseph     Response transferComplete(const pldm_msg* request, size_t payloadLength);
127ef90b0d3STom Joseph 
128ef90b0d3STom Joseph     /** @brief Handler for VerifyComplete request
129ef90b0d3STom Joseph      *
130ef90b0d3STom Joseph      *  @param[in] request - Request message
131ef90b0d3STom Joseph      *  @param[in] payload_length - Request message payload length
132ef90b0d3STom Joseph      *  @return Response - PLDM Response message
133ef90b0d3STom Joseph      */
134ef90b0d3STom Joseph     Response verifyComplete(const pldm_msg* request, size_t payloadLength);
135ef90b0d3STom Joseph 
136ef90b0d3STom Joseph     /** @brief Handler for ApplyComplete request
137ef90b0d3STom Joseph      *
138ef90b0d3STom Joseph      *  @param[in] request - Request message
139ef90b0d3STom Joseph      *  @param[in] payload_length - Request message payload length
140ef90b0d3STom Joseph      *  @return Response - PLDM Response message
141ef90b0d3STom Joseph      */
142ef90b0d3STom Joseph     Response applyComplete(const pldm_msg* request, size_t payloadLength);
143ef90b0d3STom Joseph 
144ef90b0d3STom Joseph     /** @brief Handler for ActivateFirmware command response
145ef90b0d3STom Joseph      *
146ef90b0d3STom Joseph      *  The response of the ActivateFirmware is processed and will update the
147ef90b0d3STom Joseph      *  UpdateManager with the completion of the firmware update.
148ef90b0d3STom Joseph      *
149ef90b0d3STom Joseph      *  @param[in] eid - Remote MCTP endpoint
150ef90b0d3STom Joseph      *  @param[in] response - PLDM response message
151ef90b0d3STom Joseph      *  @param[in] respMsgLen - Response message length
152ef90b0d3STom Joseph      */
153ef90b0d3STom Joseph     void activateFirmware(mctp_eid_t eid, const pldm_msg* response,
154ef90b0d3STom Joseph                           size_t respMsgLen);
155ef90b0d3STom Joseph 
156ef90b0d3STom Joseph   private:
157ef90b0d3STom Joseph     /** @brief Send PassComponentTable command request
158ef90b0d3STom Joseph      *
159ef90b0d3STom Joseph      *  @param[in] compOffset - component offset in compImageInfos
160ef90b0d3STom Joseph      */
161ef90b0d3STom Joseph     void sendPassCompTableRequest(size_t offset);
162ef90b0d3STom Joseph 
163ef90b0d3STom Joseph     /** @brief Send UpdateComponent command request
164ef90b0d3STom Joseph      *
165ef90b0d3STom Joseph      *  @param[in] compOffset - component offset in compImageInfos
166ef90b0d3STom Joseph      */
167ef90b0d3STom Joseph     void sendUpdateComponentRequest(size_t offset);
168ef90b0d3STom Joseph 
169ef90b0d3STom Joseph     /** @brief Send ActivateFirmware command request */
170ef90b0d3STom Joseph     void sendActivateFirmwareRequest();
171ef90b0d3STom Joseph 
172ef90b0d3STom Joseph     /** @brief Endpoint ID of the firmware device */
173ef90b0d3STom Joseph     mctp_eid_t eid;
174ef90b0d3STom Joseph 
175ef90b0d3STom Joseph     /** @brief File stream for firmware update package */
176ef90b0d3STom Joseph     std::ifstream& package;
177ef90b0d3STom Joseph 
178ef90b0d3STom Joseph     /** @brief FirmwareDeviceIDRecord in the fw update package that matches this
179ef90b0d3STom Joseph      *         firmware device
180ef90b0d3STom Joseph      */
181ef90b0d3STom Joseph     const FirmwareDeviceIDRecord& fwDeviceIDRecord;
182ef90b0d3STom Joseph 
183ef90b0d3STom Joseph     /** @brief Component image information for all the components in the fw
184ef90b0d3STom Joseph      *         update package
185ef90b0d3STom Joseph      */
186ef90b0d3STom Joseph     const ComponentImageInfos& compImageInfos;
187ef90b0d3STom Joseph 
188ef90b0d3STom Joseph     /** @brief Component info for the components in this FD derived from
189ef90b0d3STom Joseph      *         GetFirmwareParameters response
190ef90b0d3STom Joseph      */
191ef90b0d3STom Joseph     const ComponentInfo& compInfo;
192ef90b0d3STom Joseph 
193ef90b0d3STom Joseph     /** @brief Maximum size in bytes of the variable payload to be requested by
194ef90b0d3STom Joseph      *         the FD via RequestFirmwareData command
195ef90b0d3STom Joseph      */
196ef90b0d3STom Joseph     uint32_t maxTransferSize;
197ef90b0d3STom Joseph 
198ef90b0d3STom Joseph     /** @brief To update the status of fw update of the FD */
199ef90b0d3STom Joseph     UpdateManager* updateManager;
200ef90b0d3STom Joseph 
201ef90b0d3STom Joseph     /** @brief Component index is used to track the current component being
202ef90b0d3STom Joseph      *         updated if multiple components are applicable for the FD.
203ef90b0d3STom Joseph      *         It is also used to keep track of the next component in
204ef90b0d3STom Joseph      *         PassComponentTable
205ef90b0d3STom Joseph      */
206ef90b0d3STom Joseph     size_t componentIndex = 0;
207ef90b0d3STom Joseph 
208ef90b0d3STom Joseph     /** @brief To send a PLDM request after the current command handling */
209ef90b0d3STom Joseph     std::unique_ptr<sdeventplus::source::Defer> pldmRequest;
210ef90b0d3STom Joseph };
211ef90b0d3STom Joseph 
212ef90b0d3STom Joseph } // namespace fw_update
213ef90b0d3STom Joseph 
214ef90b0d3STom Joseph } // namespace pldm
215