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