mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-23 15:32:33 +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>
105 lines
3.7 KiB
Diff
105 lines
3.7 KiB
Diff
From 45ff6c340ddfc2dade74d5b7a8962c778ab7042c Mon Sep 17 00:00:00 2001
|
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
|
Date: Thu, 3 Oct 2024 00:11:44 +0200
|
|
Subject: [PATCH 4/5] mmc: block: attach partitions fwnode if found in mmc-card
|
|
|
|
Attach partitions fwnode if found in mmc-card and register disk with it.
|
|
|
|
This permits block partition to reference the node and register a
|
|
partition table defined in DT for the special case for embedded device
|
|
that doesn't have a partition table flashed but have an hardcoded
|
|
partition table passed from the system.
|
|
|
|
JEDEC BOOT partition boot0/boot1 are supported but in DT we refer with
|
|
the JEDEC name of boot1 and boot2 to better adhere to documentation.
|
|
|
|
Also JEDEC GP partition gp0/1/2/3 are supported but in DT we refer with
|
|
the JEDEC name of gp1/2/3/4 to better adhere to documentration.
|
|
|
|
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
|
|
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
|
|
Link: https://lore.kernel.org/r/20241002221306.4403-5-ansuelsmth@gmail.com
|
|
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
|
---
|
|
drivers/mmc/core/block.c | 55 +++++++++++++++++++++++++++++++++++++++-
|
|
1 file changed, 54 insertions(+), 1 deletion(-)
|
|
|
|
--- a/drivers/mmc/core/block.c
|
|
+++ b/drivers/mmc/core/block.c
|
|
@@ -2455,6 +2455,56 @@ static inline int mmc_blk_readonly(struc
|
|
!(card->csd.cmdclass & CCC_BLOCK_WRITE);
|
|
}
|
|
|
|
+/*
|
|
+ * Search for a declared partitions node for the disk in mmc-card related node.
|
|
+ *
|
|
+ * This is to permit support for partition table defined in DT in special case
|
|
+ * where a partition table is not written in the disk and is expected to be
|
|
+ * passed from the running system.
|
|
+ *
|
|
+ * For the user disk, "partitions" node is searched.
|
|
+ * For the special HW disk, "partitions-" node with the appended name is used
|
|
+ * following this conversion table (to adhere to JEDEC naming)
|
|
+ * - boot0 -> partitions-boot1
|
|
+ * - boot1 -> partitions-boot2
|
|
+ * - gp0 -> partitions-gp1
|
|
+ * - gp1 -> partitions-gp2
|
|
+ * - gp2 -> partitions-gp3
|
|
+ * - gp3 -> partitions-gp4
|
|
+ */
|
|
+static struct fwnode_handle *mmc_blk_get_partitions_node(struct device *mmc_dev,
|
|
+ const char *subname)
|
|
+{
|
|
+ const char *node_name = "partitions";
|
|
+
|
|
+ if (subname) {
|
|
+ mmc_dev = mmc_dev->parent;
|
|
+
|
|
+ /*
|
|
+ * Check if we are allocating a BOOT disk boot0/1 disk.
|
|
+ * In DT we use the JEDEC naming boot1/2.
|
|
+ */
|
|
+ if (!strcmp(subname, "boot0"))
|
|
+ node_name = "partitions-boot1";
|
|
+ if (!strcmp(subname, "boot1"))
|
|
+ node_name = "partitions-boot2";
|
|
+ /*
|
|
+ * Check if we are allocating a GP disk gp0/1/2/3 disk.
|
|
+ * In DT we use the JEDEC naming gp1/2/3/4.
|
|
+ */
|
|
+ if (!strcmp(subname, "gp0"))
|
|
+ node_name = "partitions-gp1";
|
|
+ if (!strcmp(subname, "gp1"))
|
|
+ node_name = "partitions-gp2";
|
|
+ if (!strcmp(subname, "gp2"))
|
|
+ node_name = "partitions-gp3";
|
|
+ if (!strcmp(subname, "gp3"))
|
|
+ node_name = "partitions-gp4";
|
|
+ }
|
|
+
|
|
+ return device_get_named_child_node(mmc_dev, node_name);
|
|
+}
|
|
+
|
|
static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card,
|
|
struct device *parent,
|
|
sector_t size,
|
|
@@ -2463,6 +2513,7 @@ static struct mmc_blk_data *mmc_blk_allo
|
|
int area_type,
|
|
unsigned int part_type)
|
|
{
|
|
+ struct fwnode_handle *disk_fwnode;
|
|
struct mmc_blk_data *md;
|
|
int devidx, ret;
|
|
char cap_str[10];
|
|
@@ -2568,7 +2619,9 @@ static struct mmc_blk_data *mmc_blk_allo
|
|
/* used in ->open, must be set before add_disk: */
|
|
if (area_type == MMC_BLK_DATA_AREA_MAIN)
|
|
dev_set_drvdata(&card->dev, md);
|
|
- ret = device_add_disk(md->parent, md->disk, mmc_disk_attr_groups);
|
|
+ disk_fwnode = mmc_blk_get_partitions_node(parent, subname);
|
|
+ ret = add_disk_fwnode(md->parent, md->disk, mmc_disk_attr_groups,
|
|
+ disk_fwnode);
|
|
if (ret)
|
|
goto err_put_disk;
|
|
return md;
|