mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-24 13:43:28 +00:00
efi_loader: device_path: support Sandbox's "host" devices
Sandbox's "host" devices are currently described as UCLASS_ROOT udevice with DEV_IF_HOST block device. As the current implementation of efi_device_path doesn't support such a type, any "host" device on sandbox cannot be seen as a distinct object. For example, => host bind 0 /foo/disk.img => efi devices Scanning disk host0... Found 1 disks Device Device Path ================ ==================== 0000000015c19970 /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b) 0000000015c19d70 /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b) => efi dh Handle Protocols ================ ==================== 0000000015c19970 Device Path, Device Path To Text, Device Path Utilities, Unicode Collation 2, HII String, HII Database, HII Config Routing 0000000015c19ba0 Driver Binding 0000000015c19c10 Simple Text Output 0000000015c19c80 Simple Text Input, Simple Text Input Ex 0000000015c19d70 Block IO, Device Path, Simple File System As you can see here, efi_root (0x0000000015c19970) and host0 device (0x0000000015c19d70) have the same representation of device path. This is not only inconvenient, but also confusing since two different efi objects are associated with the same device path and efi_dp_find_obj() will possibly return a wrong result. Solution: Each "host" device should be given an additional device path node of "vendor device path" to make it distinguishable. Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org> Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
parent
aa8c6294ed
commit
23ad52fff4
2 changed files with 41 additions and 0 deletions
|
@ -24,6 +24,10 @@
|
||||||
#define U_BOOT_GUID \
|
#define U_BOOT_GUID \
|
||||||
EFI_GUID(0xe61d73b9, 0xa384, 0x4acc, \
|
EFI_GUID(0xe61d73b9, 0xa384, 0x4acc, \
|
||||||
0xae, 0xab, 0x82, 0xe8, 0x28, 0xf3, 0x62, 0x8b)
|
0xae, 0xab, 0x82, 0xe8, 0x28, 0xf3, 0x62, 0x8b)
|
||||||
|
/* GUID used as host device on sandbox */
|
||||||
|
#define U_BOOT_HOST_DEV_GUID \
|
||||||
|
EFI_GUID(0xbbe4e671, 0x5773, 0x4ea1, \
|
||||||
|
0x9a, 0xab, 0x3a, 0x7d, 0xbf, 0x40, 0xc4, 0x82)
|
||||||
|
|
||||||
/* Root node */
|
/* Root node */
|
||||||
extern efi_handle_t efi_root;
|
extern efi_handle_t efi_root;
|
||||||
|
@ -121,6 +125,10 @@ uint16_t *efi_dp_str(struct efi_device_path *dp);
|
||||||
|
|
||||||
/* GUID of the U-Boot root node */
|
/* GUID of the U-Boot root node */
|
||||||
extern const efi_guid_t efi_u_boot_guid;
|
extern const efi_guid_t efi_u_boot_guid;
|
||||||
|
#ifdef CONFIG_SANDBOX
|
||||||
|
/* GUID of U-Boot host device on sandbox */
|
||||||
|
extern const efi_guid_t efi_guid_host_dev;
|
||||||
|
#endif
|
||||||
/* GUID of the EFI_BLOCK_IO_PROTOCOL */
|
/* GUID of the EFI_BLOCK_IO_PROTOCOL */
|
||||||
extern const efi_guid_t efi_block_io_guid;
|
extern const efi_guid_t efi_block_io_guid;
|
||||||
extern const efi_guid_t efi_global_variable_guid;
|
extern const efi_guid_t efi_global_variable_guid;
|
||||||
|
|
|
@ -12,8 +12,13 @@
|
||||||
#include <mmc.h>
|
#include <mmc.h>
|
||||||
#include <efi_loader.h>
|
#include <efi_loader.h>
|
||||||
#include <part.h>
|
#include <part.h>
|
||||||
|
#include <sandboxblockdev.h>
|
||||||
#include <asm-generic/unaligned.h>
|
#include <asm-generic/unaligned.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_SANDBOX
|
||||||
|
const efi_guid_t efi_guid_host_dev = U_BOOT_HOST_DEV_GUID;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* template END node: */
|
/* template END node: */
|
||||||
static const struct efi_device_path END = {
|
static const struct efi_device_path END = {
|
||||||
.type = DEVICE_PATH_TYPE_END,
|
.type = DEVICE_PATH_TYPE_END,
|
||||||
|
@ -445,6 +450,16 @@ static unsigned dp_size(struct udevice *dev)
|
||||||
case UCLASS_MMC:
|
case UCLASS_MMC:
|
||||||
return dp_size(dev->parent) +
|
return dp_size(dev->parent) +
|
||||||
sizeof(struct efi_device_path_sd_mmc_path);
|
sizeof(struct efi_device_path_sd_mmc_path);
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_SANDBOX
|
||||||
|
case UCLASS_ROOT:
|
||||||
|
/*
|
||||||
|
* Sandbox's host device will be represented
|
||||||
|
* as vendor device with extra one byte for
|
||||||
|
* device number
|
||||||
|
*/
|
||||||
|
return dp_size(dev->parent)
|
||||||
|
+ sizeof(struct efi_device_path_vendor) + 1;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
return dp_size(dev->parent);
|
return dp_size(dev->parent);
|
||||||
|
@ -505,6 +520,24 @@ static void *dp_fill(void *buf, struct udevice *dev)
|
||||||
#ifdef CONFIG_BLK
|
#ifdef CONFIG_BLK
|
||||||
case UCLASS_BLK:
|
case UCLASS_BLK:
|
||||||
switch (dev->parent->uclass->uc_drv->id) {
|
switch (dev->parent->uclass->uc_drv->id) {
|
||||||
|
#ifdef CONFIG_SANDBOX
|
||||||
|
case UCLASS_ROOT: {
|
||||||
|
/* stop traversing parents at this point: */
|
||||||
|
struct efi_device_path_vendor *dp = buf;
|
||||||
|
struct blk_desc *desc = dev_get_uclass_platdata(dev);
|
||||||
|
|
||||||
|
dp_fill(buf, dev->parent);
|
||||||
|
dp = buf;
|
||||||
|
++dp;
|
||||||
|
dp->dp.type = DEVICE_PATH_TYPE_HARDWARE_DEVICE;
|
||||||
|
dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_VENDOR;
|
||||||
|
dp->dp.length = sizeof(*dp) + 1;
|
||||||
|
memcpy(&dp->guid, &efi_guid_host_dev,
|
||||||
|
sizeof(efi_guid_t));
|
||||||
|
dp->vendor_data[0] = desc->devnum;
|
||||||
|
return &dp->vendor_data[1];
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_IDE
|
#ifdef CONFIG_IDE
|
||||||
case UCLASS_IDE: {
|
case UCLASS_IDE: {
|
||||||
struct efi_device_path_atapi *dp =
|
struct efi_device_path_atapi *dp =
|
||||||
|
|
Loading…
Reference in a new issue