[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