iPXE
Functions
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.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static EFIAPI uint64_t LShiftU64 (UINT64 value, UINTN shift)
 
int efipci_open (EFI_HANDLE device, UINT32 attributes, struct pci_device *pci)
 Open EFI PCI device. More...
 
void efipci_close (EFI_HANDLE device)
 Close EFI PCI device. More...
 
int efipci_info (EFI_HANDLE device, struct pci_device *pci)
 Get EFI PCI device information. More...
 

Detailed Description

EFI driver interface.

Definition in file efi_pci.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ LShiftU64()

static EFIAPI uint64_t LShiftU64 ( UINT64  value,
UINTN  shift 
)
inlinestatic

Definition at line 16 of file efi_pci.h.

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

References value.

◆ efipci_open()

int efipci_open ( EFI_HANDLE  device,
UINT32  attributes,
struct pci_device pci 
)

Open EFI PCI device.

Parameters
deviceEFI device handle
attributesProtocol opening attributes
pciPCI device to fill in
Return values
rcReturn status code

Definition at line 241 of file efi_pci.c.

242  {
244  union {
245  EFI_PCI_IO_PROTOCOL *pci_io;
246  void *interface;
247  } pci_io;
248  UINTN pci_segment, pci_bus, pci_dev, pci_fn;
249  unsigned int busdevfn;
250  EFI_STATUS efirc;
251  int rc;
252 
253  /* See if device is a PCI device */
254  if ( ( efirc = bs->OpenProtocol ( device, &efi_pci_io_protocol_guid,
255  &pci_io.interface, efi_image_handle,
256  device, attributes ) ) != 0 ) {
257  rc = -EEFI_PCI ( efirc );
258  DBGCP ( device, "EFIPCI %s cannot open PCI protocols: %s\n",
259  efi_handle_name ( device ), strerror ( rc ) );
260  goto err_open_protocol;
261  }
262 
263  /* Get PCI bus:dev.fn address */
264  if ( ( efirc = pci_io.pci_io->GetLocation ( pci_io.pci_io, &pci_segment,
265  &pci_bus, &pci_dev,
266  &pci_fn ) ) != 0 ) {
267  rc = -EEFI ( efirc );
268  DBGC ( device, "EFIPCI %s could not get PCI location: %s\n",
269  efi_handle_name ( device ), strerror ( rc ) );
270  goto err_get_location;
271  }
272  busdevfn = PCI_BUSDEVFN ( pci_segment, pci_bus, pci_dev, pci_fn );
273  pci_init ( pci, busdevfn );
274  DBGCP ( device, "EFIPCI " PCI_FMT " is %s\n",
275  PCI_ARGS ( pci ), efi_handle_name ( device ) );
276 
277  /* Try to enable I/O cycles, memory cycles, and bus mastering.
278  * Some platforms will 'helpfully' report errors if these bits
279  * can't be enabled (for example, if the card doesn't actually
280  * support I/O cycles). Work around any such platforms by
281  * enabling bits individually and simply ignoring any errors.
282  */
283  pci_io.pci_io->Attributes ( pci_io.pci_io,
286  pci_io.pci_io->Attributes ( pci_io.pci_io,
289  pci_io.pci_io->Attributes ( pci_io.pci_io,
292 
293  /* Populate PCI device */
294  if ( ( rc = pci_read_config ( pci ) ) != 0 ) {
295  DBGC ( device, "EFIPCI " PCI_FMT " cannot read PCI "
296  "configuration: %s\n",
297  PCI_ARGS ( pci ), strerror ( rc ) );
298  goto err_pci_read_config;
299  }
300 
301  return 0;
302 
303  err_pci_read_config:
304  err_get_location:
307  err_open_protocol:
308  return rc;
309 }
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2000
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:157
EFI_GUID efi_pci_io_protocol_guid
PCI I/O protocol GUID.
Definition: efi_guid.c:216
#define DBGC(...)
Definition: compiler.h:505
#define PCI_BUSDEVFN(segment, bus, slot, func)
Definition: pci.h:259
EFI_CLOSE_PROTOCOL CloseProtocol
Definition: UefiSpec.h:1906
A hardware device.
Definition: device.h:73
#define EFI_PCI_IO_ATTRIBUTE_MEMORY
Enable the Memory decode bit in the PCI Config Header.
Definition: PciIo.h:66
An object interface.
Definition: interface.h:109
#define EFI_PCI_IO_ATTRIBUTE_BUS_MASTER
Enable the DMA bit in the PCI Config Header.
Definition: PciIo.h:67
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:713
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
EFI Boot Services Table.
Definition: UefiSpec.h:1836
#define PCI_FMT
PCI device debug message format.
Definition: pci.h:287
EFI_HANDLE efi_image_handle
Image handle passed to entry point.
Definition: efi_init.c:30
int pci_read_config(struct pci_device *pci)
Read PCI device configuration.
Definition: pci.c:177
UINT64 UINTN
Unsigned value of native width.
Definition: ProcessorBind.h:71
#define EFI_PCI_IO_ATTRIBUTE_IO
Enable the I/O decode bit in the PCI Config Header.
Definition: PciIo.h:65
Enable the attributes specified by the bits that are set in Attributes for this PCI controller.
Definition: PciIo.h:119
#define EEFI_PCI(efirc)
Definition: efi_pci.c:53
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:35
#define PCI_ARGS(pci)
PCI device debug message arguments.
Definition: pci.h:290
#define DBGCP(...)
Definition: compiler.h:539
EFI_SYSTEM_TABLE * efi_systab
EFI_OPEN_PROTOCOL OpenProtocol
Definition: UefiSpec.h:1905
static void pci_init(struct pci_device *pci, unsigned int busdevfn)
Initialise PCI device.
Definition: pci.h:313
The EFI_PCI_IO_PROTOCOL provides the basic Memory, I/O, PCI configuration, and DMA interfaces used to...
Definition: PciIo.h:525
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References EFI_SYSTEM_TABLE::BootServices, EFI_BOOT_SERVICES::CloseProtocol, DBGC, DBGCP, EEFI, EEFI_PCI, efi_handle_name(), efi_image_handle, EFI_PCI_IO_ATTRIBUTE_BUS_MASTER, EFI_PCI_IO_ATTRIBUTE_IO, EFI_PCI_IO_ATTRIBUTE_MEMORY, efi_pci_io_protocol_guid, efi_systab, EfiPciIoAttributeOperationEnable, NULL, EFI_BOOT_SERVICES::OpenProtocol, PCI_ARGS, PCI_BUSDEVFN, PCI_FMT, pci_init(), pci_read_config(), rc, and strerror().

Referenced by efi_bofm_start(), efipci_info(), and efipci_start().

◆ efipci_close()

void efipci_close ( EFI_HANDLE  device)

Close EFI PCI device.

Parameters
deviceEFI device handle

Definition at line 316 of file efi_pci.c.

316  {
318 
321 }
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2000
EFI_GUID efi_pci_io_protocol_guid
PCI I/O protocol GUID.
Definition: efi_guid.c:216
EFI_CLOSE_PROTOCOL CloseProtocol
Definition: UefiSpec.h:1906
A hardware device.
Definition: device.h:73
EFI Boot Services Table.
Definition: UefiSpec.h:1836
EFI_HANDLE efi_image_handle
Image handle passed to entry point.
Definition: efi_init.c:30
EFI_SYSTEM_TABLE * efi_systab

References EFI_SYSTEM_TABLE::BootServices, EFI_BOOT_SERVICES::CloseProtocol, efi_image_handle, efi_pci_io_protocol_guid, and efi_systab.

Referenced by efi_bofm_start(), efipci_info(), efipci_start(), and efipci_stop().

◆ efipci_info()

int efipci_info ( EFI_HANDLE  device,
struct pci_device pci 
)

Get EFI PCI device information.

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

Definition at line 330 of file efi_pci.c.

330  {
331  int rc;
332 
333  /* Open PCI device, if possible */
335  pci ) ) != 0 )
336  return rc;
337 
338  /* Close PCI device */
339  efipci_close ( device );
340 
341  return 0;
342 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
A hardware device.
Definition: device.h:73
int efipci_open(EFI_HANDLE device, UINT32 attributes, struct pci_device *pci)
Open EFI PCI device.
Definition: efi_pci.c:241
#define EFI_OPEN_PROTOCOL_GET_PROTOCOL
Definition: UefiSpec.h:1271
void efipci_close(EFI_HANDLE device)
Close EFI PCI device.
Definition: efi_pci.c:316

References EFI_OPEN_PROTOCOL_GET_PROTOCOL, efipci_close(), efipci_open(), and rc.

Referenced by efi_bofm_supported(), efi_pci_info(), and efipci_supported().