disk: support MTD partitions
Add new MTD partition driver, which can be useful with mtdblock driver combination. Signed-off-by: Alexey Romanov <avromanov@salutedevices.com> Signed-off-by: Michael Trimarchi <michael@amarulasolutions.com>
This commit is contained in:

committed by
Michael Trimarchi

parent
b7d5ce05b1
commit
c29a6daec1
@@ -304,7 +304,8 @@ static void print_part_header(const char *type, struct blk_desc *desc)
|
|||||||
CONFIG_IS_ENABLED(DOS_PARTITION) || \
|
CONFIG_IS_ENABLED(DOS_PARTITION) || \
|
||||||
CONFIG_IS_ENABLED(ISO_PARTITION) || \
|
CONFIG_IS_ENABLED(ISO_PARTITION) || \
|
||||||
CONFIG_IS_ENABLED(AMIGA_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",
|
printf("\nPartition Map for %s device %d -- Partition Type: %s\n\n",
|
||||||
uclass_get_name(desc->uclass_id), desc->devnum, type);
|
uclass_get_name(desc->uclass_id), desc->devnum, type);
|
||||||
#endif /* any CONFIG_..._PARTITION */
|
#endif /* any CONFIG_..._PARTITION */
|
||||||
|
@@ -2,6 +2,7 @@ menu "MTD Support"
|
|||||||
|
|
||||||
config MTD_PARTITIONS
|
config MTD_PARTITIONS
|
||||||
bool
|
bool
|
||||||
|
select PARTITIONS
|
||||||
|
|
||||||
config MTD
|
config MTD
|
||||||
bool "Enable MTD layer"
|
bool "Enable MTD layer"
|
||||||
|
@@ -20,6 +20,8 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
|
#include <memalign.h>
|
||||||
|
#include <part.h>
|
||||||
#include <linux/bug.h>
|
#include <linux/bug.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/compat.h>
|
#include <linux/compat.h>
|
||||||
@@ -1054,3 +1056,77 @@ uint64_t mtd_get_device_size(const struct mtd_info *mtd)
|
|||||||
return mtd->size;
|
return mtd->size;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mtd_get_device_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)
|
||||||
|
{
|
||||||
|
struct mtd_info *master = blk_desc_to_mtd(dev_desc);
|
||||||
|
struct mtd_info *part;
|
||||||
|
|
||||||
|
if (!master) {
|
||||||
|
debug("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)
|
||||||
|
{
|
||||||
|
struct mtd_info *master = blk_desc_to_mtd(dev_desc);
|
||||||
|
struct mtd_info *part;
|
||||||
|
|
||||||
|
if (!master)
|
||||||
|
return;
|
||||||
|
|
||||||
|
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)
|
||||||
|
{
|
||||||
|
struct mtd_info *master = blk_desc_to_mtd(dev_desc);
|
||||||
|
ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, dev_desc->blksz);
|
||||||
|
|
||||||
|
if (!master)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
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,
|
||||||
|
};
|
||||||
|
@@ -30,12 +30,15 @@ struct block_drvr {
|
|||||||
#define PART_TYPE_ISO 0x03
|
#define PART_TYPE_ISO 0x03
|
||||||
#define PART_TYPE_AMIGA 0x04
|
#define PART_TYPE_AMIGA 0x04
|
||||||
#define PART_TYPE_EFI 0x05
|
#define PART_TYPE_EFI 0x05
|
||||||
|
#define PART_TYPE_MTD 0x06
|
||||||
|
|
||||||
/* maximum number of partition entries supported by search */
|
/* maximum number of partition entries supported by search */
|
||||||
#define DOS_ENTRY_NUMBERS 8
|
#define DOS_ENTRY_NUMBERS 8
|
||||||
#define ISO_ENTRY_NUMBERS 64
|
#define ISO_ENTRY_NUMBERS 64
|
||||||
#define MAC_ENTRY_NUMBERS 64
|
#define MAC_ENTRY_NUMBERS 64
|
||||||
#define AMIGA_ENTRY_NUMBERS 8
|
#define AMIGA_ENTRY_NUMBERS 8
|
||||||
|
#define MTD_ENTRY_NUMBERS 64
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Type string for U-Boot bootable partitions
|
* Type string for U-Boot bootable partitions
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user