From 567470cbb3e0fa74797ddf3561cece0ebd4b9ff3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kope=C4=87?= Date: Wed, 3 Apr 2024 12:06:20 +0200 Subject: [PATCH] payloads/edk2: Add iPXE EFI support for EDK2 payload MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add support for building iPXE as an EFI target and including it in the EDK2 payload as a boot option. This allows network booting directly from the UEFI boot menu without requiring a separate iPXE ROM file, as it is integrated into the payload. As the required payload-side changes are not yet upstream, guard the option on !EDK2_REPO_OFFICIAL. Adjust PXE Kconfig defaults so that PXE is built from source as ipxe.efi when EDK2_ENABLE_IPXE is selected. TEST=build/boot iPXE from edk2 boot menu on google/fizz. Change-Id: Ied61c7b8aa7a34261d6c6f7fd089b1affdc7d3f6 Signed-off-by: Michał Kopeć Signed-off-by: Matt DeVillier Reviewed-on: https://review.coreboot.org/c/coreboot/+/82721 Tested-by: build bot (Jenkins) Reviewed-by: Sean Rhodes Reviewed-by: Walter Sonius --- payloads/external/Makefile.mk | 21 +++++++++++++++++---- payloads/external/edk2/Kconfig | 18 ++++++++++++++++++ payloads/external/edk2/Makefile | 15 ++++++++++++++- payloads/external/iPXE/Kconfig | 2 ++ 4 files changed, 51 insertions(+), 5 deletions(-) diff --git a/payloads/external/Makefile.mk b/payloads/external/Makefile.mk index c0882c426d..1a494486db 100644 --- a/payloads/external/Makefile.mk +++ b/payloads/external/Makefile.mk @@ -156,7 +156,11 @@ payloads/external/depthcharge/depthcharge/build/depthcharge.elf depthcharge: $(D # edk2 -$(obj)/UEFIPAYLOAD.fd: $(DOTCONFIG) +ifeq ($(CONFIG_EDK2_ENABLE_IPXE),y) +IPXE_EFI := payloads/external/iPXE/ipxe/ipxe.rom +endif + +$(obj)/UEFIPAYLOAD.fd: $(DOTCONFIG) $(IPXE_EFI) $(MAKE) -C payloads/external/edk2 UefiPayloadPkg \ HOSTCC="$(HOSTCC)" \ CC="$(HOSTCC)" \ @@ -208,7 +212,9 @@ $(obj)/UEFIPAYLOAD.fd: $(DOTCONFIG) OBJCOPY_x86_64=$(OBJCOPY_x86_64) \ OBJCOPY_arm=$(OBJCOPY_arm) \ OBJCOPY_arm64=$(OBJCOPY_arm64) \ - MFLAGS= MAKEFLAGS= + MFLAGS= MAKEFLAGS= \ + CONFIG_EDK2_IPXE=$(CONFIG_EDK2_ENABLE_IPXE) \ + CONFIG_EDK2_IPXE_OPTION_NAME=$(CONFIG_EDK2_IPXE_OPTION_NAME) $(obj)/ShimmedUniversalPayload.elf: $(DOTCONFIG) $(MAKE) -C payloads/external/edk2 UniversalPayload \ @@ -367,13 +373,18 @@ else IPXE_SERIAL_CONSOLE = n endif +ifneq ($(CONFIG_EDK2_ENABLE_IPXE),y) cbfs-files-$(CONFIG_PXE_ROM)$(CONFIG_BUILD_IPXE) += pci$(CONFIG_PXE_ROM_ID).rom pci$(CONFIG_PXE_ROM_ID).rom-file := $(PXE_ROM_FILE) pci$(CONFIG_PXE_ROM_ID).rom-type := raw +IPXE_CROSS_COMPILE:="$(CROSS_COMPILE_$(ARCH-ramstage-y))" +else +IPXE_CROSS_COMPILE:=$(CROSS_COMPILE_x86_64) +endif payloads/external/iPXE/ipxe/ipxe.rom ipxe: $(DOTCONFIG) $(IPXE_CONFIG_SCRIPT) $(MAKE) -C payloads/external/iPXE all \ - CROSS_COMPILE="$(CROSS_COMPILE_$(ARCH-ramstage-y))" \ + CROSS_COMPILE=$(IPXE_CROSS_COMPILE) \ PXE_ROM_PCI_ID=$(PXE_ROM_PCI_ID) \ CONFIG_IPXE_MASTER=$(CONFIG_IPXE_MASTER) \ CONFIG_IPXE_STABLE=$(CONFIG_IPXE_STABLE) \ @@ -384,7 +395,9 @@ payloads/external/iPXE/ipxe/ipxe.rom ipxe: $(DOTCONFIG) $(IPXE_CONFIG_SCRIPT) CONFIG_HAS_SCRIPT=$(CONFIG_IPXE_ADD_SCRIPT) \ CONFIG_IPXE_NO_PROMPT=$(CONFIG_IPXE_NO_PROMPT) \ CONFIG_IPXE_HAS_HTTPS=$(CONFIG_IPXE_HAS_HTTPS) \ - CONFIG_IPXE_TRUST_CMD=$(CONFIG_IPXE_TRUST_CMD) + CONFIG_IPXE_TRUST_CMD=$(CONFIG_IPXE_TRUST_CMD) \ + CFLAGS_x86_64="$(CFLAGS_x86_64)" \ + CONFIG_IPXE_BUILD_EFI=$(CONFIG_EDK2_ENABLE_IPXE) \ # LinuxBoot LINUXBOOT_CROSS_COMPILE_ARCH-$(CONFIG_LINUXBOOT_X86) = x86_32 diff --git a/payloads/external/edk2/Kconfig b/payloads/external/edk2/Kconfig index dc76251fb2..7bfd486f7a 100644 --- a/payloads/external/edk2/Kconfig +++ b/payloads/external/edk2/Kconfig @@ -317,4 +317,22 @@ config EDK2_CUSTOM_BUILD_PARAMS This option can support both macros `-D` and Pcds `--pcd`. +config EDK2_ENABLE_IPXE + bool "Include iPXE in edk2 payload" + depends on !EDK2_REPO_OFFICIAL + default n + select PXE + help + Instructs coreboot build system to build iPXE EFI target and include + it in the EDK2 payload. + +config EDK2_IPXE_OPTION_NAME + string "iPXE option name" + depends on EDK2_ENABLE_IPXE + default "iPXE Network Boot" + help + Configures how the iPXE boot option should be displayed in boot menu + of EDK2 Payload. This name will be passed as PCD to the EDK2 build + system. + endif diff --git a/payloads/external/edk2/Makefile b/payloads/external/edk2/Makefile index 4eaf80b50e..6122cd4d30 100644 --- a/payloads/external/edk2/Makefile +++ b/payloads/external/edk2/Makefile @@ -158,6 +158,11 @@ endif ifeq ($(CONFIG_EDK2_LOAD_OPTION_ROMS),y) BUILD_STR += -D LOAD_OPTION_ROMS=TRUE endif +# NETWORK_IPXE = FALSE +ifeq ($(CONFIG_EDK2_IPXE),y) +BUILD_STR += -D NETWORK_IPXE=TRUE +BUILD_STR += --pcd gUefiPayloadPkgTokenSpaceGuid.PcdiPXEOptionName=L"$(CONFIG_EDK2_IPXE_OPTION_NAME)" +endif endif # !CONFIG_EDK2_REPO_OFFICIAL @@ -248,6 +253,14 @@ gop_driver: $(EDK2_PATH) cp $(top)/$(CONFIG_INTEL_GMA_VBT_FILE) $(EDK2_PATH)/UefiPayloadPkg/vbt.bin; \ fi; \ +ipxe_rom: $(EDK2_PATH) + if [ "$(CONFIG_EDK2_IPXE)" == "y" ]; then \ + echo " Including externally built iPXE"; \ + mkdir -p $(EDK2_PATH)/UefiPayloadPkg/NetworkDrivers/; \ + cp $(top)/payloads/external/iPXE/ipxe/ipxe.rom \ + $(EDK2_PATH)/UefiPayloadPkg/NetworkDrivers/ipxe.efi; \ + fi \ + checktools: echo -n "EDK2: Checking uuid-dev:" echo "#include " > libtest.c @@ -285,7 +298,7 @@ print: -e 's/s /Build: Silent/' \ -e 's/t /Toolchain: /' -prep: $(EDK2_PATH) $(EDK2_PLATFORMS_PATH) clean checktools logo gop_driver +prep: $(EDK2_PATH) $(EDK2_PLATFORMS_PATH) clean checktools logo gop_driver ipxe_rom cd $(WORKSPACE); \ source $(EDK2_PATH)/edksetup.sh; \ unset CC; $(MAKE) -C $(EDK2_PATH)/BaseTools 2>&1; \ diff --git a/payloads/external/iPXE/Kconfig b/payloads/external/iPXE/Kconfig index fd427e9754..14f8898f4e 100644 --- a/payloads/external/iPXE/Kconfig +++ b/payloads/external/iPXE/Kconfig @@ -10,6 +10,7 @@ menu "PXE Options" choice prompt "PXE ROM to use" + default BUILD_IPXE if EDK2_ENABLE_IPXE default PXE_ROM config PXE_ROM @@ -120,6 +121,7 @@ config IPXE_TRUST_CMD config IPXE_BUILD_EFI bool "Build iPXE for EFI target" depends on PAYLOAD_EDK2 + default y if EDK2_ENABLE_IPXE default n help Build iPXE for EFI target, enabling it to be executed from EDK2. If not