From: Michael Brown Date: Wed, 4 Feb 2026 13:42:21 +0000 (+0000) Subject: [efi] Cache identified PCI root bridge I/O protocol handle X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c18d8957046a6dbb1600efc49e849f9ce389abff;p=thirdparty%2Fipxe.git [efi] Cache identified PCI root bridge I/O protocol handle Reduce the overhead of PCI configuration space accesses (and the verbosity of debug messages) by caching the identified PCI root bridge I/O protocol handle for the most recently accessed PCI device. Signed-off-by: Michael Brown --- diff --git a/src/interface/efi/efi_pci.c b/src/interface/efi/efi_pci.c index 4bf3977c5..770549351 100644 --- a/src/interface/efi/efi_pci.c +++ b/src/interface/efi/efi_pci.c @@ -255,12 +255,18 @@ static void efipci_discover ( uint32_t busdevfn, struct pci_range *range ) { */ static int efipci_root_open ( struct pci_device *pci, EFI_HANDLE *handle, EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL **root ) { - struct pci_range tmp; + static struct { + struct pci_range range; + EFI_HANDLE handle; + } cache; int rc; - /* Find matching root bridge I/O protocol handle */ - if ( ( rc = efipci_discover_any ( pci, &tmp, handle ) ) != 0 ) - return rc; + /* Find and cache matching root bridge I/O protocol handle, if any */ + if ( ( pci->busdevfn - cache.range.start ) >= cache.range.count ) + efipci_discover_any ( pci, &cache.range, &cache.handle ); + if ( ! cache.handle ) + return -ENOENT; + *handle = cache.handle; /* Open PCI root bridge I/O protocol */ if ( ( rc = efi_open ( *handle, &efi_pci_root_bridge_io_protocol_guid,