
From: Henry Beberman henry.beberman@microsoft.com
U-Boot already has logic for determining the platform MAC address on many i.MX platforms, such as pulling it from fuses or SPI flash. This configuration option saves the MAC address from the ethaddr (and potentially ethaddr1) into the global page and marks it as valid. This value is then picked up in UEFI which will configure the LAN driver in Windows with the correct MAC address.
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 | 16 ++++++++++++++++ arch/arm/mach-imx/global_page.c | 26 +++++++++++++++++++++++++- configs/cl-som-imx7_nt_defconfig | 2 ++ configs/mx6cuboxi_nt_defconfig | 2 ++ configs/mx6sabresd_nt_defconfig | 2 ++ configs/udoo_neo_nt_defconfig | 2 ++ include/global_page.h | 8 ++++++++ 7 files changed, 57 insertions(+), 1 deletion(-)
diff --git a/arch/arm/mach-imx/Kconfig b/arch/arm/mach-imx/Kconfig index c88fa2ca1b..9bc0294d0c 100644 --- a/arch/arm/mach-imx/Kconfig +++ b/arch/arm/mach-imx/Kconfig @@ -85,3 +85,19 @@ config GLOBAL_PAGE help This option creates a global 4K page to store U-Boot environment data to pass to another environment such as UEFI or Windows. + +config STORE_MAC_IN_GLOBAL + bool "Store MAC address information in global page" + depends on GLOBAL_PAGE + default n + help + This option informs U-Boot to read the ethaddr environment + variable and store it in the global page for UEFI to use. + +config ETH1ADDR_IN_GLOBAL + bool "Store MAC Address for 2nd ethernet in global page" + depends on STORE_MAC_IN_GLOBAL + default n + help + This option informs U-Boot to read the eth1addr environment + variable and store it in the global page for UEFI to use. diff --git a/arch/arm/mach-imx/global_page.c b/arch/arm/mach-imx/global_page.c index 139e18f4bc..c753452ad6 100644 --- a/arch/arm/mach-imx/global_page.c +++ b/arch/arm/mach-imx/global_page.c @@ -20,9 +20,33 @@ void init_global_page(void) global_page->header.signature = 0x474c424c;
/* Set revision */ - global_page->header.revision = 0; + global_page->header.revision = 1; }
void publish_to_global_page(void) { +#ifdef CONFIG_STORE_MAC_IN_GLOBAL + publish_mac_to_global_page("ethaddr", 0); +#endif /* CONFIG_STORE_MAC_IN_GLOBAL */ + +#ifdef CONFIG_ETH1ADDR_IN_GLOBAL + publish_mac_to_global_page("eth1addr", 1); +#endif /* CONFIG_ETH1ADDR_IN_GLOBAL */ +} + +void publish_mac_to_global_page(const char *env_var, int mac) +{ + uchar mac_id[6]; + + if (mac > 1) + return; + + if (!(strcmp(env_var, "ethaddr") || strcmp(env_var, "eth1addr"))) + return; + + eth_env_get_enetaddr(env_var, mac_id); + + global_page->mac_entry[mac].enet_id = mac; + global_page->mac_entry[mac].valid = 1; + memcpy(global_page->mac_entry[mac].mac, mac_id, 6); } diff --git a/configs/cl-som-imx7_nt_defconfig b/configs/cl-som-imx7_nt_defconfig index 4fe8233f0f..048621874c 100644 --- a/configs/cl-som-imx7_nt_defconfig +++ b/configs/cl-som-imx7_nt_defconfig @@ -77,4 +77,6 @@ CONFIG_MXC_USB_OTG_HACTIVE=y CONFIG_USB_STORAGE=y CONFIG_USB_GADGET=y CONFIG_CI_UDC=y +CONFIG_GLOBAL_PAGE=y +CONFIG_STORE_MAC_IN_GLOBAL=y CONFIG_OF_LIBFDT=y diff --git a/configs/mx6cuboxi_nt_defconfig b/configs/mx6cuboxi_nt_defconfig index 087569d2e9..b29084012f 100644 --- a/configs/mx6cuboxi_nt_defconfig +++ b/configs/mx6cuboxi_nt_defconfig @@ -59,4 +59,6 @@ CONFIG_USB_STORAGE=y CONFIG_USB=y CONFIG_USE_TINY_PRINTF=y CONFIG_VIDEO=y +CONFIG_GLOBAL_PAGE=y +CONFIG_STORE_MAC_IN_GLOBAL=y CONFIG_OF_LIBFDT=y \ No newline at end of file diff --git a/configs/mx6sabresd_nt_defconfig b/configs/mx6sabresd_nt_defconfig index 9d858a4418..47c6568e60 100644 --- a/configs/mx6sabresd_nt_defconfig +++ b/configs/mx6sabresd_nt_defconfig @@ -55,4 +55,6 @@ CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y CONFIG_USB=y CONFIG_USE_TINY_PRINTF=y CONFIG_VIDEO=y +CONFIG_GLOBAL_PAGE=y +CONFIG_STORE_MAC_IN_GLOBAL=y CONFIG_OF_LIBFDT=y \ No newline at end of file diff --git a/configs/udoo_neo_nt_defconfig b/configs/udoo_neo_nt_defconfig index d5123369ca..1be3180382 100644 --- a/configs/udoo_neo_nt_defconfig +++ b/configs/udoo_neo_nt_defconfig @@ -52,4 +52,6 @@ CONFIG_SYS_L2CACHE_OFF=y CONFIG_SYS_MALLOC_F_LEN=0x800 CONFIG_USE_TINY_PRINTF=y CONFIG_PHY_MICREL=y +CONFIG_GLOBAL_PAGE=y +CONFIG_STORE_MAC_IN_GLOBAL=y CONFIG_OF_LIBFDT=y \ No newline at end of file diff --git a/include/global_page.h b/include/global_page.h index a9ee6b67ad..2ba291019a 100644 --- a/include/global_page.h +++ b/include/global_page.h @@ -14,11 +14,19 @@ struct global_page_header { u8 reserved[3]; } __packed;
+struct global_mac_entry { + u8 enet_id; + u8 valid; + u8 mac[6]; +} __packed; + struct imx_global_page { struct global_page_header header; + struct global_mac_entry mac_entry[2]; } __packed;
void init_global_page(void); void publish_to_global_page(void); +void publish_mac_to_global_page(const char *env_var, int mac);
#endif