Hi Alexander, On 5 August 2016 at 06:49, Alexander Graf <ag...@suse.de> wrote: > When using CONFIG_BLK, there were 2 issues: > > 1) The name we generate the device with has to match the > name we set in efi_set_bootdev() > > 2) The device we pass into our block functions was wrong, > we should not rediscover it but just use the already known > pointer. > > This patch fixes both issues. > > Signed-off-by: Alexander Graf <ag...@suse.de> > --- > cmd/bootefi.c | 23 ++++++++++++++++++----- > lib/efi_loader/efi_disk.c | 18 +++++++++++------- > 2 files changed, 29 insertions(+), 12 deletions(-) > > diff --git a/cmd/bootefi.c b/cmd/bootefi.c > index b8ecf4c..53a6ee3 100644 > --- a/cmd/bootefi.c > +++ b/cmd/bootefi.c > @@ -8,6 +8,7 @@ > > #include <common.h> > #include <command.h> > +#include <dm/device.h> > #include <efi_loader.h> > #include <errno.h> > #include <libfdt.h> > @@ -269,18 +270,30 @@ void efi_set_bootdev(const char *dev, const char > *devnr, const char *path) > char devname[32] = { 0 }; /* dp->str is u16[32] long */ > char *colon; > > - /* Assemble the condensed device name we use in efi_disk.c */ > - snprintf(devname, sizeof(devname), "%s%s", dev, devnr); > +#if defined(CONFIG_BLK) || defined(CONFIG_ISO_PARTITION) > + desc = blk_get_dev(dev, simple_strtol(devnr, NULL, 10)); > +#endif > + > +#ifdef CONFIG_BLK > + if (desc) { > + snprintf(devname, sizeof(devname), "%s", desc->bdev->name); > + } else > +#endif > + > + { > + /* Assemble the condensed device name we use in efi_disk.c */ > + snprintf(devname, sizeof(devname), "%s%s", dev, devnr); > + } > + > colon = strchr(devname, ':'); > > #ifdef CONFIG_ISO_PARTITION > /* For ISOs we create partition block devices */ > - desc = blk_get_dev(dev, simple_strtol(devnr, NULL, 10)); > if (desc && (desc->type != DEV_TYPE_UNKNOWN) && > (desc->part_type == PART_TYPE_ISO)) { > if (!colon) > - snprintf(devname, sizeof(devname), "%s%s:1", dev, > - devnr); > + snprintf(devname, sizeof(devname), "%s:1", devname); > + > colon = NULL; > } > #endif > diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c > index c434c92..e00a747 100644 > --- a/lib/efi_loader/efi_disk.c > +++ b/lib/efi_loader/efi_disk.c > @@ -31,6 +31,8 @@ struct efi_disk_obj { > struct efi_device_path_file_path *dp; > /* Offset into disk for simple partitions */ > lbaint_t offset; > + /* Internal block device */ > + const struct blk_desc *desc;
Rather than storing this, can you store the udevice? > }; > > static efi_status_t efi_disk_open_block(void *handle, efi_guid_t *protocol, > @@ -78,8 +80,7 @@ static efi_status_t EFIAPI efi_disk_rw_blocks(struct > efi_block_io *this, > unsigned long n; > > diskobj = container_of(this, struct efi_disk_obj, ops); > - if (!(desc = blk_get_dev(diskobj->ifname, diskobj->dev_index))) > - return EFI_EXIT(EFI_DEVICE_ERROR); > + desc = (struct blk_desc *) diskobj->desc; > blksz = desc->blksz; > blocks = buffer_size / blksz; > lba += diskobj->offset; > @@ -213,6 +214,7 @@ static void efi_disk_add_dev(const char *name, > diskobj->ifname = if_typename; > diskobj->dev_index = dev_index; > diskobj->offset = offset; > + diskobj->desc = desc; > > /* Fill in EFI IO Media info (for read/write callbacks) */ > diskobj->media.removable_media = desc->removable; > @@ -240,7 +242,8 @@ static void efi_disk_add_dev(const char *name, > > static int efi_disk_create_eltorito(struct blk_desc *desc, > const char *if_typename, > - int diskid) > + int diskid, > + const char *pdevname) > { > int disks = 0; > #ifdef CONFIG_ISO_PARTITION > @@ -252,8 +255,8 @@ static int efi_disk_create_eltorito(struct blk_desc *desc, > return 0; > > while (!part_get_info(desc, part, &info)) { > - snprintf(devname, sizeof(devname), "%s%d:%d", if_typename, > - diskid, part); > + snprintf(devname, sizeof(devname), "%s:%d", pdevname, > + part); > efi_disk_add_dev(devname, if_typename, desc, diskid, > info.start); > part++; > @@ -296,7 +299,7 @@ int efi_disk_register(void) > * so let's create them here > */ > disks += efi_disk_create_eltorito(desc, if_typename, > - desc->devnum); > + desc->devnum, dev->name); > } > #else > int i, if_type; > @@ -331,7 +334,8 @@ int efi_disk_register(void) > * El Torito images show up as block devices > * in an EFI world, so let's create them here > */ > - disks += efi_disk_create_eltorito(desc, if_typename, > i); > + disks += efi_disk_create_eltorito(desc, if_typename, > + i, devname); > } > } > #endif > -- > 2.6.6 > Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot