mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2024-11-28 07:44:32 +00:00
f9a70a20c5
Backport BLOCK OF support patch merged upstream and refresh pending BLOCK patches. This is a new way to declare partition table for BLOCK device (eMMC currently supported) with the use of DTS. Current pending patch are adapted to not cause regression with current downstream implementation of a similar functionality. Also enable the new OF_PARTITION config by default. Link: https://github.com/openwrt/openwrt/pull/16663 Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
136 lines
4.6 KiB
Diff
136 lines
4.6 KiB
Diff
From patchwork Tue Jul 30 19:25:59 2024
|
|
Content-Type: text/plain; charset="utf-8"
|
|
MIME-Version: 1.0
|
|
Content-Transfer-Encoding: 7bit
|
|
X-Patchwork-Submitter: Daniel Golle <daniel@makrotopia.org>
|
|
X-Patchwork-Id: 13747816
|
|
Date: Tue, 30 Jul 2024 20:25:59 +0100
|
|
From: Daniel Golle <daniel@makrotopia.org>
|
|
To: Rob Herring <robh@kernel.org>, Krzysztof Kozlowski <krzk+dt@kernel.org>,
|
|
Conor Dooley <conor+dt@kernel.org>, Jens Axboe <axboe@kernel.dk>,
|
|
Daniel Golle <daniel@makrotopia.org>, Christian Brauner <brauner@kernel.org>,
|
|
Al Viro <viro@zeniv.linux.org.uk>, Li Lingfeng <lilingfeng3@huawei.com>,
|
|
Ming Lei <ming.lei@redhat.com>, Christian Heusel <christian@heusel.eu>,
|
|
=?utf-8?b?UmFmYcWCIE1pxYJlY2tp?= <rafal@milecki.pl>,
|
|
Felix Fietkau <nbd@nbd.name>, John Crispin <john@phrozen.org>,
|
|
Chad Monroe <chad.monroe@adtran.com>, Yangyu Chen <cyy@cyyself.name>,
|
|
Tianling Shen <cnsztl@immortalwrt.org>, Chuanhong Guo <gch981213@gmail.com>,
|
|
Chen Minqiang <ptpt52@gmail.com>, devicetree@vger.kernel.org,
|
|
linux-kernel@vger.kernel.org, linux-block@vger.kernel.org
|
|
Subject: [PATCH v5 2/4] block: partitions: populate fwnode
|
|
Message-ID:
|
|
<3051ac090ad3b3e2f5adb6b67c923261ead729a5.1722365899.git.daniel@makrotopia.org>
|
|
References: <cover.1722365899.git.daniel@makrotopia.org>
|
|
Precedence: bulk
|
|
X-Mailing-List: linux-block@vger.kernel.org
|
|
List-Id: <linux-block.vger.kernel.org>
|
|
List-Subscribe: <mailto:linux-block+subscribe@vger.kernel.org>
|
|
List-Unsubscribe: <mailto:linux-block+unsubscribe@vger.kernel.org>
|
|
MIME-Version: 1.0
|
|
Content-Disposition: inline
|
|
In-Reply-To: <cover.1722365899.git.daniel@makrotopia.org>
|
|
|
|
Assign matching firmware nodes to block partitions in order to allow
|
|
them to be referenced e.g. as NVMEM providers.
|
|
|
|
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
|
|
---
|
|
block/partitions/core.c | 72 +++++++++++++++++++++++++++++++++++++++++
|
|
1 file changed, 72 insertions(+)
|
|
|
|
--- a/block/partitions/core.c
|
|
+++ b/block/partitions/core.c
|
|
@@ -10,6 +10,8 @@
|
|
#include <linux/ctype.h>
|
|
#include <linux/vmalloc.h>
|
|
#include <linux/raid/detect.h>
|
|
+#include <linux/property.h>
|
|
+
|
|
#include "check.h"
|
|
|
|
static int (*const check_part[])(struct parsed_partitions *) = {
|
|
@@ -295,6 +297,74 @@ static ssize_t whole_disk_show(struct de
|
|
}
|
|
static const DEVICE_ATTR(whole_disk, 0444, whole_disk_show, NULL);
|
|
|
|
+static bool part_meta_match(const char *attr, const char *member, size_t length)
|
|
+{
|
|
+ /* check if length of attr exceeds specified maximum length */
|
|
+ if (strnlen(attr, length) == length)
|
|
+ return false;
|
|
+
|
|
+ /* return true if strings match */
|
|
+ return !strncmp(attr, member, length);
|
|
+}
|
|
+
|
|
+static struct fwnode_handle *find_partition_fwnode(struct block_device *bdev)
|
|
+{
|
|
+ struct fwnode_handle *fw_parts, *fw_part;
|
|
+ struct device *ddev = disk_to_dev(bdev->bd_disk);
|
|
+ const char *partname, *uuid;
|
|
+ u32 partno;
|
|
+ bool got_uuid, got_partname, got_partno;
|
|
+
|
|
+ fw_parts = device_get_named_child_node(ddev, "partitions");
|
|
+ if (!fw_parts)
|
|
+ return NULL;
|
|
+
|
|
+ fwnode_for_each_child_node(fw_parts, fw_part) {
|
|
+ got_uuid = false;
|
|
+ got_partname = false;
|
|
+ got_partno = false;
|
|
+ /*
|
|
+ * In case 'uuid' is defined in the partitions firmware node
|
|
+ * require partition meta info being present and the specified
|
|
+ * uuid to match.
|
|
+ */
|
|
+ got_uuid = !fwnode_property_read_string(fw_part, "uuid", &uuid);
|
|
+ if (got_uuid && (!bdev->bd_meta_info ||
|
|
+ !part_meta_match(uuid, bdev->bd_meta_info->uuid,
|
|
+ PARTITION_META_INFO_UUIDLTH)))
|
|
+ continue;
|
|
+
|
|
+ /*
|
|
+ * In case 'partname' is defined in the partitions firmware node
|
|
+ * require partition meta info being present and the specified
|
|
+ * volname to match.
|
|
+ */
|
|
+ got_partname = !fwnode_property_read_string(fw_part, "partname",
|
|
+ &partname);
|
|
+ if (got_partname && (!bdev->bd_meta_info ||
|
|
+ !part_meta_match(partname,
|
|
+ bdev->bd_meta_info->volname,
|
|
+ PARTITION_META_INFO_VOLNAMELTH)))
|
|
+ continue;
|
|
+
|
|
+ /*
|
|
+ * In case 'partno' is defined in the partitions firmware node
|
|
+ * the specified partno needs to match.
|
|
+ */
|
|
+ got_partno = !fwnode_property_read_u32(fw_part, "partno", &partno);
|
|
+ if (got_partno && bdev->bd_partno != partno)
|
|
+ continue;
|
|
+
|
|
+ /* Skip if no matching criteria is present in firmware node */
|
|
+ if (!got_uuid && !got_partname && !got_partno)
|
|
+ continue;
|
|
+
|
|
+ return fw_part;
|
|
+ }
|
|
+
|
|
+ return NULL;
|
|
+}
|
|
+
|
|
/*
|
|
* Must be called either with open_mutex held, before a disk can be opened or
|
|
* after all disk users are gone.
|
|
@@ -377,6 +447,8 @@ static struct block_device *add_partitio
|
|
goto out_put;
|
|
}
|
|
|
|
+ device_set_node(pdev, find_partition_fwnode(bdev));
|
|
+
|
|
/* delay uevent until 'holders' subdir is created */
|
|
dev_set_uevent_suppress(pdev, 1);
|
|
err = device_add(pdev);
|