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