fw update: common code
new daemons to implement the flow as described in
https://github.com/openbmc/docs/blob/master/designs/code-update.md
- common/
common code folder
- common update flow
- base class for the device specific update daemons
The new daemons are all following the generic template of Code Updater
daemon as outlined in the design.
The idea is that they are separate daemons (per device, as outlined in
the design) but share all the code that's not device specific.
Tested: next patch in series
Change-Id: If2438b8506aceb8c5313ec13a0bf7cb68f3cc279
Signed-off-by: Alexander Hansen <alexander.hansen@9elements.com>
diff --git a/common/include/device.hpp b/common/include/device.hpp
new file mode 100644
index 0000000..2bfcac7
--- /dev/null
+++ b/common/include/device.hpp
@@ -0,0 +1,102 @@
+#pragma once
+
+#include "common/pldm/package_parser.hpp"
+#include "device_config.hpp"
+#include "software.hpp"
+
+#include <sdbusplus/async/context.hpp>
+#include <xyz/openbmc_project/Association/Definitions/aserver.hpp>
+#include <xyz/openbmc_project/Software/Activation/aserver.hpp>
+#include <xyz/openbmc_project/Software/Update/aserver.hpp>
+#include <xyz/openbmc_project/Software/Version/aserver.hpp>
+
+#include <string>
+
+using ActivationInterface =
+ sdbusplus::common::xyz::openbmc_project::software::Activation;
+
+class SoftwareManager;
+
+class Device
+{
+ public:
+ Device(sdbusplus::async::context& ctx, bool dryRun,
+ const DeviceConfig& deviceConfig, SoftwareManager* parent);
+
+ virtual ~Device() = default;
+ Device(const Device&) = delete;
+ Device& operator=(const Device&) = delete;
+ Device(Device&&) = delete;
+ Device& operator=(Device&&) = delete;
+
+ // we provide the pointer to the dbus interface so the device specific
+ // implementation can give percentage progress updates
+ // @param image raw fw image without pldm header
+ // @param image_size size of 'image'
+ // @param activationProgress dbus interface for progress reporting
+ // @returns true if update was applied successfully.
+ // Should also return true if update was applied
+ // successfully, but the host failed to power
+ // on.
+ virtual sdbusplus::async::task<bool> updateDevice(
+ const uint8_t* image, size_t image_size,
+ std::unique_ptr<SoftwareActivationProgress>& activationProgress) = 0;
+
+ // @returns the object path of the inventory item which
+ // can be associated with this device.
+ virtual sdbusplus::async::task<std::string>
+ getInventoryItemObjectPath() = 0;
+
+ // Returns the apply times for updates which are supported by the device
+ // Override this if your device deviates from the default set of apply
+ // times.
+ virtual std::set<RequestedApplyTimes> allowedApplyTimes();
+
+ // @param image the memory fd with the pldm package
+ // @param applyTime when the update should be applied
+ // @param swid the software id to use
+ // @returns true if update was successfull
+ sdbusplus::async::task<bool> startUpdateAsync(
+ sdbusplus::message::unix_fd image, RequestedApplyTimes applyTime,
+ std::unique_ptr<Software> softwareUpdate);
+
+ // Value of 'Type' field for the configuration in EM exposes record
+ std::string getEMConfigType() const;
+
+ // software instance, identified by its swid
+ // The specific derived class also owns its dbus interfaces,
+ // which are destroyed when the instance is deleted.
+ std::unique_ptr<Software> softwareCurrent;
+
+ protected:
+ // Resets the device, in whichever way is appropriate for the device.
+ // The reset must be capable to apply the firmware update which was done
+ // by 'deviceSpecificUpdateFunction', in case that function did not already
+ // apply it. This method is optional to implement for that reason.
+ virtual void resetDevice();
+
+ // The common configuration that all devices share.
+ // We get this from EM configuration.
+ DeviceConfig config;
+
+ SoftwareManager* parent;
+ bool dryRun;
+
+ sdbusplus::async::context& ctx;
+
+ private:
+ // @param pldm_pkg raw pldm package
+ // @param pldm_pkg_size size of 'pldm_pkg'
+ // @param applyTime when the update should be applied
+ // @returns the return value of the device specific
+ // update function
+ sdbusplus::async::task<bool> continueUpdateWithMappedPackage(
+ void* pldm_pkg,
+ const std::shared_ptr<pldm::fw_update::PackageParser>& packageParser,
+ sdbusplus::common::xyz::openbmc_project::software::ApplyTime::
+ RequestedApplyTimes applyTime,
+ const std::unique_ptr<Software>& softwareUpdate);
+
+ friend SoftwareUpdate;
+ friend Software;
+};