#include "config.h" #include "flash.hpp" #include "activation.hpp" #include "item_updater.hpp" namespace phosphor { namespace software { namespace updater { namespace softwareServer = sdbusplus::xyz::openbmc_project::Software::server; void Activation::flashWrite() { auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH, SYSTEMD_INTERFACE, "StartUnit"); auto serviceFile = "obmc-flash-mmc@" + versionId + ".service"; method.append(serviceFile, "replace"); bus.call_noreply(method); } void Activation::onStateChanges(sdbusplus::message::message& msg) { uint32_t newStateID{}; sdbusplus::message::object_path newStateObjPath; std::string newStateUnit{}; std::string newStateResult{}; // Read the msg and populate each variable msg.read(newStateID, newStateObjPath, newStateUnit, newStateResult); auto mmcServiceFile = "obmc-flash-mmc@" + versionId + ".service"; auto flashId = parent.versions.find(versionId)->second->path(); auto mmcSetPrimary = "obmc-flash-mmc-setprimary@" + flashId + ".service"; if (newStateUnit == mmcServiceFile && newStateResult == "done") { roVolumeCreated = true; activationProgress->progress(activationProgress->progress() + 1); } if (newStateUnit == mmcSetPrimary && newStateResult == "done") { ubootEnvVarsUpdated = true; } if (newStateUnit == mmcServiceFile || newStateUnit == mmcSetPrimary) { if (newStateResult == "failed" || newStateResult == "dependency") { Activation::activation( softwareServer::Activation::Activations::Failed); } else if (roVolumeCreated) { if (!ubootEnvVarsUpdated) { activationProgress->progress(90); // Set the priority which triggers the service that updates the // environment variables. if (!Activation::redundancyPriority) { Activation::redundancyPriority = std::make_unique(bus, path, *this, 0); } } else // Environment variables were updated { Activation::onFlashWriteSuccess(); } } } return; } } // namespace updater } // namespace software } // namespace phosphor