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

Heinrich Schuchardt xypron.glpk at gmx.de
Mon Sep 4 13:47:25 UTC 2017


On 09/04/2017 11:08 AM, Bin Meng 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")

Now I am able to load a file from the IDE disk and execute it with
bootefi. Thanks a lot for fixing this.

I think this is release critical and should be merged into 2017.09.

Tested-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> Reported-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
> Signed-off-by: Bin Meng <bmeng.cn at gmail.com>
> 
> ---
> 
> Changes in v2:
> - Fixed 'fatls ide 0' issue
> 
>  drivers/block/blk-uclass.c |  2 +-
>  drivers/block/ide.c        | 68 ++++++++++++++++++++++++++++++++++++++++++++++
>  include/dm/uclass-id.h     |  1 +
>  3 files changed, 70 insertions(+), 1 deletion(-)
> 
> 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..58b295e 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,21 @@ 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);
> +	int devnum = desc->devnum;
> +
> +	/* fill in device vendor/product/rev strings */
> +	strncpy(desc->vendor, ide_dev_desc[devnum].vendor, BLK_VEN_SIZE);
> +	strncpy(desc->product, ide_dev_desc[devnum].product, BLK_PRD_SIZE);
> +	strncpy(desc->revision, ide_dev_desc[devnum].revision, BLK_REV_SIZE);
> +
> +	part_init(desc);
> +
> +	return 0;
> +}
> +
>  static const struct blk_ops ide_blk_ops = {
>  	.read	= ide_read,
>  	.write	= ide_write,
> @@ -1156,6 +1179,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) */
> 



More information about the U-Boot mailing list