blob: 780ce490429dd457cb01d4c99d6916b3bb506b37 [file] [log] [blame]
Tom Joseph4d8d5772021-08-17 07:35:05 -07001#pragma once
2
Andrew Jeffery2abbce72023-10-18 10:17:35 +10303#include "common/instance_id.hpp"
Tom Joseph4d8d5772021-08-17 07:35:05 -07004#include "common/types.hpp"
5#include "device_updater.hpp"
6#include "package_parser.hpp"
Tom Joseph4d8d5772021-08-17 07:35:05 -07007#include "requester/handler.hpp"
8#include "watch.hpp"
9
George Liuc453e162022-12-21 17:16:23 +080010#include <libpldm/base.h>
George Liuc453e162022-12-21 17:16:23 +080011
Tom Joseph4d8d5772021-08-17 07:35:05 -070012#include <chrono>
13#include <filesystem>
14#include <fstream>
15#include <tuple>
16#include <unordered_map>
17
18namespace pldm
19{
20
21namespace fw_update
22{
23
24using namespace sdeventplus;
25using namespace sdeventplus::source;
Tom Joseph4d8d5772021-08-17 07:35:05 -070026using namespace pldm;
27
28using DeviceIDRecordOffset = size_t;
29using DeviceUpdaterInfo = std::pair<mctp_eid_t, DeviceIDRecordOffset>;
30using DeviceUpdaterInfos = std::vector<DeviceUpdaterInfo>;
31using TotalComponentUpdates = size_t;
32
33class Activation;
34class ActivationProgress;
35
36class UpdateManager
37{
38 public:
39 UpdateManager() = delete;
40 UpdateManager(const UpdateManager&) = delete;
41 UpdateManager(UpdateManager&&) = delete;
42 UpdateManager& operator=(const UpdateManager&) = delete;
43 UpdateManager& operator=(UpdateManager&&) = delete;
44 ~UpdateManager() = default;
45
46 explicit UpdateManager(
47 Event& event,
48 pldm::requester::Handler<pldm::requester::Request>& handler,
Andrew Jefferya330b2f2023-05-04 14:55:37 +093049 InstanceIdDb& instanceIdDb, const DescriptorMap& descriptorMap,
Tom Joseph4d8d5772021-08-17 07:35:05 -070050 const ComponentInfoMap& componentInfoMap) :
51 event(event),
Andrew Jefferya330b2f2023-05-04 14:55:37 +093052 handler(handler), instanceIdDb(instanceIdDb),
53 descriptorMap(descriptorMap), componentInfoMap(componentInfoMap),
Tom Joseph4d8d5772021-08-17 07:35:05 -070054 watch(event.get(),
DelphineCCChiu312c3732024-04-24 08:49:51 +080055 std::bind_front(&UpdateManager::processPackage, this)),
56 totalNumComponentUpdates(0), compUpdateCompletedCount(0)
Tom Joseph4d8d5772021-08-17 07:35:05 -070057 {}
58
59 /** @brief Handle PLDM request for the commands in the FW update
60 * specification
61 *
62 * @param[in] eid - Remote MCTP Endpoint ID
63 * @param[in] command - PLDM command code
64 * @param[in] request - PLDM request message
65 * @param[in] requestLen - PLDM request message length
66 *
67 * @return PLDM response message
68 */
69 Response handleRequest(mctp_eid_t eid, uint8_t command,
70 const pldm_msg* request, size_t reqMsgLen);
71
72 int processPackage(const std::filesystem::path& packageFilePath);
73
74 void updateDeviceCompletion(mctp_eid_t eid, bool status);
75
76 void updateActivationProgress();
77
78 /** @brief Callback function that will be invoked when the
79 * RequestedActivation will be set to active in the Activation
80 * interface
81 */
82 void activatePackage();
83
84 void clearActivationInfo();
85
86 /** @brief
87 *
88 */
89 DeviceUpdaterInfos
90 associatePkgToDevices(const FirmwareDeviceIDRecords& fwDeviceIDRecords,
91 const DescriptorMap& descriptorMap,
92 TotalComponentUpdates& totalNumComponentUpdates);
93
94 const std::string swRootPath{"/xyz/openbmc_project/software/"};
Tom Joseph4d8d5772021-08-17 07:35:05 -070095 Event& event; //!< reference to PLDM daemon's main event loop
96 /** @brief PLDM request handler */
97 pldm::requester::Handler<pldm::requester::Request>& handler;
Andrew Jefferya330b2f2023-05-04 14:55:37 +093098 InstanceIdDb& instanceIdDb; //!< reference to an InstanceIdDb
Tom Josephb7e083e2021-10-26 15:10:03 +053099
100 private:
Tom Joseph4d8d5772021-08-17 07:35:05 -0700101 /** @brief Device identifiers of the managed FDs */
102 const DescriptorMap& descriptorMap;
103 /** @brief Component information needed for the update of the managed FDs */
104 const ComponentInfoMap& componentInfoMap;
105 Watch watch;
106
107 std::unique_ptr<Activation> activation;
108 std::unique_ptr<ActivationProgress> activationProgress;
109 std::string objPath;
110
111 std::filesystem::path fwPackageFilePath;
112 std::unique_ptr<PackageParser> parser;
113 std::ifstream package;
114
115 std::unordered_map<mctp_eid_t, std::unique_ptr<DeviceUpdater>>
116 deviceUpdaterMap;
117 std::unordered_map<mctp_eid_t, bool> deviceUpdateCompletionMap;
118
119 /** @brief Total number of component updates to calculate the progress of
120 * the Firmware activation
121 */
122 size_t totalNumComponentUpdates;
123
124 /** @brief FW update package can contain updates for multiple firmware
125 * devices and each device can have multiple components. Once
126 * each component is updated (Transfer completed, Verified and
127 * Applied) ActivationProgress is updated.
128 */
129 size_t compUpdateCompletedCount;
130 decltype(std::chrono::steady_clock::now()) startTime;
131};
132
133} // namespace fw_update
134
Andrew Jeffery27a022c2022-08-10 23:12:49 +0930135} // namespace pldm