Signed-off-by: Michael Olbrich <m.olbr...@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

Reply via email to