diff options
author | Daniel Golle <daniel@makrotopia.org> | 2024-02-26 05:08:04 +0000 |
---|---|---|
committer | Daniel Golle <daniel@makrotopia.org> | 2024-02-26 05:14:10 +0000 |
commit | 0bdf2fcbe902a4e3a6023788c7c8227b9ce9f423 (patch) | |
tree | f59f8ec213c120481a20d0ad5eeb7e201f66c2c6 /utils | |
parent | ca6afe964b248417488b22bf6da0663dce5ed09a (diff) |
uvol: add support for detecting fitblk boot device
Auto-detect LVM2 volume on boot device used with fitblk uImage.FIT
sub-image driver.
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Diffstat (limited to 'utils')
-rw-r--r-- | utils/uvol/files/blockdev_common.uc | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/utils/uvol/files/blockdev_common.uc b/utils/uvol/files/blockdev_common.uc index ac601e78c..f76508657 100644 --- a/utils/uvol/files/blockdev_common.uc +++ b/utils/uvol/files/blockdev_common.uc @@ -45,6 +45,45 @@ let get_uevent_major_minor = function(file) { }; // 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"); let uevent = null; @@ -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]); } |