xref: /openbmc/phosphor-bmc-code-mgmt/bmc/item_updater.hpp (revision cab87e9cdeeb3e166d6d577511f6be4dc7721aca)
1*cab87e9cSJagpal Singh Gill #pragma once
2*cab87e9cSJagpal Singh Gill 
3*cab87e9cSJagpal Singh Gill #include "activation.hpp"
4*cab87e9cSJagpal Singh Gill #include "item_updater_helper.hpp"
5*cab87e9cSJagpal Singh Gill #include "msl_verify.hpp"
6*cab87e9cSJagpal Singh Gill #include "update_manager.hpp"
7*cab87e9cSJagpal Singh Gill #include "version.hpp"
8*cab87e9cSJagpal Singh Gill #include "xyz/openbmc_project/Collection/DeleteAll/server.hpp"
9*cab87e9cSJagpal Singh Gill 
10*cab87e9cSJagpal Singh Gill #include <sdbusplus/async.hpp>
11*cab87e9cSJagpal Singh Gill #include <sdbusplus/server.hpp>
12*cab87e9cSJagpal Singh Gill #include <xyz/openbmc_project/Association/Definitions/server.hpp>
13*cab87e9cSJagpal Singh Gill #include <xyz/openbmc_project/Common/FactoryReset/server.hpp>
14*cab87e9cSJagpal Singh Gill #include <xyz/openbmc_project/Control/FieldMode/server.hpp>
15*cab87e9cSJagpal Singh Gill #include <xyz/openbmc_project/Software/MinimumVersion/server.hpp>
16*cab87e9cSJagpal Singh Gill 
17*cab87e9cSJagpal Singh Gill #include <string>
18*cab87e9cSJagpal Singh Gill #include <vector>
19*cab87e9cSJagpal Singh Gill 
20*cab87e9cSJagpal Singh Gill namespace phosphor
21*cab87e9cSJagpal Singh Gill {
22*cab87e9cSJagpal Singh Gill namespace software
23*cab87e9cSJagpal Singh Gill {
24*cab87e9cSJagpal Singh Gill namespace updater
25*cab87e9cSJagpal Singh Gill {
26*cab87e9cSJagpal Singh Gill 
27*cab87e9cSJagpal Singh Gill using ActivationIntf =
28*cab87e9cSJagpal Singh Gill     sdbusplus::xyz::openbmc_project::Software::server::Activation;
29*cab87e9cSJagpal Singh Gill using ItemUpdaterInherit = sdbusplus::server::object_t<
30*cab87e9cSJagpal Singh Gill     sdbusplus::server::xyz::openbmc_project::common::FactoryReset,
31*cab87e9cSJagpal Singh Gill     sdbusplus::server::xyz::openbmc_project::control::FieldMode,
32*cab87e9cSJagpal Singh Gill     sdbusplus::server::xyz::openbmc_project::association::Definitions,
33*cab87e9cSJagpal Singh Gill     sdbusplus::server::xyz::openbmc_project::collection::DeleteAll>;
34*cab87e9cSJagpal Singh Gill using MinimumVersionInherit = sdbusplus::server::object_t<
35*cab87e9cSJagpal Singh Gill     sdbusplus::server::xyz::openbmc_project::software::MinimumVersion>;
36*cab87e9cSJagpal Singh Gill 
37*cab87e9cSJagpal Singh Gill namespace MatchRules = sdbusplus::bus::match::rules;
38*cab87e9cSJagpal Singh Gill using VersionClass = phosphor::software::manager::Version;
39*cab87e9cSJagpal Singh Gill using AssociationList =
40*cab87e9cSJagpal Singh Gill     std::vector<std::tuple<std::string, std::string, std::string>>;
41*cab87e9cSJagpal Singh Gill using UpdateManager = phosphor::software::update::Manager;
42*cab87e9cSJagpal Singh Gill 
43*cab87e9cSJagpal Singh Gill /** @class MinimumVersion
44*cab87e9cSJagpal Singh Gill  *  @brief OpenBMC MinimumVersion implementation.
45*cab87e9cSJagpal Singh Gill  *  @details A concrete implementation for
46*cab87e9cSJagpal Singh Gill  *  xyz.openbmc_project.Software.MinimumVersion DBus API.
47*cab87e9cSJagpal Singh Gill  */
48*cab87e9cSJagpal Singh Gill class MinimumVersion : public MinimumVersionInherit
49*cab87e9cSJagpal Singh Gill {
50*cab87e9cSJagpal Singh Gill   public:
51*cab87e9cSJagpal Singh Gill     /** @brief Constructs MinimumVersion
52*cab87e9cSJagpal Singh Gill      *
53*cab87e9cSJagpal Singh Gill      * @param[in] bus - The D-Bus bus object
54*cab87e9cSJagpal Singh Gill      * @param[in] path - The D-bus object path
55*cab87e9cSJagpal Singh Gill      */
MinimumVersion(sdbusplus::bus_t & bus,const std::string & path)56*cab87e9cSJagpal Singh Gill     MinimumVersion(sdbusplus::bus_t& bus, const std::string& path) :
57*cab87e9cSJagpal Singh Gill         MinimumVersionInherit(bus, path.c_str(), action::emit_interface_added)
58*cab87e9cSJagpal Singh Gill     {}
59*cab87e9cSJagpal Singh Gill };
60*cab87e9cSJagpal Singh Gill 
61*cab87e9cSJagpal Singh Gill /** @class ItemUpdater
62*cab87e9cSJagpal Singh Gill  *  @brief Manages the activation of the BMC version items.
63*cab87e9cSJagpal Singh Gill  */
64*cab87e9cSJagpal Singh Gill class ItemUpdater : public ItemUpdaterInherit
65*cab87e9cSJagpal Singh Gill {
66*cab87e9cSJagpal Singh Gill   public:
67*cab87e9cSJagpal Singh Gill     /*
68*cab87e9cSJagpal Singh Gill      * @brief Types of Activation status for image validation.
69*cab87e9cSJagpal Singh Gill      */
70*cab87e9cSJagpal Singh Gill     enum class ActivationStatus
71*cab87e9cSJagpal Singh Gill     {
72*cab87e9cSJagpal Singh Gill         ready,
73*cab87e9cSJagpal Singh Gill         invalid,
74*cab87e9cSJagpal Singh Gill         active
75*cab87e9cSJagpal Singh Gill     };
76*cab87e9cSJagpal Singh Gill 
77*cab87e9cSJagpal Singh Gill     /** @brief Types of Updater. */
78*cab87e9cSJagpal Singh Gill     enum class UpdaterType
79*cab87e9cSJagpal Singh Gill     {
80*cab87e9cSJagpal Singh Gill         BMC,
81*cab87e9cSJagpal Singh Gill         BIOS,
82*cab87e9cSJagpal Singh Gill         ALL
83*cab87e9cSJagpal Singh Gill     };
84*cab87e9cSJagpal Singh Gill 
85*cab87e9cSJagpal Singh Gill     /** @brief Constructs ItemUpdater
86*cab87e9cSJagpal Singh Gill      *
87*cab87e9cSJagpal Singh Gill      * @param[in] bus    - The D-Bus bus object
88*cab87e9cSJagpal Singh Gill      */
ItemUpdater(sdbusplus::async::context & ctx,const std::string & path,UpdaterType type=UpdaterType::ALL,bool useUpdateDBusInterface=true)89*cab87e9cSJagpal Singh Gill     ItemUpdater(sdbusplus::async::context& ctx, const std::string& path,
90*cab87e9cSJagpal Singh Gill                 UpdaterType type = UpdaterType::ALL,
91*cab87e9cSJagpal Singh Gill                 bool useUpdateDBusInterface = true) :
92*cab87e9cSJagpal Singh Gill         ItemUpdaterInherit(ctx.get_bus(), path.c_str(),
93*cab87e9cSJagpal Singh Gill                            ItemUpdaterInherit::action::defer_emit),
94*cab87e9cSJagpal Singh Gill         type(type), useUpdateDBusInterface(useUpdateDBusInterface), ctx(ctx),
95*cab87e9cSJagpal Singh Gill         bus(ctx.get_bus()), helper(bus)
96*cab87e9cSJagpal Singh Gill     {
97*cab87e9cSJagpal Singh Gill         if (!useUpdateDBusInterface)
98*cab87e9cSJagpal Singh Gill         {
99*cab87e9cSJagpal Singh Gill             versionMatch = std::make_unique<sdbusplus::bus::match_t>(
100*cab87e9cSJagpal Singh Gill                 bus,
101*cab87e9cSJagpal Singh Gill                 MatchRules::interfacesAdded() +
102*cab87e9cSJagpal Singh Gill                     MatchRules::path("/xyz/openbmc_project/software"),
103*cab87e9cSJagpal Singh Gill                 std::bind(std::mem_fn(&ItemUpdater::createActivation), this,
104*cab87e9cSJagpal Singh Gill                           std::placeholders::_1));
105*cab87e9cSJagpal Singh Gill         }
106*cab87e9cSJagpal Singh Gill         getRunningSlot();
107*cab87e9cSJagpal Singh Gill         setBMCInventoryPath();
108*cab87e9cSJagpal Singh Gill         if (type == UpdaterType::BMC || type == UpdaterType::ALL)
109*cab87e9cSJagpal Singh Gill         {
110*cab87e9cSJagpal Singh Gill             processBMCImage();
111*cab87e9cSJagpal Singh Gill         }
112*cab87e9cSJagpal Singh Gill         if (type == UpdaterType::BIOS || type == UpdaterType::ALL)
113*cab87e9cSJagpal Singh Gill         {
114*cab87e9cSJagpal Singh Gill #ifdef HOST_BIOS_UPGRADE
115*cab87e9cSJagpal Singh Gill             createBIOSObject();
116*cab87e9cSJagpal Singh Gill #endif
117*cab87e9cSJagpal Singh Gill         }
118*cab87e9cSJagpal Singh Gill         restoreFieldModeStatus();
119*cab87e9cSJagpal Singh Gill         emit_object_added();
120*cab87e9cSJagpal Singh Gill     };
121*cab87e9cSJagpal Singh Gill 
122*cab87e9cSJagpal Singh Gill     /** @brief Save priority value to persistent storage (flash and optionally
123*cab87e9cSJagpal Singh Gill      *  a U-Boot environment variable)
124*cab87e9cSJagpal Singh Gill      *
125*cab87e9cSJagpal Singh Gill      *  @param[in] versionId - The Id of the version
126*cab87e9cSJagpal Singh Gill      *  @param[in] value - The priority value
127*cab87e9cSJagpal Singh Gill      *  @return None
128*cab87e9cSJagpal Singh Gill      */
129*cab87e9cSJagpal Singh Gill     void savePriority(const std::string& versionId, uint8_t value);
130*cab87e9cSJagpal Singh Gill 
131*cab87e9cSJagpal Singh Gill     /** @brief Sets the given priority free by incrementing
132*cab87e9cSJagpal Singh Gill      *  any existing priority with the same value by 1
133*cab87e9cSJagpal Singh Gill      *
134*cab87e9cSJagpal Singh Gill      *  @param[in] value - The priority that needs to be set free.
135*cab87e9cSJagpal Singh Gill      *  @param[in] versionId - The Id of the version for which we
136*cab87e9cSJagpal Singh Gill      *                         are trying to free up the priority.
137*cab87e9cSJagpal Singh Gill      *  @return None
138*cab87e9cSJagpal Singh Gill      */
139*cab87e9cSJagpal Singh Gill     void freePriority(uint8_t value, const std::string& versionId);
140*cab87e9cSJagpal Singh Gill 
141*cab87e9cSJagpal Singh Gill     /**
142*cab87e9cSJagpal Singh Gill      * @brief Create and populate the active BMC Version.
143*cab87e9cSJagpal Singh Gill      */
144*cab87e9cSJagpal Singh Gill     void processBMCImage();
145*cab87e9cSJagpal Singh Gill 
146*cab87e9cSJagpal Singh Gill     /**
147*cab87e9cSJagpal Singh Gill      * @brief Verifies the image at filepath and creates the version and
148*cab87e9cSJagpal Singh Gill      * activation object. In case activation object already exists for the
149*cab87e9cSJagpal Singh Gill      * specified id, update the activation status based on image verification.
150*cab87e9cSJagpal Singh Gill      * @param[in] id - The unique identifier for the update.
151*cab87e9cSJagpal Singh Gill      * @param[in] path - The object path for the relevant objects.
152*cab87e9cSJagpal Singh Gill      * @param[in] version - The version of the image.
153*cab87e9cSJagpal Singh Gill      * @param[in] purpose - The purpose of the image.
154*cab87e9cSJagpal Singh Gill      * @param[in] extendedVersion The extended version of the image.
155*cab87e9cSJagpal Singh Gill      * @param[in] filePath - The file path where the image is located.
156*cab87e9cSJagpal Singh Gill      * @param[in] compatibleNames - The compatible name for the image.
157*cab87e9cSJagpal Singh Gill      * @param[out] Activations - Whether the image is ready to activate or not.
158*cab87e9cSJagpal Singh Gill      */
159*cab87e9cSJagpal Singh Gill     ActivationIntf::Activations verifyAndCreateObjects(
160*cab87e9cSJagpal Singh Gill         std::string& id, std::string& path, std::string& version,
161*cab87e9cSJagpal Singh Gill         VersionClass::VersionPurpose purpose, std::string& extendedVersion,
162*cab87e9cSJagpal Singh Gill         std ::string& filePath, std::vector<std::string>& compatibleNames);
163*cab87e9cSJagpal Singh Gill 
164*cab87e9cSJagpal Singh Gill     /**
165*cab87e9cSJagpal Singh Gill      * @brief Creates the activation object
166*cab87e9cSJagpal Singh Gill      * @param[in] id - The unique identifier for the update.
167*cab87e9cSJagpal Singh Gill      * @param[in] path - The object path for the activation object.
168*cab87e9cSJagpal Singh Gill      * @param[in] applyTime - The apply time for the image
169*cab87e9cSJagpal Singh Gill      */
170*cab87e9cSJagpal Singh Gill     void createActivationWithApplyTime(
171*cab87e9cSJagpal Singh Gill         std::string& id, std::string& path,
172*cab87e9cSJagpal Singh Gill         ApplyTimeIntf::RequestedApplyTimes applyTime);
173*cab87e9cSJagpal Singh Gill 
174*cab87e9cSJagpal Singh Gill     /**
175*cab87e9cSJagpal Singh Gill      * @brief Request the activation for the specified update.
176*cab87e9cSJagpal Singh Gill      * @param[in] id - The unique identifier for the update.
177*cab87e9cSJagpal Singh Gill      * @param[out] bool - status for the action.
178*cab87e9cSJagpal Singh Gill      */
179*cab87e9cSJagpal Singh Gill     bool requestActivation(std::string& id);
180*cab87e9cSJagpal Singh Gill 
181*cab87e9cSJagpal Singh Gill     /**
182*cab87e9cSJagpal Singh Gill      * @brief Change the activation status for the specified update.
183*cab87e9cSJagpal Singh Gill      * @param[in] id - The unique identifier for the update.
184*cab87e9cSJagpal Singh Gill      * @param[in] status - The activation status to set.
185*cab87e9cSJagpal Singh Gill      * @param[out] bool - status for the action.
186*cab87e9cSJagpal Singh Gill      */
187*cab87e9cSJagpal Singh Gill     bool updateActivationStatus(std::string& id,
188*cab87e9cSJagpal Singh Gill                                 ActivationIntf::Activations status);
189*cab87e9cSJagpal Singh Gill 
190*cab87e9cSJagpal Singh Gill     /**
191*cab87e9cSJagpal Singh Gill      * @brief Create the Update object
192*cab87e9cSJagpal Singh Gill      * @param[in] id - The unique identifier for the update.
193*cab87e9cSJagpal Singh Gill      * @param[in] path - The object path for the update object.
194*cab87e9cSJagpal Singh Gill      */
195*cab87e9cSJagpal Singh Gill     void createUpdateObject(const std::string& id, const std::string& path);
196*cab87e9cSJagpal Singh Gill 
197*cab87e9cSJagpal Singh Gill     /**
198*cab87e9cSJagpal Singh Gill      * @brief Erase specified entry D-Bus object
199*cab87e9cSJagpal Singh Gill      *        if Action property is not set to Active
200*cab87e9cSJagpal Singh Gill      *
201*cab87e9cSJagpal Singh Gill      * @param[in] entryId - unique identifier of the entry
202*cab87e9cSJagpal Singh Gill      */
203*cab87e9cSJagpal Singh Gill     void erase(std::string entryId);
204*cab87e9cSJagpal Singh Gill 
205*cab87e9cSJagpal Singh Gill     /**
206*cab87e9cSJagpal Singh Gill      * @brief Deletes all versions except for the current one
207*cab87e9cSJagpal Singh Gill      */
208*cab87e9cSJagpal Singh Gill     void deleteAll() override;
209*cab87e9cSJagpal Singh Gill 
210*cab87e9cSJagpal Singh Gill     /** @brief Creates an active association to the
211*cab87e9cSJagpal Singh Gill      *  newly active software image
212*cab87e9cSJagpal Singh Gill      *
213*cab87e9cSJagpal Singh Gill      * @param[in]  path - The path to create the association to.
214*cab87e9cSJagpal Singh Gill      */
215*cab87e9cSJagpal Singh Gill     void createActiveAssociation(const std::string& path);
216*cab87e9cSJagpal Singh Gill 
217*cab87e9cSJagpal Singh Gill     /** @brief Removes the associations from the provided software image path
218*cab87e9cSJagpal Singh Gill      *
219*cab87e9cSJagpal Singh Gill      * @param[in]  path - The path to remove the associations from.
220*cab87e9cSJagpal Singh Gill      */
221*cab87e9cSJagpal Singh Gill     void removeAssociations(const std::string& path);
222*cab87e9cSJagpal Singh Gill 
223*cab87e9cSJagpal Singh Gill     /** @brief Determine if the given priority is the lowest
224*cab87e9cSJagpal Singh Gill      *
225*cab87e9cSJagpal Singh Gill      *  @param[in] value - The priority that needs to be checked.
226*cab87e9cSJagpal Singh Gill      *
227*cab87e9cSJagpal Singh Gill      *  @return boolean corresponding to whether the given
228*cab87e9cSJagpal Singh Gill      *      priority is lowest.
229*cab87e9cSJagpal Singh Gill      */
230*cab87e9cSJagpal Singh Gill     bool isLowestPriority(uint8_t value);
231*cab87e9cSJagpal Singh Gill 
232*cab87e9cSJagpal Singh Gill     /**
233*cab87e9cSJagpal Singh Gill      * @brief Updates the U-Boot variables to point to the requested
234*cab87e9cSJagpal Singh Gill      *        versionId, so that the systems boots from this version on
235*cab87e9cSJagpal Singh Gill      *        the next reboot.
236*cab87e9cSJagpal Singh Gill      *
237*cab87e9cSJagpal Singh Gill      * @param[in] versionId - The version to point the system to boot from.
238*cab87e9cSJagpal Singh Gill      */
239*cab87e9cSJagpal Singh Gill     void updateUbootEnvVars(const std::string& versionId);
240*cab87e9cSJagpal Singh Gill 
241*cab87e9cSJagpal Singh Gill     /**
242*cab87e9cSJagpal Singh Gill      * @brief Updates the uboot variables to point to BMC version with lowest
243*cab87e9cSJagpal Singh Gill      *        priority, so that the system boots from this version on the
244*cab87e9cSJagpal Singh Gill      *        next boot.
245*cab87e9cSJagpal Singh Gill      */
246*cab87e9cSJagpal Singh Gill     void resetUbootEnvVars();
247*cab87e9cSJagpal Singh Gill 
248*cab87e9cSJagpal Singh Gill     /** @brief Brings the total number of active BMC versions to
249*cab87e9cSJagpal Singh Gill      *         ACTIVE_BMC_MAX_ALLOWED -1. This function is intended to be
250*cab87e9cSJagpal Singh Gill      *         run before activating a new BMC version. If this function
251*cab87e9cSJagpal Singh Gill      *         needs to delete any BMC version(s) it will delete the
252*cab87e9cSJagpal Singh Gill      *         version(s) with the highest priority, skipping the
253*cab87e9cSJagpal Singh Gill      *         functional BMC version.
254*cab87e9cSJagpal Singh Gill      *
255*cab87e9cSJagpal Singh Gill      * @param[in] caller - The Activation object that called this function.
256*cab87e9cSJagpal Singh Gill      */
257*cab87e9cSJagpal Singh Gill     void freeSpace(const Activation& caller);
258*cab87e9cSJagpal Singh Gill 
259*cab87e9cSJagpal Singh Gill     /** @brief Creates a updateable association to the
260*cab87e9cSJagpal Singh Gill      *  "running" BMC software image
261*cab87e9cSJagpal Singh Gill      *
262*cab87e9cSJagpal Singh Gill      * @param[in]  path - The path to create the association.
263*cab87e9cSJagpal Singh Gill      */
264*cab87e9cSJagpal Singh Gill     void createUpdateableAssociation(const std::string& path);
265*cab87e9cSJagpal Singh Gill 
266*cab87e9cSJagpal Singh Gill     /** @brief Persistent map of Version D-Bus objects and their
267*cab87e9cSJagpal Singh Gill      * version id */
268*cab87e9cSJagpal Singh Gill     std::map<std::string, std::unique_ptr<VersionClass>> versions;
269*cab87e9cSJagpal Singh Gill 
270*cab87e9cSJagpal Singh Gill     /** @brief Vector of needed BMC images in the tarball*/
271*cab87e9cSJagpal Singh Gill     std::vector<std::string> imageUpdateList;
272*cab87e9cSJagpal Singh Gill 
273*cab87e9cSJagpal Singh Gill     /** @brief The slot of running BMC image */
274*cab87e9cSJagpal Singh Gill     uint32_t runningImageSlot = 0;
275*cab87e9cSJagpal Singh Gill 
276*cab87e9cSJagpal Singh Gill     /** @brief The type of updater. */
277*cab87e9cSJagpal Singh Gill     UpdaterType type;
278*cab87e9cSJagpal Singh Gill 
279*cab87e9cSJagpal Singh Gill     /** @brief Flag to indicate if the update interface is used or not */
280*cab87e9cSJagpal Singh Gill     bool useUpdateDBusInterface;
281*cab87e9cSJagpal Singh Gill 
282*cab87e9cSJagpal Singh Gill   private:
283*cab87e9cSJagpal Singh Gill     /** @brief Callback function for Software.Version match.
284*cab87e9cSJagpal Singh Gill      *  @details Creates an Activation D-Bus object.
285*cab87e9cSJagpal Singh Gill      *
286*cab87e9cSJagpal Singh Gill      * @param[in]  msg       - Data associated with subscribed signal
287*cab87e9cSJagpal Singh Gill      */
288*cab87e9cSJagpal Singh Gill     void createActivation(sdbusplus::message_t& msg);
289*cab87e9cSJagpal Singh Gill 
290*cab87e9cSJagpal Singh Gill     /**
291*cab87e9cSJagpal Singh Gill      * @brief Validates the presence of SquashFS image in the image dir.
292*cab87e9cSJagpal Singh Gill      *
293*cab87e9cSJagpal Singh Gill      * @param[in]  filePath  - The path to the image dir.
294*cab87e9cSJagpal Singh Gill      * @param[out] result    - ActivationStatus Enum.
295*cab87e9cSJagpal Singh Gill      *                         ready if validation was successful.
296*cab87e9cSJagpal Singh Gill      *                         invalid if validation fail.
297*cab87e9cSJagpal Singh Gill      *                         active if image is the current version.
298*cab87e9cSJagpal Singh Gill      *
299*cab87e9cSJagpal Singh Gill      */
300*cab87e9cSJagpal Singh Gill     ActivationStatus validateSquashFSImage(const std::string& filePath);
301*cab87e9cSJagpal Singh Gill 
302*cab87e9cSJagpal Singh Gill     /** @brief BMC factory reset - marks the read-write partition for
303*cab87e9cSJagpal Singh Gill      * recreation upon reboot. */
304*cab87e9cSJagpal Singh Gill     void reset() override;
305*cab87e9cSJagpal Singh Gill 
306*cab87e9cSJagpal Singh Gill     /**
307*cab87e9cSJagpal Singh Gill      * @brief Enables field mode, if value=true.
308*cab87e9cSJagpal Singh Gill      *
309*cab87e9cSJagpal Singh Gill      * @param[in]  value  - If true, enables field mode.
310*cab87e9cSJagpal Singh Gill      * @param[out] result - Returns the current state of field mode.
311*cab87e9cSJagpal Singh Gill      *
312*cab87e9cSJagpal Singh Gill      */
313*cab87e9cSJagpal Singh Gill     bool fieldModeEnabled(bool value) override;
314*cab87e9cSJagpal Singh Gill 
315*cab87e9cSJagpal Singh Gill     /** @brief Sets the BMC inventory item path under
316*cab87e9cSJagpal Singh Gill      *  /xyz/openbmc_project/inventory/system/chassis/. */
317*cab87e9cSJagpal Singh Gill     void setBMCInventoryPath();
318*cab87e9cSJagpal Singh Gill 
319*cab87e9cSJagpal Singh Gill     /** @brief The path to the BMC inventory item. */
320*cab87e9cSJagpal Singh Gill     std::string bmcInventoryPath;
321*cab87e9cSJagpal Singh Gill 
322*cab87e9cSJagpal Singh Gill     /** @brief Restores field mode status on reboot. */
323*cab87e9cSJagpal Singh Gill     void restoreFieldModeStatus();
324*cab87e9cSJagpal Singh Gill 
325*cab87e9cSJagpal Singh Gill     /** @brief Creates a functional association to the
326*cab87e9cSJagpal Singh Gill      *  "running" BMC software image
327*cab87e9cSJagpal Singh Gill      *
328*cab87e9cSJagpal Singh Gill      * @param[in]  path - The path to create the association to.
329*cab87e9cSJagpal Singh Gill      */
330*cab87e9cSJagpal Singh Gill     void createFunctionalAssociation(const std::string& path);
331*cab87e9cSJagpal Singh Gill 
332*cab87e9cSJagpal Singh Gill     /** @brief D-Bus context */
333*cab87e9cSJagpal Singh Gill     sdbusplus::async::context& ctx;
334*cab87e9cSJagpal Singh Gill 
335*cab87e9cSJagpal Singh Gill     /** @brief Persistent sdbusplus D-Bus bus connection. */
336*cab87e9cSJagpal Singh Gill     sdbusplus::bus_t& bus;
337*cab87e9cSJagpal Singh Gill 
338*cab87e9cSJagpal Singh Gill     /** @brief The helper of image updater. */
339*cab87e9cSJagpal Singh Gill     Helper helper;
340*cab87e9cSJagpal Singh Gill 
341*cab87e9cSJagpal Singh Gill     /** @brief Persistent map of Activation D-Bus objects and their
342*cab87e9cSJagpal Singh Gill      * version id */
343*cab87e9cSJagpal Singh Gill     std::map<std::string, std::unique_ptr<Activation>> activations;
344*cab87e9cSJagpal Singh Gill 
345*cab87e9cSJagpal Singh Gill     /** @brief sdbusplus signal match for Software.Version */
346*cab87e9cSJagpal Singh Gill     std::unique_ptr<sdbusplus::bus::match_t> versionMatch;
347*cab87e9cSJagpal Singh Gill 
348*cab87e9cSJagpal Singh Gill     /** @brief This entry's associations */
349*cab87e9cSJagpal Singh Gill     AssociationList assocs;
350*cab87e9cSJagpal Singh Gill 
351*cab87e9cSJagpal Singh Gill     /** @brief Clears read only partition for
352*cab87e9cSJagpal Singh Gill      * given Activation D-Bus object.
353*cab87e9cSJagpal Singh Gill      *
354*cab87e9cSJagpal Singh Gill      * @param[in]  versionId - The version id.
355*cab87e9cSJagpal Singh Gill      */
356*cab87e9cSJagpal Singh Gill     void removeReadOnlyPartition(const std::string& versionId);
357*cab87e9cSJagpal Singh Gill 
358*cab87e9cSJagpal Singh Gill     /** @brief Copies U-Boot from the currently booted BMC chip to the
359*cab87e9cSJagpal Singh Gill      *  alternate chip.
360*cab87e9cSJagpal Singh Gill      */
361*cab87e9cSJagpal Singh Gill     void mirrorUbootToAlt();
362*cab87e9cSJagpal Singh Gill 
363*cab87e9cSJagpal Singh Gill     /** @brief Check the required image files
364*cab87e9cSJagpal Singh Gill      *
365*cab87e9cSJagpal Singh Gill      * @param[in] filePath - BMC tarball file path
366*cab87e9cSJagpal Singh Gill      * @param[in] imageList - Image filenames included in the BMC tarball
367*cab87e9cSJagpal Singh Gill      * @param[out] result - Boolean
368*cab87e9cSJagpal Singh Gill      *                      true if all image files are found in BMC tarball
369*cab87e9cSJagpal Singh Gill      *                      false if one of image files is missing
370*cab87e9cSJagpal Singh Gill      */
371*cab87e9cSJagpal Singh Gill     static bool checkImage(const std::string& filePath,
372*cab87e9cSJagpal Singh Gill                            const std::vector<std::string>& imageList);
373*cab87e9cSJagpal Singh Gill 
374*cab87e9cSJagpal Singh Gill     /** @brief Persistent MinimumVersion D-Bus object */
375*cab87e9cSJagpal Singh Gill     std::unique_ptr<MinimumVersion> minimumVersionObject;
376*cab87e9cSJagpal Singh Gill 
377*cab87e9cSJagpal Singh Gill     /** @brief Persistent map of Update D-Bus objects and their SwIds */
378*cab87e9cSJagpal Singh Gill     std::map<std::string, std::unique_ptr<UpdateManager>> updateManagers;
379*cab87e9cSJagpal Singh Gill 
380*cab87e9cSJagpal Singh Gill #ifdef HOST_BIOS_UPGRADE
381*cab87e9cSJagpal Singh Gill     /** @brief Create the BIOS object without knowing the version.
382*cab87e9cSJagpal Singh Gill      *
383*cab87e9cSJagpal Singh Gill      *  The object is created only to provide the DBus access so that an
384*cab87e9cSJagpal Singh Gill      *  external service could set the correct BIOS version.
385*cab87e9cSJagpal Singh Gill      *  On BIOS code update, the version is updated accordingly.
386*cab87e9cSJagpal Singh Gill      */
387*cab87e9cSJagpal Singh Gill     void createBIOSObject();
388*cab87e9cSJagpal Singh Gill 
389*cab87e9cSJagpal Singh Gill     /** @brief Persistent Activation D-Bus object for BIOS */
390*cab87e9cSJagpal Singh Gill     std::unique_ptr<Activation> biosActivation;
391*cab87e9cSJagpal Singh Gill 
392*cab87e9cSJagpal Singh Gill   public:
393*cab87e9cSJagpal Singh Gill     /** @brief Persistent Version D-Bus object for BIOS */
394*cab87e9cSJagpal Singh Gill     std::unique_ptr<VersionClass> biosVersion;
395*cab87e9cSJagpal Singh Gill #endif
396*cab87e9cSJagpal Singh Gill 
397*cab87e9cSJagpal Singh Gill     /** @brief Get the slot number of running image */
398*cab87e9cSJagpal Singh Gill     void getRunningSlot();
399*cab87e9cSJagpal Singh Gill };
400*cab87e9cSJagpal Singh Gill 
401*cab87e9cSJagpal Singh Gill } // namespace updater
402*cab87e9cSJagpal Singh Gill } // namespace software
403*cab87e9cSJagpal Singh Gill } // namespace phosphor
404