All the efi-specific objects, except for existing devices, will show up under "efi root node" device.
Signed-off-by: AKASHI Takahiro <takahiro.aka...@linaro.org> --- include/efi_loader.h | 3 +++ lib/efi_loader/efi_root_node.c | 14 +++++----- lib/efi_loader/efi_setup.c | 49 +++++++++++++++++++++++++++++++++- 3 files changed, 59 insertions(+), 7 deletions(-) diff --git a/include/efi_loader.h b/include/efi_loader.h index 86cf91a6feca..4df965455c21 100644 --- a/include/efi_loader.h +++ b/include/efi_loader.h @@ -225,6 +225,9 @@ extern struct list_head efi_obj_list; /* List of all events */ extern struct list_head efi_events; +/* Root device */ +extern efi_handle_t efi_root; + /* Initialize efi execution environment */ efi_status_t efi_init_obj_list(void); /* Called by bootefi to initialize root node */ diff --git a/lib/efi_loader/efi_root_node.c b/lib/efi_loader/efi_root_node.c index b056ba3ee880..4b2d1457576a 100644 --- a/lib/efi_loader/efi_root_node.c +++ b/lib/efi_loader/efi_root_node.c @@ -16,6 +16,8 @@ struct efi_root_dp { struct efi_device_path end; } __packed; +efi_handle_t efi_root; + /** * efi_root_node_register() - create root node * @@ -26,12 +28,11 @@ struct efi_root_dp { */ efi_status_t efi_root_node_register(void) { - efi_handle_t root; efi_status_t ret; struct efi_root_dp *dp; /* Create handle */ - ret = efi_create_handle(&root); + ret = efi_add_handle(efi_root); if (ret != EFI_SUCCESS) return ret; @@ -52,24 +53,25 @@ efi_status_t efi_root_node_register(void) dp->end.length = sizeof(struct efi_device_path); /* Install device path protocol */ - ret = efi_add_protocol(root, &efi_guid_device_path, dp); + ret = efi_add_protocol(efi_root, &efi_guid_device_path, dp); if (ret != EFI_SUCCESS) goto failure; /* Install device path to text protocol */ - ret = efi_add_protocol(root, &efi_guid_device_path_to_text_protocol, + ret = efi_add_protocol(efi_root, &efi_guid_device_path_to_text_protocol, (void *)&efi_device_path_to_text); if (ret != EFI_SUCCESS) goto failure; /* Install device path utilities protocol */ - ret = efi_add_protocol(root, &efi_guid_device_path_utilities_protocol, + ret = efi_add_protocol(efi_root, + &efi_guid_device_path_utilities_protocol, (void *)&efi_device_path_utilities); if (ret != EFI_SUCCESS) goto failure; /* Install Unicode collation protocol */ - ret = efi_add_protocol(root, &efi_guid_unicode_collation_protocol, + ret = efi_add_protocol(efi_root, &efi_guid_unicode_collation_protocol, (void *)&efi_unicode_collation_protocol); if (ret != EFI_SUCCESS) goto failure; diff --git a/lib/efi_loader/efi_setup.c b/lib/efi_loader/efi_setup.c index 38569af1f2c8..83f1b842e6be 100644 --- a/lib/efi_loader/efi_setup.c +++ b/lib/efi_loader/efi_setup.c @@ -7,6 +7,10 @@ */ #include <common.h> +#include <dm.h> +#include <dm/device-internal.h> +#include <dm/lists.h> +#include <dm/root.h> #include <efi_loader.h> DECLARE_GLOBAL_DATA_PTR; @@ -16,7 +20,7 @@ DECLARE_GLOBAL_DATA_PTR; static efi_status_t efi_obj_list_initialized = OBJ_LIST_NOT_INITIALIZED; /* Initialize and populate EFI object list */ -efi_status_t efi_init_obj_list(void) +static efi_status_t efi_system_init(void) { efi_status_t ret = EFI_SUCCESS; @@ -87,3 +91,46 @@ out: efi_obj_list_initialized = ret; return ret; } + +/* For backward compatibility */ +efi_status_t efi_init_obj_list(void) +{ + int ret; + extern struct udevice *efi_root; + + if (efi_root) + return EFI_SUCCESS; + + ret = device_bind_driver(dm_root(), "efi_root", "UEFI sub system", + &efi_root); + if (ret) + return EFI_OUT_OF_RESOURCES; + + ret = device_probe(efi_root); + if (ret) + return EFI_OUT_OF_RESOURCES; + + return EFI_SUCCESS; +} + +static int efi_system_probe(struct udevice *dev) +{ + efi_status_t ret; + + ret = efi_system_init(); + if (ret != EFI_SUCCESS) + return -1; + + return 0; +} + +U_BOOT_DRIVER(efi_root) = { + .name = "efi_root", + .id = UCLASS_EFI, + .probe = efi_system_probe, +}; + +UCLASS_DRIVER(efi) = { + .name = "efi", + .id = UCLASS_EFI, +}; -- 2.19.1 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot