Переглянути джерело

bcm27xx: use PARTUUID for root in cmdline

This allows booting from USB/NVME while keeping SD compatibility.

Signed-off-by: Álvaro Fernández Rojas <[email protected]>
Álvaro Fernández Rojas 1 рік тому
батько
коміт
fe0081eecf

+ 4 - 1
target/linux/bcm27xx/base-files/lib/preinit/79_move_config

@@ -16,7 +16,10 @@ move_config() {
 		insmod vfat
 		mkdir -p /boot
 		mount -t vfat -o rw,noatime /dev/$partdev /boot
-		[ -f "/boot/$BACKUP_FILE" ] && mv -f "/boot/$BACKUP_FILE" /
+		if [ -f "/boot/$BACKUP_FILE" ]; then
+			mv -f "/boot/$BACKUP_FILE" /
+			export BCM27XX_SET_ROOT_PART=1
+		fi
 	fi
 }
 

+ 12 - 0
target/linux/bcm27xx/base-files/lib/preinit/81_set_root_part

@@ -0,0 +1,12 @@
+# SPDX-License-Identifier: GPL-2.0-only
+
+. /lib/upgrade/platform.sh
+
+do_set_root_part() {
+	if [ "$BCM27XX_SET_ROOT_PART" -eq "1" ]; then
+		bcm27xx_set_root_part
+		unset BCM27XX_SET_ROOT_PART
+	fi
+}
+
+[ "$INITRAMFS" = "1" ] || boot_hook_add preinit_main do_set_root_part

+ 32 - 1
target/linux/bcm27xx/base-files/lib/upgrade/platform.sh

@@ -85,15 +85,46 @@ platform_do_upgrade() {
 	get_image "$@" | dd of="/dev/$diskdev" bs=1 skip=440 count=4 seek=440 conv=fsync
 }
 
+bcm27xx_set_root_part() {
+	local root_part
+
+	if [ -f "/boot/partuuid.txt" ]; then
+		root_part="PARTUUID=$(cat "/boot/partuuid.txt")-02"
+	else
+		root_part="/dev/mmcblk0p2"
+	fi
+
+	sed -i "s#\broot=[^ ]*#root=${root_part}#g" "/boot/cmdline.txt"
+}
+
 platform_copy_config() {
 	local partdev
 
 	if export_partdevice partdev 1; then
 		mkdir -p /boot
 		[ -f /boot/kernel*.img ] || mount -t vfat -o rw,noatime "/dev/$partdev" /boot
-		cp -af "$UPGRADE_BACKUP" "/boot/$BACKUP_FILE"
+
 		tar -C / -zxvf "$UPGRADE_BACKUP" boot/cmdline.txt boot/config.txt
+		bcm27xx_set_root_part
+
+		local backup_tmp="/tmp/backup-update"
+		mkdir -p $backup_tmp
+		tar -C $backup_tmp -zxvf $UPGRADE_BACKUP
+		cp -af /boot/cmdline.txt $backup_tmp/boot/
+
+		local work_dir=$(pwd)
+		cd $backup_tmp
+		tar -C $backup_tmp -zcvf /boot/$BACKUP_FILE *
+		cd $work_dir
+
 		sync
 		umount /boot
 	fi
 }
+
+platform_restore_backup() {
+	local TAR_V=$1
+
+	tar -C / -x${TAR_V}zf "$CONF_RESTORE"
+	bcm27xx_set_root_part
+}

+ 7 - 1
target/linux/bcm27xx/image/Makefile

@@ -15,13 +15,19 @@ endef
 
 ### Image scripts ###
 define Build/boot-common
+	echo $(IMG_PART_SIGNATURE) > [email protected]
+	sed \
+		-e 's#@ROOT@#PARTUUID=$(IMG_PART_SIGNATURE)-02#g' \
+		cmdline.txt > [email protected]
+
 	rm -f [email protected]
 	mkfs.fat -n boot -C [email protected] $(FAT32_BLOCKS)
 	mcopy -i [email protected] $(KDIR)/COPYING.linux ::
 	mcopy -i [email protected] $(KDIR)/LICENCE.broadcom ::
-	mcopy -i [email protected] cmdline.txt ::
+	mcopy -i [email protected] $@-cmdline.txt ::cmdline.txt
 	mcopy -i [email protected] config.txt ::
 	mcopy -i [email protected] distroconfig.txt ::
+	mcopy -i [email protected] [email protected] ::partuuid.txt
 	mcopy -i [email protected] $(IMAGE_KERNEL) ::$(KERNEL_IMG)
 	$(foreach dts,$(shell echo $(DEVICE_DTS)),mcopy -i [email protected] $(DTS_DIR)/$(dts).dtb ::;)
 	mmd -i [email protected] ::/overlays

+ 1 - 1
target/linux/bcm27xx/image/cmdline.txt

@@ -1 +1 @@
-console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=squashfs,ext4 rootwait
+console=serial0,115200 console=tty1 root=@ROOT@ rootfstype=squashfs,ext4 rootwait