From: Michael Brown Date: Mon, 24 Nov 2025 20:27:53 +0000 (+0000) Subject: [pci] Use runtime selectable PCI I/O API for EFI cloud builds X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dfea3bbfad75aa742623beb4d88e2be086a4b8ee;p=thirdparty%2Fipxe.git [pci] Use runtime selectable PCI I/O API for EFI cloud builds On some systems (observed on an AWS m8g.medium instance in eu-west-2), the UEFI firmware omits the PCI host bridge drivers for all but the first PCI bus. The observable result is that any devices on other PCI buses (such as the ENA network device) are not enumerated by the UEFI firmware and are therefore unusable by iPXE. Support these systems by switching to using PCIAPI_CLOUD for EFI cloud builds, trying the EFI PCI I/O API first and falling back to direct access (via ECAM) for devices that the UEFI firmware has failed to enumerate itself. Signed-off-by: Michael Brown --- diff --git a/src/config/cloud/ioapi.h b/src/config/cloud/ioapi.h index bcd245981..3ab05082f 100644 --- a/src/config/cloud/ioapi.h +++ b/src/config/cloud/ioapi.h @@ -8,3 +8,13 @@ #define PCIAPI_RUNTIME_PCBIOS #define PCIAPI_RUNTIME_DIRECT #endif + +/* Work around missing PCI host bridge drivers in the cut-down UEFI found + * in some AWS EC2 instances. + */ +#ifdef PLATFORM_efi +#undef PCIAPI_EFI +#define PCIAPI_CLOUD +#define PCIAPI_RUNTIME_EFI +#define PCIAPI_RUNTIME_ECAM +#endif diff --git a/src/config/config_pci.c b/src/config/config_pci.c index 8ed9f6603..b2adae995 100644 --- a/src/config/config_pci.c +++ b/src/config/config_pci.c @@ -45,3 +45,6 @@ REQUIRE_OBJECT ( pcibios ); #ifdef PCIAPI_RUNTIME_DIRECT REQUIRE_OBJECT ( pcidirect ); #endif +#ifdef PCIAPI_RUNTIME_EFI +REQUIRE_OBJECT ( efi_pci ); +#endif diff --git a/src/include/ipxe/pci_io.h b/src/include/ipxe/pci_io.h index 0d32adf81..7ac09efb0 100644 --- a/src/include/ipxe/pci_io.h +++ b/src/include/ipxe/pci_io.h @@ -192,9 +192,10 @@ struct pci_api { #endif /* PCI runtime selectable API priorities */ -#define PCIAPI_PRIORITY_ECAM 01 /**< ACPI ECAM */ -#define PCIAPI_PRIORITY_PCBIOS 02 /**< PCI BIOS calls */ -#define PCIAPI_PRIORITY_DIRECT 03 /**< Direct Type 1 accesses */ +#define PCIAPI_PRIORITY_EFI 01 /**< EFI PCI I/O protocols */ +#define PCIAPI_PRIORITY_ECAM 02 /**< ACPI ECAM */ +#define PCIAPI_PRIORITY_PCBIOS 03 /**< PCI BIOS calls */ +#define PCIAPI_PRIORITY_DIRECT 04 /**< Direct Type 1 accesses */ /** Provide a runtime selectable PCI I/O API */ #define PROVIDE_PCIAPI_RUNTIME( subsys, priority ) \ diff --git a/src/interface/efi/efi_pci.c b/src/interface/efi/efi_pci.c index fbf06300b..f4853c234 100644 --- a/src/interface/efi/efi_pci.c +++ b/src/interface/efi/efi_pci.c @@ -436,6 +436,7 @@ PROVIDE_PCIAPI_INLINE ( efi, pci_write_config_byte ); PROVIDE_PCIAPI_INLINE ( efi, pci_write_config_word ); PROVIDE_PCIAPI_INLINE ( efi, pci_write_config_dword ); PROVIDE_PCIAPI ( efi, pci_ioremap, efipci_ioremap ); +PROVIDE_PCIAPI_RUNTIME ( efi, PCIAPI_PRIORITY_EFI ); /****************************************************************************** *