From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alexander Graf Date: Tue, 29 Jan 2019 17:19:38 +0100 Subject: [U-Boot] [RFC 3/3] drivers: align block device drivers with DM-efi integration In-Reply-To: <20190129025956.21870-4-takahiro.akashi@linaro.org> References: <20190129025956.21870-1-takahiro.akashi@linaro.org> <20190129025956.21870-4-takahiro.akashi@linaro.org> Message-ID: List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 01/29/2019 03:59 AM, AKASHI Takahiro wrote: > Efi_disk_create() should be hook up at every creation of block device > at each driver. Associated blk_desc must be properly set up before > calling this function. > > Signed-off-by: AKASHI Takahiro > --- > common/usb_storage.c | 27 +++++++++++++++++++++++++-- > drivers/scsi/scsi.c | 22 ++++++++++++++++++++++ > lib/efi_driver/efi_block_device.c | 30 +++++++++--------------------- > 3 files changed, 56 insertions(+), 23 deletions(-) > > diff --git a/common/usb_storage.c b/common/usb_storage.c > index 8c889bb1a648..ff895c0e4557 100644 > --- a/common/usb_storage.c > +++ b/common/usb_storage.c > @@ -46,6 +46,10 @@ > #include > #include > > +/* FIXME */ > +extern int efi_disk_create(struct udevice *dev); > +extern int blk_create_partitions(struct udevice *parent); > + > #undef BBB_COMDAT_TRACE > #undef BBB_XPORT_TRACE > > @@ -227,8 +231,27 @@ static int usb_stor_probe_device(struct usb_device *udev) > > ret = usb_stor_get_info(udev, data, blkdev); > if (ret == 1) { > - usb_max_devs++; > - debug("%s: Found device %p\n", __func__, udev); > + ret = efi_disk_create(dev); > + if (ret) { > + debug("Cannot create efi_disk device\n"); > + ret = device_unbind(dev); > + if (ret) > + return ret; > + } else { > + usb_max_devs++; > + ret = blk_create_partitions(dev); > + if (ret < 0) { > + debug("Cannot create disk partition device\n"); > + /* TODO: undo create */ > + > + ret = device_unbind(dev); > + if (ret) > + return ret; > + } > + usb_max_devs += ret; > + debug("%s: Found device %p, partitions:%d\n", > + __func__, udev, ret); > + } Why do we need to do this in device specific code? Alex > } else { > debug("usb_stor_get_info: Invalid device\n"); > ret = device_unbind(dev); > diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c > index df47e2fc78bd..f0f8cbc0bf26 100644 > --- a/drivers/scsi/scsi.c > +++ b/drivers/scsi/scsi.c > @@ -11,6 +11,10 @@ > #include > #include > > +/* FIXME */ > +int efi_disk_create(struct udevice *dev); > +int blk_create_partitions(struct udevice *parent); > + > #if !defined(CONFIG_DM_SCSI) > # ifdef CONFIG_SCSI_DEV_LIST > # define SCSI_DEV_LIST CONFIG_SCSI_DEV_LIST > @@ -593,9 +597,27 @@ static int do_scsi_scan_one(struct udevice *dev, int id, int lun, bool verbose) > memcpy(&bdesc->product, &bd.product, sizeof(bd.product)); > memcpy(&bdesc->revision, &bd.revision, sizeof(bd.revision)); > > + ret = efi_disk_create(bdev); > + if (ret) { > + debug("Can't create efi_disk device\n"); > + ret = device_unbind(bdev); > + > + return ret; > + } > + ret = blk_create_partitions(bdev); > + if (ret < 0) { > + debug("Can't create efi_disk partitions\n"); > + /* TODO: undo create */ > + > + ret = device_unbind(bdev); > + > + return ret; > + } > + > if (verbose) { > printf(" Device %d: ", 0); > dev_print(bdesc); > + debug("Found %d partitions\n", ret); > } > return 0; > } > diff --git a/lib/efi_driver/efi_block_device.c b/lib/efi_driver/efi_block_device.c > index 3f147cf60879..4ab3402d6768 100644 > --- a/lib/efi_driver/efi_block_device.c > +++ b/lib/efi_driver/efi_block_device.c > @@ -32,6 +32,10 @@ > #include > #include > > +/* FIXME */ > +extern int efi_disk_create(struct udevice *dev); > +extern int blk_create_partitions(struct udevice *parent); > + > /* > * EFI attributes of the udevice handled by this driver. > * > @@ -102,24 +106,6 @@ static ulong efi_bl_write(struct udevice *dev, lbaint_t blknr, lbaint_t blkcnt, > return blkcnt; > } > > -/* > - * Create partions for the block device. > - * > - * @handle EFI handle of the block device > - * @dev udevice of the block device > - */ > -static int efi_bl_bind_partitions(efi_handle_t handle, struct udevice *dev) > -{ > - struct blk_desc *desc; > - const char *if_typename; > - > - desc = dev_get_uclass_platdata(dev); > - if_typename = blk_get_if_type_name(desc->if_type); > - > - return efi_disk_create_partitions(handle, desc, if_typename, > - desc->devnum, dev->name); > -} > - > /* > * Create a block device for a handle > * > @@ -168,15 +154,17 @@ static int efi_bl_bind(efi_handle_t handle, void *interface) > platdata->handle = handle; > platdata->io = interface; > > + ret = efi_disk_create(bdev); > + if (ret) > + return ret; > + > ret = device_probe(bdev); > if (ret) > return ret; > EFI_PRINT("%s: block device '%s' created\n", __func__, bdev->name); > - > /* Create handles for the partions of the block device */ > - disks = efi_bl_bind_partitions(handle, bdev); > + disks = blk_create_partitions(bdev); > EFI_PRINT("Found %d partitions\n", disks); > - > return 0; > } >