[U-Boot] [PATCH] efi_loader: disk: Fix CONFIG_BLK breakage
Simon Glass
sjg at chromium.org
Mon Aug 8 23:44:30 CEST 2016
Hi Alexander,
On 5 August 2016 at 06:49, Alexander Graf <agraf at 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 <agraf at 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
More information about the U-Boot
mailing list