Re: [U-Boot] [RFC 1/3] dm: blk: add UCLASS_PARTITION

2019-01-30 Thread Simon Glass
Hi Takahiro,

On Mon, 28 Jan 2019 at 19:59, AKASHI Takahiro
 wrote:
>
> UCLASS_PARTITION device will be created as a child node of
> UCLASS_BLK device.
>
> Signed-off-by: AKASHI Takahiro 
> ---
>  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 
>  #include 
>  #include 
> +#include 
> +#include 
>
>  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)
> +   return ret;
> +
> +   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 */
> --
> 2.19.1
>

This looks OK to me. It does need a test in test/dm/partition.c for
the new uclass.

Regards,
Simon
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [RFC 1/3] dm: blk: add UCLASS_PARTITION

2019-01-29 Thread AKASHI Takahiro
On Tue, Jan 29, 2019 at 11:20:01PM +0100, Heinrich Schuchardt wrote:
> 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 
> > ---
> >  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 
> >  #include 
> >  #include 
> > +#include 
> > +#include 
> >  
> >  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().

Yes, I'm aware of that, but please note that this is a prototype
and so I haven't paid much attention to failure cases (error recovery).
First of all, even in the current implementation, we don't support
*unplugging* (or unbind in EFI jargon?) devices.
It's a more fundamental issue.

> > +   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?

Ditto. Please be patient for the time being :)

-Takahiro Akashi

> 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 */
> > 
> 
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [RFC 1/3] dm: blk: add UCLASS_PARTITION

2019-01-29 Thread Heinrich Schuchardt
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 
> ---
>  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 
>  #include 
>  #include 
> +#include 
> +#include 
>  
>  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 */
> 

___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [RFC 1/3] dm: blk: add UCLASS_PARTITION

2019-01-29 Thread Philipp Tomsich

> On 29.01.2019, at 18:46, Sergey Kubushyn  wrote:
> 
> On Tue, 29 Jan 2019, Alexander Graf wrote:
> 
>> On 01/29/2019 04:17 AM, Sergey Kubushyn wrote:
>>> On Tue, 29 Jan 2019, AKASHI Takahiro wrote:
>>> 
>>> My $.25 -- IMHO, block device partitions in Device Tree is _NOT_ a very
>>> good
>>> idea.
>> 
>> This is about device model, not device tree :). Device trees indeed should 
>> not contain partition information. Our internal object model however would 
>> do well if it had them.
> 
> DM assumes using Device Tree.

As there’s no compatible-string, this indeed is for the internal object model 
only.
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [RFC 1/3] dm: blk: add UCLASS_PARTITION

2019-01-29 Thread Sergey Kubushyn

On Tue, 29 Jan 2019, Alexander Graf wrote:


On 01/29/2019 04:17 AM, Sergey Kubushyn wrote:

 On Tue, 29 Jan 2019, AKASHI Takahiro wrote:

 My $.25 -- IMHO, block device partitions in Device Tree is _NOT_ a very
 good
 idea.


This is about device model, not device tree :). Device trees indeed should 
not contain partition information. Our internal object model however would do 
well if it had them.


DM assumes using Device Tree.

---
**
*  KSI@homeKOI8 Net  < >  The impossible we do immediately.  *
*  Las Vegas   NV, USA   < >  Miracles require 24-hour notice.   *
**
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [RFC 1/3] dm: blk: add UCLASS_PARTITION

2019-01-29 Thread Alexander Graf

On 01/29/2019 04:17 AM, Sergey Kubushyn wrote:

On Tue, 29 Jan 2019, AKASHI Takahiro wrote:

My $.25 -- IMHO, block device partitions in Device Tree is _NOT_ a 
very good

idea.


This is about device model, not device tree :). Device trees indeed 
should not contain partition information. Our internal object model 
however would do well if it had them.



Alex

___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [RFC 1/3] dm: blk: add UCLASS_PARTITION

2019-01-28 Thread Sergey Kubushyn

On Tue, 29 Jan 2019, AKASHI Takahiro wrote:

My $.25 -- IMHO, block device partitions in Device Tree is _NOT_ a very good
idea.

What if one decided to re-partition his drive? Or just use bigger or smaller
drive? Would he has to re-write DTS file and re-compile everything? And such
change is not something extraordinary, it is a routine action.

IMHO partitions do _NOT_ belong to Block Device. That's what partition
tables are.

It _MIGHT_ make sense for some particular devices such as MTD that don't
have partition tables but _NOT_ for Block Devices in general.


UCLASS_PARTITION device will be created as a child node of
UCLASS_BLK device.

Signed-off-by: AKASHI Takahiro 


---
**
*  KSI@homeKOI8 Net  < >  The impossible we do immediately.  *
*  Las Vegas   NV, USA   < >  Miracles require 24-hour notice.   *
**
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


[U-Boot] [RFC 1/3] dm: blk: add UCLASS_PARTITION

2019-01-28 Thread AKASHI Takahiro
UCLASS_PARTITION device will be created as a child node of
UCLASS_BLK device.

Signed-off-by: AKASHI Takahiro 
---
 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 
 #include 
 #include 
+#include 
+#include 
 
 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)
+   return ret;
+
+   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 */
-- 
2.19.1

___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot