xref: /openbmc/openpower-pnor-code-mgmt/ubi/obmc-flash-bios (revision 15513dbbabd921552276338b02d300139b6f687f)
1bee8ffdfSAdriana Kobylak#!/bin/bash
210e915abSAdriana Kobylak
310e915abSAdriana Kobylak# Get the mtd device number (mtdX)
4*15513dbbSPatrick Williamsfunction findmtd() {
510e915abSAdriana Kobylak    m="$(grep -xl "$1" /sys/class/mtd/*/name)"
610e915abSAdriana Kobylak    m="${m%/name}"
710e915abSAdriana Kobylak    m="${m##*/}"
810e915abSAdriana Kobylak    echo "${m}"
910e915abSAdriana Kobylak}
1010e915abSAdriana Kobylak
1110e915abSAdriana Kobylak# Get the ubi device number (ubiX_Y)
12*15513dbbSPatrick Williamsfunction findubi() {
1310e915abSAdriana Kobylak    u="$(grep -xl "$1" /sys/class/ubi/ubi?/subsystem/ubi*/name)"
1410e915abSAdriana Kobylak    u="${u%/name}"
1510e915abSAdriana Kobylak    u="${u##*/}"
1610e915abSAdriana Kobylak    echo "${u}"
1710e915abSAdriana Kobylak}
1810e915abSAdriana Kobylak
1910e915abSAdriana Kobylak# Get the mount information
20*15513dbbSPatrick Williamsfunction is_mounted() {
2110e915abSAdriana Kobylak    grep -q "$1" /proc/mounts
2210e915abSAdriana Kobylak    return $?
2310e915abSAdriana Kobylak}
2410e915abSAdriana Kobylak
2510e915abSAdriana Kobylak# Attach the pnor mtd device to ubi.
26*15513dbbSPatrick Williamsfunction attach_ubi() {
2710e915abSAdriana Kobylak    pnormtd="$(findmtd pnor)"
2810e915abSAdriana Kobylak    pnor="${pnormtd#mtd}"
2910e915abSAdriana Kobylak    pnordev="/dev/mtd${pnor}"
3010e915abSAdriana Kobylak
3110e915abSAdriana Kobylak    if [ -d "/sys/class/ubi/ubi${pnor}" ]; then
3210e915abSAdriana Kobylak        # Already attached
3310e915abSAdriana Kobylak        return 0
3410e915abSAdriana Kobylak    fi
3510e915abSAdriana Kobylak
3610e915abSAdriana Kobylak    ubiattach /dev/ubi_ctrl -m "${pnor}" -d "${pnor}"
3710e915abSAdriana Kobylak    rc=$?
3810e915abSAdriana Kobylak    if [ ${rc} -ne 0 ]; then
3910e915abSAdriana Kobylak        # Check the pnor mtd device is formatted as ubi by reading the first 3 byes,
4010e915abSAdriana Kobylak        # which should be the ascii chars 'UBI'
41bee8ffdfSAdriana Kobylak        magic="$(hexdump -C -n 3 "${pnordev}")"
4210e915abSAdriana Kobylak        if [[ "${magic}" =~ "UBI" ]]; then
4310e915abSAdriana Kobylak            # Device already formatted as ubi, ubiattach failed for some other reason
4410e915abSAdriana Kobylak            return ${rc}
4510e915abSAdriana Kobylak        else
4610e915abSAdriana Kobylak            # Format device as ubi
4710e915abSAdriana Kobylak            echo "Starting ubiformat ${pnordev}"
4810e915abSAdriana Kobylak            ubiformat "${pnordev}" -y -q
4910e915abSAdriana Kobylak            # Retry the ubiattach
5010e915abSAdriana Kobylak            ubiattach /dev/ubi_ctrl -m "${pnor}" -d "${pnor}"
5110e915abSAdriana Kobylak        fi
5210e915abSAdriana Kobylak    fi
5310e915abSAdriana Kobylak}
5410e915abSAdriana Kobylak
55*15513dbbSPatrick Williamsfunction mount_squashfs() {
5610e915abSAdriana Kobylak    pnormtd="$(findmtd pnor)"
5710e915abSAdriana Kobylak    ubidev="/dev/ubi${pnormtd#mtd}"
5810e915abSAdriana Kobylak    mountdir="/media/${name}"
5910e915abSAdriana Kobylak    vol="$(findubi "${name}")"
6010e915abSAdriana Kobylak    img="/tmp/images/${version}/pnor.xz.squashfs"
61bee8ffdfSAdriana Kobylak    # shellcheck disable=SC2012 # ls provides the size in human-readable form
62bee8ffdfSAdriana Kobylak    filesize="$(ls -sh "$img" | awk -F " " '{print $1}')"
6310e915abSAdriana Kobylak
6410e915abSAdriana Kobylak    if is_mounted "${name}"; then
6510e915abSAdriana Kobylak        echo "${name} is already mounted."
6610e915abSAdriana Kobylak        return 0
6710e915abSAdriana Kobylak    fi
6810e915abSAdriana Kobylak
69bee8ffdfSAdriana Kobylak    if [ -n "${vol}" ]; then
7010e915abSAdriana Kobylak        ubirmvol "${ubidev}" -N "${name}"
7110e915abSAdriana Kobylak    fi
7210e915abSAdriana Kobylak
7310e915abSAdriana Kobylak    if [ ! -d "${mountdir}" ]; then
7410e915abSAdriana Kobylak        mkdir "${mountdir}"
7510e915abSAdriana Kobylak    fi
7610e915abSAdriana Kobylak
7710e915abSAdriana Kobylak    # Set size of read-only partition equal to pnor.xz.squashfs
7810e915abSAdriana Kobylak    ubimkvol "${ubidev}" -N "${name}" -s "${filesize}"KiB --type=static
79bee8ffdfSAdriana Kobylak    if ! vol="$(findubi "${name}")"; then
8010e915abSAdriana Kobylak        echo "Unable to create RO volume!"
8110e915abSAdriana Kobylak        return 1
8210e915abSAdriana Kobylak    fi
8310e915abSAdriana Kobylak
8410e915abSAdriana Kobylak    ubidevid="${vol#ubi}"
85bee8ffdfSAdriana Kobylak    if ! ubiupdatevol "/dev/ubi${ubidevid}" "${img}"; then
8610e915abSAdriana Kobylak        echo "Unable to update RO volume!"
8710e915abSAdriana Kobylak        return 1
8810e915abSAdriana Kobylak    fi
8910e915abSAdriana Kobylak
90bee8ffdfSAdriana Kobylak    if ! ubiblock --create "/dev/ubi${ubidevid}"; then
9110e915abSAdriana Kobylak        echo "Unable to create UBI block for RO volume!"
9210e915abSAdriana Kobylak        return 1
9310e915abSAdriana Kobylak    fi
9410e915abSAdriana Kobylak
95bee8ffdfSAdriana Kobylak    if ! mount -t squashfs -o ro "/dev/ubiblock${ubidevid}" "${mountdir}"; then
9610e915abSAdriana Kobylak        echo "Unable to mount RO volume!"
9710e915abSAdriana Kobylak        return 1
9810e915abSAdriana Kobylak    fi
9910e915abSAdriana Kobylak}
10010e915abSAdriana Kobylak
101*15513dbbSPatrick Williamsfunction mount_ubi() {
10210e915abSAdriana Kobylak    pnormtd="$(findmtd pnor)"
10310e915abSAdriana Kobylak    pnor="${pnormtd#mtd}"
10410e915abSAdriana Kobylak    ubidev="/dev/ubi${pnor}"
10510e915abSAdriana Kobylak    pnordev="/dev/mtd${pnor}"
10610e915abSAdriana Kobylak
10710e915abSAdriana Kobylak    if [[ "${name}" == "pnor-patch" ]]; then
10810e915abSAdriana Kobylak        if [[ "$(fw_printenv fieldmode 2>/dev/null)" == "fieldmode=true" ]]; then
10910e915abSAdriana Kobylak            return 0
11010e915abSAdriana Kobylak        fi
111bee8ffdfSAdriana Kobylak        if [[ ! "$(hexdump -C -n 3 "${pnordev}")" =~ "UBI" ]]; then
11210e915abSAdriana Kobylak            return 0
11310e915abSAdriana Kobylak        fi
11410e915abSAdriana Kobylak        mountdir="/usr/local/share/pnor"
11510e915abSAdriana Kobylak    else
11610e915abSAdriana Kobylak        mountdir="/media/${name}"
11710e915abSAdriana Kobylak    fi
11810e915abSAdriana Kobylak
11910e915abSAdriana Kobylak    if [[ "${name}" == "pnor-prsv" ]]; then
12010e915abSAdriana Kobylak        size="2MiB"
12110e915abSAdriana Kobylak    else
12210e915abSAdriana Kobylak        size="16MiB"
12310e915abSAdriana Kobylak    fi
12410e915abSAdriana Kobylak
12510e915abSAdriana Kobylak    if [ ! -d "${mountdir}" ]; then
12610e915abSAdriana Kobylak        mkdir -p "${mountdir}"
12710e915abSAdriana Kobylak    fi
12810e915abSAdriana Kobylak
12910e915abSAdriana Kobylak    vol="$(findubi "${name}")"
13010e915abSAdriana Kobylak    if [ -z "${vol}" ]; then
13110e915abSAdriana Kobylak        ubimkvol "${ubidev}" -N "${name}" -s "${size}"
13210e915abSAdriana Kobylak    fi
13310e915abSAdriana Kobylak
13410e915abSAdriana Kobylak    if ! is_mounted "${name}"; then
13510e915abSAdriana Kobylak        mountdev="ubi${pnor}:${name}"
13610e915abSAdriana Kobylak        mount -t ubifs "${mountdev}" "${mountdir}"
13710e915abSAdriana Kobylak    fi
13810e915abSAdriana Kobylak}
13910e915abSAdriana Kobylak
140*15513dbbSPatrick Williamsfunction umount_ubi() {
14110e915abSAdriana Kobylak    pnormtd="$(findmtd pnor)"
14210e915abSAdriana Kobylak    pnor="${pnormtd#mtd}"
14310e915abSAdriana Kobylak    ubidev="/dev/ubi${pnor}"
14410e915abSAdriana Kobylak    mountdir="/media/${name}"
14510e915abSAdriana Kobylak
14610e915abSAdriana Kobylak    if is_mounted "${name}"; then
14710e915abSAdriana Kobylak        umount "${mountdir}"
14810e915abSAdriana Kobylak    fi
14910e915abSAdriana Kobylak
15010e915abSAdriana Kobylak    vol="$(findubi "${name}")"
15110e915abSAdriana Kobylak    id="${vol##*_}"
15210e915abSAdriana Kobylak    if [ -n "${id}" ]; then
15310e915abSAdriana Kobylak        ubirmvol "${ubidev}" -n "${id}"
15410e915abSAdriana Kobylak    fi
15510e915abSAdriana Kobylak
15610e915abSAdriana Kobylak    if [ -d "${mountdir}" ]; then
15710e915abSAdriana Kobylak        rm -r "${mountdir}"
15810e915abSAdriana Kobylak    fi
15910e915abSAdriana Kobylak}
16010e915abSAdriana Kobylak
161*15513dbbSPatrick Williamsfunction remount_ubi() {
16210e915abSAdriana Kobylak    pnormtd="$(findmtd pnor)"
16310e915abSAdriana Kobylak    pnor="${pnormtd#mtd}"
16410e915abSAdriana Kobylak    pnordev="/dev/mtd${pnor}"
16510e915abSAdriana Kobylak
16610e915abSAdriana Kobylak    # Re-Attach the pnor mtd device to ubi
167bee8ffdfSAdriana Kobylak    if [[ $(hexdump -C -n 3 "${pnordev}") =~ "UBI" ]]; then
16810e915abSAdriana Kobylak        ubiattach /dev/ubi_ctrl -m "${pnor}" -d "${pnor}"
16910e915abSAdriana Kobylak    else
17010e915abSAdriana Kobylak        # Device not formatted as ubi.
17110e915abSAdriana Kobylak        return 0
17210e915abSAdriana Kobylak    fi
17310e915abSAdriana Kobylak
17410e915abSAdriana Kobylak    # Get information on all ubi volumes
175bee8ffdfSAdriana Kobylak    ubinfo=$(ubinfo -d "${pnor}")
17610e915abSAdriana Kobylak    presentVolumes=${ubinfo##*:}
17710e915abSAdriana Kobylak    IFS=', ' read -r -a array <<< "$presentVolumes"
178bee8ffdfSAdriana Kobylak    for element in "${array[@]}";
17910e915abSAdriana Kobylak    do
180bee8ffdfSAdriana Kobylak        elementProperties=$(ubinfo -d "$pnor" -n "$element")
18110e915abSAdriana Kobylak        # Get ubi volume name by getting rid of additional properties
18210e915abSAdriana Kobylak        name=${elementProperties#*Name:}
18310e915abSAdriana Kobylak        name="${name%Character*}"
18410e915abSAdriana Kobylak        name="$(echo -e "${name}" | tr -d '[:space:]')"
18510e915abSAdriana Kobylak
18610e915abSAdriana Kobylak        if [[ ${name} == pnor-prsv ]] || [[ ${name} == pnor-rw* ]] || [[ ${name} == pnor-ro* ]]; then
18710e915abSAdriana Kobylak            mountdir="/media/${name}"
18810e915abSAdriana Kobylak            if [ ! -d "${mountdir}" ]; then
18910e915abSAdriana Kobylak                mkdir -p "${mountdir}"
19010e915abSAdriana Kobylak            fi
19110e915abSAdriana Kobylak
19210e915abSAdriana Kobylak            if [[ ${name} == pnor-ro* ]]
19310e915abSAdriana Kobylak            then
194bee8ffdfSAdriana Kobylak                ubiblock --create "/dev/ubi${pnor}_${element}"
19510e915abSAdriana Kobylak                mount -t squashfs -o ro "/dev/ubiblock${pnor}_${element}" "${mountdir}"
19610e915abSAdriana Kobylak            else
19710e915abSAdriana Kobylak                mount -t ubifs "ubi${pnor}:${name}" "${mountdir}"
19810e915abSAdriana Kobylak            fi
19910e915abSAdriana Kobylak        fi
20010e915abSAdriana Kobylak    done
20110e915abSAdriana Kobylak}
20210e915abSAdriana Kobylak
203*15513dbbSPatrick Williamsfunction ubi_cleanup() {
20410e915abSAdriana Kobylak    # When ubi_cleanup is run, it expects one or no active version.
20510e915abSAdriana Kobylak    activeVersion=$(busctl --list --no-pager tree \
20610e915abSAdriana Kobylak            org.open_power.Software.Host.Updater | \
20710e915abSAdriana Kobylak        grep /xyz/openbmc_project/software/ | tail -c 9)
20810e915abSAdriana Kobylak
20910e915abSAdriana Kobylak    if [[ -z "$activeVersion" ]]; then
21010e915abSAdriana Kobylak        vols=$(ubinfo -a | grep -e "pnor-ro-" -e "pnor-rw-" | cut -c 14-)
211bee8ffdfSAdriana Kobylak        mapfile -t array <<< "${vols}"
21210e915abSAdriana Kobylak    else
21310e915abSAdriana Kobylak        vols=$(ubinfo -a | grep -e "pnor-ro-" -e "pnor-rw-" | \
21410e915abSAdriana Kobylak            grep -v "$activeVersion" | cut -c 14-)
215bee8ffdfSAdriana Kobylak        mapfile -t array <<< "${vols}"
21610e915abSAdriana Kobylak    fi
21710e915abSAdriana Kobylak
218bee8ffdfSAdriana Kobylak    for (( index=0; index<${#array[@]}; index++ )); do
219bee8ffdfSAdriana Kobylak        name=${array[index]}
22010e915abSAdriana Kobylak        umount_ubi
22110e915abSAdriana Kobylak    done
22210e915abSAdriana Kobylak}
22310e915abSAdriana Kobylak
22410e915abSAdriana Kobylakcase "$1" in
22510e915abSAdriana Kobylak    ubiattach)
22610e915abSAdriana Kobylak        attach_ubi
22710e915abSAdriana Kobylak        ;;
22810e915abSAdriana Kobylak    squashfsmount)
22910e915abSAdriana Kobylak        name="$2"
23010e915abSAdriana Kobylak        version="$3"
23110e915abSAdriana Kobylak        mount_squashfs
23210e915abSAdriana Kobylak        ;;
23310e915abSAdriana Kobylak    ubimount)
23410e915abSAdriana Kobylak        name="$2"
23510e915abSAdriana Kobylak        mount_ubi
23610e915abSAdriana Kobylak        ;;
23710e915abSAdriana Kobylak    ubiumount)
23810e915abSAdriana Kobylak        name="$2"
23910e915abSAdriana Kobylak        umount_ubi
24010e915abSAdriana Kobylak        ;;
24110e915abSAdriana Kobylak    ubiremount)
24210e915abSAdriana Kobylak        remount_ubi
24310e915abSAdriana Kobylak        ;;
24410e915abSAdriana Kobylak    ubicleanup)
24510e915abSAdriana Kobylak        ubi_cleanup
24610e915abSAdriana Kobylak        ;;
24710e915abSAdriana Kobylak    *)
24810e915abSAdriana Kobylak        echo "Invalid argument"
24910e915abSAdriana Kobylak        exit 1
25010e915abSAdriana Kobylak        ;;
25110e915abSAdriana Kobylakesac
25210e915abSAdriana Kobylakrc=$?
25310e915abSAdriana Kobylakif [ ${rc} -ne 0 ]; then
25410e915abSAdriana Kobylak    echo "$0: error ${rc}"
25510e915abSAdriana Kobylak    exit ${rc}
25610e915abSAdriana Kobylakfi
257