[U-Boot] [PATCH 01/11] imx: Add bootcmd to load and run UEFI from mmc

Stefano Babic sbabic at denx.de
Tue Aug 7 11:11:11 UTC 2018


Hi Henry,

On 14/07/2018 02:11, Henry Beberman wrote:
> From: Henry Beberman <henry.beberman at 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 at microsoft.com>
> Cc: Stefano Babic <sbabic at denx.de>
> Cc: Fabio Estevam <fabio.estevam at nxp.com>
> Cc: Tom Rini <trini at 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
> 

I am really missing why we need this specially for i.MX. There is
nothing special to i.MX, and if this command is necessary, we should put
it in common code.

Anyway, should we not try to merge it with the general support for UEFI
in U-Boot ? We have already a "bootefi" command (aarch64 and x86,
currently).

> 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 */
> 

Best regards,
Stefano Babic

-- 
=====================================================================
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================


More information about the U-Boot mailing list