[PATCH v1 2/4] disk: support MTD partitions
Heinrich Schuchardt
xypron.glpk at gmx.de
Tue Feb 27 14:28:55 CET 2024
On 27.02.24 11:04, Alexey Romanov wrote:
> 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 | 5 +++-
> drivers/mtd/Kconfig | 1 +
> drivers/mtd/mtdpart.c | 69 +++++++++++++++++++++++++++++++++++++++++++
> include/part.h | 2 ++
> 4 files changed, 76 insertions(+), 1 deletion(-)
>
> diff --git a/disk/part.c b/disk/part.c
> index 36b88205ec..0fc5cc0419 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)
> puts ("\nPartition Map for ");
> switch (desc->uclass_id) {
> case UCLASS_IDE:
> @@ -343,6 +344,8 @@ static void print_part_header(const char *type, struct blk_desc *desc)
> case UCLASS_BLKMAP:
> puts("BLKMAP");
> break;
> + case UCLASS_MTD:
> + puts("MTD");
> default:
> printf("UNKNOWN(%d)", desc->uclass_id);
> break;
> 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..608908c193 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 __maybe_unused part_get_info_mtd(struct blk_desc *dev_desc, int part_idx,
> + struct disk_partition *info)
You use the function in U_BOOT_PART_TYPE(mtd). In struct part_driver
there are no conditional fields. Why mark it as __maybe_unused?
> +{
> + 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 __maybe_unused part_print_mtd(struct blk_desc *dev_desc)
ditto
Best regards
Heinrich
> +{
> + 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..f7f3773a95 100644
> --- a/include/part.h
> +++ b/include/part.h
> @@ -30,12 +30,14 @@ 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
> */
More information about the U-Boot
mailing list