[U-Boot] [RFC 1/3] dm: blk: add UCLASS_PARTITION
Heinrich Schuchardt
xypron.glpk at gmx.de
Tue Jan 29 22:20:01 UTC 2019
On 1/29/19 3:59 AM, AKASHI Takahiro wrote:
> UCLASS_PARTITION device will be created as a child node of
> UCLASS_BLK device.
>
> Signed-off-by: AKASHI Takahiro <takahiro.akashi at linaro.org>
> ---
> drivers/block/blk-uclass.c | 52 ++++++++++++++++++++++++++++++++++++++
> include/dm/uclass-id.h | 1 +
> 2 files changed, 53 insertions(+)
>
> diff --git a/drivers/block/blk-uclass.c b/drivers/block/blk-uclass.c
> index baaf431e5e0c..d4ca30f23fc1 100644
> --- a/drivers/block/blk-uclass.c
> +++ b/drivers/block/blk-uclass.c
> @@ -10,6 +10,8 @@
> #include <dm/device-internal.h>
> #include <dm/lists.h>
> #include <dm/uclass-internal.h>
> +#include <part.h>
> +#include <string.h>
>
> static const char *if_typename_str[IF_TYPE_COUNT] = {
> [IF_TYPE_IDE] = "ide",
> @@ -654,3 +656,53 @@ UCLASS_DRIVER(blk) = {
> .post_probe = blk_post_probe,
> .per_device_platdata_auto_alloc_size = sizeof(struct blk_desc),
> };
> +
> +U_BOOT_DRIVER(blk_partition) = {
> + .name = "blk_partition",
> + .id = UCLASS_PARTITION,
> + .platdata_auto_alloc_size = sizeof(struct disk_part),
> +};
> +
> +UCLASS_DRIVER(partition) = {
> + .id = UCLASS_PARTITION,
> + .name = "partition",
> +};
> +
> +#if defined(CONFIG_PARTITIONS) && defined(CONFIG_HAVE_BLOCK_DEVICE)
> +int blk_create_partitions(struct udevice *parent)
> +{
> + int part;
> + struct blk_desc *desc = dev_get_uclass_platdata(parent);
> + disk_partition_t info;
> + struct disk_part *part_data;
> + char devname[32];
> + struct udevice *dev;
> + int disks = 0, ret;
> +
> + /* Add devices for each partition */
> + for (part = 1; part <= MAX_SEARCH_PARTITIONS; part++) {
> + if (part_get_info(desc, part, &info))
> + continue;
> + snprintf(devname, sizeof(devname), "%s:%d", parent->name,
> + part);
> +
> + ret = device_bind_driver(parent, "blk_partition",
> + strdup(devname), &dev);
> + if (ret)
This looks like a memory leak for the output of strdup().
> + return ret;
Why would we leave here if one partition fails?
Does this imply that all further partitions will fail?
Should we use continue here?
Best regards
Heinrich
> +
> + part_data = dev_get_uclass_platdata(dev);
> + part_data->partnum = part;
> + part_data->gpt_part_info = info;
> +
> + disks++;
> + }
> +
> + return disks;
> +}
> +#else
> +int blk_create_partitions(struct udevice *dev)
> +{
> + return 0;
> +}
> +#endif
> diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h
> index f3bafb3c6353..e02b5f8fda42 100644
> --- a/include/dm/uclass-id.h
> +++ b/include/dm/uclass-id.h
> @@ -65,6 +65,7 @@ enum uclass_id {
> UCLASS_NVME, /* NVM Express device */
> UCLASS_PANEL, /* Display panel, such as an LCD */
> UCLASS_PANEL_BACKLIGHT, /* Backlight controller for panel */
> + UCLASS_PARTITION, /* Logical disk partition device */
> UCLASS_PCH, /* x86 platform controller hub */
> UCLASS_PCI, /* PCI bus */
> UCLASS_PCI_GENERIC, /* Generic PCI bus device */
>
More information about the U-Boot
mailing list