mmc: Update and remove functions for the kernel and rootfs
Add support for update and remove of eMMC images.
The code update tarball contains an image-kernel and image-rofs
files. These can be flashed directly to the eMMC partitions since
they're filesystem files compressed with zstd:
https://gerrit.openbmc-project.xyz/c/openbmc/meta-phosphor/+/30781
https://gerrit.openbmc-project.xyz/c/openbmc/meta-phosphor/+/34334
The image-rofs contains the BMC rootfs files, and the image-kernel
contains the fitImage file which is loaded by U-Boot.
Tested: Verified the non-running rofs and kernel partitions were updated.
Change-Id: Ic983dec1df389d56f11f12dc2e82589d1a2b9dcc
Signed-off-by: Adriana Kobylak <anoo@us.ibm.com>
diff --git a/mmc/flash.cpp b/mmc/flash.cpp
index afaadfb..dd12b0d 100644
--- a/mmc/flash.cpp
+++ b/mmc/flash.cpp
@@ -1,3 +1,5 @@
+#include "config.h"
+
#include "flash.hpp"
#include "activation.hpp"
@@ -9,14 +11,49 @@
namespace updater
{
+namespace softwareServer = sdbusplus::xyz::openbmc_project::Software::server;
+
void Activation::flashWrite()
{
- // Empty
+ 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*/)
+void Activation::onStateChanges(sdbusplus::message::message& msg)
{
- // Empty
+ 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";
+
+ if (newStateUnit == mmcServiceFile && newStateResult == "done")
+ {
+ roVolumeCreated = true;
+ activationProgress->progress(activationProgress->progress() + 1);
+ }
+
+ if (newStateUnit == mmcServiceFile)
+ {
+ if (newStateResult == "failed" || newStateResult == "dependency")
+ {
+ Activation::activation(
+ softwareServer::Activation::Activations::Failed);
+ }
+ else if (roVolumeCreated)
+ {
+ Activation::onFlashWriteSuccess();
+ }
+ }
+
+ return;
}
} // namespace updater
diff --git a/mmc/item_updater_helper.cpp b/mmc/item_updater_helper.cpp
index 8ef5749..0eb910e 100644
--- a/mmc/item_updater_helper.cpp
+++ b/mmc/item_updater_helper.cpp
@@ -1,3 +1,5 @@
+#include "config.h"
+
#include "item_updater_helper.hpp"
namespace phosphor
@@ -27,9 +29,13 @@
// Empty
}
-void Helper::removeVersion(const std::string& /* versionId */)
+void Helper::removeVersion(const std::string& versionId)
{
- // Empty
+ auto method = bus.new_method_call(SYSTEMD_BUSNAME, SYSTEMD_PATH,
+ SYSTEMD_INTERFACE, "StartUnit");
+ auto serviceFile = "obmc-flash-mmc-remove@" + versionId + ".service";
+ method.append(serviceFile, "replace");
+ bus.call_noreply(method);
}
void Helper::updateUbootVersionId(const std::string& /* versionId */)
diff --git a/mmc/obmc-flash-mmc-remove@.service.in b/mmc/obmc-flash-mmc-remove@.service.in
new file mode 100644
index 0000000..0fb4311
--- /dev/null
+++ b/mmc/obmc-flash-mmc-remove@.service.in
@@ -0,0 +1,7 @@
+[Unit]
+Description=Delete image %I from BMC storage
+
+[Service]
+Type=oneshot
+RemainAfterExit=no
+ExecStart=/usr/bin/obmc-flash-bmc mmc-remove %i
diff --git a/mmc/obmc-flash-mmc@.service.in b/mmc/obmc-flash-mmc@.service.in
new file mode 100644
index 0000000..f8b4262
--- /dev/null
+++ b/mmc/obmc-flash-mmc@.service.in
@@ -0,0 +1,8 @@
+[Unit]
+Description=Write image %I to BMC storage
+OnFailure=obmc-flash-mmc-remove@%i.service
+
+[Service]
+Type=oneshot
+RemainAfterExit=no
+ExecStart=/usr/bin/obmc-flash-bmc mmc %i @IMG_UPLOAD_DIR@