#include "config.h" #include "flash.hpp" #include "activation.hpp" #include "images.hpp" #include "item_updater.hpp" #include #include #include namespace { constexpr auto PATH_INITRAMFS = "/run/initramfs"; constexpr auto FLASH_ALT_SERVICE_TMPL = "obmc-flash-bmc-alt@"; } // namespace namespace phosphor { namespace software { namespace updater { PHOSPHOR_LOG2_USING; namespace fs = std::filesystem; using namespace phosphor::software::image; void Activation::flashWrite() { #ifdef BMC_STATIC_DUAL_IMAGE if (parent.runningImageSlot != 0) { // It's running on the secondary chip, update the primary one info("Flashing primary flash from secondary, id: {ID}", "ID", versionId); auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH, SYSTEMD_INTERFACE, "StartUnit"); auto serviceFile = FLASH_ALT_SERVICE_TMPL + versionId + ".service"; method.append(serviceFile, "replace"); bus.call_noreply(method); return; } #endif // For static layout code update, just put images in /run/initramfs. // It expects user to trigger a reboot and an updater script will program // the image to flash during reboot. fs::path uploadDir(IMG_UPLOAD_DIR); fs::path toPath(PATH_INITRAMFS); for (const auto& bmcImage : parent.imageUpdateList) { std::error_code ec; fs::copy_file(uploadDir / versionId / bmcImage, toPath / bmcImage, fs::copy_options::overwrite_existing, ec); } } void Activation::onStateChanges([[maybe_unused]] sdbusplus::message_t& msg) { #ifdef BMC_STATIC_DUAL_IMAGE uint32_t newStateID; auto serviceFile = FLASH_ALT_SERVICE_TMPL + versionId + ".service"; sdbusplus::message::object_path newStateObjPath; std::string newStateUnit{}; std::string newStateResult{}; msg.read(newStateID, newStateObjPath, newStateUnit, newStateResult); if (newStateUnit != serviceFile) { return; } if (newStateResult == "done") { activationProgress->progress(90); onFlashWriteSuccess(); } else { Activation::activation(sdbusplus::server::xyz::openbmc_project:: software::Activation::Activations::Failed); } #endif } } // namespace updater } // namespace software } // namespace phosphor