mtdparts: new add.spread: add part skipping bad blocks

This patch adds a new 'mtdparts add' variant: add.spread. This command variant
adds a new partition to the mtdparts variable but also increases the partitions
size by skipping bad blocks and aggregating any additional bad blocks found at
the end of the partition.

Signed-off-by: Ben Gardiner <bengardiner@nanometrics.ca>
CC: Wolfgang Denk <wd@denx.de>
CC: Scott Wood <scottwood@freescale.com>
This commit is contained in:
Ben Gardiner 2010-08-31 17:48:04 -04:00 committed by Scott Wood
parent ca75b20ebb
commit 59a50d2de1
1 changed files with 26 additions and 8 deletions

View File

@ -1949,9 +1949,13 @@ int do_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
} }
/* mtdparts add <mtd-dev> <size>[@<offset>] <name> [ro] */ /* mtdparts add <mtd-dev> <size>[@<offset>] <name> [ro] */
if (((argc == 5) || (argc == 6)) && (strcmp(argv[1], "add") == 0)) { if (((argc == 5) || (argc == 6)) && (strncmp(argv[1], "add", 3) == 0)) {
#define PART_ADD_DESC_MAXLEN 64 #define PART_ADD_DESC_MAXLEN 64
char tmpbuf[PART_ADD_DESC_MAXLEN]; char tmpbuf[PART_ADD_DESC_MAXLEN];
#if defined(CONFIG_CMD_MTDPARTS_SPREAD)
struct mtd_info *mtd;
uint64_t next_offset;
#endif
u8 type, num, len; u8 type, num, len;
struct mtd_device *dev; struct mtd_device *dev;
struct mtd_device *dev_tmp; struct mtd_device *dev_tmp;
@ -1986,15 +1990,25 @@ int do_mtdparts(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
debug("+ %s\t%d\t%s\n", MTD_DEV_TYPE(dev->id->type), debug("+ %s\t%d\t%s\n", MTD_DEV_TYPE(dev->id->type),
dev->id->num, dev->id->mtd_id); dev->id->num, dev->id->mtd_id);
if ((dev_tmp = device_find(dev->id->type, dev->id->num)) == NULL) { p = list_entry(dev->parts.next, struct part_info, link);
#if defined(CONFIG_CMD_MTDPARTS_SPREAD)
if (get_mtd_info(dev->id->type, dev->id->num, &mtd))
return 1;
if (!strcmp(&argv[1][3], ".spread")) {
spread_partition(mtd, p, &next_offset);
debug("increased %s to %d bytes\n", p->name, p->size);
}
#endif
dev_tmp = device_find(dev->id->type, dev->id->num);
if (dev_tmp == NULL) {
device_add(dev); device_add(dev);
} else { } else if (part_add(dev_tmp, p) != 0) {
/* merge new partition with existing ones*/ /* merge new partition with existing ones*/
p = list_entry(dev->parts.next, struct part_info, link); device_del(dev);
if (part_add(dev_tmp, p) != 0) { return 1;
device_del(dev);
return 1;
}
} }
if (generate_mtdparts_save(last_parts, MTDPARTS_MAXLEN) != 0) { if (generate_mtdparts_save(last_parts, MTDPARTS_MAXLEN) != 0) {
@ -2039,6 +2053,10 @@ U_BOOT_CMD(
" - delete partition (e.g. part-id = nand0,1)\n" " - delete partition (e.g. part-id = nand0,1)\n"
"mtdparts add <mtd-dev> <size>[@<offset>] [<name>] [ro]\n" "mtdparts add <mtd-dev> <size>[@<offset>] [<name>] [ro]\n"
" - add partition\n" " - add partition\n"
#if defined(CONFIG_CMD_MTDPARTS_SPREAD)
"mtdparts add.spread <mtd-dev> <size>[@<offset>] [<name>] [ro]\n"
" - add partition, padding size by skipping bad blocks\n"
#endif
"mtdparts default\n" "mtdparts default\n"
" - reset partition table to defaults\n" " - reset partition table to defaults\n"
#if defined(CONFIG_CMD_MTDPARTS_SPREAD) #if defined(CONFIG_CMD_MTDPARTS_SPREAD)