forked from openwrt/openwrt
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
generic: backport BLOCK OF support patch
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. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
- Loading branch information
Showing
10 changed files
with
470 additions
and
28 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
53 changes: 53 additions & 0 deletions
53
...neric/backport-6.6/410-v6.13-01-block-add-support-for-defining-read-only-partitions.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
From 03cb793b26834ddca170ba87057c8f883772dd45 Mon Sep 17 00:00:00 2001 | ||
From: Christian Marangi <ansuelsmth@gmail.com> | ||
Date: Thu, 3 Oct 2024 00:11:41 +0200 | ||
Subject: [PATCH 1/5] block: add support for defining read-only partitions | ||
|
||
Add support for defining read-only partitions and complete support for | ||
it in the cmdline partition parser as the additional "ro" after a | ||
partition is scanned but never actually applied. | ||
|
||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com> | ||
Reviewed-by: Christoph Hellwig <hch@lst.de> | ||
Link: https://lore.kernel.org/r/20241002221306.4403-2-ansuelsmth@gmail.com | ||
Signed-off-by: Jens Axboe <axboe@kernel.dk> | ||
--- | ||
block/blk.h | 1 + | ||
block/partitions/cmdline.c | 3 +++ | ||
block/partitions/core.c | 3 +++ | ||
3 files changed, 7 insertions(+) | ||
|
||
--- a/block/blk.h | ||
+++ b/block/blk.h | ||
@@ -424,6 +424,7 @@ void blk_free_ext_minor(unsigned int min | ||
#define ADDPART_FLAG_NONE 0 | ||
#define ADDPART_FLAG_RAID 1 | ||
#define ADDPART_FLAG_WHOLEDISK 2 | ||
+#define ADDPART_FLAG_READONLY 4 | ||
int bdev_add_partition(struct gendisk *disk, int partno, sector_t start, | ||
sector_t length); | ||
int bdev_del_partition(struct gendisk *disk, int partno); | ||
--- a/block/partitions/cmdline.c | ||
+++ b/block/partitions/cmdline.c | ||
@@ -237,6 +237,9 @@ static int add_part(int slot, struct cmd | ||
put_partition(state, slot, subpart->from >> 9, | ||
subpart->size >> 9); | ||
|
||
+ if (subpart->flags & PF_RDONLY) | ||
+ state->parts[slot].flags |= ADDPART_FLAG_READONLY; | ||
+ | ||
info = &state->parts[slot].info; | ||
|
||
strscpy(info->volname, subpart->name, sizeof(info->volname)); | ||
--- a/block/partitions/core.c | ||
+++ b/block/partitions/core.c | ||
@@ -392,6 +392,9 @@ static struct block_device *add_partitio | ||
goto out_del; | ||
} | ||
|
||
+ if (flags & ADDPART_FLAG_READONLY) | ||
+ bdev->bd_read_only = true; | ||
+ | ||
/* everything is up and running, commence */ | ||
err = xa_insert(&disk->part_tbl, partno, bdev, GFP_KERNEL); | ||
if (err) |
94 changes: 94 additions & 0 deletions
94
target/linux/generic/backport-6.6/410-v6.13-03-block-introduce-add_disk_fwnode.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,94 @@ | ||
From e5f587242b6072ffab4f4a084a459a59f3035873 Mon Sep 17 00:00:00 2001 | ||
From: Christian Marangi <ansuelsmth@gmail.com> | ||
Date: Thu, 3 Oct 2024 00:11:43 +0200 | ||
Subject: [PATCH 3/5] block: introduce add_disk_fwnode() | ||
|
||
Introduce add_disk_fwnode() as a replacement of device_add_disk() that | ||
permits to pass and attach a fwnode to disk dev. | ||
|
||
This variant can be useful for eMMC that might have the partition table | ||
for the disk defined in DT. A parser can later make use of the attached | ||
fwnode to parse the related table and init the hardcoded partition for | ||
the disk. | ||
|
||
device_add_disk() is converted to a simple wrapper of add_disk_fwnode() | ||
with the fwnode entry set as NULL. | ||
|
||
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com> | ||
Reviewed-by: Christoph Hellwig <hch@lst.de> | ||
Link: https://lore.kernel.org/r/20241002221306.4403-4-ansuelsmth@gmail.com | ||
Signed-off-by: Jens Axboe <axboe@kernel.dk> | ||
--- | ||
block/genhd.c | 28 ++++++++++++++++++++++++---- | ||
include/linux/blkdev.h | 3 +++ | ||
2 files changed, 27 insertions(+), 4 deletions(-) | ||
|
||
--- a/block/genhd.c | ||
+++ b/block/genhd.c | ||
@@ -383,16 +383,18 @@ int disk_scan_partitions(struct gendisk | ||
} | ||
|
||
/** | ||
- * device_add_disk - add disk information to kernel list | ||
+ * add_disk_fwnode - add disk information to kernel list with fwnode | ||
* @parent: parent device for the disk | ||
* @disk: per-device partitioning information | ||
* @groups: Additional per-device sysfs groups | ||
+ * @fwnode: attached disk fwnode | ||
* | ||
* This function registers the partitioning information in @disk | ||
- * with the kernel. | ||
+ * with the kernel. Also attach a fwnode to the disk device. | ||
*/ | ||
-int __must_check device_add_disk(struct device *parent, struct gendisk *disk, | ||
- const struct attribute_group **groups) | ||
+int __must_check add_disk_fwnode(struct device *parent, struct gendisk *disk, | ||
+ const struct attribute_group **groups, | ||
+ struct fwnode_handle *fwnode) | ||
|
||
{ | ||
struct device *ddev = disk_to_dev(disk); | ||
@@ -451,6 +453,8 @@ int __must_check device_add_disk(struct | ||
ddev->parent = parent; | ||
ddev->groups = groups; | ||
dev_set_name(ddev, "%s", disk->disk_name); | ||
+ if (fwnode) | ||
+ device_set_node(ddev, fwnode); | ||
if (!(disk->flags & GENHD_FL_HIDDEN)) | ||
ddev->devt = MKDEV(disk->major, disk->first_minor); | ||
ret = device_add(ddev); | ||
@@ -552,6 +556,22 @@ out_exit_elevator: | ||
elevator_exit(disk->queue); | ||
return ret; | ||
} | ||
+EXPORT_SYMBOL_GPL(add_disk_fwnode); | ||
+ | ||
+/** | ||
+ * device_add_disk - add disk information to kernel list | ||
+ * @parent: parent device for the disk | ||
+ * @disk: per-device partitioning information | ||
+ * @groups: Additional per-device sysfs groups | ||
+ * | ||
+ * This function registers the partitioning information in @disk | ||
+ * with the kernel. | ||
+ */ | ||
+int __must_check device_add_disk(struct device *parent, struct gendisk *disk, | ||
+ const struct attribute_group **groups) | ||
+{ | ||
+ return add_disk_fwnode(parent, disk, groups, NULL); | ||
+} | ||
EXPORT_SYMBOL(device_add_disk); | ||
|
||
static void blk_report_disk_dead(struct gendisk *disk, bool surprise) | ||
--- a/include/linux/blkdev.h | ||
+++ b/include/linux/blkdev.h | ||
@@ -741,6 +741,9 @@ static inline unsigned int blk_queue_dep | ||
#define for_each_bio(_bio) \ | ||
for (; _bio; _bio = _bio->bi_next) | ||
|
||
+int __must_check add_disk_fwnode(struct device *parent, struct gendisk *disk, | ||
+ const struct attribute_group **groups, | ||
+ struct fwnode_handle *fwnode); | ||
int __must_check device_add_disk(struct device *parent, struct gendisk *disk, | ||
const struct attribute_group **groups); | ||
static inline int __must_check add_disk(struct gendisk *disk) |
104 changes: 104 additions & 0 deletions
104
...eric/backport-6.6/410-v6.13-04-mmc-block-attach-partitions-fwnode-if-found-in-mmc-c.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
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; |
Oops, something went wrong.