xref: /openbmc/openpower-pnor-code-mgmt/vpnor/obmc-vpnor-util (revision 837b09428d86a80fcae589b81c2fc7b00dd36484)
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