diff options
| author | Ben Gardiner <bengardiner@nanometrics.ca> | 2010-08-31 17:48:02 -0400 | 
|---|---|---|
| committer | Scott Wood <scottwood@freescale.com> | 2010-10-11 15:11:00 -0500 | 
| commit | 04ac380288ea8c334efdf938766e2748056a2821 (patch) | |
| tree | 807853c8b0c7f6d95c3601147d8dad11c2960e14 | |
| parent | 4ba692fb1e413db974037238370b8402c8a60750 (diff) | |
| download | olio-uboot-2014.01-04ac380288ea8c334efdf938766e2748056a2821.tar.xz olio-uboot-2014.01-04ac380288ea8c334efdf938766e2748056a2821.zip | |
mtdparts: show net size in mtdparts list
This patch adds an additional column to the output of list_partitions. The
additional column will contain the net size and a '(!)' beside it if the net
size is not equal to the partition size.
Signed-off-by: Ben Gardiner <bengardiner@nanometrics.ca>
CC: Wolfgang Denk <wd@denx.de>
CC: Scott Wood <scottwood@freescale.com>
| -rw-r--r-- | common/cmd_mtdparts.c | 68 | 
1 files changed, 61 insertions, 7 deletions
| diff --git a/common/cmd_mtdparts.c b/common/cmd_mtdparts.c index 772ad5451..266844f14 100644 --- a/common/cmd_mtdparts.c +++ b/common/cmd_mtdparts.c @@ -1215,38 +1215,92 @@ static int generate_mtdparts_save(char *buf, u32 buflen)  	return ret;  } +#if defined(CONFIG_CMD_MTDPARTS_SHOW_NET_SIZES)  /** - * Format and print out a partition list for each device from global device - * list. + * Get the net size (w/o bad blocks) of the given partition. + * + * @param mtd the mtd info + * @param part the partition + * @return the calculated net size of this partition   */ -static void list_partitions(void) +static uint64_t net_part_size(struct mtd_info *mtd, struct part_info *part) +{ +	if (!mtd->block_isbad) +		return part->size; + +	uint64_t i, net_size = 0; + +	for (i = 0; i < part->size; i += mtd->erasesize) { +		if (!mtd->block_isbad(mtd, part->offset + i)) +			net_size += mtd->erasesize; +	} +	return net_size; +} +#endif + +static void print_partition_table(void)  {  	struct list_head *dentry, *pentry;  	struct part_info *part;  	struct mtd_device *dev;  	int part_num; -	debug("\n---list_partitions---\n");  	list_for_each(dentry, &devices) {  		dev = list_entry(dentry, struct mtd_device, link); +		/* list partitions for given device */ +		part_num = 0; +#if defined(CONFIG_CMD_MTDPARTS_SHOW_NET_SIZES) +		struct mtd_info *mtd; + +		if (get_mtd_info(dev->id->type, dev->id->num, &mtd)) +			return; + +		printf("\ndevice %s%d <%s>, # parts = %d\n", +				MTD_DEV_TYPE(dev->id->type), dev->id->num, +				dev->id->mtd_id, dev->num_parts); +		printf(" #: name\t\tsize\t\tnet size\toffset\t\tmask_flags\n"); + +		list_for_each(pentry, &dev->parts) { +			u32 net_size; +			char *size_note; + +			part = list_entry(pentry, struct part_info, link); +			net_size = net_part_size(mtd, part); +			size_note = part->size == net_size ? " " : " (!)"; +			printf("%2d: %-20s0x%08x\t0x%08x%s\t0x%08x\t%d\n", +					part_num, part->name, part->size, +					net_size, size_note, part->offset, +					part->mask_flags); +#else /* !defined(CONFIG_CMD_MTDPARTS_SHOW_NET_SIZES) */  		printf("\ndevice %s%d <%s>, # parts = %d\n",  				MTD_DEV_TYPE(dev->id->type), dev->id->num,  				dev->id->mtd_id, dev->num_parts);  		printf(" #: name\t\tsize\t\toffset\t\tmask_flags\n"); -		/* list partitions for given device */ -		part_num = 0;  		list_for_each(pentry, &dev->parts) {  			part = list_entry(pentry, struct part_info, link);  			printf("%2d: %-20s0x%08x\t0x%08x\t%d\n",  					part_num, part->name, part->size,  					part->offset, part->mask_flags); - +#endif /* defined(CONFIG_CMD_MTDPARTS_SHOW_NET_SIZES) */  			part_num++;  		}  	} +  	if (list_empty(&devices))  		printf("no partitions defined\n"); +} + +/** + * Format and print out a partition list for each device from global device + * list. + */ +static void list_partitions(void) +{ +	struct part_info *part; + +	debug("\n---list_partitions---\n"); +	print_partition_table();  	/* current_mtd_dev is not NULL only when we have non empty device list */  	if (current_mtd_dev) { |