]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Cache identified PCI root bridge I/O protocol handle
authorMichael Brown <mcb30@ipxe.org>
Wed, 4 Feb 2026 13:42:21 +0000 (13:42 +0000)
committerMichael Brown <mcb30@ipxe.org>
Wed, 4 Feb 2026 14:10:27 +0000 (14:10 +0000)
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 <mcb30@ipxe.org>
src/interface/efi/efi_pci.c

index 4bf3977c5d814ee3873af52b87616e46d8008f11..7705493519c1f2710cf4a52e976ffcbd81173b68 100644 (file)
@@ -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,