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 <avroma...@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
   */

Reply via email to