1#!/bin/sh 2 3clear_volatile() { 4 service=$(mapper get-service /org/open_power/control/volatile) 5 clearVolatileEnabled=$(busctl get-property $service /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled) 6 if [[ "$clearVolatileEnabled" != "b true" ]]; then 7 return 0 8 fi 9 10 PNOR_TOC_FILE="pnor.toc" 11 PNOR_RO_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/ro/" 12 PNOR_RW_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/rw/" 13 PNOR_PRSV_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/prsv/" 14 15 # toc partition string format: 16 # partition27=HB_VOLATILE,0x02ba9000,0x02bae000,00,ECC,VOLATILE,READWRITE 17 tocFilePath="${PNOR_RO_ACTIVE_PATH}${PNOR_TOC_FILE}" 18 volatiles=($(grep VOLATILE "${tocFilePath}" | grep -Eo '^partition([0-9]+)=([A-Za-z0-9_]+)')) 19 for (( index=0; index<${#volatiles[@]}; index++ )); do 20 volatileName="$(echo ${volatiles[${index}]} | awk -F '=' '{print $2}')" 21 22 rwVolatile="${PNOR_RW_ACTIVE_PATH}${volatileName}" 23 if [ -f "${rwVolatile}" ]; then 24 echo "Clear $rwVolatile" 25 rm "${rwVolatile}" 26 fi 27 prsvVolatile="${PNOR_PRSV_ACTIVE_PATH}${volatileName}" 28 if [ -f "${prsvVolatile}" ]; then 29 echo "Clear $prsvVolatile" 30 rm "${prsvVolatile}" 31 fi 32 done 33 # Always reset the sensor after clearing 34 busctl set-property $service /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled b false 35} 36 37update_symlinks() { 38 PNOR_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/" 39 HOSTFW_ACTIVE_PATH="/var/lib/phosphor-software-manager/hostfw/" 40 PNOR_RO_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/ro" 41 PNOR_RO_PREFIX="/media/pnor-ro-" 42 PNOR_RW_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/rw" 43 PNOR_RW_PREFIX="/media/pnor-rw-" 44 PNOR_PRSV_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/prsv" 45 PNOR_PRSV="/media/pnor-prsv" 46 PERSISTENCE_PATH="/var/lib/obmc/openpower-pnor-code-mgmt/" 47 PNOR_PATCH_LOCATION="/usr/local/share/pnor/" 48 HOSTFW_PATCH_LOCATION="/usr/local/share/hostfw/" 49 MMC_BASE_PATH="/media/hostfw" 50 MMC_RO_PATH="${MMC_BASE_PATH}/running-ro" 51 MMC_RUNNING_PATH="${MMC_BASE_PATH}/running" 52 MMC_ALTERNATE_PATH="${MMC_BASE_PATH}/alternate" 53 HOSTFW_RUNNING_PATH="${HOSTFW_ACTIVE_PATH}/running" 54 HOSTFW_ALTERNATE_PATH="${HOSTFW_ACTIVE_PATH}/alternate" 55 56 # Get a list of all active PNOR versions 57 data="$(ls -d ${PNOR_RO_PREFIX}* 2>/dev/null)" 58 IFS=$'\n' array=(${data}) 59 60 currentVersion="" 61 lowestPriority=255 62 for element in ${array[@]}; do 63 #Remove the PNOR_RO_PREFIX from the path to get version ID. 64 versionId="${element#${PNOR_RO_PREFIX}}" 65 66 # Get the priority of active versions from persistence files. 67 if [[ -f "${PERSISTENCE_PATH}${versionId}" ]]; then 68 data="$(grep -r "priority" ${PERSISTENCE_PATH}${versionId})" 69 priority="${data: -1}" 70 if [[ priority -le lowestPriority ]]; then 71 lowestPriority=${priority} 72 currentVersion=${versionId} 73 fi 74 fi 75 done 76 77 if [ ! -z $currentVersion ]; then 78 # Use active version 79 roTarget="${PNOR_RO_PREFIX}${currentVersion}" 80 rwTarget="${PNOR_RW_PREFIX}${currentVersion}" 81 prsvTarget="${PNOR_PRSV}" 82 elif [ -d "${MMC_BASE_PATH}" ]; then 83 # Use eMMC 84 roTarget="${MMC_RO_PATH}" 85 rwTarget="${MMC_RUNNING_PATH}" 86 prsvTarget="${MMC_RUNNING_PATH}" 87 88 if [ ! -d "${HOSTFW_ACTIVE_PATH}" ]; then 89 mkdir -p "${HOSTFW_ACTIVE_PATH}" 90 fi 91 # Symlinks used by PLDM 92 if [[ $(readlink -f "${HOSTFW_RUNNING_PATH}") != ${MMC_RUNNING_PATH} ]]; then 93 rm -f ${HOSTFW_RUNNING_PATH} 94 ln -sfv ${MMC_RUNNING_PATH} ${HOSTFW_RUNNING_PATH} 95 fi 96 if [[ $(readlink -f "${HOSTFW_ALTERNATE_PATH}") != ${MMC_ALTERNATE_PATH} ]]; then 97 rm -f ${HOSTFW_ALTERNATE_PATH} 98 ln -sfv ${MMC_ALTERNATE_PATH} ${HOSTFW_ALTERNATE_PATH} 99 fi 100 fi 101 102 if [ ! -d "${PNOR_ACTIVE_PATH}" ]; then 103 mkdir -p "${PNOR_ACTIVE_PATH}" 104 fi 105 106 # If the RW or RO active links doesn't point to the version with 107 # lowest priority, then remove the symlink and create new ones. 108 if [[ $(readlink -f "${PNOR_RO_ACTIVE_PATH}") != ${roTarget} ]]; then 109 rm -f ${PNOR_RO_ACTIVE_PATH} 110 rm -rf ${PNOR_PATCH_LOCATION}* 111 ln -sfv ${roTarget} ${PNOR_RO_ACTIVE_PATH} 112 fi 113 114 if [[ $(readlink -f "${PNOR_RW_ACTIVE_PATH}") != ${rwTarget} ]]; then 115 rm -f ${PNOR_RW_ACTIVE_PATH} 116 ln -sfv ${rwTarget} ${PNOR_RW_ACTIVE_PATH} 117 fi 118 119 if [[ $(readlink -f "${PNOR_PRSV_ACTIVE_PATH}") != ${prsvTarget} ]]; then 120 rm -f ${PNOR_PRSV_ACTIVE_PATH} 121 ln -sfv ${prsvTarget} ${PNOR_PRSV_ACTIVE_PATH} 122 fi 123} 124 125case "$1" in 126 clearvolatile) 127 clear_volatile 128 ;; 129 updatesymlinks) 130 update_symlinks 131 ;; 132 *) 133 echo "Invalid argument" 134 exit 1 135 ;; 136esac 137rc=$? 138if [ ${rc} -ne 0 ]; then 139 echo "$0: error ${rc}" 140 exit ${rc} 141fi 142