vpnor: Move clearvolatile services to vpnor

The clearvolatile services were originally in the ubi layout, but
the functionality is purely for vpnor, not tied to a filesystem
layout. Move them to the vpnor layer where non-UBI layouts that use
virtual pnor such as eMMC have this functionality.

Tested: Verified on witherspoon that the renamed services were
        included in the image and ran during a power on.

Change-Id: I6e9e9e4f5a8a7690a46872ee2fdc0fc96e621482
Signed-off-by: Adriana Kobylak <anoo@us.ibm.com>
diff --git a/vpnor/Makefile.am.include b/vpnor/Makefile.am.include
index 49d9c1a..ce7e535 100644
--- a/vpnor/Makefile.am.include
+++ b/vpnor/Makefile.am.include
@@ -3,5 +3,7 @@
 
 if HAVE_SYSTEMD
 systemdsystemunit_DATA += \
+	%reldir%/obmc-vpnor-check-clearvolatile@.service \
+	%reldir%/obmc-vpnor-enable-clearvolatile@.service \
 	%reldir%/obmc-vpnor-updatesymlinks.service
 endif
diff --git a/vpnor/obmc-vpnor-check-clearvolatile@.service b/vpnor/obmc-vpnor-check-clearvolatile@.service
new file mode 100644
index 0000000..c303721
--- /dev/null
+++ b/vpnor/obmc-vpnor-check-clearvolatile@.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Clear the Volatile PNOR partitions in host%I if Enabled
+After=obmc-vpnor-enable-clearvolatile@%i.service
+Before=obmc-host-start-pre@%i.target
+ConditionPathExists=!/run/openbmc/host@%i-on
+
+[Service]
+Type=oneshot
+RemainAfterExit=no
+ExecStart=/usr/bin/obmc-vpnor-util clearvolatile
+
+[Install]
+RequiredBy=obmc-host-startmin@%i.target
diff --git a/vpnor/obmc-vpnor-enable-clearvolatile@.service b/vpnor/obmc-vpnor-enable-clearvolatile@.service
new file mode 100644
index 0000000..bad59b1
--- /dev/null
+++ b/vpnor/obmc-vpnor-enable-clearvolatile@.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=Enable the clearing of the Volatile PNOR partitions in host%I
+After=obmc-host-reset-running@%i.target
+Wants=mapper-wait@-org-open_power-control-volatile.service
+After=mapper-wait@-org-open_power-control-volatile.service
+Before=obmc-vpnor-check-clearvolatile@%i.service
+ConditionPathExists=!/run/openbmc/host@%i-on
+
+[Service]
+Type=oneshot
+RemainAfterExit=no
+ExecStart=/bin/sh -c "busctl set-property `mapper get-service /org/open_power/control/volatile` /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled b true"
+SyslogIdentifier=obmc-vpnor-enable-clearvolatile
+
+[Install]
+RequiredBy=obmc-host-start@%i.target
diff --git a/vpnor/obmc-vpnor-util b/vpnor/obmc-vpnor-util
index 25e6726..2abf8fb 100644
--- a/vpnor/obmc-vpnor-util
+++ b/vpnor/obmc-vpnor-util
@@ -1,5 +1,39 @@
 #!/bin/sh
 
+clear_volatile() {
+  service=$(mapper get-service /org/open_power/control/volatile)
+  clearVolatileEnabled=$(busctl get-property $service /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled)
+  if [[ "$clearVolatileEnabled" != "b true" ]]; then
+    return 0
+  fi
+
+  PNOR_TOC_FILE="pnor.toc"
+  PNOR_RO_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/ro/"
+  PNOR_RW_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/rw/"
+  PNOR_PRSV_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/prsv/"
+
+  # toc partition string format:
+  # partition27=HB_VOLATILE,0x02ba9000,0x02bae000,00,ECC,VOLATILE,READWRITE
+  tocFilePath="${PNOR_RO_ACTIVE_PATH}${PNOR_TOC_FILE}"
+  volatiles=($(grep VOLATILE "${tocFilePath}" | grep -Eo '^partition([0-9]+)=([A-Za-z0-9_]+)'))
+  for (( index=0; index<${#volatiles[@]}; index++ )); do
+    volatileName="$(echo ${volatiles[${index}]} | awk -F '=' '{print $2}')"
+
+    rwVolatile="${PNOR_RW_ACTIVE_PATH}${volatileName}"
+    if [ -f "${rwVolatile}" ]; then
+      echo "Clear $rwVolatile"
+      rm "${rwVolatile}"
+    fi
+    prsvVolatile="${PNOR_PRSV_ACTIVE_PATH}${volatileName}"
+    if [ -f "${prsvVolatile}" ]; then
+      echo "Clear $prsvVolatile"
+      rm "${prsvVolatile}"
+    fi
+  done
+  # Always reset the sensor after clearing
+  busctl set-property $service /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled b false
+}
+
 update_symlinks() {
   PNOR_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/"
   PNOR_RO_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/ro"
@@ -60,6 +94,9 @@
 }
 
 case "$1" in
+  clearvolatile)
+    clear_volatile
+    ;;
   updatesymlinks)
     update_symlinks
     ;;