blob: 2a522761db8a392836944be3f311dba639200b17 [file] [log] [blame]
#pragma once
#include "common/pldm/package_parser.hpp"
#include "software.hpp"
#include "software_config.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;
namespace phosphor::software::manager
{
class SoftwareManager;
};
namespace phosphor::software::device
{
class Device
{
public:
Device(sdbusplus::async::context& ctx,
const phosphor::software::config::SoftwareConfig& deviceConfig,
phosphor::software::manager::SoftwareManager* parent,
std::set<RequestedApplyTimes> allowedApplyTimes);
virtual ~Device() = default;
Device(const Device&) = delete;
Device& operator=(const Device&) = delete;
Device(Device&&) = delete;
Device& operator=(Device&&) = delete;
// @brief Applies the image to the device
// @param image raw fw image without pldm header
// @param image_size size of 'image'
// @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) = 0;
// @brief Set the ActivationProgress properties on dbus
// @param progress progress value
// @returns true on successful property update
bool setUpdateProgress(uint8_t progress) const;
// @brief This coroutine is spawned to perform the
// async update of the device.
// @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> softwareUpdateExternal);
// Value of 'Type' field for the configuration in EM exposes record
std::string getEMConfigType() const;
protected:
// The apply times for updates which are supported by the device
// Override this if your device deviates from the default set of apply
// times.
std::set<RequestedApplyTimes> allowedApplyTimes;
// 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;
// In case of apply time == OnReset, this contains the software version
// which has been written to the device, or should be written to it,
// but is not active yet.
std::unique_ptr<Software> softwarePending;
// 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 sdbusplus::async::task<bool> resetDevice();
// The common configuration that all devices share.
// We get this from EM configuration.
config::SoftwareConfig config;
manager::SoftwareManager* parent;
sdbusplus::async::context& ctx;
private:
bool updateInProgress = false;
// @param componentImage component image as extracted from update pkg
// @param componentImageSize size of 'componentImage'
// @param applyTime when the update should be applied
// @param softwarePendingIn the pending software instance
// @returns the return value of the device specific
// update function
sdbusplus::async::task<bool> continueUpdateWithMappedPackage(
const uint8_t* componentImage, size_t componentImageSize,
const std::string& componentVersion, RequestedApplyTimes applyTime);
// @brief extracts the information we need from the pldm package
// @returns true on success
sdbusplus::async::task<bool> getImageInfo(
std::unique_ptr<void, std::function<void(void*)>>& pldmPackage,
size_t pldmPackageSize, uint8_t** matchingComponentImage,
size_t* componentImageSize, std::string& componentVersion);
friend update::SoftwareUpdate;
friend Software;
};
}; // namespace phosphor::software::device