[openwrt/openwrt] mediatek: mt7623: prepare for full sysupgrade support on UniElec U7623

LEDE Commits lede-commits at lists.infradead.org
Sun Jul 26 05:50:13 EDT 2020


981213 pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/29fa5526a2ba5882cf0159b03998e29194c1f190

commit 29fa5526a2ba5882cf0159b03998e29194c1f190
Author: David Woodhouse <dwmw2 at infradead.org>
AuthorDate: Mon Jul 20 21:10:04 2020 +0100

    mediatek: mt7623: prepare for full sysupgrade support on UniElec U7623
    
    An upcoming commit will add a full system image for U7623 which will
    contain the MBR partition table and U-Boot too.
    
    That contrasts with the current image which only owns the eMMC from
    sector 0xa00 onwards, and must start with a legacy uImage.
    
    Prepare for sysupgrade to the new images, and cope with the fact that
    the recovery partition will be /dev/mmcblk0p2 instead of /dev/mmcblk0p1
    after the upgrade.
    
    This commit could potentially be backported to 19.07 to allow for direct
    sysupgrade to the new image layout.
    
    Signed-off-by: David Woodhouse <dwmw2 at infradead.org>
---
 .../mt7623/base-files/lib/preinit/79_move_config   |   6 +-
 .../mt7623/base-files/lib/upgrade/platform.sh      | 199 ++++++++++++---------
 2 files changed, 117 insertions(+), 88 deletions(-)

diff --git a/target/linux/mediatek/mt7623/base-files/lib/preinit/79_move_config b/target/linux/mediatek/mt7623/base-files/lib/preinit/79_move_config
index cbb6c604c8..f47894c0fd 100644
--- a/target/linux/mediatek/mt7623/base-files/lib/preinit/79_move_config
+++ b/target/linux/mediatek/mt7623/base-files/lib/preinit/79_move_config
@@ -10,7 +10,11 @@ move_config() {
 		partnum=2
 		;;
 	unielec,u7623-02-emmc-512m)
-		partnum=1
+		if grep -q root=/dev/mmcblk0p2 /proc/cmdline; then
+			partnum=1;
+		else
+			partnum=2;
+		fi
 		;;
 	*)
 		return 1
diff --git a/target/linux/mediatek/mt7623/base-files/lib/upgrade/platform.sh b/target/linux/mediatek/mt7623/base-files/lib/upgrade/platform.sh
index 2b37846456..d3da22d496 100755
--- a/target/linux/mediatek/mt7623/base-files/lib/upgrade/platform.sh
+++ b/target/linux/mediatek/mt7623/base-files/lib/upgrade/platform.sh
@@ -1,92 +1,113 @@
-platform_do_upgrade() {
-	local board=$(board_name)
 
-	case "$board" in
-	bananapi,bpi-r2)
-		local diskdev partdev diff
+REQUIRE_IMAGE_METADATA=1
 
-		export_bootdevice && export_partdevice diskdev 0 || {
-			echo "Unable to determine upgrade device"
-			return 1
-		}
+# Full system upgrade including preloader for MediaTek SoCs on eMMC or SD
+mtk_mmc_full_upgrade() {
+	local diskdev partdev diff oldrecovery
 
-		#Keep the persistent random mac address (if it exists)
-		mkdir -p /tmp/recovery
-		export_partdevice recoverydev 2
-		if mount -o rw,noatime "/dev/$recoverydev" -tvfat /tmp/recovery; then
-			[ -f "/tmp/recovery/mac_addr" ] && cp /tmp/recovery/mac_addr /tmp/
-			umount /tmp/recovery
-		fi
-		sync
+	if grep -q root=/dev/mmcblk0p2 /proc/cmdline; then
+	    oldrecovery=1
+	else
+	    oldrecovery=2
+	fi
 
-		if [ "$SAVE_PARTITIONS" = "1" ]; then
-			get_partitions "/dev/$diskdev" bootdisk
+	export_bootdevice && export_partdevice diskdev 0 || {
+		echo "Unable to determine upgrade device"
+		return 1
+	}
 
-			#extract the boot sector from the image
-			get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b
+	#Keep the persistent random mac address (if it exists)
+	mkdir -p /tmp/recovery
+	export_partdevice recoverydev $oldrecovery
+	if mount -o rw,noatime "/dev/$recoverydev" -tvfat /tmp/recovery; then
+		[ -f "/tmp/recovery/mac_addr" ] && cp /tmp/recovery/mac_addr /tmp/
+		umount /tmp/recovery
+	fi
+	sync
 
-			get_partitions /tmp/image.bs image
+	if [ "$SAVE_PARTITIONS" = "1" ]; then
+		get_partitions "/dev/$diskdev" bootdisk
 
-			#compare tables
-			diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
-		else
-			diff=1
-		fi
+		#extract the boot sector from the image
+		get_image "$@" | dd of=/tmp/image.bs count=1 bs=512b
 
-		if [ -n "$diff" ]; then
-			get_image "$@" | dd of="/dev/$diskdev" bs=4096 conv=fsync
-
-			# 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"
-		else
-			#iterate over each partition from the image and write it to the boot disk
-			while read part start size; do
-				part="$(($part - 2))"
-				if export_partdevice partdev $part; then
-					echo "Writing image to /dev/$partdev..."
-					get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync
-				else
-				    echo "Unable to find partition $part device, skipped."
-				fi
-			done < /tmp/partmap.image
-
-			#copy partition uuid
-			echo "Writing new UUID to /dev/$diskdev..."
-			get_image "$@" | dd of="/dev/$diskdev" bs=1 skip=440 count=4 seek=440 conv=fsync
-		fi
+		get_partitions /tmp/image.bs image
 
-		if mount -o rw,noatime "/dev/$recoverydev" -t vfat /tmp/recovery; then
-			[ -f "/tmp/mac_addr" ] && cp /tmp/mac_addr /tmp/recovery
+		#compare tables
+		diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)"
+	else
+		diff=1
+	fi
 
-			if [ "$diskdev" = "mmcblk0" -a -r /tmp/recovery/eMMCboot.bin ]; then
-				echo 0 > /sys/block/mmcblk0boot0/force_ro
-				dd if=/tmp/recovery/eMMCboot.bin of=/dev/mmcblk0boot0 conv=fsync
-				sync
-				echo 1 > /sys/block/mmcblk0boot0/force_ro
+	if [ -n "$diff" ]; then
+		get_image "$@" | dd of="/dev/$diskdev" bs=4096 conv=fsync
+
+		# Separate removal and addition is necessary; otherwise, partition 1
+		# will be missing if it overlaps with the old partition 2
+		partx -d - "/dev/$diskdev"
+		partx -a - "/dev/$diskdev"
+	else
+		# iterate over each partition from the image and write it to the boot disk
+		while read part start size; do
+			part="$(($part - 2))"
+			if export_partdevice partdev $part; then
+				echo "Writing image to /dev/$partdev..."
+				get_image "$@" | dd of="/dev/$partdev" ibs="512" obs=1M skip="$start" count="$size" conv=fsync
+			else
+			    echo "Unable to find partition $part device, skipped."
 			fi
+		done < /tmp/partmap.image
+
+		#copy partition uuid
+		echo "Writing new UUID to /dev/$diskdev..."
+		get_image "$@" | dd of="/dev/$diskdev" bs=1 skip=440 count=4 seek=440 conv=fsync
+	fi
+
+	export_partdevice recoverydev 2
+	if mount -o rw,noatime "/dev/$recoverydev" -t vfat /tmp/recovery; then
+		[ -f "/tmp/mac_addr" ] && cp /tmp/mac_addr /tmp/recovery
+
+		if [ "$diskdev" = "mmcblk0" -a -r /tmp/recovery/eMMCboot.bin ]; then
+			echo 0 > /sys/block/mmcblk0boot0/force_ro
+			dd if=/tmp/recovery/eMMCboot.bin of=/dev/mmcblk0boot0 conv=fsync
 			sync
-			umount /tmp/recovery
+			echo 1 > /sys/block/mmcblk0boot0/force_ro
 		fi
+		sync
+		umount /tmp/recovery
+	fi
+}
+
+platform_do_upgrade() {
+	local board=$(board_name)
+
+	case "$board" in
+	bananapi,bpi-r2)
+		mtk_mmc_full_upgrade "$1"
 		;;
 
 	unielec,u7623-02-emmc-512m)
-		#Keep the persisten random mac address (if it exists)
-		mkdir -p /tmp/recovery
-		mount -o rw,noatime /dev/mmcblk0p1 /tmp/recovery
-		[ -f "/tmp/recovery/mac_addr" ] && \
-			mv -f /tmp/recovery/mac_addr /tmp/
-		umount /tmp/recovery
+		local magic="$(get_magic_long "$1")"
+		if [ "$magic" = "53444d4d" ]; then
+			mtk_mmc_full_upgrade "$1"
+		else # Old partial image starting with uImage
+			# Keep the persistent random mac address (if it exists)
+			recoverydev=mmcblk0p1
+			mkdir -p /tmp/recovery
+			mount -o rw,noatime /dev/$recoverydev /tmp/recovery
+			[ -f "/tmp/recovery/mac_addr" ] && \
+				mv -f /tmp/recovery/mac_addr /tmp/
+			umount /tmp/recovery
 
-		#1310720 is the offset in bytes from the start of eMMC and to
-		#the location of the kernel (2560 512 byte sectors)
-		get_image "$1" | dd of=/dev/mmcblk0 bs=1310720 seek=1 conv=fsync
+			# 1310720 is the offset in bytes from the start of eMMC and to
+			# the location of the kernel (2560 512 byte sectors)
+			get_image "$1" | dd of=/dev/mmcblk0 bs=1310720 seek=1 conv=fsync
 
-		mount -o rw,noatime /dev/mmcblk0p1 /tmp/recovery
-		[ -f "/tmp/mac_addr" ] && mv -f /tmp/mac_addr /tmp/recovery
-		sync
-		umount /tmp/recovery
+			mount -o rw,noatime /dev/$recoverydev /tmp/recovery
+			[ -f "/tmp/mac_addr" ] && mv -f /tmp/mac_addr /tmp/recovery
+			sync
+			umount /tmp/recovery
+		fi
 		;;
 	*)
 		default_do_upgrade "$1"
@@ -133,10 +154,21 @@ platform_check_image() {
 		fi
 		;;
 	unielec,u7623-02-emmc-512m)
+		# Can always upgrade to the new-style full image
+		[ "$magic" = "53444d4d" ] && return 0
+
+		# Legacy uImage directly at 0xA00 on the eMMC.
 		[ "$magic" != "27051956" ] && {
 			echo "Invalid image type."
 			return 1
 		}
+		rootpart=$(cat /proc/cmdline)
+		rootpart="${rootpart##*root=}"
+		rootpart="${rootpart%% *}"
+		[ "$rootpart" != "/dev/mmcblk0p2" ] && {
+			echo "Cannot downgrade to legacy image."
+			return 1
+		}
 		return 0
 		;;
 	*)
@@ -148,25 +180,18 @@ platform_check_image() {
 	return 0
 }
 
-platform_copy_config_emmc() {
-	local partdev
-
-	if export_bootdevice && export_partdevice partdev $1; then
-		mkdir -p /recovery
-		mount -o rw,noatime "/dev/$partdev" -t vfat /recovery
-		cp -af "$UPGRADE_BACKUP" "/recovery/$BACKUP_FILE"
-		sync
-		umount /recovery
-	fi
-}
-
 platform_copy_config() {
 	case "$(board_name)" in
-	bananapi,bpi-r2)
-		platform_copy_config_emmc 2
-		;;
+	bananapi,bpi-r2|\
 	unielec,u7623-02-emmc-512m)
-		platform_copy_config_emmc 1
+		# platform_do_upgrade() will have set $recoverydev
+		if [ -n "$recoverydev" ]; then
+			mkdir -p /tmp/recovery
+			mount -o rw,noatime "/dev/$recoverydev" -t vfat /tmp/recovery
+			cp -af "$UPGRADE_BACKUP" "/tmp/recovery/$BACKUP_FILE"
+			sync
+			umount /tmp/recovery
+		fi
 		;;
 	esac
 }



More information about the lede-commits mailing list