|
@@ -22,40 +22,65 @@
|
|
|
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
|
|
-static u8 efi_obj_list_initialized;
|
|
|
+#define OBJ_LIST_NOT_INITIALIZED 1
|
|
|
+
|
|
|
+static efi_status_t efi_obj_list_initialized = OBJ_LIST_NOT_INITIALIZED;
|
|
|
|
|
|
static struct efi_device_path *bootefi_image_path;
|
|
|
static struct efi_device_path *bootefi_device_path;
|
|
|
|
|
|
/* Initialize and populate EFI object list */
|
|
|
-static void efi_init_obj_list(void)
|
|
|
+efi_status_t efi_init_obj_list(void)
|
|
|
{
|
|
|
+ efi_status_t ret = EFI_SUCCESS;
|
|
|
+
|
|
|
/* Initialize once only */
|
|
|
- if (efi_obj_list_initialized)
|
|
|
- return;
|
|
|
- efi_obj_list_initialized = 1;
|
|
|
+ if (efi_obj_list_initialized != OBJ_LIST_NOT_INITIALIZED)
|
|
|
+ return efi_obj_list_initialized;
|
|
|
|
|
|
/* Initialize EFI driver uclass */
|
|
|
- efi_driver_init();
|
|
|
+ ret = efi_driver_init();
|
|
|
+ if (ret != EFI_SUCCESS)
|
|
|
+ goto out;
|
|
|
|
|
|
- efi_console_register();
|
|
|
+ ret = efi_console_register();
|
|
|
+ if (ret != EFI_SUCCESS)
|
|
|
+ goto out;
|
|
|
#ifdef CONFIG_PARTITIONS
|
|
|
- efi_disk_register();
|
|
|
+ ret = efi_disk_register();
|
|
|
+ if (ret != EFI_SUCCESS)
|
|
|
+ goto out;
|
|
|
#endif
|
|
|
#if defined(CONFIG_LCD) || defined(CONFIG_DM_VIDEO)
|
|
|
- efi_gop_register();
|
|
|
+ ret = efi_gop_register();
|
|
|
+ if (ret != EFI_SUCCESS)
|
|
|
+ goto out;
|
|
|
#endif
|
|
|
#ifdef CONFIG_CMD_NET
|
|
|
- efi_net_register();
|
|
|
+ ret = efi_net_register();
|
|
|
+ if (ret != EFI_SUCCESS)
|
|
|
+ goto out;
|
|
|
#endif
|
|
|
#ifdef CONFIG_GENERATE_SMBIOS_TABLE
|
|
|
- efi_smbios_register();
|
|
|
+ ret = efi_smbios_register();
|
|
|
+ if (ret != EFI_SUCCESS)
|
|
|
+ goto out;
|
|
|
#endif
|
|
|
- efi_watchdog_register();
|
|
|
+ ret = efi_watchdog_register();
|
|
|
+ if (ret != EFI_SUCCESS)
|
|
|
+ goto out;
|
|
|
|
|
|
/* Initialize EFI runtime services */
|
|
|
- efi_reset_system_init();
|
|
|
- efi_get_time_init();
|
|
|
+ ret = efi_reset_system_init();
|
|
|
+ if (ret != EFI_SUCCESS)
|
|
|
+ goto out;
|
|
|
+ ret = efi_get_time_init();
|
|
|
+ if (ret != EFI_SUCCESS)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+out:
|
|
|
+ efi_obj_list_initialized = ret;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -186,9 +211,6 @@ static efi_status_t do_bootefi_exec(void *efi, void *fdt,
|
|
|
assert(device_path && image_path);
|
|
|
}
|
|
|
|
|
|
- /* Initialize and populate EFI object list */
|
|
|
- efi_init_obj_list();
|
|
|
-
|
|
|
efi_setup_loaded_image(&loaded_image_info, &loaded_image_info_obj,
|
|
|
device_path, image_path);
|
|
|
|
|
@@ -285,9 +307,6 @@ static int do_bootefi_bootmgr_exec(unsigned long fdt_addr)
|
|
|
void *addr;
|
|
|
efi_status_t r;
|
|
|
|
|
|
- /* Initialize and populate EFI object list */
|
|
|
- efi_init_obj_list();
|
|
|
-
|
|
|
/*
|
|
|
* gd lives in a fixed register which may get clobbered while we execute
|
|
|
* the payload. So save it here and restore it on every callback entry
|
|
@@ -316,6 +335,14 @@ static int do_bootefi(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
unsigned long addr, fdt_addr = 0;
|
|
|
efi_status_t r;
|
|
|
|
|
|
+ /* Initialize EFI drivers */
|
|
|
+ r = efi_init_obj_list();
|
|
|
+ if (r != EFI_SUCCESS) {
|
|
|
+ printf("Error: Cannot set up EFI drivers, r = %lu\n",
|
|
|
+ r & ~EFI_ERROR_MASK);
|
|
|
+ return CMD_RET_FAILURE;
|
|
|
+ }
|
|
|
+
|
|
|
if (argc < 2)
|
|
|
return CMD_RET_USAGE;
|
|
|
#ifdef CONFIG_CMD_BOOTEFI_HELLO
|