From 3bb910caa8cfb07c8d2858e70065dc2904ecaf99 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 4 Sep 2014 16:03:10 +0100 Subject: [PATCH] [efi] Make EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL optional 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 Signed-off-by: Michael Brown --- src/interface/efi/efi_pci.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/interface/efi/efi_pci.c b/src/interface/efi/efi_pci.c index 033eae87..86c781d8 100644 --- a/src/interface/efi/efi_pci.c +++ b/src/interface/efi/efi_pci.c @@ -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 ) {