[PATCH v3 1/3] disk: support MTD partitions
Alexey Romanov
avromanov at salutedevices.com
Thu Apr 4 12:58:11 CEST 2024
Add new MTD partition driver, which can be useful with
mtdblock driver combination.
Signed-off-by: Alexey Romanov <avromanov at salutedevices.com>
---
disk/part.c | 3 +-
drivers/mtd/Kconfig | 1 +
drivers/mtd/mtdpart.c | 69 +++++++++++++++++++++++++++++++++++++++++++
include/part.h | 3 ++
4 files changed, 75 insertions(+), 1 deletion(-)
diff --git a/disk/part.c b/disk/part.c
index b6b485a637..5ed7dee6fa 100644
--- a/disk/part.c
+++ b/disk/part.c
@@ -304,7 +304,8 @@ static void print_part_header(const char *type, struct blk_desc *desc)
CONFIG_IS_ENABLED(DOS_PARTITION) || \
CONFIG_IS_ENABLED(ISO_PARTITION) || \
CONFIG_IS_ENABLED(AMIGA_PARTITION) || \
- CONFIG_IS_ENABLED(EFI_PARTITION)
+ CONFIG_IS_ENABLED(EFI_PARTITION) || \
+ CONFIG_IS_ENABLED(MTD_PARTITIONS)
printf("\nPartition Map for %s device %d -- Partition Type: %s\n\n",
uclass_get_name(desc->uclass_id), desc->devnum, type);
#endif /* any CONFIG_..._PARTITION */
diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
index 1902351719..40272f7e50 100644
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
@@ -2,6 +2,7 @@ menu "MTD Support"
config MTD_PARTITIONS
bool
+ select PARTITIONS
config MTD
bool "Enable MTD layer"
diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
index 4886392a1c..67244869f2 100644
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
@@ -21,6 +21,8 @@
#include <common.h>
#include <malloc.h>
+#include <memalign.h>
+#include <part.h>
#include <linux/bug.h>
#include <linux/errno.h>
#include <linux/compat.h>
@@ -1055,3 +1057,70 @@ uint64_t mtd_get_device_size(const struct mtd_info *mtd)
return mtd->size;
}
EXPORT_SYMBOL_GPL(mtd_get_device_size);
+
+static struct mtd_info *mtd_get_partition_by_index(struct mtd_info *mtd, int index)
+{
+ struct mtd_info *part;
+ int i = 0;
+
+ list_for_each_entry(part, &mtd->partitions, node)
+ if (i++ == index)
+ return part;
+
+ debug("Partition with idx=%d not found on MTD device %s\n", index, mtd->name);
+ return NULL;
+}
+
+static int part_get_info_mtd(struct blk_desc *dev_desc, int part_idx,
+ struct disk_partition *info)
+{
+ struct mtd_info *master = blk_desc_to_mtd(dev_desc);
+ struct mtd_info *part;
+
+ if (!master) {
+ pr_err("MTD device is NULL\n");
+ return -EINVAL;
+ }
+
+ part = mtd_get_partition_by_index(master, part_idx);
+ if (!part) {
+ debug("Failed to find partition with idx=%d\n", part_idx);
+ return -EINVAL;
+ }
+
+ snprintf(info->name, PART_NAME_LEN, part->name);
+ info->start = part->offset / dev_desc->blksz;
+ info->size = part->size / dev_desc->blksz;
+ info->blksz = dev_desc->blksz;
+
+ return 0;
+}
+
+static void part_print_mtd(struct blk_desc *dev_desc)
+{
+ struct mtd_info *master = blk_desc_to_mtd(dev_desc);
+ struct mtd_info *part;
+
+ list_for_each_entry(part, &master->partitions, node)
+ printf("- 0x%012llx-0x%012llx : \"%s\"\n",
+ part->offset, part->offset + part->size, part->name);
+}
+
+static int part_test_mtd(struct blk_desc *dev_desc)
+{
+ ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, dev_desc->blksz);
+
+ if (blk_dread(dev_desc, 0, 1, (ulong *)buffer) != 1)
+ return -1;
+
+ return 0;
+}
+
+U_BOOT_PART_TYPE(mtd) = {
+ .name = "MTD",
+ .part_type = PART_TYPE_MTD,
+ .max_entries = MTD_ENTRY_NUMBERS,
+ .get_info = part_get_info_ptr(part_get_info_mtd),
+ .print = part_print_ptr(part_print_mtd),
+ .test = part_test_mtd,
+};
diff --git a/include/part.h b/include/part.h
index db34bc6bb7..85c1b881b9 100644
--- a/include/part.h
+++ b/include/part.h
@@ -30,12 +30,15 @@ struct block_drvr {
#define PART_TYPE_ISO 0x03
#define PART_TYPE_AMIGA 0x04
#define PART_TYPE_EFI 0x05
+#define PART_TYPE_MTD 0x06
/* maximum number of partition entries supported by search */
#define DOS_ENTRY_NUMBERS 8
#define ISO_ENTRY_NUMBERS 64
#define MAC_ENTRY_NUMBERS 64
#define AMIGA_ENTRY_NUMBERS 8
+#define MTD_ENTRY_NUMBERS 64
+
/*
* Type string for U-Boot bootable partitions
*/
--
2.34.1
More information about the U-Boot
mailing list