Przeglądaj źródła

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 <[email protected]>
Daniel Golle 1 rok temu
rodzic
commit
5992f976b3
1 zmienionych plików z 22 dodań i 1 usunięć
  1. 22 1
      package/base-files/files/lib/upgrade/common.sh

+ 22 - 1
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])