@@ -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 */
@@ -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;
@@ -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,
+};
All the efi-specific objects, except for existing devices, will show up under "efi root node" device. Signed-off-by: AKASHI Takahiro <takahiro.akashi@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(-)