
From: Henry Beberman henry.beberman@microsoft.com
This patch enables i.MX platforms to easily add a boot script to their U-Boot Proper environment to automatically load and execute an EFI firmware from the first FAT partition of an MMC device.
This is a portion of enabling the Windows 10 IoT Core boot path.
The go command is overridden when CONFIG_UEFI_BOOT is specified. This new go will perform a cache flush/disable, disable interrupts, then jump to the address where UEFI was loaded.
This patch adds two new Kconfig options: CONFIG_UEFI_BOOT: Selects the UEFI bootcmd and overrides go to flush caches and disable interrupts. CONFIG_UEFI_LOAD_ADDR: Specifies the load address for the UEFI image
Signed-off-by: Henry Beberman henry.beberman@microsoft.com Cc: Stefano Babic sbabic@denx.de Cc: Fabio Estevam fabio.estevam@nxp.com Cc: Tom Rini trini@konsulko.com --- arch/arm/mach-imx/Makefile | 1 + arch/arm/mach-imx/boot.c | 19 +++++++++++++++++++ common/Kconfig | 17 +++++++++++++++++ include/config_uefi_bootcmd.h | 29 +++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+) create mode 100644 arch/arm/mach-imx/boot.c create mode 100644 include/config_uefi_bootcmd.h
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index 733c308670..a81af51f03 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile @@ -42,6 +42,7 @@ endif obj-$(CONFIG_SATA) += sata.o obj-$(CONFIG_SECURE_BOOT) += hab.o obj-$(CONFIG_SYSCOUNTER_TIMER) += syscounter.o +obj-$(CONFIG_UEFI_BOOT) += boot.o endif ifeq ($(SOC),$(filter $(SOC),mx7ulp)) obj-y += cache.o diff --git a/arch/arm/mach-imx/boot.c b/arch/arm/mach-imx/boot.c new file mode 100644 index 0000000000..457a323fa2 --- /dev/null +++ b/arch/arm/mach-imx/boot.c @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2018 Microsoft Corporation + */ + +#include <common.h> +#include <command.h> + +DECLARE_GLOBAL_DATA_PTR; + +#if defined(CONFIG_UEFI_BOOT) +unsigned long do_go_exec(ulong (*entry)(int, char * const []), int argc, + char * const argv[]) +{ + cleanup_before_linux(); + + return entry(argc, argv); +} +#endif /* CONFIG_UEFI_BOOT */ diff --git a/common/Kconfig b/common/Kconfig index 4c7a1a9af8..35362b629c 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -217,6 +217,23 @@ config BOOTCOMMAND This is the string of commands that will be used as bootcmd and if AUTOBOOT is set, automatically run.
+config UEFI_BOOT + bool "Boot a UEFI firmware loaded from the first FAT partition on the mmc" + default n + help + Override the CONFIG_BOOTCOMMAND to load a UEFI firmware image from the + first FAT partition on the mmc. Override the go command to make it disable + interrupts and flush the cache before jumping to the specified address. + +config UEFI_LOAD_ADDR + hex "Load address for the UEFI image" + depends on UEFI_BOOT + help + CONFIG_UEFI_BOOT uses this as the address to load the UEFI image. + The uefi_bootcmd script in the environment will fatload efi from the mmc + to this location, then use an overridden go command to disable caches and + interrupts then jump to this location. + menu "Console"
config MENU diff --git a/include/config_uefi_bootcmd.h b/include/config_uefi_bootcmd.h new file mode 100644 index 0000000000..03903abf8f --- /dev/null +++ b/include/config_uefi_bootcmd.h @@ -0,0 +1,29 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +/* + * Copyright (C) 2018 Microsoft Corporation + */ + +#ifndef _CONFIG_UEFI_BOOTCMD_H +#define _CONFIG_UEFI_BOOTCMD_H + +#define BOOTENV \ + "uefi_image_name=imxboard_efi.fd\0" \ + "uefi_addr=" __stringify(CONFIG_UEFI_LOAD_ADDR) "\0" \ + "uefi_bootcmd=" \ + "part list mmc ${mmcdev} -bootable devplist; " \ + "env exists devplist || setenv devplist 1; " \ + "for bootpart in ${devplist}; do " \ + "if fatload mmc ${mmcdev}:${bootpart} " \ + "${uefi_addr} ${uefi_image_name}; then " \ + "echo "Jumping to ${uefi_image_name} at " \ + "${uefi_addr}"; " \ + "go ${uefi_addr}; " \ + "fi; " \ + "done; " \ + "echo "Could not find ${uefi_image_name} on mmc ${mmcdev}";\0" + +#ifdef CONFIG_UEFI_BOOT +#define CONFIG_BOOTCOMMAND "run uefi_bootcmd" +#endif + +#endif /* _CONFIG_UEFI_BOOTCMD_H */