[U-Boot] [PATCH v6 25/31] cmd: mtdparts: add a generic 'mtdparts' parser

Boris Brezillon boris.brezillon at bootlin.com
Thu Aug 16 17:04:43 UTC 2018


On Thu, 16 Aug 2018 17:30:23 +0200
Miquel Raynal <miquel.raynal at bootlin.com> wrote:

>  
> +int mtdparts_parse_part(struct mtd_info *parent, const char **_mtdparts,
> +			struct mtd_partition **_parts, int *_nb_parts)
> +{
> +	const char *mtdparts = *_mtdparts;
> +	struct part_info *part_legacy;
> +	struct mtd_partition *parts;
> +	int cur_off = 0, cur_sz = 0;
> +	int nb_parts = 0;
> +	char *names;
> +	int ret, idx;
> +
> +	*_parts = NULL;
> +	*_nb_parts = 0;
> +
> +	/* First, iterate over the partitions until we know their number */
> +	while (mtdparts[0] != '\0' && mtdparts[0] != ';') {
> +		ret = part_parse(mtdparts, &mtdparts, &part_legacy);
> +		if (ret)
> +			return ret;
> +
> +		nb_parts++;
> +		free(part_legacy);
> +	}
> +
> +	/* Allocate an array of partitions to give back to the caller */
> +	parts = malloc((sizeof(*parts) + 20) * nb_parts);
> +	names = (char *)&parts[nb_parts];
> +	if (!parts) {
> +		printf("Could not allocate enough space to save partitions meta-data\n");
> +		return -ENOMEM;
> +	}
> +
> +	/* Iterate again over each partition to save the data in our array */
> +	for (idx = 0; idx < nb_parts; idx++) {
> +		char *name;
> +
> +		ret = part_parse(*_mtdparts, _mtdparts, &part_legacy);
> +		if (ret)
> +			return ret;
> +
> +		name = &names[idx * 20];
> +		strncpy(name, part_legacy->name, 20);
> +		parts[idx].name = name;
> +
> +		parts[idx].size = part_legacy->size;
> +		if (parts[idx].size == SIZE_REMAINING)
> +			parts[idx].size = parent->size - cur_sz;
> +		cur_sz += parts[idx].size;
> +
> +		parts[idx].offset = part_legacy->offset;
> +		if (parts[idx].offset == OFFSET_NOT_SPECIFIED)
> +			parts[idx].offset = cur_off;
> +		cur_off += parts[idx].size;
> +
> +		parts[idx].mask_flags = part_legacy->mask_flags;
> +		parts[idx].ecclayout = parent->ecclayout;
> +
> +		free(part_legacy);
> +	}
> +
> +	/* Offset by one mtdparts to point to the next device if needed */
> +	if (*_mtdparts[0] == ';')
> +		_mtdparts++;
> +
> +	*_parts = parts;
> +	*_nb_parts = nb_parts;
> +
> +	return 0;
> +}
>

I guess the CMD_MTD dependency on CMD_MTDPARTS comes from here. Can't
we just move mtdparts_parse_part()+part_parse() somewhere in
drivers/mtd/ and remove this dependency?



More information about the U-Boot mailing list