mediatek: mt7623: prepare for full sysupgrade support on UniElec U7623
authorDavid Woodhouse <dwmw2@infradead.org>
Mon, 20 Jul 2020 20:10:04 +0000 (21:10 +0100)
committerChuanhong Guo <gch981213@gmail.com>
Sun, 26 Jul 2020 08:42:36 +0000 (16:42 +0800)
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@infradead.org>
target/linux/mediatek/mt7623/base-files/lib/preinit/79_move_config
target/linux/mediatek/mt7623/base-files/lib/upgrade/platform.sh

index cbb6c604c867886e5316d9472034081618690d1f..f47894c0fd96a7df7f3b41bfff016377f85cd5b5 100644 (file)
@@ -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
index 2b37846456ae518570c0993950e2597deade50ed..d3da22d496e1fb916374392e0633d815d16747b7 100755 (executable)
-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
 }