blob: e5decfc2c969df7bb309d14adaf92dea22cba4c5 [file] [log] [blame]
Adriana Kobylakfc886ca2021-04-26 16:07:21 +00001#!/bin/bash
Adriana Kobylakf3dfe652019-10-08 11:35:55 -05002
Patrick Williams15513db2022-12-08 06:23:24 -06003function clear_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
Adriana Kobylakbbb5e3b2020-06-19 10:22:13 -05008 fi
Adriana Kobylak4e82bc82021-09-28 19:25:39 +00009
Patrick Williams15513db2022-12-08 06:23:24 -060010 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}"
Adriana Kobylak4e82bc82021-09-28 19:25:39 +000020 fi
Patrick Williams15513db2022-12-08 06:23:24 -060021 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}"
Patrick Williams15513db2022-12-08 06:23:24 -060026
27 if [ ! -f "${PNOR_RO_ACTIVE_PATH}${volatileName}" ]; then
Adriana Kobylak837b0942025-01-15 13:13:20 -060028 echo "Clear ${volatileName} lid 81e0066f.lid"
Patrick Williams15513db2022-12-08 06:23:24 -060029 cp -a "${PNOR_RO_ACTIVE_PATH}81e0066f.lid" "${PNOR_PRSV_ACTIVE_PATH}"
Adriana Kobylak837b0942025-01-15 13:13:20 -060030 else
31 if [ -f "${rwVolatile}" ]; then
32 echo "Clear $rwVolatile"
33 rm "${rwVolatile}"
34 fi
35 prsvVolatile="${PNOR_PRSV_ACTIVE_PATH}${volatileName}"
36 if [ -f "${prsvVolatile}" ]; then
37 echo "Clear $prsvVolatile"
38 rm "${prsvVolatile}"
39 fi
Patrick Williams15513db2022-12-08 06:23:24 -060040 fi
41 done
42 # Always reset the sensor after clearing
43 busctl set-property "$service" /org/open_power/control/volatile xyz.openbmc_project.Object.Enable Enabled b false
Adriana Kobylakbbb5e3b2020-06-19 10:22:13 -050044}
45
Patrick Williams15513db2022-12-08 06:23:24 -060046function update_symlinks() {
47 PNOR_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/"
48 HOSTFW_ACTIVE_PATH="/var/lib/phosphor-software-manager/hostfw/"
49 PNOR_RO_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/ro"
50 PNOR_RO_PREFIX="/media/pnor-ro-"
51 PNOR_RW_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/rw"
52 PNOR_RW_PREFIX="/media/pnor-rw-"
53 PNOR_PRSV_ACTIVE_PATH="/var/lib/phosphor-software-manager/pnor/prsv"
54 PNOR_PRSV="/media/pnor-prsv"
55 PERSISTENCE_PATH="/var/lib/obmc/openpower-pnor-code-mgmt/"
56 PNOR_PATCH_LOCATION="/usr/local/share/pnor/"
57 MMC_BASE_PATH="/media/hostfw"
58 MMC_RO_PATH="${MMC_BASE_PATH}/running-ro"
59 MMC_RUNNING_PATH="${MMC_BASE_PATH}/running"
60 MMC_ALTERNATE_PATH="${MMC_BASE_PATH}/alternate"
61 MMC_STAGING_PATH="${MMC_BASE_PATH}/staging"
62 MMC_NVRAM_PATH="${MMC_BASE_PATH}/nvram"
63 HOSTFW_RUNNING_PATH="${HOSTFW_ACTIVE_PATH}/running"
64 HOSTFW_ALTERNATE_PATH="${HOSTFW_ACTIVE_PATH}/alternate"
65 HOSTFW_STAGING_PATH="${HOSTFW_ACTIVE_PATH}/staging"
66 HOSTFW_NVRAM_PATH="${HOSTFW_ACTIVE_PATH}/nvram"
Adriana Kobylakf3dfe652019-10-08 11:35:55 -050067
Patrick Williams15513db2022-12-08 06:23:24 -060068 # Get a list of all active PNOR versions
69 data="$(ls -d ${PNOR_RO_PREFIX}* 2>/dev/null)"
70 mapfile -t array <<< "${data}"
Adriana Kobylakf3dfe652019-10-08 11:35:55 -050071
Patrick Williams15513db2022-12-08 06:23:24 -060072 currentVersion=""
73 lowestPriority=255
74 for element in "${array[@]}"; do
75 #Remove the PNOR_RO_PREFIX from the path to get version ID.
76 versionId="${element#"${PNOR_RO_PREFIX}"}"
Adriana Kobylakf3dfe652019-10-08 11:35:55 -050077
Patrick Williams15513db2022-12-08 06:23:24 -060078 # Get the priority of active versions from persistence files.
79 if [[ -f "${PERSISTENCE_PATH}${versionId}" ]]; then
80 data="$(grep -r "priority" "${PERSISTENCE_PATH}${versionId}")"
81 priority="${data: -1}"
82 if [[ priority -le lowestPriority ]]; then
83 lowestPriority=${priority}
84 currentVersion=${versionId}
85 fi
86 fi
87 done
88
89 if [ -n "$currentVersion" ]; then
90 # Use active version
91 roTarget="${PNOR_RO_PREFIX}${currentVersion}"
92 rwTarget="${PNOR_RW_PREFIX}${currentVersion}"
93 prsvTarget="${PNOR_PRSV}"
94 elif [ -d "${MMC_BASE_PATH}" ]; then
95 # Use eMMC
96 roTarget="${MMC_RO_PATH}"
97 rwTarget="${MMC_RUNNING_PATH}"
98 prsvTarget="${MMC_RUNNING_PATH}"
99
100 if [ ! -d "${HOSTFW_ACTIVE_PATH}" ]; then
101 mkdir -p "${HOSTFW_ACTIVE_PATH}"
102 fi
103 # Symlinks used by PLDM
104 if [[ $(readlink -f "${HOSTFW_RUNNING_PATH}") != "${MMC_RUNNING_PATH}" ]]; then
105 rm -f ${HOSTFW_RUNNING_PATH}
106 ln -sfv ${MMC_RUNNING_PATH} ${HOSTFW_RUNNING_PATH}
107 fi
108 if [[ $(readlink -f "${HOSTFW_ALTERNATE_PATH}") != "${MMC_ALTERNATE_PATH}" ]]; then
109 rm -f ${HOSTFW_ALTERNATE_PATH}
110 ln -sfv ${MMC_ALTERNATE_PATH} ${HOSTFW_ALTERNATE_PATH}
111 fi
112 if [[ $(readlink -f "${HOSTFW_STAGING_PATH}") != "${MMC_STAGING_PATH}" ]]; then
113 rm -f ${HOSTFW_STAGING_PATH}
114 ln -sfv ${MMC_STAGING_PATH} ${HOSTFW_STAGING_PATH}
115 fi
116 if [[ $(readlink -f "${HOSTFW_NVRAM_PATH}") != "${MMC_NVRAM_PATH}" ]]; then
117 rm -f ${HOSTFW_NVRAM_PATH}
118 ln -sfv ${MMC_NVRAM_PATH} ${HOSTFW_NVRAM_PATH}
119 fi
Adriana Kobylakf3dfe652019-10-08 11:35:55 -0500120 fi
Adriana Kobylakf3dfe652019-10-08 11:35:55 -0500121
Patrick Williams15513db2022-12-08 06:23:24 -0600122 if [ ! -d "${PNOR_ACTIVE_PATH}" ]; then
Adriana Kobylakf3dfe652019-10-08 11:35:55 -0500123 mkdir -p "${PNOR_ACTIVE_PATH}"
Patrick Williams15513db2022-12-08 06:23:24 -0600124 fi
Adriana Kobylakf3dfe652019-10-08 11:35:55 -0500125
Patrick Williams15513db2022-12-08 06:23:24 -0600126 # If the RW or RO active links doesn't point to the version with
127 # lowest priority, then remove the symlink and create new ones.
128 if [[ $(readlink -f "${PNOR_RO_ACTIVE_PATH}") != "${roTarget}" ]]; then
129 rm -f ${PNOR_RO_ACTIVE_PATH}
130 rm -rf ${PNOR_PATCH_LOCATION}*
Andrew Geisslereab7ca82023-05-09 08:24:32 -0500131 ln -sfv "${roTarget}" ${PNOR_RO_ACTIVE_PATH}
Patrick Williams15513db2022-12-08 06:23:24 -0600132 fi
Adriana Kobylakf3dfe652019-10-08 11:35:55 -0500133
Patrick Williams15513db2022-12-08 06:23:24 -0600134 if [[ $(readlink -f "${PNOR_RW_ACTIVE_PATH}") != "${rwTarget}" ]]; then
135 rm -f ${PNOR_RW_ACTIVE_PATH}
Andrew Geisslereab7ca82023-05-09 08:24:32 -0500136 ln -sfv "${rwTarget}" ${PNOR_RW_ACTIVE_PATH}
Patrick Williams15513db2022-12-08 06:23:24 -0600137 fi
Adriana Kobylakf3dfe652019-10-08 11:35:55 -0500138
Patrick Williams15513db2022-12-08 06:23:24 -0600139 if [[ $(readlink -f "${PNOR_PRSV_ACTIVE_PATH}") != "${prsvTarget}" ]]; then
140 rm -f ${PNOR_PRSV_ACTIVE_PATH}
Andrew Geisslereab7ca82023-05-09 08:24:32 -0500141 ln -sfv "${prsvTarget}" ${PNOR_PRSV_ACTIVE_PATH}
Patrick Williams15513db2022-12-08 06:23:24 -0600142 fi
Adriana Kobylakf3dfe652019-10-08 11:35:55 -0500143}
144
145case "$1" in
Patrick Williams15513db2022-12-08 06:23:24 -0600146 clearvolatile)
147 clear_volatile
148 ;;
149 updatesymlinks)
150 update_symlinks
151 ;;
152 *)
153 echo "Invalid argument"
154 exit 1
155 ;;
Adriana Kobylakf3dfe652019-10-08 11:35:55 -0500156esac
157rc=$?
158if [ ${rc} -ne 0 ]; then
Patrick Williams15513db2022-12-08 06:23:24 -0600159 echo "$0: error ${rc}"
160 exit ${rc}
Adriana Kobylakf3dfe652019-10-08 11:35:55 -0500161fi