From 5992f976b39a0a0a79e5b9656279186cd471e353 Mon Sep 17 00:00:00 2001 From: Daniel Golle Date: Sun, 25 Feb 2024 21:01:01 +0000 Subject: [PATCH] base-files: recognize bootdevice on devices using fitblk Boards using the fitblk driver need special treatment when it comes to detecting the actual block device used to store the image used to boot from. Transparently handle this in 'export_bootdevice' and provide new 'fitblk_get_bootdev' function to replace implementations in /lib/upgrade/platform.sh. Signed-off-by: Daniel Golle --- .../base-files/files/lib/upgrade/common.sh | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/package/base-files/files/lib/upgrade/common.sh b/package/base-files/files/lib/upgrade/common.sh index af1182cb16..7e83379082 100644 --- a/package/base-files/files/lib/upgrade/common.sh +++ b/package/base-files/files/lib/upgrade/common.sh @@ -165,6 +165,23 @@ part_magic_fat() { [ "$magic" = "FAT" ] || [ "$magic_fat32" = "FAT32" ] } +fitblk_get_bootdev() { + [ -e /sys/firmware/devicetree/base/chosen/rootdisk ] || return + + local rootdisk="$(cat /sys/firmware/devicetree/base/chosen/rootdisk)" + local handle bootdev + for handle in /sys/class/block/*/of_node/phandle /sys/class/block/*/device/of_node/phandle; do + [ ! -e "$handle" ] && continue + if [ "$rootdisk" = "$(cat $handle)" ]; then + bootdev="${handle%/of_node/phandle}" + bootdev="${bootdev%/device}" + bootdev="${bootdev#/sys/class/block/}" + echo "$bootdev" + break + fi + done +} + export_bootdevice() { local cmdline uuid blockdev uevent line class local MAJOR MINOR DEVNAME DEVTYPE @@ -196,7 +213,11 @@ export_bootdevice() { done ;; /dev/*) - uevent="/sys/class/block/${rootpart##*/}/../uevent" + if [ "$rootpart" = "/dev/fit0" ]; then + uevent="/sys/class/block/$(fitblk_get_bootdev)/uevent" + else + uevent="/sys/class/block/${rootpart##*/}/../uevent" + fi ;; 0x[a-f0-9][a-f0-9][a-f0-9] | 0x[a-f0-9][a-f0-9][a-f0-9][a-f0-9] | \ [a-f0-9][a-f0-9][a-f0-9] | [a-f0-9][a-f0-9][a-f0-9][a-f0-9])