uvol: add support for detecting fitblk boot device
authorDaniel Golle <daniel@makrotopia.org>
Mon, 26 Feb 2024 05:08:04 +0000 (05:08 +0000)
committerDaniel Golle <daniel@makrotopia.org>
Mon, 26 Feb 2024 05:14:10 +0000 (05:14 +0000)
Auto-detect LVM2 volume on boot device used with fitblk uImage.FIT
sub-image driver.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
utils/uvol/files/blockdev_common.uc

index ac601e78c4a70042fe7588a2696789f390e0bd1e..f76508657feacc021f95d516d2bc134493f638f6 100644 (file)
@@ -44,6 +44,45 @@ let get_uevent_major_minor = function(file) {
        return r;
 };
 
+// adapted from /lib/upgrade/common.sh
+let fitblk_get_bootdev = function(void) {
+       let rootdisk_handle = fs.open("/sys/firmware/devicetree/base/chosen/rootdisk", "r");
+       if (!rootdisk_handle)
+               return null;
+
+       // read rootdisk handle
+       let rootdisk = rootdisk_handle.read("all");
+       rootdisk_handle.close();
+
+       // find all block device handle sysfs files
+       let handles = fs.glob('/sys/class/block/*/of_node/phandle');
+       let mtd_handles = fs.glob('/sys/class/block/*/device/of_node/phandle');
+       // concat array of both globs
+       for (let mtddev in mtd_handles)
+               push(handles, mtddev);
+
+       for (let dev in handles) {
+               let bdev_handle = fs.open(dev, "r");
+               if (!bdev_handle)
+                       continue;
+
+               let bdev = bdev_handle.read("all");
+               bdev_handle.close();
+
+               if ( bdev != rootdisk )
+                       continue;
+
+               let path = split(dev, '/');
+               let pe = length(path) - 3;
+               if (path[pe] == "device")
+                       --pe;
+
+               return path[pe];
+       }
+
+       return null;
+};
+
 // adapted from /lib/upgrade/common.sh
 let get_bootdev = function(void) {
        let rootpart = cmdline_get_var("root");
@@ -100,6 +139,8 @@ let get_bootdev = function(void) {
                                break;
                        }
                }
+       } else if (rootpart == "/dev/fit0") {
+               uevent = sprintf("/sys/class/block/%s/../uevent", fitblk_get_bootdev());
        } else if (wildcard(rootpart, "/dev/*")) {
                uevent = sprintf("/sys/class/block/%s/../uevent", split(rootpart, '/')[-1]);
        }