summaryrefslogtreecommitdiffstats
path: root/meta-openpower/common/recipes-phosphor/flash
diff options
context:
space:
mode:
Diffstat (limited to 'meta-openpower/common/recipes-phosphor/flash')
-rw-r--r--meta-openpower/common/recipes-phosphor/flash/openpower-software-manager.bb71
-rw-r--r--meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios362
-rw-r--r--meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-check-clearvolatile@.service14
-rw-r--r--meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-cleanup.service8
-rw-r--r--meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-enable-clearvolatile@.service14
-rw-r--r--meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubiattach.service8
-rw-r--r--meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubimount@.service13
-rw-r--r--meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubipatch.service11
-rw-r--r--meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubiremount.service13
-rw-r--r--meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubiumount-ro@.service10
-rw-r--r--meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubiumount-rw@.service10
-rw-r--r--meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-updatesymlinks.service16
-rw-r--r--meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/org.open_power.Software.Host.Updater.service19
-rw-r--r--meta-openpower/common/recipes-phosphor/flash/phosphor-software-manager.bbappend4
-rw-r--r--meta-openpower/common/recipes-phosphor/flash/phosphor-software-manager/software-bmc-updater.conf3
15 files changed, 576 insertions, 0 deletions
diff --git a/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager.bb b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager.bb
new file mode 100644
index 000000000..cd17e0d5c
--- /dev/null
+++ b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager.bb
@@ -0,0 +1,71 @@
+SUMMARY = "OpenPower Software Management"
+DESCRIPTION = "OpenPower Software Manager provides a set of host software \
+management daemons. It is suitable for use on a wide variety of OpenPower \
+platforms."
+HOMEPAGE = "https://github.com/openbmc/openpower-pnor-code-mgmt"
+PR = "r1"
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://${S}/LICENSE;md5=e3fc50a88d0a364313df4b21ef20c29e"
+
+inherit autotools pkgconfig
+inherit obmc-phosphor-dbus-service
+inherit pythonnative
+
+PACKAGECONFIG[verify_pnor_signature] = "--enable-verify_pnor_signature,--disable-verify_pnor_signature"
+
+DEPENDS += " \
+ autoconf-archive-native \
+ phosphor-dbus-interfaces \
+ phosphor-logging \
+ sdbusplus \
+ sdbusplus-native \
+ "
+
+RDEPENDS_${PN} += " \
+ mtd-utils-ubifs \
+ phosphor-dbus-interfaces \
+ phosphor-logging \
+ sdbusplus \
+ virtual-obmc-image-manager \
+ "
+
+S = "${WORKDIR}/git"
+
+SRC_URI += "git://github.com/openbmc/openpower-pnor-code-mgmt"
+
+SRC_URI += "file://obmc-flash-bios"
+
+SRCREV = "c39d923fee581533775e37be3f59f77c021718ee"
+
+do_install_append() {
+ install -d ${D}${sbindir}
+ install -m 0755 ${WORKDIR}/obmc-flash-bios ${D}${sbindir}/obmc-flash-bios
+}
+
+DBUS_SERVICE_${PN} += "org.open_power.Software.Host.Updater.service"
+
+SYSTEMD_SERVICE_${PN} += " \
+ obmc-flash-bios-ubiattach.service \
+ obmc-flash-bios-ubimount@.service \
+ obmc-flash-bios-ubiumount-ro@.service \
+ obmc-flash-bios-ubiumount-rw@.service \
+ obmc-flash-bios-ubipatch.service \
+ obmc-flash-bios-ubiremount.service \
+ obmc-flash-bios-updatesymlinks.service \
+ obmc-flash-bios-cleanup.service \
+ obmc-flash-bios-enable-clearvolatile@.service \
+ obmc-flash-bios-check-clearvolatile@.service \
+ "
+
+ENABLE_CLEAR_VOLATILE_TMPL = "obmc-flash-bios-enable-clearvolatile@.service"
+HOST_START_TGTFMT = "obmc-host-start@{0}.target"
+ENABLE_CLEAR_VOLATILE_INSTFMT = "obmc-flash-bios-enable-clearvolatile@{0}.service"
+ENABLE_CLEAR_VOLATILE_START_FMT = "../${ENABLE_CLEAR_VOLATILE_TMPL}:${HOST_START_TGTFMT}.requires/${ENABLE_CLEAR_VOLATILE_INSTFMT}"
+
+CHECK_CLEAR_VOLATILE_TMPL = "obmc-flash-bios-check-clearvolatile@.service"
+HOST_STARTMIN_TGTFMT = "obmc-host-startmin@{0}.target"
+CHECK_CLEAR_VOLATILE_INSTFMT = "obmc-flash-bios-check-clearvolatile@{0}.service"
+CHECK_CLEAR_VOLATILE_START_FMT = "../${CHECK_CLEAR_VOLATILE_TMPL}:${HOST_STARTMIN_TGTFMT}.requires/${CHECK_CLEAR_VOLATILE_INSTFMT}"
+
+SYSTEMD_LINK_${PN} += "${@compose_list_zip(d, 'ENABLE_CLEAR_VOLATILE_START_FMT', 'OBMC_HOST_INSTANCES')}"
+SYSTEMD_LINK_${PN} += "${@compose_list_zip(d, 'CHECK_CLEAR_VOLATILE_START_FMT', 'OBMC_HOST_INSTANCES')}"
diff --git a/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios
new file mode 100644
index 000000000..ff8818518
--- /dev/null
+++ b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios
@@ -0,0 +1,362 @@
+#!/bin/sh
+
+# Get the mtd device number (mtdX)
+findmtd() {
+ m="$(grep -xl "$1" /sys/class/mtd/*/name)"
+ m="${m%/name}"
+ m="${m##*/}"
+ echo "${m}"
+}
+
+# Get the ubi device number (ubiX_Y)
+findubi() {
+ u="$(grep -xl "$1" /sys/class/ubi/ubi?/subsystem/ubi*/name)"
+ u="${u%/name}"
+ u="${u##*/}"
+ echo "${u}"
+}
+
+# Get the mount information
+is_mounted() {
+ grep -q "$1" /proc/mounts
+ return $?
+}
+
+# Attach the pnor mtd device to ubi.
+attach_ubi() {
+ pnormtd="$(findmtd pnor)"
+ pnor="${pnormtd#mtd}"
+ pnordev="/dev/mtd${pnor}"
+
+ if [ -d "/sys/class/ubi/ubi${pnor}" ]; then
+ # Already attached
+ return 0
+ fi
+
+ ubiattach /dev/ubi_ctrl -m "${pnor}" -d "${pnor}"
+ rc=$?
+ if [ ${rc} -ne 0 ]; then
+ # Check the pnor mtd device is formatted as ubi by reading the first 3 byes,
+ # which should be the ascii chars 'UBI'
+ magic="$(hexdump -C -n 3 ${pnordev})"
+ if [[ "${magic}" =~ "UBI" ]]; then
+ # Device already formatted as ubi, ubiattach failed for some other reason
+ return ${rc}
+ else
+ # Format device as ubi
+ echo "Starting ubiformat ${pnordev}"
+ ubiformat "${pnordev}" -y -q
+ # Retry the ubiattach
+ ubiattach /dev/ubi_ctrl -m "${pnor}" -d "${pnor}"
+ fi
+ fi
+}
+
+mount_squashfs() {
+ pnormtd="$(findmtd pnor)"
+ ubidev="/dev/ubi${pnormtd#mtd}"
+ mountdir="/media/${name}"
+ vol="$(findubi "${name}")"
+ img="/tmp/images/${version}/pnor.xz.squashfs"
+ filesize="$(ls -sh $img | awk -F " " {'print $1'})"
+
+ if is_mounted "${name}"; then
+ echo "${name} is already mounted."
+ return 0
+ fi
+
+ if [ ! -z "${vol}" ]; then
+ ubirmvol "${ubidev}" -N "${name}"
+ fi
+
+ if [ ! -d "${mountdir}" ]; then
+ mkdir "${mountdir}"
+ fi
+
+ # Set size of read-only partition equal to pnor.xz.squashfs
+ ubimkvol "${ubidev}" -N "${name}" -s "${filesize}"KiB --type=static
+ vol="$(findubi "${name}")"
+
+ if [ $? != 0 ]; then
+ echo "Unable to create RO volume!"
+ return 1
+ fi
+
+ ubidevid="${vol#ubi}"
+ ubiupdatevol "/dev/ubi${ubidevid}" "${img}"
+
+ if [ $? != 0 ]; then
+ echo "Unable to update RO volume!"
+ return 1
+ fi
+
+ ubiblock --create "/dev/ubi${ubidevid}"
+
+ if [ $? != 0 ]; then
+ echo "Unable to create UBI block for RO volume!"
+ return 1
+ fi
+
+ mount -t squashfs -o ro "/dev/ubiblock${ubidevid}" "${mountdir}"
+
+ if [ $? != 0 ]; then
+ echo "Unable to mount RO volume!"
+ return 1
+ fi
+}
+
+mount_ubi() {
+ pnormtd="$(findmtd pnor)"
+ pnor="${pnormtd#mtd}"
+ ubidev="/dev/ubi${pnor}"
+ pnordev="/dev/mtd${pnor}"
+
+ if [[ "${name}" == "pnor-patch" ]]; then
+ if [[ "$(fw_printenv fieldmode 2>/dev/null)" == "fieldmode=true" ]]; then
+ return 0
+ fi
+ if [[ ! "$(hexdump -C -n 3 ${pnordev})" =~ "UBI" ]]; then
+ return 0
+ fi
+ mountdir="/usr/local/share/pnor"
+ else
+ mountdir="/media/${name}"
+ fi
+
+ if [[ "${name}" == "pnor-prsv" ]]; then
+ size="2MiB"
+ else
+ size="16MiB"
+ fi
+
+ if [ ! -d "${mountdir}" ]; then
+ mkdir -p "${mountdir}"
+ fi
+
+ vol="$(findubi "${name}")"
+ if [ -z "${vol}" ]; then
+ ubimkvol "${ubidev}" -N "${name}" -s "${size}"
+ fi
+
+ if ! is_mounted "${name}"; then
+ mountdev="ubi${pnor}:${name}"
+ mount -t ubifs "${mountdev}" "${mountdir}"
+ fi
+}
+
+umount_ubi() {
+ pnormtd="$(findmtd pnor)"
+ pnor="${pnormtd#mtd}"
+ ubidev="/dev/ubi${pnor}"
+ mountdir="/media/${name}"
+
+ if is_mounted "${name}"; then
+ umount "${mountdir}"
+ fi
+
+ vol="$(findubi "${name}")"
+ id="${vol##*_}"
+ if [ -n "${id}" ]; then
+ ubirmvol "${ubidev}" -n "${id}"
+ fi
+
+ if [ -d "${mountdir}" ]; then
+ rm -r "${mountdir}"
+ fi
+}
+
+remount_ubi() {
+ pnormtd="$(findmtd pnor)"
+ pnor="${pnormtd#mtd}"
+ pnordev="/dev/mtd${pnor}"
+
+ # Re-Attach the pnor mtd device to ubi
+ if [[ $(hexdump -C -n 3 ${pnordev}) =~ "UBI" ]]; then
+ ubiattach /dev/ubi_ctrl -m "${pnor}" -d "${pnor}"
+ else
+ # Device not formatted as ubi.
+ return 0
+ fi
+
+ # Get information on all ubi volumes
+ ubinfo=$(ubinfo -d ${pnor})
+ presentVolumes=${ubinfo##*:}
+ IFS=', ' read -r -a array <<< "$presentVolumes"
+ for element in ${array[@]};
+ do
+ elementProperties=$(ubinfo -d $pnor -n $element)
+ # Get ubi volume name by getting rid of additional properties
+ name=${elementProperties#*Name:}
+ name="${name%Character*}"
+ name="$(echo -e "${name}" | tr -d '[:space:]')"
+
+ if [[ ${name} == pnor-prsv ]] || [[ ${name} == pnor-rw* ]] || [[ ${name} == pnor-ro* ]]; then
+ mountdir="/media/${name}"
+ if [ ! -d "${mountdir}" ]; then
+ mkdir -p "${mountdir}"
+ fi
+
+ if [[ ${name} == pnor-ro* ]]
+ then
+ ubiblock --create /dev/ubi${pnor}_${element}
+ mount -t squashfs -o ro "/dev/ubiblock${pnor}_${element}" "${mountdir}"
+ else
+ mount -t ubifs "ubi${pnor}:${name}" "${mountdir}"
+ fi
+ fi
+ done
+}
+
+update_symlinks() {
+ PNOR_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/"
+ PNOR_RO_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/ro"
+ PNOR_RO_PREFIX="/media/pnor-ro-"
+ PNOR_RW_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/rw"
+ PNOR_RW_PREFIX="/media/pnor-rw-"
+ PNOR_PRSV_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/prsv"
+ PNOR_PRSV="/media/pnor-prsv"
+ PERSISTENCE_PATH="/var/lib/obmc/openpower-pnor-code-mgmt/"
+ PNOR_PATCH_LOCATION="/usr/local/share/pnor/"
+
+ # Get a list of all active PNOR versions
+ data="$(ls -d ${PNOR_RO_PREFIX}*)"
+ IFS=$'\n' array=(${data})
+
+ currentVersion=""
+ lowestPriority=255
+ for element in ${array[@]}; do
+ #Remove the PNOR_RO_PREFIX from the path to get version ID.
+ versionId="${element#${PNOR_RO_PREFIX}}"
+
+ # Get the priority of active versions from persistence files.
+ if [[ -f "${PERSISTENCE_PATH}${versionId}" ]]; then
+ data="$(grep -r "priority" ${PERSISTENCE_PATH}${versionId})"
+ priority="${data: -1}"
+ if [[ priority -le lowestPriority ]]; then
+ lowestPriority=${priority}
+ currentVersion=${versionId}
+ fi
+ fi
+ done
+
+ # Return if no active version found
+ if [ -z $currentVersion ]; then
+ return 0;
+ fi
+
+ if [ ! -d "${PNOR_ACTIVE_PATH}" ]; then
+ mkdir -p "${PNOR_ACTIVE_PATH}"
+ fi
+
+ # If the RW or RO active links doesn't point to the version with
+ # lowest priority, then remove the symlink and create new ones.
+ if [[ $(readlink -f "${PNOR_RO_ACTIVE_PATH}") != ${PNOR_RO_PREFIX}${currentVersion} ]]; then
+ rm -f ${PNOR_RO_ACTIVE_PATH}
+ rm -rf ${PNOR_PATCH_LOCATION}*
+ ln -sfv ${PNOR_RO_PREFIX}${currentVersion} ${PNOR_RO_ACTIVE_PATH}
+ fi
+
+ if [[ $(readlink -f "${PNOR_RW_ACTIVE_PATH}") != ${PNOR_RW_PREFIX}${currentVersion} ]]; then
+ rm -f ${PNOR_RW_ACTIVE_PATH}
+ ln -sfv ${PNOR_RW_PREFIX}${currentVersion} ${PNOR_RW_ACTIVE_PATH}
+ fi
+
+ if [[ ! -h ${PNOR_PRSV_ACTIVE_PATH} ]]; then
+ ln -sfv ${PNOR_PRSV} ${PNOR_PRSV_ACTIVE_PATH}
+ fi
+}
+
+ubi_cleanup() {
+ # When ubi_cleanup is run, it expects one or no active version.
+ activeVersion=$(busctl --list --no-pager tree \
+ org.open_power.Software.Host.Updater | \
+ grep /xyz/openbmc_project/software/ | tail -c 9)
+
+ if [[ -z "$activeVersion" ]]; then
+ vols=$(ubinfo -a | grep -e "pnor-ro-" -e "pnor-rw-" | cut -c 14-)
+ vols=(${vols})
+ else
+ vols=$(ubinfo -a | grep -e "pnor-ro-" -e "pnor-rw-" | \
+ grep -v "$activeVersion" | cut -c 14-)
+ vols=(${vols})
+ fi
+
+ for (( index=0; index<${#vols[@]}; index++ )); do
+ name=${vols[index]}
+ umount_ubi
+ done
+}
+
+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
+}
+
+case "$1" in
+ ubiattach)
+ attach_ubi
+ ;;
+ squashfsmount)
+ name="$2"
+ version="$3"
+ mount_squashfs
+ ;;
+ ubimount)
+ name="$2"
+ mount_ubi
+ ;;
+ ubiumount)
+ name="$2"
+ umount_ubi
+ ;;
+ ubiremount)
+ remount_ubi
+ ;;
+ updatesymlinks)
+ update_symlinks
+ ;;
+ ubicleanup)
+ ubi_cleanup
+ ;;
+ clearvolatile)
+ clear_volatile
+ ;;
+ *)
+ echo "Invalid argument"
+ exit 1
+ ;;
+esac
+rc=$?
+if [ ${rc} -ne 0 ]; then
+ echo "$0: error ${rc}"
+ exit ${rc}
+fi
diff --git a/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-check-clearvolatile@.service b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-check-clearvolatile@.service
new file mode 100644
index 000000000..af66b4db9
--- /dev/null
+++ b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-check-clearvolatile@.service
@@ -0,0 +1,14 @@
+[Unit]
+Description=Clear the Volatile PNOR partitions in host%i if Enabled
+After=obmc-flash-bios-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/env obmc-flash-bios clearvolatile
+SyslogIdentifier=obmc-flash-bios-check-clearvolatile
+
+[Install]
+RequiredBy=obmc-host-startmin@%i.target
diff --git a/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-cleanup.service b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-cleanup.service
new file mode 100644
index 000000000..07642a0e0
--- /dev/null
+++ b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-cleanup.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=Clean up UBI volumes unattached to a Host version
+
+[Service]
+Type=oneshot
+RemainAfterExit=no
+ExecStart=/usr/bin/env obmc-flash-bios ubicleanup
+SyslogIdentifier=obmc-flash-bios
diff --git a/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-enable-clearvolatile@.service b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-enable-clearvolatile@.service
new file mode 100644
index 000000000..e040738c7
--- /dev/null
+++ b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-enable-clearvolatile@.service
@@ -0,0 +1,14 @@
+[Unit]
+Description=Enable the clearing of the Volatile PNOR partitions in host%i
+After=mapper-wait@-org-open_power-control-volatile.service
+Before=obmc-flash-bios-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-flash-bios-enable-clearvolatile
+
+[Install]
+RequiredBy=obmc-host-start@%i.target
diff --git a/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubiattach.service b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubiattach.service
new file mode 100644
index 000000000..d0785c9b0
--- /dev/null
+++ b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubiattach.service
@@ -0,0 +1,8 @@
+[Unit]
+Description=Attach the PNOR mtd device to UBI
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=/usr/bin/env obmc-flash-bios ubiattach
+SyslogIdentifier=obmc-flash-bios
diff --git a/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubimount@.service b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubimount@.service
new file mode 100644
index 000000000..d03041dad
--- /dev/null
+++ b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubimount@.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Mount UBIFS volumes pnor-ro-%I, pnor-rw-%I and pnor-prsv
+Requires=obmc-flash-bios-ubiattach.service
+After=obmc-flash-bios-ubiattach.service
+OnFailure=obmc-flash-bios-ubiumount-ro@%i.service obmc-flash-bios-ubiumount-rw@%i.service
+
+[Service]
+Type=oneshot
+RemainAfterExit=no
+ExecStart=/usr/bin/env obmc-flash-bios squashfsmount pnor-ro-%i %i
+ExecStart=/usr/bin/env obmc-flash-bios ubimount pnor-rw-%i
+ExecStart=/usr/bin/env obmc-flash-bios ubimount pnor-prsv
+SyslogIdentifier=obmc-flash-bios
diff --git a/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubipatch.service b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubipatch.service
new file mode 100644
index 000000000..206d31448
--- /dev/null
+++ b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubipatch.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=Create a ubi volume for pnor patches
+Before=mboxd.service
+Wants=usr-local.mount
+After=usr-local.mount
+
+[Service]
+Type=oneshot
+RemainAfterExit=no
+ExecStart=/usr/bin/env obmc-flash-bios ubimount pnor-patch
+SyslogIdentifier=obmc-flash-bios
diff --git a/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubiremount.service b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubiremount.service
new file mode 100644
index 000000000..f52cac684
--- /dev/null
+++ b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubiremount.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=Remount the squashfs and ubi volumes after a reboot
+Wants=org.open_power.Software.Host.Updater.service
+Before=org.open_power.Software.Host.Updater.service
+
+[Service]
+Type=oneshot
+RemainAfterExit=no
+ExecStart=/usr/bin/env obmc-flash-bios ubiremount
+SyslogIdentifier=obmc-flash-bios
+
+[Install]
+WantedBy=multi-user.target
diff --git a/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubiumount-ro@.service b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubiumount-ro@.service
new file mode 100644
index 000000000..c6dc553f4
--- /dev/null
+++ b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubiumount-ro@.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Remove UBIFS volume pnor-ro-%I
+Wants=obmc-flash-bios-ubiattach.service
+After=obmc-flash-bios-ubiattach.service
+
+[Service]
+Type=oneshot
+RemainAfterExit=no
+ExecStart=/usr/bin/env obmc-flash-bios ubiumount pnor-ro-%i
+SyslogIdentifier=obmc-flash-bios
diff --git a/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubiumount-rw@.service b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubiumount-rw@.service
new file mode 100644
index 000000000..c0ea8e628
--- /dev/null
+++ b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-ubiumount-rw@.service
@@ -0,0 +1,10 @@
+[Unit]
+Description=Remove UBIFS volume pnor-rw-%I
+Wants=obmc-flash-bios-ubiattach.service
+After=obmc-flash-bios-ubiattach.service
+
+[Service]
+Type=oneshot
+RemainAfterExit=no
+ExecStart=/usr/bin/env obmc-flash-bios ubiumount pnor-rw-%i
+SyslogIdentifier=obmc-flash-bios
diff --git a/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-updatesymlinks.service b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-updatesymlinks.service
new file mode 100644
index 000000000..8323ccf29
--- /dev/null
+++ b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/obmc-flash-bios-updatesymlinks.service
@@ -0,0 +1,16 @@
+[Unit]
+Description=Updates symlinks for active PNOR version
+Before=mboxd.service
+Before=mboxd-reload@0.service
+After=org.open_power.Software.Host.Updater.service
+After=op-reset-chassis-running@0.service
+ConditionPathExists=!/run/openbmc/chassis@0-on
+
+[Service]
+Type=oneshot
+RemainAfterExit=no
+ExecStart=/usr/bin/env obmc-flash-bios updatesymlinks
+SyslogIdentifier=obmc-flash-bios
+
+[Install]
+WantedBy=mboxd.service mboxd-reload@.service
diff --git a/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/org.open_power.Software.Host.Updater.service b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/org.open_power.Software.Host.Updater.service
new file mode 100644
index 000000000..2def481f7
--- /dev/null
+++ b/meta-openpower/common/recipes-phosphor/flash/openpower-software-manager/org.open_power.Software.Host.Updater.service
@@ -0,0 +1,19 @@
+[Unit]
+Description=OpenPower Software Update Manager
+Wants=xyz.openbmc_project.Software.Version.service
+Before=xyz.openbmc_project.Software.Version.service
+Before=mboxd.service
+Wants=obmc-flash-bios-ubipatch.service
+Before=obmc-flash-bios-ubipatch.service
+Wants=obmc-mapper.target
+After=obmc-mapper.target
+
+[Service]
+ExecStart=/usr/bin/env openpower-update-manager
+SyslogIdentifier=openpower-update-manager
+Restart=always
+Type=dbus
+BusName={BUSNAME}
+
+[Install]
+WantedBy={SYSTEMD_DEFAULT_TARGET}
diff --git a/meta-openpower/common/recipes-phosphor/flash/phosphor-software-manager.bbappend b/meta-openpower/common/recipes-phosphor/flash/phosphor-software-manager.bbappend
new file mode 100644
index 000000000..c1799f127
--- /dev/null
+++ b/meta-openpower/common/recipes-phosphor/flash/phosphor-software-manager.bbappend
@@ -0,0 +1,4 @@
+FILESEXTRAPATHS_append := "${THISDIR}/${PN}:"
+
+SYSTEMD_OVERRIDE_${PN}-updater += \
+ "software-bmc-updater.conf:xyz.openbmc_project.Software.BMC.Updater.service.d/software-bmc-updater.conf"
diff --git a/meta-openpower/common/recipes-phosphor/flash/phosphor-software-manager/software-bmc-updater.conf b/meta-openpower/common/recipes-phosphor/flash/phosphor-software-manager/software-bmc-updater.conf
new file mode 100644
index 000000000..587476244
--- /dev/null
+++ b/meta-openpower/common/recipes-phosphor/flash/phosphor-software-manager/software-bmc-updater.conf
@@ -0,0 +1,3 @@
+[Unit]
+Wants=op-vpd-parser.service
+After=op-vpd-parser.service
OpenPOWER on IntegriCloud