From: Rob Clark <robdclark@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 08/21] efi_loader: use proper device-paths for partitions
Date: Sun, 10 Sep 2017 07:21:32 -0400 [thread overview]
Message-ID: <20170910112149.21358-16-robdclark@gmail.com> (raw)
In-Reply-To: <20170910112149.21358-1-robdclark@gmail.com>
Also, create disk objects for the disk itself, in addition to the
partitions. (UEFI terminology is a bit confusing, a "disk" object is
really a partition.) This helps grub properly identify the boot device
since it is trying to match up partition "disk" object with it's parent
device.
Now instead of seeing devices like:
/File(sdhci at 07864000.blk)/EndEntire
/File(usb_mass_storage.lun0)/EndEntire
You see:
/ACPI(133741d0,0)/UnknownMessaging(1d)/EndEntire
/ACPI(133741d0,0)/UnknownMessaging(1d)/HD(0,800,64000,dd904a8c00000000,1,1)/EndEntire
/ACPI(133741d0,0)/UnknownMessaging(1d)/HD(1,64800,200000,dd904a8c00000000,1,1)/EndEntire
/ACPI(133741d0,0)/UnknownMessaging(1d)/HD(2,264800,19a000,dd904a8c00000000,1,1)/EndEntire
/ACPI(133741d0,0)/USB(0,0)/USB(0,0)/USB(0,0)/EndEntire
/ACPI(133741d0,0)/USB(0,0)/USB(0,0)/USB(0,0)/HD(0,800,60000,38ca680200000000,1,1)/EndEntire
/ACPI(133741d0,0)/USB(0,0)/USB(0,0)/USB(0,0)/HD(1,61000,155000,38ca680200000000,1,1)/EndEntire
/ACPI(133741d0,0)/USB(0,0)/USB(0,0)/USB(0,0)/HD(2,20fa800,1bbf8800,38ca680200000000,1,1)/EndEntire
/ACPI(133741d0,0)/USB(0,0)/USB(0,0)/USB(0,0)/HD(3,1b6800,1f44000,38ca680200000000,1,1)/EndEntire
This is on a board with single USB disk and single sd-card. The
UnknownMessaging(1d) node in the device-path is the MMC device,
but grub_efi_print_device_path() hasn't been updated yet for some
of the newer device-path sub-types.
This patch is inspired by a patch originally from Peter Jones, but
re-worked to use efi_device_path, so it doesn't much resemble the
original.
Signed-off-by: Rob Clark <robdclark@gmail.com>
---
lib/efi_loader/efi_disk.c | 54 +++++++++++++++++++++++++++--------------------
1 file changed, 31 insertions(+), 23 deletions(-)
diff --git a/lib/efi_loader/efi_disk.c b/lib/efi_loader/efi_disk.c
index ed06485e33..14f3e020c8 100644
--- a/lib/efi_loader/efi_disk.c
+++ b/lib/efi_loader/efi_disk.c
@@ -28,11 +28,13 @@ struct efi_disk_obj {
/* EFI Interface Media descriptor struct, referenced by ops */
struct efi_block_io_media media;
/* EFI device path to this block device */
- struct efi_device_path_file_path *dp;
+ struct efi_device_path *dp;
+ /* partition # */
+ unsigned part;
/* Offset into disk for simple partitions */
lbaint_t offset;
/* Internal block device */
- const struct blk_desc *desc;
+ struct blk_desc *desc;
};
static efi_status_t EFIAPI efi_disk_reset(struct efi_block_io *this,
@@ -172,26 +174,26 @@ static const struct efi_block_io block_io_disk_template = {
static void efi_disk_add_dev(const char *name,
const char *if_typename,
- const struct blk_desc *desc,
+ struct blk_desc *desc,
int dev_index,
- lbaint_t offset)
+ lbaint_t offset,
+ unsigned part)
{
struct efi_disk_obj *diskobj;
- struct efi_device_path_file_path *dp;
- int objlen = sizeof(*diskobj) + (sizeof(*dp) * 2);
/* Don't add empty devices */
if (!desc->lba)
return;
- diskobj = calloc(1, objlen);
+ diskobj = calloc(1, sizeof(*diskobj));
/* Fill in object data */
- dp = (void *)&diskobj[1];
+ diskobj->dp = efi_dp_from_part(desc, part);
+ diskobj->part = part;
diskobj->parent.protocols[0].guid = &efi_block_io_guid;
diskobj->parent.protocols[0].protocol_interface = &diskobj->ops;
diskobj->parent.protocols[1].guid = &efi_guid_device_path;
- diskobj->parent.protocols[1].protocol_interface = dp;
+ diskobj->parent.protocols[1].protocol_interface = diskobj->dp;
diskobj->parent.handle = diskobj;
diskobj->ops = block_io_disk_template;
diskobj->ifname = if_typename;
@@ -207,17 +209,6 @@ static void efi_disk_add_dev(const char *name,
diskobj->media.last_block = desc->lba - offset;
diskobj->ops.media = &diskobj->media;
- /* Fill in device path */
- diskobj->dp = dp;
- dp[0].dp.type = DEVICE_PATH_TYPE_MEDIA_DEVICE;
- dp[0].dp.sub_type = DEVICE_PATH_SUB_TYPE_FILE_PATH;
- dp[0].dp.length = sizeof(*dp);
- ascii2unicode(dp[0].str, name);
-
- dp[1].dp.type = DEVICE_PATH_TYPE_END;
- dp[1].dp.sub_type = DEVICE_PATH_SUB_TYPE_END;
- dp[1].dp.length = sizeof(*dp);
-
/* Hook up to the device list */
list_add_tail(&diskobj->parent.link, &efi_obj_list);
}
@@ -236,14 +227,18 @@ static int efi_disk_create_eltorito(struct blk_desc *desc,
if (desc->part_type != PART_TYPE_ISO)
return 0;
+ /* and devices for each partition: */
while (!part_get_info(desc, part, &info)) {
snprintf(devname, sizeof(devname), "%s:%d", pdevname,
part);
efi_disk_add_dev(devname, if_typename, desc, diskid,
- info.start);
+ info.start, part);
part++;
disks++;
}
+
+ /* ... and add block device: */
+ efi_disk_add_dev(devname, if_typename, desc, diskid, 0, 0);
#endif
return disks;
@@ -271,9 +266,22 @@ int efi_disk_register(void)
uclass_next_device_check(&dev)) {
struct blk_desc *desc = dev_get_uclass_platdata(dev);
const char *if_typename = dev->driver->name;
+ disk_partition_t info;
+ int part = 1;
printf("Scanning disk %s...\n", dev->name);
- efi_disk_add_dev(dev->name, if_typename, desc, desc->devnum, 0);
+
+ /* add devices for each partition: */
+ while (!part_get_info(desc, part, &info)) {
+ efi_disk_add_dev(dev->name, if_typename, desc,
+ desc->devnum, 0, part);
+ part++;
+ }
+
+ /* ... and add block device: */
+ efi_disk_add_dev(dev->name, if_typename, desc,
+ desc->devnum, 0, 0);
+
disks++;
/*
@@ -309,7 +317,7 @@ int efi_disk_register(void)
snprintf(devname, sizeof(devname), "%s%d",
if_typename, i);
- efi_disk_add_dev(devname, if_typename, desc, i, 0);
+ efi_disk_add_dev(devname, if_typename, desc, i, 0, 0);
disks++;
/*
--
2.13.5
next prev parent reply other threads:[~2017-09-10 11:21 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-10 11:21 [U-Boot] [PATCH v2 00/21] efi_loader: enough UEFI for standard distro boot Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v3 1/9] fs/fat: split out helper to init fsdata Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v2 01/21] part: move efi_guid_t Rob Clark
2017-09-11 22:55 ` Heinrich Schuchardt
2017-09-12 12:29 ` Simon Glass
2017-09-10 11:21 ` [U-Boot] [PATCH v3 2/9] fs/fat: introduce new director iterators Rob Clark
2017-09-12 12:29 ` Simon Glass
2017-09-10 11:21 ` [U-Boot] [PATCH v2 02/21] part: extract MBR signature from partitions Rob Clark
2017-09-12 12:29 ` Simon Glass
2017-09-10 11:21 ` [U-Boot] [PATCH v2 03/21] efi: add some missing __packed Rob Clark
2017-09-12 12:30 ` Simon Glass
2017-09-10 11:21 ` [U-Boot] [PATCH v3 3/9] fat/fs: convert to directory iterators Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v2 04/21] efi: add some more device path structures Rob Clark
2017-09-12 12:30 ` Simon Glass
2017-09-10 11:21 ` [U-Boot] [PATCH v3 4/9] fs: add fs_readdir() Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v2 05/21] efi_loader: add device-path utils Rob Clark
2017-09-12 12:30 ` Simon Glass
2017-09-12 13:05 ` Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v3 5/9] fs/fat: implement opendir/readdir/closedir Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v2 06/21] efi_loader: drop redundant efi_device_path_protocol Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v3 6/9] fat/fs: remove a bunch of dead code Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v2 07/21] efi_loader: flesh out device-path to text Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v3 7/9] fat/fs: move ls to generic implementation Rob Clark
2017-09-10 11:21 ` Rob Clark [this message]
2017-09-10 11:21 ` [U-Boot] [PATCH v3 8/9] fs/fat: fix case for FAT shortnames Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v2 09/21] efi_loader: use proper device-paths for net Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v3 9/9] fs/fat: Clean up open-coded sector <-> cluster conversions Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v2 10/21] efi_loader: refactor boot device and loaded_image handling Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v2 11/21] efi_loader: add file/filesys support Rob Clark
2017-09-12 12:30 ` Simon Glass
2017-09-10 11:21 ` [U-Boot] [PATCH v2 12/21] efi_loader: support load_image() from a file-path Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v2 13/21] efi_loader: make pool allocations cacheline aligned Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v2 14/21] efi_loader: efi variable support Rob Clark
2017-09-12 12:30 ` Simon Glass
2017-09-12 13:10 ` Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v2 15/21] efi_loader: add bootmgr Rob Clark
2017-09-12 12:30 ` Simon Glass
2017-09-10 11:21 ` [U-Boot] [PATCH v2 16/21] efi_loader: file_path should be variable length Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v2 17/21] efi_loader: set loaded image code/data type properly Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v2 18/21] efi_loader: print GUIDs Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v2 19/21] efi_loader: split out escape sequence based size query Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v2 20/21] efi_loader: Correctly figure out size for vidconsole Rob Clark
2017-09-10 11:21 ` [U-Boot] [PATCH v2 21/21] efi_loader: Some console improvements " Rob Clark
2017-09-12 12:30 ` Simon Glass
2017-09-10 11:38 ` [U-Boot] [PATCH v2 00/21] efi_loader: enough UEFI for standard distro boot Rob Clark
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170910112149.21358-16-robdclark@gmail.com \
--to=robdclark@gmail.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox