From mboxrd@z Thu Jan 1 00:00:00 1970 Delivery-date: Mon, 07 Feb 2022 17:47:33 +0100 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by lore.white.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1nH7Ar-008QRW-0j for lore@lore.pengutronix.de; Mon, 07 Feb 2022 17:47:33 +0100 Received: from localhost ([127.0.0.1] helo=metis.ext.pengutronix.de) by metis.ext.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1nH7Ap-00011A-LD; Mon, 07 Feb 2022 17:47:31 +0100 Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nH7An-0000yz-Cx; Mon, 07 Feb 2022 17:47:29 +0100 Received: from [2a0a:edc0:0:1101:1d::39] (helo=dude03.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtp (Exim 4.94.2) (envelope-from ) id 1nH7An-00F8En-CQ; Mon, 07 Feb 2022 17:47:28 +0100 Received: from mol by dude03.red.stw.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1nH7Al-007iJT-CW; Mon, 07 Feb 2022 17:47:27 +0100 From: Michael Olbrich To: oss-tools@pengutronix.de Date: Mon, 7 Feb 2022 17:47:17 +0100 Message-Id: <20220207164718.1835141-3-m.olbrich@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220207164718.1835141-1-m.olbrich@pengutronix.de> References: <20220207164718.1835141-1-m.olbrich@pengutronix.de> MIME-Version: 1.0 Subject: [OSS-Tools] [PATCH v2 2/3] libdt: add support for barebox, storage-by-uuid X-BeenThere: oss-tools@pengutronix.de X-Mailman-Version: 2.1.29 Precedence: list List-Id: Pengutronix Public Open-Source-Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Michael Olbrich Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "OSS-Tools" X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: oss-tools-bounces@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false Signed-off-by: Michael Olbrich --- 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