]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Make EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL optional
authorMichael Brown <mcb30@ipxe.org>
Thu, 4 Sep 2014 15:03:10 +0000 (16:03 +0100)
committerMichael Brown <mcb30@ipxe.org>
Thu, 4 Sep 2014 15:03:52 +0000 (16:03 +0100)
Some UEFI systems (observed with a Hyper-V virtual machine) do not
provide EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.  Make this an optional
protocol (and fail any attempts to access PCI configuration space via
the root bridge if the protocol is missing).

Reported-by: Colin Blacker <Colin.Blacker@computerplanet.co.uk>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/interface/efi/efi_pci.c

index 033eae87c62dc91f6c6eccb9424ea46dc17734ca..86c781d82dc37833acf80afd694b252fe300b805 100644 (file)
@@ -59,7 +59,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
 
 /** PCI root bridge I/O protocol */
 static EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *efipci;
-EFI_REQUIRE_PROTOCOL ( EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL, &efipci );
+EFI_REQUEST_PROTOCOL ( EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL, &efipci );
 
 static unsigned long efipci_address ( struct pci_device *pci,
                                      unsigned long location ) {
@@ -74,6 +74,9 @@ int efipci_read ( struct pci_device *pci, unsigned long location,
        EFI_STATUS efirc;
        int rc;
 
+       if ( ! efipci )
+               return -ENOTSUP;
+
        if ( ( efirc = efipci->Pci.Read ( efipci, EFIPCI_WIDTH ( location ),
                                          efipci_address ( pci, location ), 1,
                                          value ) ) != 0 ) {
@@ -92,6 +95,9 @@ int efipci_write ( struct pci_device *pci, unsigned long location,
        EFI_STATUS efirc;
        int rc;
 
+       if ( ! efipci )
+               return -ENOTSUP;
+
        if ( ( efirc = efipci->Pci.Write ( efipci, EFIPCI_WIDTH ( location ),
                                           efipci_address ( pci, location ), 1,
                                           &value ) ) != 0 ) {