Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[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>
  • Loading branch information
mcb30 committed Sep 4, 2014
1 parent f94d651 commit 3bb910c
Showing 1 changed file with 7 additions and 1 deletion.
8 changes: 7 additions & 1 deletion src/interface/efi/efi_pci.c
Expand Up @@ -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 ) {
Expand All @@ -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 ) {
Expand All @@ -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 ) {
Expand Down

0 comments on commit 3bb910c

Please sign in to comment.