base-files: recognize bootdevice on devices using fitblk
authorDaniel Golle <daniel@makrotopia.org>
Sun, 25 Feb 2024 21:01:01 +0000 (21:01 +0000)
committerDaniel Golle <daniel@makrotopia.org>
Mon, 26 Feb 2024 01:29:22 +0000 (01:29 +0000)
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 <daniel@makrotopia.org>
package/base-files/files/lib/upgrade/common.sh

index af1182cb16a383afb978138434f80ceac57f41d9..7e83379082e50f12104280e64eb5036232899fe6 100644 (file)
@@ -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])