openpower: mmc: physical reset triggers bios reset

The service openpower-bios-factory-reset runs during startup and
calls bios_reset_check. This method determines whether the
factory-reset-toggle gpio has changed since the last reboot and
triggers a bios reset if it has. This decouples the code to check
for bios resets from the code in item_updater_mmc::reset and from
the BMC factory reset code.

Tested: Verified that the reset-gpio-val file was created to store
the previous value of the environment variable rwreset. Added files
to /media/hostfw and verified that they were removed upon reboot
when the value in reset-gpio-val differed from rwreset.

Signed-off-by: Isaac Kurth <isaac.kurth@ibm.com>
Change-Id: I9942c1826f800a2ce9aef4b9456b3f4acc4b94fe
diff --git a/mmc/obmc-flash-bios b/mmc/obmc-flash-bios
index 478e63f..7d2a1a9 100644
--- a/mmc/obmc-flash-bios
+++ b/mmc/obmc-flash-bios
@@ -1,5 +1,21 @@
 #!/bin/sh
 
+bios_reset_if_needed() {
+  resetval=$(fw_printenv -n rwreset 2>/dev/nell)
+  if [ "$resetval" = "0" ] || [ "$resetval" = "1" ]; then
+    varstore="/media/hostfw/reset-gpio-val"
+    if [ -f "$varstore" ]; then
+      if [ "$resetval" != "$(cat $varstore)" ]; then
+        if busctl call org.open_power.Software.Host.Updater /xyz/openbmc_project/software xyz.openbmc_project.Common.FactoryReset Reset; then
+          echo "$resetval" > "$varstore"
+        fi
+      fi
+    else
+      echo "$resetval" > "$varstore"
+    fi
+  fi
+}
+
 mmc_init() {
   base_dir="/media/hostfw"
   ro_dir="${base_dir}/running-ro"
@@ -128,6 +144,9 @@
 }
 
 case "$1" in
+  bios-reset-if-needed)
+    bios_reset_if_needed
+    ;;
   mmc-init)
     mmc_init
     ;;
@@ -135,7 +154,7 @@
     mmc_patch
     ;;
   *)
-    echo "Invalid argument"
+    echo "Invalid argument: $1" >&2
     exit 1
     ;;
 esac