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>
This commit is contained in:
Daniel Golle 2024-02-26 05:08:04 +00:00
parent ca6afe964b
commit 0bdf2fcbe9
1 changed files with 41 additions and 0 deletions

View 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]);
}