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