blob: 54ba59018cd3f5b8bf92dad431a8b70ed773d615 [file] [log] [blame]
Adriana Kobylakfc886ca2021-04-26 16:07:21 +00001#!/bin/bash
Adriana Kobylakf3dfe652019-10-08 11:35:55 -05002
Adriana Kobylakbbb5e3b2020-06-19 10:22:13 -05003clear_volatile() {
4 service=$(mapper get-service /org/open_power/control/volatile)
Adriana Kobylakfc886ca2021-04-26 16:07:21 +00005 clearVolatileEnabled=$(busctl get-property "$service" /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled)
Adriana Kobylakbbb5e3b2020-06-19 10:22:13 -05006 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}"
Adriana Kobylak4e82bc82021-09-28 19:25:39 +000018 if [ ! -f "${tocFilePath}" ]; then
19 tocFilePath="${PNOR_RW_ACTIVE_PATH}${PNOR_TOC_FILE}"
20 fi
Adriana Kobylakfc886ca2021-04-26 16:07:21 +000021 mapfile -t volatiles < <(grep VOLATILE "${tocFilePath}" | grep -Eo '^partition([0-9]+)=([A-Za-z0-9_]+)')
Adriana Kobylakbbb5e3b2020-06-19 10:22:13 -050022 for (( index=0; index<${#volatiles[@]}; index++ )); do
Adriana Kobylakfc886ca2021-04-26 16:07:21 +000023 volatileName="$(echo "${volatiles[${index}]}" | awk -F '=' '{print $2}')"
Adriana Kobylakbbb5e3b2020-06-19 10:22:13 -050024
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
Adriana Kobylak4e82bc82021-09-28 19:25:39 +000035
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
Adriana Kobylakbbb5e3b2020-06-19 10:22:13 -050040 done
41 # Always reset the sensor after clearing
Adriana Kobylakfc886ca2021-04-26 16:07:21 +000042 busctl set-property "$service" /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled b false
Adriana Kobylakbbb5e3b2020-06-19 10:22:13 -050043}
44
Adriana Kobylakf3dfe652019-10-08 11:35:55 -050045update_symlinks() {
46 PNOR_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/"
Adriana Kobylak0e0a3b12020-07-15 16:47:03 -050047 HOSTFW_ACTIVE_PATH="/var/lib/phosphor-software-manager/hostfw/"
Adriana Kobylakf3dfe652019-10-08 11:35:55 -050048 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/"
Adriana Kobylak0e0a3b12020-07-15 16:47:03 -050056 MMC_BASE_PATH="/media/hostfw"
Adriana Kobylak98f22322020-07-20 10:39:41 -050057 MMC_RO_PATH="${MMC_BASE_PATH}/running-ro"
Adriana Kobylak0e0a3b12020-07-15 16:47:03 -050058 MMC_RUNNING_PATH="${MMC_BASE_PATH}/running"
59 MMC_ALTERNATE_PATH="${MMC_BASE_PATH}/alternate"
Adriana Kobylak87372ae2020-09-01 11:30:59 -050060 MMC_STAGING_PATH="${MMC_BASE_PATH}/staging"
Adriana Kobylak8652eb92022-05-20 14:35:35 +000061 MMC_NVRAM_PATH="${MMC_BASE_PATH}/nvram"
Adriana Kobylak0e0a3b12020-07-15 16:47:03 -050062 HOSTFW_RUNNING_PATH="${HOSTFW_ACTIVE_PATH}/running"
63 HOSTFW_ALTERNATE_PATH="${HOSTFW_ACTIVE_PATH}/alternate"
Adriana Kobylak87372ae2020-09-01 11:30:59 -050064 HOSTFW_STAGING_PATH="${HOSTFW_ACTIVE_PATH}/staging"
Adriana Kobylak8652eb92022-05-20 14:35:35 +000065 HOSTFW_NVRAM_PATH="${HOSTFW_ACTIVE_PATH}/nvram"
Adriana Kobylakf3dfe652019-10-08 11:35:55 -050066
67 # Get a list of all active PNOR versions
Adriana Kobylak0e0a3b12020-07-15 16:47:03 -050068 data="$(ls -d ${PNOR_RO_PREFIX}* 2>/dev/null)"
Adriana Kobylakfc886ca2021-04-26 16:07:21 +000069 mapfile -t array <<< "${data}"
Adriana Kobylakf3dfe652019-10-08 11:35:55 -050070
71 currentVersion=""
72 lowestPriority=255
Adriana Kobylakfc886ca2021-04-26 16:07:21 +000073 for element in "${array[@]}"; do
Adriana Kobylakf3dfe652019-10-08 11:35:55 -050074 #Remove the PNOR_RO_PREFIX from the path to get version ID.
Adriana Kobylak095b1a02022-05-23 20:44:59 +000075 versionId="${element#"${PNOR_RO_PREFIX}"}"
Adriana Kobylakf3dfe652019-10-08 11:35:55 -050076
77 # Get the priority of active versions from persistence files.
78 if [[ -f "${PERSISTENCE_PATH}${versionId}" ]]; then
Adriana Kobylakfc886ca2021-04-26 16:07:21 +000079 data="$(grep -r "priority" "${PERSISTENCE_PATH}${versionId}")"
Adriana Kobylakf3dfe652019-10-08 11:35:55 -050080 priority="${data: -1}"
Adriana Kobylakfc886ca2021-04-26 16:07:21 +000081 if [[ priority -le lowestPriority ]]; then
Adriana Kobylakf3dfe652019-10-08 11:35:55 -050082 lowestPriority=${priority}
83 currentVersion=${versionId}
84 fi
85 fi
86 done
87
Adriana Kobylakfc886ca2021-04-26 16:07:21 +000088 if [ -n "$currentVersion" ]; then
Adriana Kobylak0e0a3b12020-07-15 16:47:03 -050089 # Use active version
90 roTarget="${PNOR_RO_PREFIX}${currentVersion}"
91 rwTarget="${PNOR_RW_PREFIX}${currentVersion}"
92 prsvTarget="${PNOR_PRSV}"
93 elif [ -d "${MMC_BASE_PATH}" ]; then
94 # Use eMMC
Adriana Kobylak98f22322020-07-20 10:39:41 -050095 roTarget="${MMC_RO_PATH}"
Adriana Kobylak0e0a3b12020-07-15 16:47:03 -050096 rwTarget="${MMC_RUNNING_PATH}"
97 prsvTarget="${MMC_RUNNING_PATH}"
98
99 if [ ! -d "${HOSTFW_ACTIVE_PATH}" ]; then
100 mkdir -p "${HOSTFW_ACTIVE_PATH}"
101 fi
Adriana Kobylak98f22322020-07-20 10:39:41 -0500102 # Symlinks used by PLDM
Adriana Kobylakfc886ca2021-04-26 16:07:21 +0000103 if [[ $(readlink -f "${HOSTFW_RUNNING_PATH}") != "${MMC_RUNNING_PATH}" ]]; then
Adriana Kobylak0e0a3b12020-07-15 16:47:03 -0500104 rm -f ${HOSTFW_RUNNING_PATH}
105 ln -sfv ${MMC_RUNNING_PATH} ${HOSTFW_RUNNING_PATH}
106 fi
Adriana Kobylakfc886ca2021-04-26 16:07:21 +0000107 if [[ $(readlink -f "${HOSTFW_ALTERNATE_PATH}") != "${MMC_ALTERNATE_PATH}" ]]; then
Adriana Kobylak0e0a3b12020-07-15 16:47:03 -0500108 rm -f ${HOSTFW_ALTERNATE_PATH}
109 ln -sfv ${MMC_ALTERNATE_PATH} ${HOSTFW_ALTERNATE_PATH}
110 fi
Adriana Kobylakfc886ca2021-04-26 16:07:21 +0000111 if [[ $(readlink -f "${HOSTFW_STAGING_PATH}") != "${MMC_STAGING_PATH}" ]]; then
Adriana Kobylak87372ae2020-09-01 11:30:59 -0500112 rm -f ${HOSTFW_STAGING_PATH}
113 ln -sfv ${MMC_STAGING_PATH} ${HOSTFW_STAGING_PATH}
114 fi
Adriana Kobylak8652eb92022-05-20 14:35:35 +0000115 if [[ $(readlink -f "${HOSTFW_NVRAM_PATH}") != "${MMC_NVRAM_PATH}" ]]; then
116 rm -f ${HOSTFW_NVRAM_PATH}
117 ln -sfv ${MMC_NVRAM_PATH} ${HOSTFW_NVRAM_PATH}
118 fi
Adriana Kobylakf3dfe652019-10-08 11:35:55 -0500119 fi
120
121 if [ ! -d "${PNOR_ACTIVE_PATH}" ]; then
122 mkdir -p "${PNOR_ACTIVE_PATH}"
123 fi
124
125 # If the RW or RO active links doesn't point to the version with
126 # lowest priority, then remove the symlink and create new ones.
Adriana Kobylakfc886ca2021-04-26 16:07:21 +0000127 if [[ $(readlink -f "${PNOR_RO_ACTIVE_PATH}") != "${roTarget}" ]]; then
Adriana Kobylakf3dfe652019-10-08 11:35:55 -0500128 rm -f ${PNOR_RO_ACTIVE_PATH}
129 rm -rf ${PNOR_PATCH_LOCATION}*
Adriana Kobylak0e0a3b12020-07-15 16:47:03 -0500130 ln -sfv ${roTarget} ${PNOR_RO_ACTIVE_PATH}
Adriana Kobylakf3dfe652019-10-08 11:35:55 -0500131 fi
132
Adriana Kobylakfc886ca2021-04-26 16:07:21 +0000133 if [[ $(readlink -f "${PNOR_RW_ACTIVE_PATH}") != "${rwTarget}" ]]; then
Adriana Kobylakf3dfe652019-10-08 11:35:55 -0500134 rm -f ${PNOR_RW_ACTIVE_PATH}
Adriana Kobylak0e0a3b12020-07-15 16:47:03 -0500135 ln -sfv ${rwTarget} ${PNOR_RW_ACTIVE_PATH}
Adriana Kobylakf3dfe652019-10-08 11:35:55 -0500136 fi
137
Adriana Kobylakfc886ca2021-04-26 16:07:21 +0000138 if [[ $(readlink -f "${PNOR_PRSV_ACTIVE_PATH}") != "${prsvTarget}" ]]; then
Adriana Kobylak0e0a3b12020-07-15 16:47:03 -0500139 rm -f ${PNOR_PRSV_ACTIVE_PATH}
140 ln -sfv ${prsvTarget} ${PNOR_PRSV_ACTIVE_PATH}
Adriana Kobylakf3dfe652019-10-08 11:35:55 -0500141 fi
142}
143
144case "$1" in
Adriana Kobylakbbb5e3b2020-06-19 10:22:13 -0500145 clearvolatile)
146 clear_volatile
147 ;;
Adriana Kobylakf3dfe652019-10-08 11:35:55 -0500148 updatesymlinks)
149 update_symlinks
150 ;;
151 *)
152 echo "Invalid argument"
153 exit 1
154 ;;
155esac
156rc=$?
157if [ ${rc} -ne 0 ]; then
158 echo "$0: error ${rc}"
159 exit ${rc}
160fi