payloads/edk2: Add iPXE EFI support for EDK2 payload

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ć <michal.kopec@3mdeb.com>
Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/82721
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Sean Rhodes <sean@starlabs.systems>
Reviewed-by: Walter Sonius <walterav1984@gmail.com>
This commit is contained in:
Michał Kopeć 2024-04-03 12:06:20 +02:00 committed by Matt DeVillier
commit 567470cbb3
4 changed files with 51 additions and 5 deletions

View file

@ -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

View file

@ -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

View file

@ -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 <uuid/uuid.h>" > 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; \

View file

@ -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