openwrt/target/linux/layerscape/base-files/lib/upgrade/platform.sh
Pawel Dembicki 6180005deb layerscape: fix sd-card sysupgrade
So far, kernel has not been written correctly to SD card during
sysupgrade, as both target path and offset were wrong.

This patch fixes it, and adds some descriptive output on the way.

Fixes: 0841b68c91 ("layerscape: support sysupgrade for SD card ext4
rootfs")

Reviewed-by: Yangbo Lu <yangbo.lu@nxp.com>
Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
[alter/extend commit message]
Signed-off-by: Adrian Schmutzler <freifunk@adrianschmutzler.de>
2020-10-26 00:40:12 +01:00

186 lines
4.5 KiB
Bash

#
# Copyright 2015-2019 Traverse Technologies
# Copyright 2020 NXP
#
RAMFS_COPY_BIN="/usr/sbin/fw_printenv /usr/sbin/fw_setenv /usr/sbin/ubinfo /bin/echo"
RAMFS_COPY_DATA="/etc/fw_env.config /var/lock/fw_printenv.lock"
REQUIRE_IMAGE_METADATA=1
platform_check_image_sdboot() {
local diskdev partdev diff
export_bootdevice && export_partdevice diskdev 0 || {
echo "Unable to determine upgrade device"
return 1
}
# get partitions table from boot device
get_partitions "/dev/$diskdev" bootdisk
# get partitions table from sysupgrade.bin
dd if="$1" of=/tmp/image.bs bs=512b count=1 > /dev/null 2>&1
sync
get_partitions /tmp/image.bs image
# compare tables
diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
rm -f /tmp/image.bs /tmp/partmap.bootdisk /tmp/partmap.image
if [ -n "$diff" ]; then
echo "Partition layout has changed. Full image will be written."
ask_bool 0 "Abort" && exit 1
return 0
fi
}
platform_do_upgrade_sdboot() {
local diskdev partdev diff
export_bootdevice && export_partdevice diskdev 0 || {
echo "Unable to determine upgrade device"
return 1
}
if [ "$UPGRADE_OPT_SAVE_PARTITIONS" = "1" ]; then
# get partitions table from boot device
get_partitions "/dev/$diskdev" bootdisk
# get partitions table from sysupgrade.bin
dd if="$1" of=/tmp/image.bs bs=512b count=1 > /dev/null 2>&1
sync
get_partitions /tmp/image.bs image
# compare tables
diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
else
diff=1
fi
if [ -n "$diff" ]; then
dd if="$1" of="/dev/$diskdev" bs=1024 count=4 > /dev/null 2>&1
echo "Writing image to /dev/$diskdev..."
dd if="$1" of="/dev/$diskdev" bs=1024 skip=16384 seek=16384 > /dev/null 2>&1
sync
# Separate removal and addtion is necessary; otherwise, partition 1
# will be missing if it overlaps with the old partition 2
partx -d - "/dev/$diskdev"
partx -a - "/dev/$diskdev"
return 0
fi
# write kernel image
echo "Writing kernel to /dev/$diskdev..."
dd if="$1" of="/dev/$diskdev" bs=1024 skip=16384 seek=16384 count=16384 > /dev/null 2>&1
sync
# iterate over each partition from the image and write it to the boot disk
while read part start size; do
if export_partdevice partdev $part; then
echo "Writing image to /dev/$partdev..."
dd if="$1" of="/dev/$partdev" bs=512 skip="$start" count="$size" > /dev/null 2>&1
sync
else
echo "Unable to find partition $part device, skipped."
fi
done < /tmp/partmap.image
}
platform_do_upgrade_traverse_nandubi() {
bootsys=$(fw_printenv bootsys | awk -F= '{{print $2}}')
newbootsys=2
if [ "$bootsys" -eq "2" ]; then
newbootsys=1
fi
# If nand_do_upgrade succeeds, we don't have an opportunity to add any actions of
# our own, so do it here and set back on failure
echo "Setting bootsys to #${newbootsys}"
fw_setenv bootsys $newbootsys
CI_UBIPART="nandubi"
CI_KERNPART="kernel${newbootsys}"
CI_ROOTPART="rootfs${newbootsys}"
nand_do_upgrade "$1" || (echo "Upgrade failed, setting bootsys ${bootsys}" && fw_setenv bootsys $bootsys)
}
platform_copy_config() {
local partdev parttype=ext4
if export_partdevice partdev 1; then
mount -t $parttype -o rw,noatime "/dev/$partdev" /mnt
cp -af "$UPGRADE_BACKUP" "/mnt/$BACKUP_FILE"
umount /mnt
fi
}
platform_check_image() {
local board=$(board_name)
case "$board" in
traverse,ls1043v | \
traverse,ls1043s)
nand_do_platform_check "traverse-ls1043" $1
return $?
;;
fsl,ls1012a-frdm | \
fsl,ls1012a-rdb | \
fsl,ls1021a-twr | \
fsl,ls1043a-rdb | \
fsl,ls1046a-rdb | \
fsl,ls1088a-rdb | \
fsl,ls2088a-rdb)
return 0
;;
fsl,ls1012a-frwy-sdboot | \
fsl,ls1021a-twr-sdboot | \
fsl,ls1043a-rdb-sdboot | \
fsl,ls1046a-rdb-sdboot | \
fsl,ls1088a-rdb-sdboot)
platform_check_image_sdboot "$1"
return 0
;;
*)
echo "Sysupgrade is not currently supported on $board"
;;
esac
return 1
}
platform_do_upgrade() {
local board=$(board_name)
# Force the creation of fw_printenv.lock
mkdir -p /var/lock
touch /var/lock/fw_printenv.lock
case "$board" in
traverse,ls1043v | \
traverse,ls1043s)
platform_do_upgrade_traverse_nandubi "$1"
;;
fsl,ls1012a-frdm | \
fsl,ls1012a-rdb | \
fsl,ls1021a-twr | \
fsl,ls1043a-rdb | \
fsl,ls1046a-rdb | \
fsl,ls1088a-rdb | \
fsl,ls2088a-rdb)
PART_NAME=firmware
default_do_upgrade "$1"
;;
fsl,ls1012a-frwy-sdboot | \
fsl,ls1021a-twr-sdboot | \
fsl,ls1043a-rdb-sdboot | \
fsl,ls1046a-rdb-sdboot | \
fsl,ls1088a-rdb-sdboot)
platform_do_upgrade_sdboot "$1"
return 0
;;
*)
echo "Sysupgrade is not currently supported on $board"
;;
esac
}