diff mbox series

[U-Boot,v3,2/4] block: ide: Fix block read/write with driver model

Message ID 1504683022-23843-2-git-send-email-bmeng.cn@gmail.com
State Superseded
Delegated to: Tom Rini
Headers show
Series [U-Boot,v3,1/4] blk: Use macros for block device vendor/product/rev string size | expand

Commit Message

Bin Meng Sept. 6, 2017, 7:30 a.m. UTC
This converts the IDE driver to driver model so that block read and
write are fully functional.

Fixes: b7c6baef ("x86: Convert MMC to driver model")
Reported-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>

Reviewed-by: Simon Glass <sjg@chromium.org>
Tested-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---

Changes in v3:
- Updated BLK_XXX_SIZE usage

Changes in v2:
- Fixed 'fatls ide 0' issue

 drivers/block/blk-uclass.c |  2 +-
 drivers/block/ide.c        | 70 ++++++++++++++++++++++++++++++++++++++++++++++
 include/dm/uclass-id.h     |  1 +
 3 files changed, 72 insertions(+), 1 deletion(-)

Comments

Bin Meng Sept. 9, 2017, 12:30 a.m. UTC | #1
Hi Tom,

On Wed, Sep 6, 2017 at 3:30 PM, Bin Meng <bmeng.cn@gmail.com> wrote:
> This converts the IDE driver to driver model so that block read and
> write are fully functional.
>
> Fixes: b7c6baef ("x86: Convert MMC to driver model")
> Reported-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
>
> Reviewed-by: Simon Glass <sjg@chromium.org>
> Tested-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
>
> Changes in v3:
> - Updated BLK_XXX_SIZE usage
>
> Changes in v2:
> - Fixed 'fatls ide 0' issue
>
>  drivers/block/blk-uclass.c |  2 +-
>  drivers/block/ide.c        | 70 ++++++++++++++++++++++++++++++++++++++++++++++
>  include/dm/uclass-id.h     |  1 +
>  3 files changed, 72 insertions(+), 1 deletion(-)
>

Will you take this series in 2017.09?

Regards,
Bin
Tom Rini Sept. 9, 2017, 3:25 a.m. UTC | #2
On Sat, Sep 09, 2017 at 08:30:44AM +0800, Bin Meng wrote:
> Hi Tom,
> 
> On Wed, Sep 6, 2017 at 3:30 PM, Bin Meng <bmeng.cn@gmail.com> wrote:
> > This converts the IDE driver to driver model so that block read and
> > write are fully functional.
> >
> > Fixes: b7c6baef ("x86: Convert MMC to driver model")
> > Reported-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> > Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
> >
> > Reviewed-by: Simon Glass <sjg@chromium.org>
> > Tested-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> > ---
> >
> > Changes in v3:
> > - Updated BLK_XXX_SIZE usage
> >
> > Changes in v2:
> > - Fixed 'fatls ide 0' issue
> >
> >  drivers/block/blk-uclass.c |  2 +-
> >  drivers/block/ide.c        | 70 ++++++++++++++++++++++++++++++++++++++++++++++
> >  include/dm/uclass-id.h     |  1 +
> >  3 files changed, 72 insertions(+), 1 deletion(-)
> >
> 
> Will you take this series in 2017.09?

I would swear that we declare vendor/etc as size + 1 so that we can
ensure that size+1==NULL and only write up to size into the field.  But
the rest of this patch strncpy's to size+1.  That feels wrong, but I'm
not totally sure.  Are you?  Thanks!
Bin Meng Sept. 10, 2017, 12:09 p.m. UTC | #3
Hi Tom,

On Sat, Sep 9, 2017 at 11:25 AM, Tom Rini <trini@konsulko.com> wrote:
> On Sat, Sep 09, 2017 at 08:30:44AM +0800, Bin Meng wrote:
>> Hi Tom,
>>
>> On Wed, Sep 6, 2017 at 3:30 PM, Bin Meng <bmeng.cn@gmail.com> wrote:
>> > This converts the IDE driver to driver model so that block read and
>> > write are fully functional.
>> >
>> > Fixes: b7c6baef ("x86: Convert MMC to driver model")
>> > Reported-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
>> > Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
>> >
>> > Reviewed-by: Simon Glass <sjg@chromium.org>
>> > Tested-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
>> > ---
>> >
>> > Changes in v3:
>> > - Updated BLK_XXX_SIZE usage
>> >
>> > Changes in v2:
>> > - Fixed 'fatls ide 0' issue
>> >
>> >  drivers/block/blk-uclass.c |  2 +-
>> >  drivers/block/ide.c        | 70 ++++++++++++++++++++++++++++++++++++++++++++++
>> >  include/dm/uclass-id.h     |  1 +
>> >  3 files changed, 72 insertions(+), 1 deletion(-)
>> >
>>
>> Will you take this series in 2017.09?
>
> I would swear that we declare vendor/etc as size + 1 so that we can
> ensure that size+1==NULL and only write up to size into the field.  But
> the rest of this patch strncpy's to size+1.  That feels wrong, but I'm
> not totally sure.  Are you?  Thanks!
>

OK, v4 was just sent. Please take a look and hope it makes it before
the release.

Regards,
Bin
diff mbox series

Patch

diff --git a/drivers/block/blk-uclass.c b/drivers/block/blk-uclass.c
index e5f00dc..8e58580 100644
--- a/drivers/block/blk-uclass.c
+++ b/drivers/block/blk-uclass.c
@@ -26,7 +26,7 @@  static const char *if_typename_str[IF_TYPE_COUNT] = {
 };
 
 static enum uclass_id if_type_uclass_id[IF_TYPE_COUNT] = {
-	[IF_TYPE_IDE]		= UCLASS_INVALID,
+	[IF_TYPE_IDE]		= UCLASS_IDE,
 	[IF_TYPE_SCSI]		= UCLASS_SCSI,
 	[IF_TYPE_ATAPI]		= UCLASS_INVALID,
 	[IF_TYPE_USB]		= UCLASS_MASS_STORAGE,
diff --git a/drivers/block/ide.c b/drivers/block/ide.c
index ce51153..1b5476e 100644
--- a/drivers/block/ide.c
+++ b/drivers/block/ide.c
@@ -827,12 +827,20 @@  void ide_init(void)
 		ide_ident(&ide_dev_desc[i]);
 		dev_print(&ide_dev_desc[i]);
 
+#ifndef CONFIG_BLK
 		if ((ide_dev_desc[i].lba > 0) && (ide_dev_desc[i].blksz > 0)) {
 			/* initialize partition type */
 			part_init(&ide_dev_desc[i]);
 		}
+#endif
 	}
 	WATCHDOG_RESET();
+
+#ifdef CONFIG_BLK
+	struct udevice *dev;
+
+	uclass_first_device(UCLASS_IDE, &dev);
+#endif
 }
 
 /* We only need to swap data if we are running on a big endian cpu. */
@@ -1147,6 +1155,23 @@  int ide_device_present(int dev)
 #endif
 
 #ifdef CONFIG_BLK
+static int ide_blk_probe(struct udevice *udev)
+{
+	struct blk_desc *desc = dev_get_uclass_platdata(udev);
+
+	/* fill in device vendor/product/rev strings */
+	strncpy(desc->vendor, ide_dev_desc[desc->devnum].vendor,
+		BLK_VEN_SIZE + 1);
+	strncpy(desc->product, ide_dev_desc[desc->devnum].product,
+		BLK_PRD_SIZE + 1);
+	strncpy(desc->revision, ide_dev_desc[desc->devnum].revision,
+		BLK_REV_SIZE + 1);
+
+	part_init(desc);
+
+	return 0;
+}
+
 static const struct blk_ops ide_blk_ops = {
 	.read	= ide_read,
 	.write	= ide_write,
@@ -1156,6 +1181,51 @@  U_BOOT_DRIVER(ide_blk) = {
 	.name		= "ide_blk",
 	.id		= UCLASS_BLK,
 	.ops		= &ide_blk_ops,
+	.probe		= ide_blk_probe,
+};
+
+static int ide_probe(struct udevice *udev)
+{
+	struct udevice *blk_dev;
+	char name[20];
+	int blksz;
+	lbaint_t size;
+	int i;
+	int ret;
+
+	for (i = 0; i < CONFIG_SYS_IDE_MAXDEVICE; i++) {
+		if (ide_dev_desc[i].type != DEV_TYPE_UNKNOWN) {
+			sprintf(name, "blk#%d", i);
+
+			blksz = ide_dev_desc[i].blksz;
+			size = blksz * ide_dev_desc[i].lba;
+			ret = blk_create_devicef(udev, "ide_blk", name,
+						 IF_TYPE_IDE, i,
+						 blksz, size, &blk_dev);
+			if (ret)
+				return ret;
+		}
+	}
+
+	return 0;
+}
+
+U_BOOT_DRIVER(ide) = {
+	.name		= "ide",
+	.id		= UCLASS_IDE,
+	.probe		= ide_probe,
+};
+
+struct pci_device_id ide_supported[] = {
+	{ PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_IDE << 8, 0xffff00) },
+	{ }
+};
+
+U_BOOT_PCI_DEVICE(ide, ide_supported);
+
+UCLASS_DRIVER(ide) = {
+	.name		= "ide",
+	.id		= UCLASS_IDE,
 };
 #else
 U_BOOT_LEGACY_BLK(ide) = {
diff --git a/include/dm/uclass-id.h b/include/dm/uclass-id.h
index 1a50199..3fc2083 100644
--- a/include/dm/uclass-id.h
+++ b/include/dm/uclass-id.h
@@ -41,6 +41,7 @@  enum uclass_id {
 	UCLASS_I2C_EEPROM,	/* I2C EEPROM device */
 	UCLASS_I2C_GENERIC,	/* Generic I2C device */
 	UCLASS_I2C_MUX,		/* I2C multiplexer */
+	UCLASS_IDE,		/* IDE device */
 	UCLASS_IRQ,		/* Interrupt controller */
 	UCLASS_KEYBOARD,	/* Keyboard input device */
 	UCLASS_LED,		/* Light-emitting diode (LED) */