iPXE
efi_pci.h File Reference

EFI driver interface. More...

#include <ipxe/pci.h>
#include <ipxe/efi/efi.h>
#include <ipxe/efi/Protocol/PciIo.h>

Go to the source code of this file.

Data Structures

struct  efi_pci_device
 An EFI PCI device. More...

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
static EFIAPI uint64_t LShiftU64 (UINT64 value, UINTN shift)
int efipci_info (EFI_HANDLE device, struct efi_pci_device *efipci)
 Get EFI PCI device information.

Detailed Description

EFI driver interface.

Definition in file efi_pci.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ LShiftU64()

EFIAPI uint64_t LShiftU64 ( UINT64 value,
UINTN shift )
inlinestatic

Definition at line 17 of file efi_pci.h.

17 {
18 return ( value << shift );
19}
pseudo_bit_t value[0x00020]
Definition arbel.h:2

References EFIAPI, and value.

◆ efipci_info()

int efipci_info ( EFI_HANDLE device,
struct efi_pci_device * efipci )
extern

Get EFI PCI device information.

Parameters
deviceEFI device handle
efipciEFI PCI device to fill in
Return values
rcReturn status code

Definition at line 711 of file efi_pci.c.

711 {
712 EFI_PCI_IO_PROTOCOL *pci_io;
713 UINTN pci_segment, pci_bus, pci_dev, pci_fn;
714 unsigned int busdevfn;
715 EFI_STATUS efirc;
716 int rc;
717
718 /* See if device is a PCI device */
720 &pci_io ) ) != 0 ) {
721 DBGCP ( device, "EFIPCI %s cannot open PCI protocols: %s\n",
723 return rc;
724 }
725 efipci->io = pci_io;
726
727 /* Get PCI bus:dev.fn address */
728 if ( ( efirc = pci_io->GetLocation ( pci_io, &pci_segment, &pci_bus,
729 &pci_dev, &pci_fn ) ) != 0 ) {
730 rc = -EEFI ( efirc );
731 DBGC ( device, "EFIPCI %s could not get PCI location: %s\n",
733 return rc;
734 }
735 busdevfn = PCI_BUSDEVFN ( pci_segment, pci_bus, pci_dev, pci_fn );
736 pci_init ( &efipci->pci, busdevfn );
737 dma_init ( &efipci->pci.dma, &efipci_dma_operations );
738 DBGCP ( device, "EFIPCI " PCI_FMT " is %s\n",
739 PCI_ARGS ( &efipci->pci ), efi_handle_name ( device ) );
740
741 /* Try to enable I/O cycles, memory cycles, and bus mastering.
742 * Some platforms will 'helpfully' report errors if these bits
743 * can't be enabled (for example, if the card doesn't actually
744 * support I/O cycles). Work around any such platforms by
745 * enabling bits individually and simply ignoring any errors.
746 */
753
754 /* Populate PCI device */
755 if ( ( rc = pci_read_config ( &efipci->pci ) ) != 0 ) {
756 DBGC ( device, "EFIPCI " PCI_FMT " cannot read PCI "
757 "configuration: %s\n",
758 PCI_ARGS ( &efipci->pci ), strerror ( rc ) );
759 return rc;
760 }
761
762 return 0;
763}
UINT64 UINTN
Unsigned value of native width.
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
@ EfiPciIoAttributeOperationEnable
Enable the attributes specified by the bits that are set in Attributes for this PCI controller.
Definition PciIo.h:114
#define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER
Enable the DMA bit in the PCI Config Header.
Definition PciIo.h:62
#define EFI_PCI_IO_ATTRIBUTE_MEMORY
Enable the Memory decode bit in the PCI Config Header.
Definition PciIo.h:61
struct _EFI_PCI_IO_PROTOCOL EFI_PCI_IO_PROTOCOL
Definition PciIo.h:24
#define EFI_PCI_IO_ATTRIBUTE_IO
Enable the I/O decode bit in the PCI Config Header.
Definition PciIo.h:60
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition efi_debug.c:652
EFI_GUID efi_pci_io_protocol_guid
PCI I/O protocol GUID.
Definition efi_guid.c:313
static struct dma_operations efipci_dma_operations
EFI PCI DMA operations.
Definition efi_pci.c:687
uint16_t busdevfn
PCI bus:dev.fn address.
Definition ena.h:17
#define DBGCP(...)
Definition compiler.h:539
#define DBGC(...)
Definition compiler.h:505
#define efi_open(handle, protocol, interface)
Open protocol for ephemeral use.
Definition efi.h:444
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition efi.h:175
#define PCI_BUSDEVFN(segment, bus, slot, func)
Definition pci_io.h:30
static __always_inline void dma_init(struct dma_device *dma, struct dma_operations *op)
Initialise DMA device.
Definition dma.h:454
int pci_read_config(struct pci_device *pci)
Read PCI device configuration.
Definition pci.c:269
#define PCI_FMT
PCI device debug message format.
Definition pci.h:312
#define PCI_ARGS(pci)
PCI device debug message arguments.
Definition pci.h:315
static void pci_init(struct pci_device *pci, unsigned int busdevfn)
Initialise PCI device.
Definition pci.h:341
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
EFI_PCI_IO_PROTOCOL_ATTRIBUTES Attributes
Definition PciIo.h:532
EFI_PCI_IO_PROTOCOL_GET_LOCATION GetLocation
Definition PciIo.h:531
A hardware device.
Definition device.h:77
EFI_PCI_IO_PROTOCOL * io
PCI I/O protocol.
Definition efi_pci.h:26
struct pci_device pci
PCI device.
Definition efi_pci.h:24
struct dma_device dma
DMA device.
Definition pci.h:215

References _EFI_PCI_IO_PROTOCOL::Attributes, busdevfn, DBGC, DBGCP, pci_device::dma, dma_init(), EEFI, EFI_HANDLE, efi_handle_name(), efi_open, EFI_PCI_IO_ATTRIBUTE_BUS_MASTER, EFI_PCI_IO_ATTRIBUTE_IO, EFI_PCI_IO_ATTRIBUTE_MEMORY, efi_pci_io_protocol_guid, efipci_dma_operations, EfiPciIoAttributeOperationEnable, _EFI_PCI_IO_PROTOCOL::GetLocation, efi_pci_device::io, NULL, efi_pci_device::pci, PCI_ARGS, PCI_BUSDEVFN, PCI_FMT, pci_init(), pci_read_config(), rc, and strerror().

Referenced by efi_bofm_start(), efi_bofm_supported(), efi_device_info_pci(), efipci_start(), and efipci_supported().