[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