[U-Boot] [PATCH] efi_loader: disk: Fix CONFIG_BLK breakage
Alexander Graf
agraf at suse.de
Wed Aug 10 09:47:56 CEST 2016
> On 08 Aug 2016, at 23:44, Simon Glass <sjg at chromium.org> wrote:
>
> 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?
I could, but then I would diverge between the CONFIG_BLK and non-CONFIG_BLK path again, which would turn the code into an #ifdef mess (read: hard to maintain), because the whole device creation path relies on struct blk_desc * today and doesn’t pass the udevice anywhere.
Do you feel strongly about this? To give you an idea how messy it gets, the diff is below.
Alex
diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
index d8ddcc9..79d313b 100644
--- a/lib/efi_loader/efi_disk.c
+++ b/lib/efi_loader/efi_disk.c
@@ -32,7 +32,11 @@ struct efi_disk_obj {
/* Offset into disk for simple partitions */
lbaint_t offset;
/* Internal block device */
+#ifdef CONFIG_BLK
+ struct udevice *dev;
+#else
const struct blk_desc *desc;
+#endif
};
static efi_status_t efi_disk_open_block(void *handle, efi_guid_t *protocol,
@@ -69,6 +73,15 @@ enum efi_disk_direction {
EFI_DISK_WRITE,
};
+static struct blk_desc *diskobj2desc(struct efi_disk_obj *diskobj)
+{
+#ifdef CONFIG_BLK
+ return dev_get_uclass_platdata(diskobj->dev);
+#else
+ return (struct blk_desc *)diskobj->desc;
+#endif
+}
+
static efi_status_t EFIAPI efi_disk_rw_blocks(struct efi_block_io *this,
u32 media_id, u64 lba, unsigned long buffer_size,
void *buffer, enum efi_disk_direction direction)
@@ -80,7 +93,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);
- desc = (struct blk_desc *) diskobj->desc;
+ desc = diskobj2desc(diskobj);
blksz = desc->blksz;
blocks = buffer_size / blksz;
lba += diskobj->offset;
@@ -194,10 +207,17 @@ static const struct efi_block_io block_io_disk_template = {
static void efi_disk_add_dev(const char *name,
const char *if_typename,
+#ifdef CONFIG_BLK
+ struct udevice *dev,
+#else
const struct blk_desc *desc,
+#endif
int dev_index,
lbaint_t offset)
{
+#ifdef CONFIG_BLK
+ struct blk_desc *desc = dev_get_uclass_platdata(dev);
+#endif
struct efi_disk_obj *diskobj;
struct efi_device_path_file_path *dp;
int objlen = sizeof(*diskobj) + (sizeof(*dp) * 2);
@@ -218,7 +238,11 @@ static void efi_disk_add_dev(const char *name,
diskobj->ifname = if_typename;
diskobj->dev_index = dev_index;
diskobj->offset = offset;
+#ifdef CONFIG_BLK
+ diskobj->dev = dev;
+#else
diskobj->desc = desc;
+#endif
/* Fill in EFI IO Media info (for read/write callbacks) */
diskobj->media.removable_media = desc->removable;
@@ -244,13 +268,19 @@ static void efi_disk_add_dev(const char *name,
list_add_tail(&diskobj->parent.link, &efi_obj_list);
}
-static int efi_disk_create_eltorito(struct blk_desc *desc,
- const char *if_typename,
- int diskid,
- const char *pdevname)
+static int efi_disk_create_eltorito(
+#ifdef CONFIG_BLK
+ struct udevice *dev,
+#else
+ struct blk_desc *desc,
+#endif
+ const char *if_typename, int diskid, const char *pdevname)
{
int disks = 0;
#ifdef CONFIG_ISO_PARTITION
+#ifdef CONFIG_BLK
+ struct blk_desc *desc = dev_get_uclass_platdata(dev);
+#endif
char devname[32] = { 0 }; /* dp->str is u16[32] long */
disk_partition_t info;
int part = 1;
@@ -261,8 +291,13 @@ static int efi_disk_create_eltorito(struct blk_desc *desc,
while (!part_get_info(desc, part, &info)) {
snprintf(devname, sizeof(devname), "%s:%d", pdevname,
part);
+#ifdef CONFIG_BLK
+ efi_disk_add_dev(devname, if_typename, dev, diskid,
+ info.start);
+#else
efi_disk_add_dev(devname, if_typename, desc, diskid,
info.start);
+#endif
part++;
disks++;
}
@@ -295,14 +330,14 @@ int efi_disk_register(void)
const char *if_typename = dev->driver->name;
printf("Scanning disk %s...\n", dev->name);
- efi_disk_add_dev(dev->name, if_typename, desc, desc->devnum, 0);
+ efi_disk_add_dev(dev->name, if_typename, dev, desc->devnum, 0);
disks++;
/*
* 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,
+ disks += efi_disk_create_eltorito(dev, if_typename,
desc->devnum, dev->name);
}
#else
More information about the U-Boot
mailing list