openwrt/target/linux/octeon/base-files/lib/upgrade/platform.sh
Christian Svensson 9bc782dfd8 octeon: n821: sysupgrade for Cisco vEdge 1000
This commit adds the logic required to install OpenWrt on a
Cisco/Viptela vEdge 1000 while nicely integrating with the already
present bootloader and making it possible to roll back to stock OS.

The vEdge 1000 has a built-in SSD with a ext2 partition from which
the stock u-boot boots the Linux kernel from.

In order for Linux not to be confused about which partition the root
file system is on, there are some tricks needed to ensure the partition
is identifiable at boot time. For this we use blkid as part of the
scripts, and sfdisk as part of the manual installation process
documented on the wiki. Thus, those packages have been added as a
platform dependency. Finally, the u-boot environment is updated which
requires the use of uboot-envtools.

Tested on a Cisco vEdge 1000.

Signed-off-by: Christian Svensson <blue@cmd.nu>
Link: https://github.com/openwrt/openwrt/pull/16140
Signed-off-by: Robert Marko <robimarko@gmail.com>
2024-09-02 20:26:42 +02:00

183 lines
4.2 KiB
Bash
Executable File

#
# Copyright (C) 2021 OpenWrt.org
#
if [ -x /usr/sbin/blkid ]; then
RAMFS_COPY_BIN="/usr/sbin/blkid"
fi
platform_get_rootfs() {
local rootfsdev
local rootpartuuid
if read cmdline < /proc/cmdline; then
case "$cmdline" in
*root=PARTUUID=*)
rootpartuuid="${cmdline##*root=PARTUUID=}"
rootpartuuid="${rootpartuuid%% *}"
rootfsdev="$(blkid -o device -t PARTUUID="${rootpartuuid}")"
;;
*root=*)
rootfsdev="${cmdline##*root=}"
rootfsdev="${rootfsdev%% *}"
;;
esac
echo "${rootfsdev}"
fi
}
platform_get_n821_disk() {
local partnum=$1
local DEVNAME
while read line; do
export -n "${line}"
done < $(find /sys/bus/platform/devices/16f0000000000.ehci/ -path \*block/sd[a-z]/uevent)
echo "/dev/${DEVNAME}${partnum}"
}
platform_copy_config_helper() {
local device=$1
local fstype=$2
mount -t "${fstype}" "$device" /mnt
cp -af "$UPGRADE_BACKUP" "/mnt/$BACKUP_FILE"
umount /mnt
}
platform_copy_config() {
case "$(board_name)" in
erlite|\
ubnt,usg)
platform_copy_config_helper /dev/sda1 vfat
;;
itus,shield-router)
platform_copy_config_helper /dev/mmcblk1p1 vfat
;;
er|\
ubnt,edgerouter-4|\
ubnt,edgerouter-6p)
platform_copy_config_helper /dev/mmcblk0p1 vfat
;;
cisco,vedge1000)
platform_copy_config_helper "$(platform_get_n821_disk 1)" ext2
;;
esac
}
platform_do_flash() {
local tar_file=$1
local board=$2
local kernel=$3
local rootfs=$4
local board_dir=$(tar tf "$tar_file" | grep -m 1 '^sysupgrade-.*/$')
board_dir=${board_dir%/}
[ -n "$board_dir" ] || return 1
mkdir -p /boot
if [ $board = "itus,shield-router" ]; then
# mmcblk1p1 (fat) contains all ELF-bin images for the Shield
mount /dev/mmcblk1p1 /boot
echo "flashing Itus Kernel to /boot/$kernel (/dev/mmblk1p1)"
tar -Oxf $tar_file "$board_dir/kernel" > /boot/$kernel
else
if [ "${board}" = "cisco,vedge1000" ]; then
local rootpartuuid
rootpartuuid="$(/usr/sbin/blkid -o value -s PARTUUID "${rootfs}")"
if [ -n "${rootpartuuid}" ]; then
echo "setting root partition to PARTUUID=${rootpartuuid}"
fw_setenv bootcmd 'usb start; ext2load usb 0:1 $loadaddr vmlinux.64; bootoctlinux $loadaddr coremask=f endbootargs rootfstype=squashfs rootwait root=PARTUUID='"${rootpartuuid}"
else
echo "WARNING: unable to figure out root partition UUID, leaving bootcmd unchanged"
fi
mount -t ext2 "${kernel}" /boot
else
mount -t vfat "${kernel}" /boot
fi
[ -f /boot/vmlinux.64 -a ! -L /boot/vmlinux.64 ] && {
mv /boot/vmlinux.64 /boot/vmlinux.64.previous
mv /boot/vmlinux.64.md5 /boot/vmlinux.64.md5.previous
}
echo "flashing kernel to $(awk '/\/boot/ {print $1}' /proc/mounts)"
tar xf $tar_file $board_dir/kernel -O > /boot/vmlinux.64
md5sum /boot/vmlinux.64 | cut -f1 -d " " > /boot/vmlinux.64.md5
fi
echo "flashing rootfs to ${rootfs}"
tar xf $tar_file $board_dir/root -O | dd of="${rootfs}" bs=4096
sync
umount /boot
}
platform_do_upgrade() {
local tar_file="$1"
local board=$(board_name)
local rootfs="$(platform_get_rootfs)"
local kernel=
if [ ! -b "${rootfs}" ] && [ "${board}" = "cisco,vedge1000" ]; then
# Default to the built-in USB disk for N821
rootfs="$(platform_get_n821_disk 2)"
fi
[ -b "${rootfs}" ] || return 1
case "$board" in
er | \
ubnt,edgerouter-4 | \
ubnt,edgerouter-6p)
kernel=/dev/mmcblk0p1
;;
erlite|\
ubnt,usg)
kernel=/dev/sda1
;;
itus,shield-router)
kernel=ItusrouterImage
;;
cisco,vedge1000)
kernel="$(platform_get_n821_disk 1)"
;;
*)
return 1
esac
platform_do_flash $tar_file $board $kernel $rootfs
return 0
}
platform_check_image() {
local board=$(board_name)
local tar_file="$1"
local board_dir=$(tar tf "$tar_file" | grep -m 1 '^sysupgrade-.*/$')
board_dir=${board_dir%/}
[ -n "$board_dir" ] || return 1
case "$board" in
er | \
erlite | \
itus,shield-router | \
ubnt,edgerouter-4 | \
ubnt,edgerouter-6p | \
ubnt,usg | \
cisco,vedge1000)
local kernel_length=$(tar xf $tar_file $board_dir/kernel -O | wc -c 2> /dev/null)
local rootfs_length=$(tar xf $tar_file $board_dir/root -O | wc -c 2> /dev/null)
[ "$kernel_length" = 0 -o "$rootfs_length" = 0 ] && {
echo "The upgrade image is corrupt."
return 1
}
return 0
;;
esac
echo "Sysupgrade is not yet supported on $board."
return 1
}