* [OSS-Tools] [PATCH v2 1/3] libdt: only requires a partname for mtd
2022-02-07 16:47 [OSS-Tools] [PATCH v2 0/3] improve barebox-state support on EFI system Michael Olbrich
@ 2022-02-07 16:47 ` Michael Olbrich
2022-02-07 16:47 ` [OSS-Tools] [PATCH v2 2/3] libdt: add support for barebox, storage-by-uuid Michael Olbrich
2022-02-07 16:47 ` [OSS-Tools] [PATCH v2 3/3] state: automatically find state.dtb in the ESP Michael Olbrich
2 siblings, 0 replies; 5+ messages in thread
From: Michael Olbrich @ 2022-02-07 16:47 UTC (permalink / raw)
To: oss-tools; +Cc: Michael Olbrich
It's not used anywhere else.
Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
---
src/libdt.c | 19 ++++++++++---------
1 file changed, 10 insertions(+), 9 deletions(-)
diff --git a/src/libdt.c b/src/libdt.c
index 342313f8aed7..0f98344561c9 100644
--- a/src/libdt.c
+++ b/src/libdt.c
@@ -2384,7 +2384,6 @@ int of_get_devicepath(struct device_node *partition_node, char **devpath, off_t
{
struct device_node *node;
struct udev_device *dev, *partdev, *mtd;
- const char *partname;
int ret;
*offset = 0;
@@ -2454,16 +2453,18 @@ int of_get_devicepath(struct device_node *partition_node, char **devpath, off_t
return -ENODEV;
}
- /* find the name of the partition... */
- ret = of_property_read_string(partition_node, "label", &partname);
- if (ret) {
- fprintf(stderr, "%s: no 'label' property found in %s\n", __func__,
- partition_node->full_name);
- return ret;
- }
-
mtd = of_find_mtd_device(dev);
if (mtd) {
+ const char *partname;
+
+ /* find the name of the partition... */
+ ret = of_property_read_string(partition_node, "label", &partname);
+ if (ret) {
+ fprintf(stderr, "%s: no 'label' property found in %s\n", __func__,
+ partition_node->full_name);
+ return ret;
+ }
+
/* ...find the udev_device by partition name... */
partdev = device_find_mtd_partition(dev, partname);
if (!partdev)
--
2.30.2
_______________________________________________
OSS-Tools mailing list
OSS-Tools@pengutronix.de
^ permalink raw reply [flat|nested] 5+ messages in thread
* [OSS-Tools] [PATCH v2 2/3] libdt: add support for barebox, storage-by-uuid
2022-02-07 16:47 [OSS-Tools] [PATCH v2 0/3] improve barebox-state support on EFI system Michael Olbrich
2022-02-07 16:47 ` [OSS-Tools] [PATCH v2 1/3] libdt: only requires a partname for mtd Michael Olbrich
@ 2022-02-07 16:47 ` Michael Olbrich
2022-04-14 10:17 ` [OSS-Tools] [PATCH] fixup! " Michael Olbrich
2022-02-07 16:47 ` [OSS-Tools] [PATCH v2 3/3] state: automatically find state.dtb in the ESP Michael Olbrich
2 siblings, 1 reply; 5+ messages in thread
From: Michael Olbrich @ 2022-02-07 16:47 UTC (permalink / raw)
To: oss-tools; +Cc: Michael Olbrich
Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
---
src/libdt.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 69 insertions(+), 5 deletions(-)
diff --git a/src/libdt.c b/src/libdt.c
index 0f98344561c9..2e0247e2cab3 100644
--- a/src/libdt.c
+++ b/src/libdt.c
@@ -2361,6 +2361,52 @@ out:
return dev;
}
+static struct udev_device *of_find_device_by_uuid(const char *uuid)
+{
+ struct udev *udev;
+ struct udev_enumerate *enumerate;
+ struct udev_list_entry *devices, *dev_list_entry;
+ int ret = 0;
+
+ udev = udev_new();
+ if (!udev) {
+ fprintf(stderr, "Can't create udev\n");
+ return NULL;
+ }
+
+ enumerate = udev_enumerate_new(udev);
+ udev_enumerate_add_match_subsystem(enumerate, "block");
+ udev_enumerate_scan_devices(enumerate);
+ devices = udev_enumerate_get_list_entry(enumerate);
+ udev_list_entry_foreach(dev_list_entry, devices) {
+ const char *path, *devtype, *outpath, *uuid;
+ struct udev_device *device;
+
+ path = udev_list_entry_get_name(dev_list_entry);
+ device = udev_device_new_from_syspath(udev, path);
+
+ /* distinguish device (disk) from partitions */
+ devtype = udev_device_get_devtype(device);
+ if (!devtype)
+ continue;
+ if (!strcmp(devtype, "disk")) {
+ uuid = udev_device_get_property_value(device, "ID_PART_TABLE_UUID");
+ if (!strcmp(uuid, uuid)) {
+ outpath = udev_device_get_devnode(device);
+ return device;
+ }
+ } else if (!strcmp(devtype, "partition")) {
+ uuid = udev_device_get_property_value(device, "ID_PART_ENTRY_UUID");
+ if (!strcmp(uuid, uuid)) {
+ outpath = udev_device_get_devnode(device);
+ return device;
+ }
+ }
+
+ }
+ return NULL;
+}
+
/*
* of_get_devicepath - get information how to access device corresponding to a device_node
* @partition_node: The device_node which shall be accessed
@@ -2446,11 +2492,29 @@ int of_get_devicepath(struct device_node *partition_node, char **devpath, off_t
if (!strcmp(node->name, "partitions"))
node = node->parent;
- dev = of_find_device_by_node_path(node->full_name);
- if (!dev) {
- fprintf(stderr, "%s: cannot find device from node %s\n", __func__,
- node->full_name);
- return -ENODEV;
+ if (of_device_is_compatible(node, "barebox,storage-by-uuid")) {
+ const char *uuid;
+
+ ret = of_property_read_string(node, "uuid", &uuid);
+ if (ret) {
+ fprintf(stderr, "%s: missing uuid property for %s\n", __func__,
+ node->full_name);
+ return -ENODEV;
+ }
+ dev = of_find_device_by_uuid(uuid);
+ if (!dev) {
+ fprintf(stderr, "%s: cannot find device for uuid %s\n", __func__,
+ uuid);
+ return -ENODEV;
+ }
+ }
+ else {
+ dev = of_find_device_by_node_path(node->full_name);
+ if (!dev) {
+ fprintf(stderr, "%s: cannot find device from node %s\n", __func__,
+ node->full_name);
+ return -ENODEV;
+ }
}
mtd = of_find_mtd_device(dev);
--
2.30.2
_______________________________________________
OSS-Tools mailing list
OSS-Tools@pengutronix.de
^ permalink raw reply [flat|nested] 5+ messages in thread
* [OSS-Tools] [PATCH v2 3/3] state: automatically find state.dtb in the ESP
2022-02-07 16:47 [OSS-Tools] [PATCH v2 0/3] improve barebox-state support on EFI system Michael Olbrich
2022-02-07 16:47 ` [OSS-Tools] [PATCH v2 1/3] libdt: only requires a partname for mtd Michael Olbrich
2022-02-07 16:47 ` [OSS-Tools] [PATCH v2 2/3] libdt: add support for barebox, storage-by-uuid Michael Olbrich
@ 2022-02-07 16:47 ` Michael Olbrich
2 siblings, 0 replies; 5+ messages in thread
From: Michael Olbrich @ 2022-02-07 16:47 UTC (permalink / raw)
To: oss-tools; +Cc: Michael Olbrich
Systemd mounts the EFI System Partition (ESP) to /boot or /efi.
So look there for the state.dtb when the devicetree in sysfs/procfs is
not available.
This way barebox-state can be used on EFI systems without manually
specifying the devicetree file.
Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
---
src/barebox-state.c | 24 ++++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/src/barebox-state.c b/src/barebox-state.c
index 334aed6f3d43..bf67340d4dc6 100644
--- a/src/barebox-state.c
+++ b/src/barebox-state.c
@@ -342,6 +342,30 @@ struct state *state_get(const char *name, const char *filename, bool readonly, b
}
} else {
root = of_read_proc_devicetree();
+
+ /* No device-tree in procfs / sysfs, try dtb file in the ESP */
+ if (-PTR_ERR(root) == ENOENT) {
+ const char *paths[] = {
+ /* default mount paths used by systemd */
+ "/boot/EFI/BAREBOX/state.dtb",
+ "/efi/EFI/BAREBOX/state.dtb",
+ NULL
+ };
+ void *fdt;
+ int i;
+
+ for (i = 0; paths[i]; ++i) {
+ fdt = read_file(paths[i], NULL);
+ if (fdt)
+ break;
+ }
+ if (fdt) {
+ root = of_unflatten_dtb(fdt);
+ free(fdt);
+ }
+ else
+ root = ERR_PTR(-ENOENT);
+ }
if (IS_ERR(root)) {
pr_err("Unable to read devicetree. %s\n",
strerror(-PTR_ERR(root)));
--
2.30.2
_______________________________________________
OSS-Tools mailing list
OSS-Tools@pengutronix.de
^ permalink raw reply [flat|nested] 5+ messages in thread