1fc886cabSAdriana Kobylak#!/bin/bash 2f3dfe65dSAdriana Kobylak 315513dbbSPatrick Williamsfunction clear_volatile() { 4bbb5e3beSAdriana Kobylak service=$(mapper get-service /org/open_power/control/volatile) 5fc886cabSAdriana Kobylak clearVolatileEnabled=$(busctl get-property "$service" /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled) 6bbb5e3beSAdriana Kobylak if [[ "$clearVolatileEnabled" != "b true" ]]; then 7bbb5e3beSAdriana Kobylak return 0 8bbb5e3beSAdriana Kobylak fi 9bbb5e3beSAdriana Kobylak 10bbb5e3beSAdriana Kobylak PNOR_TOC_FILE="pnor.toc" 11bbb5e3beSAdriana Kobylak PNOR_RO_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/ro/" 12bbb5e3beSAdriana Kobylak PNOR_RW_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/rw/" 13bbb5e3beSAdriana Kobylak PNOR_PRSV_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/prsv/" 14bbb5e3beSAdriana Kobylak 15bbb5e3beSAdriana Kobylak # toc partition string format: 16bbb5e3beSAdriana Kobylak # partition27=HB_VOLATILE,0x02ba9000,0x02bae000,00,ECC,VOLATILE,READWRITE 17bbb5e3beSAdriana Kobylak tocFilePath="${PNOR_RO_ACTIVE_PATH}${PNOR_TOC_FILE}" 184e82bc84SAdriana Kobylak if [ ! -f "${tocFilePath}" ]; then 194e82bc84SAdriana Kobylak tocFilePath="${PNOR_RW_ACTIVE_PATH}${PNOR_TOC_FILE}" 204e82bc84SAdriana Kobylak fi 21fc886cabSAdriana Kobylak mapfile -t volatiles < <(grep VOLATILE "${tocFilePath}" | grep -Eo '^partition([0-9]+)=([A-Za-z0-9_]+)') 22bbb5e3beSAdriana Kobylak for (( index=0; index<${#volatiles[@]}; index++ )); do 23fc886cabSAdriana Kobylak volatileName="$(echo "${volatiles[${index}]}" | awk -F '=' '{print $2}')" 24bbb5e3beSAdriana Kobylak 25bbb5e3beSAdriana Kobylak rwVolatile="${PNOR_RW_ACTIVE_PATH}${volatileName}" 26*837b0942SAdriana Kobylak 27*837b0942SAdriana Kobylak if [ ! -f "${PNOR_RO_ACTIVE_PATH}${volatileName}" ]; then 28*837b0942SAdriana Kobylak echo "Clear ${volatileName} lid 81e0066f.lid" 29*837b0942SAdriana Kobylak cp -a "${PNOR_RO_ACTIVE_PATH}81e0066f.lid" "${PNOR_PRSV_ACTIVE_PATH}" 30*837b0942SAdriana Kobylak else 31bbb5e3beSAdriana Kobylak if [ -f "${rwVolatile}" ]; then 32bbb5e3beSAdriana Kobylak echo "Clear $rwVolatile" 33bbb5e3beSAdriana Kobylak rm "${rwVolatile}" 34bbb5e3beSAdriana Kobylak fi 35bbb5e3beSAdriana Kobylak prsvVolatile="${PNOR_PRSV_ACTIVE_PATH}${volatileName}" 36bbb5e3beSAdriana Kobylak if [ -f "${prsvVolatile}" ]; then 37bbb5e3beSAdriana Kobylak echo "Clear $prsvVolatile" 38bbb5e3beSAdriana Kobylak rm "${prsvVolatile}" 39bbb5e3beSAdriana Kobylak fi 404e82bc84SAdriana Kobylak fi 41bbb5e3beSAdriana Kobylak done 42bbb5e3beSAdriana Kobylak # Always reset the sensor after clearing 43fc886cabSAdriana Kobylak busctl set-property "$service" /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled b false 44bbb5e3beSAdriana Kobylak} 45bbb5e3beSAdriana Kobylak 4615513dbbSPatrick Williamsfunction update_symlinks() { 47f3dfe65dSAdriana Kobylak PNOR_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/" 480e0a3b1aSAdriana Kobylak HOSTFW_ACTIVE_PATH="/var/lib/phosphor-software-manager/hostfw/" 49f3dfe65dSAdriana Kobylak PNOR_RO_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/ro" 50f3dfe65dSAdriana Kobylak PNOR_RO_PREFIX="/media/pnor-ro-" 51f3dfe65dSAdriana Kobylak PNOR_RW_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/rw" 52f3dfe65dSAdriana Kobylak PNOR_RW_PREFIX="/media/pnor-rw-" 53f3dfe65dSAdriana Kobylak PNOR_PRSV_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/prsv" 54f3dfe65dSAdriana Kobylak PNOR_PRSV="/media/pnor-prsv" 55f3dfe65dSAdriana Kobylak PERSISTENCE_PATH="/var/lib/obmc/openpower-pnor-code-mgmt/" 56f3dfe65dSAdriana Kobylak PNOR_PATCH_LOCATION="/usr/local/share/pnor/" 570e0a3b1aSAdriana Kobylak MMC_BASE_PATH="/media/hostfw" 5898f22326SAdriana Kobylak MMC_RO_PATH="${MMC_BASE_PATH}/running-ro" 590e0a3b1aSAdriana Kobylak MMC_RUNNING_PATH="${MMC_BASE_PATH}/running" 600e0a3b1aSAdriana Kobylak MMC_ALTERNATE_PATH="${MMC_BASE_PATH}/alternate" 6187372ae1SAdriana Kobylak MMC_STAGING_PATH="${MMC_BASE_PATH}/staging" 628652eb9bSAdriana Kobylak MMC_NVRAM_PATH="${MMC_BASE_PATH}/nvram" 630e0a3b1aSAdriana Kobylak HOSTFW_RUNNING_PATH="${HOSTFW_ACTIVE_PATH}/running" 640e0a3b1aSAdriana Kobylak HOSTFW_ALTERNATE_PATH="${HOSTFW_ACTIVE_PATH}/alternate" 6587372ae1SAdriana Kobylak HOSTFW_STAGING_PATH="${HOSTFW_ACTIVE_PATH}/staging" 668652eb9bSAdriana Kobylak HOSTFW_NVRAM_PATH="${HOSTFW_ACTIVE_PATH}/nvram" 67f3dfe65dSAdriana Kobylak 68f3dfe65dSAdriana Kobylak # Get a list of all active PNOR versions 690e0a3b1aSAdriana Kobylak data="$(ls -d ${PNOR_RO_PREFIX}* 2>/dev/null)" 70fc886cabSAdriana Kobylak mapfile -t array <<< "${data}" 71f3dfe65dSAdriana Kobylak 72f3dfe65dSAdriana Kobylak currentVersion="" 73f3dfe65dSAdriana Kobylak lowestPriority=255 74fc886cabSAdriana Kobylak for element in "${array[@]}"; do 75f3dfe65dSAdriana Kobylak #Remove the PNOR_RO_PREFIX from the path to get version ID. 76095b1a02SAdriana Kobylak versionId="${element#"${PNOR_RO_PREFIX}"}" 77f3dfe65dSAdriana Kobylak 78f3dfe65dSAdriana Kobylak # Get the priority of active versions from persistence files. 79f3dfe65dSAdriana Kobylak if [[ -f "${PERSISTENCE_PATH}${versionId}" ]]; then 80fc886cabSAdriana Kobylak data="$(grep -r "priority" "${PERSISTENCE_PATH}${versionId}")" 81f3dfe65dSAdriana Kobylak priority="${data: -1}" 82f3dfe65dSAdriana Kobylak if [[ priority -le lowestPriority ]]; then 83f3dfe65dSAdriana Kobylak lowestPriority=${priority} 84f3dfe65dSAdriana Kobylak currentVersion=${versionId} 85f3dfe65dSAdriana Kobylak fi 86f3dfe65dSAdriana Kobylak fi 87f3dfe65dSAdriana Kobylak done 88f3dfe65dSAdriana Kobylak 89fc886cabSAdriana Kobylak if [ -n "$currentVersion" ]; then 900e0a3b1aSAdriana Kobylak # Use active version 910e0a3b1aSAdriana Kobylak roTarget="${PNOR_RO_PREFIX}${currentVersion}" 920e0a3b1aSAdriana Kobylak rwTarget="${PNOR_RW_PREFIX}${currentVersion}" 930e0a3b1aSAdriana Kobylak prsvTarget="${PNOR_PRSV}" 940e0a3b1aSAdriana Kobylak elif [ -d "${MMC_BASE_PATH}" ]; then 950e0a3b1aSAdriana Kobylak # Use eMMC 9698f22326SAdriana Kobylak roTarget="${MMC_RO_PATH}" 970e0a3b1aSAdriana Kobylak rwTarget="${MMC_RUNNING_PATH}" 980e0a3b1aSAdriana Kobylak prsvTarget="${MMC_RUNNING_PATH}" 990e0a3b1aSAdriana Kobylak 1000e0a3b1aSAdriana Kobylak if [ ! -d "${HOSTFW_ACTIVE_PATH}" ]; then 1010e0a3b1aSAdriana Kobylak mkdir -p "${HOSTFW_ACTIVE_PATH}" 1020e0a3b1aSAdriana Kobylak fi 10398f22326SAdriana Kobylak # Symlinks used by PLDM 104fc886cabSAdriana Kobylak if [[ $(readlink -f "${HOSTFW_RUNNING_PATH}") != "${MMC_RUNNING_PATH}" ]]; then 1050e0a3b1aSAdriana Kobylak rm -f ${HOSTFW_RUNNING_PATH} 1060e0a3b1aSAdriana Kobylak ln -sfv ${MMC_RUNNING_PATH} ${HOSTFW_RUNNING_PATH} 1070e0a3b1aSAdriana Kobylak fi 108fc886cabSAdriana Kobylak if [[ $(readlink -f "${HOSTFW_ALTERNATE_PATH}") != "${MMC_ALTERNATE_PATH}" ]]; then 1090e0a3b1aSAdriana Kobylak rm -f ${HOSTFW_ALTERNATE_PATH} 1100e0a3b1aSAdriana Kobylak ln -sfv ${MMC_ALTERNATE_PATH} ${HOSTFW_ALTERNATE_PATH} 1110e0a3b1aSAdriana Kobylak fi 112fc886cabSAdriana Kobylak if [[ $(readlink -f "${HOSTFW_STAGING_PATH}") != "${MMC_STAGING_PATH}" ]]; then 11387372ae1SAdriana Kobylak rm -f ${HOSTFW_STAGING_PATH} 11487372ae1SAdriana Kobylak ln -sfv ${MMC_STAGING_PATH} ${HOSTFW_STAGING_PATH} 11587372ae1SAdriana Kobylak fi 1168652eb9bSAdriana Kobylak if [[ $(readlink -f "${HOSTFW_NVRAM_PATH}") != "${MMC_NVRAM_PATH}" ]]; then 1178652eb9bSAdriana Kobylak rm -f ${HOSTFW_NVRAM_PATH} 1188652eb9bSAdriana Kobylak ln -sfv ${MMC_NVRAM_PATH} ${HOSTFW_NVRAM_PATH} 1198652eb9bSAdriana Kobylak fi 120f3dfe65dSAdriana Kobylak fi 121f3dfe65dSAdriana Kobylak 122f3dfe65dSAdriana Kobylak if [ ! -d "${PNOR_ACTIVE_PATH}" ]; then 123f3dfe65dSAdriana Kobylak mkdir -p "${PNOR_ACTIVE_PATH}" 124f3dfe65dSAdriana Kobylak fi 125f3dfe65dSAdriana Kobylak 126f3dfe65dSAdriana Kobylak # If the RW or RO active links doesn't point to the version with 127f3dfe65dSAdriana Kobylak # lowest priority, then remove the symlink and create new ones. 128fc886cabSAdriana Kobylak if [[ $(readlink -f "${PNOR_RO_ACTIVE_PATH}") != "${roTarget}" ]]; then 129f3dfe65dSAdriana Kobylak rm -f ${PNOR_RO_ACTIVE_PATH} 130f3dfe65dSAdriana Kobylak rm -rf ${PNOR_PATCH_LOCATION}* 131eab7ca8eSAndrew Geissler ln -sfv "${roTarget}" ${PNOR_RO_ACTIVE_PATH} 132f3dfe65dSAdriana Kobylak fi 133f3dfe65dSAdriana Kobylak 134fc886cabSAdriana Kobylak if [[ $(readlink -f "${PNOR_RW_ACTIVE_PATH}") != "${rwTarget}" ]]; then 135f3dfe65dSAdriana Kobylak rm -f ${PNOR_RW_ACTIVE_PATH} 136eab7ca8eSAndrew Geissler ln -sfv "${rwTarget}" ${PNOR_RW_ACTIVE_PATH} 137f3dfe65dSAdriana Kobylak fi 138f3dfe65dSAdriana Kobylak 139fc886cabSAdriana Kobylak if [[ $(readlink -f "${PNOR_PRSV_ACTIVE_PATH}") != "${prsvTarget}" ]]; then 1400e0a3b1aSAdriana Kobylak rm -f ${PNOR_PRSV_ACTIVE_PATH} 141eab7ca8eSAndrew Geissler ln -sfv "${prsvTarget}" ${PNOR_PRSV_ACTIVE_PATH} 142f3dfe65dSAdriana Kobylak fi 143f3dfe65dSAdriana Kobylak} 144f3dfe65dSAdriana Kobylak 145f3dfe65dSAdriana Kobylakcase "$1" in 146bbb5e3beSAdriana Kobylak clearvolatile) 147bbb5e3beSAdriana Kobylak clear_volatile 148bbb5e3beSAdriana Kobylak ;; 149f3dfe65dSAdriana Kobylak updatesymlinks) 150f3dfe65dSAdriana Kobylak update_symlinks 151f3dfe65dSAdriana Kobylak ;; 152f3dfe65dSAdriana Kobylak *) 153f3dfe65dSAdriana Kobylak echo "Invalid argument" 154f3dfe65dSAdriana Kobylak exit 1 155f3dfe65dSAdriana Kobylak ;; 156f3dfe65dSAdriana Kobylakesac 157f3dfe65dSAdriana Kobylakrc=$? 158f3dfe65dSAdriana Kobylakif [ ${rc} -ne 0 ]; then 159f3dfe65dSAdriana Kobylak echo "$0: error ${rc}" 160f3dfe65dSAdriana Kobylak exit ${rc} 161f3dfe65dSAdriana Kobylakfi 162