i2c: synquacer: SNI Synquacer I2C controller
[platform/kernel/u-boot.git] / cmd / bootefi.c
index 8fa4a1c..cba81ff 100644 (file)
@@ -8,6 +8,7 @@
 #define LOG_CATEGORY LOGC_EFI
 
 #include <common.h>
+#include <bootm.h>
 #include <charset.h>
 #include <command.h>
 #include <dm.h>
@@ -18,6 +19,7 @@
 #include <image.h>
 #include <log.h>
 #include <malloc.h>
+#include <asm/global_data.h>
 #include <linux/libfdt.h>
 #include <linux/libfdt_env.h>
 #include <mapmem.h>
@@ -71,7 +73,7 @@ void efi_set_bootdev(const char *dev, const char *devnr, const char *path,
        /* Remember only PE-COFF and FIT images */
        if (efi_check_pe(buffer, buffer_size, NULL) != EFI_SUCCESS) {
 #ifdef CONFIG_FIT
-               if (!fit_check_format(buffer))
+               if (fit_check_format(buffer, IMAGE_SIZE_INVAL))
                        return;
                /*
                 * FIT images of type EFI_OS are started via command bootm.
@@ -212,86 +214,6 @@ done:
 }
 
 /**
- * efi_reserve_memory() - add reserved memory to memory map
- *
- * @addr:      start address of the reserved memory range
- * @size:      size of the reserved memory range
- * @nomap:     indicates that the memory range shall not be accessed by the
- *             UEFI payload
- */
-static void efi_reserve_memory(u64 addr, u64 size, bool nomap)
-{
-       int type;
-       efi_uintn_t ret;
-
-       /* Convert from sandbox address space. */
-       addr = (uintptr_t)map_sysmem(addr, 0);
-
-       if (nomap)
-               type = EFI_RESERVED_MEMORY_TYPE;
-       else
-               type = EFI_BOOT_SERVICES_DATA;
-
-       ret = efi_add_memory_map(addr, size, type);
-       if (ret != EFI_SUCCESS)
-               log_err("Reserved memory mapping failed addr %llx size %llx\n",
-                       addr, size);
-}
-
-/**
- * efi_carve_out_dt_rsv() - Carve out DT reserved memory ranges
- *
- * The mem_rsv entries of the FDT are added to the memory map. Any failures are
- * ignored because this is not critical and we would rather continue to try to
- * boot.
- *
- * @fdt: Pointer to device tree
- */
-static void efi_carve_out_dt_rsv(void *fdt)
-{
-       int nr_rsv, i;
-       u64 addr, size;
-       int nodeoffset, subnode;
-
-       nr_rsv = fdt_num_mem_rsv(fdt);
-
-       /* Look for an existing entry and add it to the efi mem map. */
-       for (i = 0; i < nr_rsv; i++) {
-               if (fdt_get_mem_rsv(fdt, i, &addr, &size) != 0)
-                       continue;
-               efi_reserve_memory(addr, size, false);
-       }
-
-       /* process reserved-memory */
-       nodeoffset = fdt_subnode_offset(fdt, 0, "reserved-memory");
-       if (nodeoffset >= 0) {
-               subnode = fdt_first_subnode(fdt, nodeoffset);
-               while (subnode >= 0) {
-                       fdt_addr_t fdt_addr;
-                       fdt_size_t fdt_size;
-
-                       /* check if this subnode has a reg property */
-                       fdt_addr = fdtdec_get_addr_size_auto_parent(
-                                               fdt, nodeoffset, subnode,
-                                               "reg", 0, &fdt_size, false);
-                       /*
-                        * The /reserved-memory node may have children with
-                        * a size instead of a reg property.
-                        */
-                       if (fdt_addr != FDT_ADDR_T_NONE &&
-                           fdtdec_get_is_enabled(fdt, subnode)) {
-                               bool nomap;
-
-                               nomap = !!fdt_getprop(fdt, subnode, "no-map",
-                                                     NULL);
-                               efi_reserve_memory(fdt_addr, fdt_size, nomap);
-                       }
-                       subnode = fdt_next_subnode(fdt, subnode);
-               }
-       }
-}
-
-/**
  * get_config_table() - get configuration table
  *
  * @guid:      GUID of the configuration table
@@ -418,6 +340,9 @@ static efi_status_t do_bootefi_exec(efi_handle_t handle, void *load_options)
        efi_uintn_t exit_data_size = 0;
        u16 *exit_data = NULL;
 
+       /* On ARM switch from EL3 or secure mode to EL2 or non-secure mode */
+       switch_to_non_secure_mode();
+
        /* Call our payload! */
        ret = EFI_CALL(efi_start_image(handle, &exit_data_size, &exit_data));
        if (ret != EFI_SUCCESS) {
@@ -433,6 +358,9 @@ static efi_status_t do_bootefi_exec(efi_handle_t handle, void *load_options)
 
        free(load_options);
 
+       if (IS_ENABLED(CONFIG_EFI_LOAD_FILE2_INITRD))
+               efi_initrd_deregister();
+
        return ret;
 }
 
@@ -711,10 +639,12 @@ static int do_bootefi(struct cmd_tbl *cmdtp, int flag, int argc,
        else if (ret != EFI_SUCCESS)
                return CMD_RET_FAILURE;
 
-       if (!strcmp(argv[1], "bootmgr"))
-               return do_efibootmgr();
+       if (IS_ENABLED(CONFIG_CMD_BOOTEFI_BOOTMGR)) {
+               if (!strcmp(argv[1], "bootmgr"))
+                       return do_efibootmgr();
+       }
 #ifdef CONFIG_CMD_BOOTEFI_SELFTEST
-       else if (!strcmp(argv[1], "selftest"))
+       if (!strcmp(argv[1], "selftest"))
                return do_efi_selftest();
 #endif
 
@@ -737,11 +667,14 @@ static char bootefi_help_text[] =
        "    Use environment variable efi_selftest to select a single test.\n"
        "    Use 'setenv efi_selftest list' to enumerate all tests.\n"
 #endif
+#ifdef CONFIG_CMD_BOOTEFI_BOOTMGR
        "bootefi bootmgr [fdt address]\n"
        "  - load and boot EFI payload based on BootOrder/BootXXXX variables.\n"
        "\n"
        "    If specified, the device tree located at <fdt address> gets\n"
-       "    exposed as EFI configuration table.\n";
+       "    exposed as EFI configuration table.\n"
+#endif
+       ;
 #endif
 
 U_BOOT_CMD(