
From: Henry Beberman henry.beberman@microsoft.com
This patch is to enable U-Boot to pass configuration information available during U-Boot Proper into a subsequent OS. This is required for Windows because it lacks device tree support.
When CONFIG_GLOBAL_PAGE and CONFIG_UEFI_BOOT are set on an i.MX6 or i.MX7 platform the go command will initialize a 4k page at a hardcoded offset to zero. Then it will set a signature and revision number at the start of the page so the consumer of the configuration can verify that the page has been initialized to the expected format.
Signed-off-by: Henry Beberman henry.beberman@microsoft.com Cc: Stefano Babic sbabic@denx.de Cc: Fabio Estevam fabio.estevam@nxp.com --- arch/arm/mach-imx/Kconfig | 7 +++++++ arch/arm/mach-imx/Makefile | 1 + arch/arm/mach-imx/boot.c | 6 ++++++ arch/arm/mach-imx/global_page.c | 28 ++++++++++++++++++++++++++++ include/configs/mx6_common.h | 11 +++++++++++ include/configs/mx7_common.h | 5 +++++ include/global_page.h | 24 ++++++++++++++++++++++++ 7 files changed, 82 insertions(+) create mode 100644 arch/arm/mach-imx/global_page.c create mode 100644 include/global_page.h
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index 3aec89d440..c88fa2ca1b 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig @@ -78,3 +78,10 @@ config NXP_BOARD_REVISION NXP boards based on i.MX6/7 contain the board revision information stored in the fuses. Select this option if you want to be able to retrieve the board revision information. + +config GLOBAL_PAGE + bool "Enable global 4K page for configuration sharing" + default n + help + This option creates a global 4K page to store U-Boot environment data + to pass to another environment such as UEFI or Windows. diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index a81af51f03..be095d71a2 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile @@ -43,6 +43,7 @@ obj-$(CONFIG_SATA) += sata.o obj-$(CONFIG_SECURE_BOOT) += hab.o obj-$(CONFIG_SYSCOUNTER_TIMER) += syscounter.o obj-$(CONFIG_UEFI_BOOT) += boot.o +obj-$(CONFIG_GLOBAL_PAGE) += global_page.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 index 457a323fa2..2dbde8d8ee 100644 --- a/arch/arm/mach-imx/boot.c +++ b/arch/arm/mach-imx/boot.c @@ -5,6 +5,7 @@
#include <common.h> #include <command.h> +#include <global_page.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -12,6 +13,11 @@ DECLARE_GLOBAL_DATA_PTR; unsigned long do_go_exec(ulong (*entry)(int, char * const []), int argc, char * const argv[]) { +#ifdef CONFIG_GLOBAL_PAGE + init_global_page(); + publish_to_global_page(); +#endif + cleanup_before_linux();
return entry(argc, argv); diff --git a/arch/arm/mach-imx/global_page.c b/arch/arm/mach-imx/global_page.c new file mode 100644 index 0000000000..139e18f4bc --- /dev/null +++ b/arch/arm/mach-imx/global_page.c @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2018 Microsoft Corporation + */ + +#include <global_page.h> +#include <environment.h> + +DECLARE_GLOBAL_DATA_PTR; + +struct imx_global_page *global_page = + (struct imx_global_page *)GLOBAL_PAGE_BASE_ADDRESS; + +void init_global_page(void) +{ + /* Clear global page */ + memset(global_page, 0, 0x1000); + + /* Set signature to 'GLBL' */ + global_page->header.signature = 0x474c424c; + + /* Set revision */ + global_page->header.revision = 0; +} + +void publish_to_global_page(void) +{ +} diff --git a/include/configs/mx6_common.h b/include/configs/mx6_common.h index 756db4da61..6571787e50 100644 --- a/include/configs/mx6_common.h +++ b/include/configs/mx6_common.h @@ -74,4 +74,15 @@ #define CONFIG_SYS_NORMAL_WORLD #endif
+/* Define global page address */ +#if defined(CONFIG_GLOBAL_PAGE) +#if defined(CONFIG_MX6SL) || defined(CONFIG_MX6SLL) || \ + defined(CONFIG_MX6SX) || \ + defined(CONFIG_MX6UL) || defined(CONFIG_MX6ULL) +#define GLOBAL_PAGE_BASE_ADDRESS 0x82003000 +#else +#define GLOBAL_PAGE_BASE_ADDRESS 0x10817000 +#endif +#endif + #endif diff --git a/include/configs/mx7_common.h b/include/configs/mx7_common.h index 4864df5108..a26805e93c 100644 --- a/include/configs/mx7_common.h +++ b/include/configs/mx7_common.h @@ -63,4 +63,9 @@ #define CONFIG_SYS_NORMAL_WORLD #endif
+/* Define global page address */ +#if defined(CONFIG_GLOBAL_PAGE) +#define GLOBAL_PAGE_BASE_ADDRESS 0x82003000 +#endif + #endif diff --git a/include/global_page.h b/include/global_page.h new file mode 100644 index 0000000000..a9ee6b67ad --- /dev/null +++ b/include/global_page.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0+*/ +/* + * Copyright (C) 2018 Microsoft Corporation + */ + +#ifndef _GLOBAL_PAGE_H +#define _GLOBAL_PAGE_H + +#include <common.h> + +struct global_page_header { + u32 signature; + u8 revision; + u8 reserved[3]; +} __packed; + +struct imx_global_page { + struct global_page_header header; +} __packed; + +void init_global_page(void); +void publish_to_global_page(void); + +#endif