summaryrefslogtreecommitdiffstats
path: root/src/interface
diff options
context:
space:
mode:
authorMichael Brown2014-09-04 17:03:10 +0200
committerMichael Brown2014-09-04 17:03:52 +0200
commit3bb910caa8cfb07c8d2858e70065dc2904ecaf99 (patch)
tree9e6c64e0ef619730f8dd7941153e673b4b55a818 /src/interface
parent[efi] Avoid returning uninitialised data from PCI configuration space reads (diff)
downloadipxe-3bb910caa8cfb07c8d2858e70065dc2904ecaf99.tar.gz
ipxe-3bb910caa8cfb07c8d2858e70065dc2904ecaf99.tar.xz
ipxe-3bb910caa8cfb07c8d2858e70065dc2904ecaf99.zip
[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 <Colin.Blacker@computerplanet.co.uk> Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/interface')
-rw-r--r--src/interface/efi/efi_pci.c8
1 files changed, 7 insertions, 1 deletions
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 ) {