iPXE
Macros | Functions | Variables
efi_pci_api.h File Reference

iPXE PCI I/O API for EFI More...

Go to the source code of this file.

Macros

#define PCIAPI_PREFIX_efi   __efi_
 
#define EFIPCI_WIDTH_BYTE   0
 
#define EFIPCI_WIDTH_WORD   1
 
#define EFIPCI_WIDTH_DWORD   2
 
#define EFIPCI_LOCATION(_offset, _width)   ( (_offset) | ( (_width) << 16 ) )
 
#define EFIPCI_OFFSET(_location)   ( (_location) & 0xffff )
 
#define EFIPCI_WIDTH(_location)   ( (_location) >> 16 )
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
int efipci_read (struct pci_device *pci, unsigned long location, void *value)
 Read from PCI configuration space. More...
 
int efipci_write (struct pci_device *pci, unsigned long location, unsigned long value)
 Write to PCI configuration space. More...
 
static __always_inline int PCIAPI_INLINE (efi, pci_can_probe)(void)
 Check if PCI bus probing is allowed. More...
 
static __always_inline int PCIAPI_INLINE (efi, pci_read_config_byte)(struct pci_device *pci
 Read byte from PCI configuration space via EFI. More...
 
return efipci_read (pci, EFIPCI_LOCATION(where, EFIPCI_WIDTH_BYTE), value)
 
static __always_inline int PCIAPI_INLINE (efi, pci_read_config_word)(struct pci_device *pci
 Read word from PCI configuration space via EFI. More...
 
return efipci_read (pci, EFIPCI_LOCATION(where, EFIPCI_WIDTH_WORD), value)
 
static __always_inline int PCIAPI_INLINE (efi, pci_read_config_dword)(struct pci_device *pci
 Read dword from PCI configuration space via EFI. More...
 
return efipci_read (pci, EFIPCI_LOCATION(where, EFIPCI_WIDTH_DWORD), value)
 
static __always_inline int PCIAPI_INLINE (efi, pci_write_config_byte)(struct pci_device *pci
 Write byte to PCI configuration space via EFI. More...
 
static __always_inline int PCIAPI_INLINE (efi, pci_write_config_word)(struct pci_device *pci
 Write word to PCI configuration space via EFI. More...
 
static __always_inline int PCIAPI_INLINE (efi, pci_write_config_dword)(struct pci_device *pci
 Write dword to PCI configuration space via EFI. More...
 

Variables

static __always_inline int unsigned int where
 
static __always_inline int unsigned int uint8_tvalue
 

Detailed Description

iPXE PCI I/O API for EFI

Definition in file efi_pci_api.h.

Macro Definition Documentation

◆ PCIAPI_PREFIX_efi

#define PCIAPI_PREFIX_efi   __efi_

Definition at line 15 of file efi_pci_api.h.

◆ EFIPCI_WIDTH_BYTE

#define EFIPCI_WIDTH_BYTE   0

Definition at line 19 of file efi_pci_api.h.

◆ EFIPCI_WIDTH_WORD

#define EFIPCI_WIDTH_WORD   1

Definition at line 20 of file efi_pci_api.h.

◆ EFIPCI_WIDTH_DWORD

#define EFIPCI_WIDTH_DWORD   2

Definition at line 21 of file efi_pci_api.h.

◆ EFIPCI_LOCATION

#define EFIPCI_LOCATION (   _offset,
  _width 
)    ( (_offset) | ( (_width) << 16 ) )

Definition at line 23 of file efi_pci_api.h.

◆ EFIPCI_OFFSET

#define EFIPCI_OFFSET (   _location)    ( (_location) & 0xffff )

Definition at line 25 of file efi_pci_api.h.

◆ EFIPCI_WIDTH

#define EFIPCI_WIDTH (   _location)    ( (_location) >> 16 )

Definition at line 26 of file efi_pci_api.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ efipci_read() [1/4]

int efipci_read ( struct pci_device pci,
unsigned long  location,
void *  value 
)

Read from PCI configuration space.

Parameters
pciPCI device
locationEncoded offset and width
Return values
valueValue
rcReturn status code

Definition at line 340 of file efi_pci.c.

341  {
344  EFI_STATUS efirc;
345  int rc;
346 
347  /* Open root bridge */
348  if ( ( rc = efipci_root_open ( pci, &handle, &root ) ) != 0 )
349  goto err_root;
350 
351  /* Read from configuration space */
352  if ( ( efirc = root->Pci.Read ( root, EFIPCI_WIDTH ( location ),
353  efipci_address ( pci, location ), 1,
354  value ) ) != 0 ) {
355  rc = -EEFI ( efirc );
356  DBGC ( pci, "EFIPCI " PCI_FMT " config read from offset %02lx "
357  "failed: %s\n", PCI_ARGS ( pci ),
358  EFIPCI_OFFSET ( location ), strerror ( rc ) );
359  goto err_read;
360  }
361 
362  err_read:
364  err_root:
365  return rc;
366 }
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:171
static void efipci_root_close(EFI_HANDLE handle)
Close EFI PCI root bridge I/O protocol.
Definition: efi_pci.c:308
struct stp_switch root
Root switch.
Definition: stp.h:26
static int efipci_root_open(struct pci_device *pci, EFI_HANDLE *handle, EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL **root)
Open EFI PCI root bridge I/O protocol.
Definition: efi_pci.c:270
#define DBGC(...)
Definition: compiler.h:505
#define EFIPCI_OFFSET(_location)
Definition: efi_pci_api.h:25
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
#define PCI_FMT
PCI device debug message format.
Definition: pci.h:307
Provides the basic Memory, I/O, PCI configuration, and DMA interfaces that are used to abstract acces...
#define EFIPCI_WIDTH(_location)
Definition: efi_pci_api.h:26
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
#define PCI_ARGS(pci)
PCI device debug message arguments.
Definition: pci.h:310
static unsigned long efipci_address(struct pci_device *pci, unsigned long location)
Calculate EFI PCI configuration space address.
Definition: efi_pci.c:323
uint16_t handle
Handle.
Definition: smbios.h:16
Definition: efi.h:59

References DBGC, EEFI, efipci_address(), EFIPCI_OFFSET, efipci_root_close(), efipci_root_open(), EFIPCI_WIDTH, handle, PCI_ARGS, PCI_FMT, rc, root, strerror(), and value.

◆ efipci_write()

int efipci_write ( struct pci_device pci,
unsigned long  location,
unsigned long  value 
)

Write to PCI configuration space.

Parameters
pciPCI device
locationEncoded offset and width
valueValue
Return values
rcReturn status code

Definition at line 376 of file efi_pci.c.

377  {
380  EFI_STATUS efirc;
381  int rc;
382 
383  /* Open root bridge */
384  if ( ( rc = efipci_root_open ( pci, &handle, &root ) ) != 0 )
385  goto err_root;
386 
387  /* Read from configuration space */
388  if ( ( efirc = root->Pci.Write ( root, EFIPCI_WIDTH ( location ),
389  efipci_address ( pci, location ), 1,
390  &value ) ) != 0 ) {
391  rc = -EEFI ( efirc );
392  DBGC ( pci, "EFIPCI " PCI_FMT " config write to offset %02lx "
393  "failed: %s\n", PCI_ARGS ( pci ),
394  EFIPCI_OFFSET ( location ), strerror ( rc ) );
395  goto err_write;
396  }
397 
398  err_write:
400  err_root:
401  return rc;
402 }
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:171
static void efipci_root_close(EFI_HANDLE handle)
Close EFI PCI root bridge I/O protocol.
Definition: efi_pci.c:308
struct stp_switch root
Root switch.
Definition: stp.h:26
static int efipci_root_open(struct pci_device *pci, EFI_HANDLE *handle, EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL **root)
Open EFI PCI root bridge I/O protocol.
Definition: efi_pci.c:270
#define DBGC(...)
Definition: compiler.h:505
#define EFIPCI_OFFSET(_location)
Definition: efi_pci_api.h:25
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
#define PCI_FMT
PCI device debug message format.
Definition: pci.h:307
Provides the basic Memory, I/O, PCI configuration, and DMA interfaces that are used to abstract acces...
#define EFIPCI_WIDTH(_location)
Definition: efi_pci_api.h:26
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:31
#define PCI_ARGS(pci)
PCI device debug message arguments.
Definition: pci.h:310
static unsigned long efipci_address(struct pci_device *pci, unsigned long location)
Calculate EFI PCI configuration space address.
Definition: efi_pci.c:323
uint16_t handle
Handle.
Definition: smbios.h:16
Definition: efi.h:59

References DBGC, EEFI, efipci_address(), EFIPCI_OFFSET, efipci_root_close(), efipci_root_open(), EFIPCI_WIDTH, handle, PCI_ARGS, PCI_FMT, rc, root, strerror(), and value.

◆ PCIAPI_INLINE() [1/7]

static __always_inline int PCIAPI_INLINE ( efi  ,
pci_can_probe   
)
inlinestatic

Check if PCI bus probing is allowed.

Return values
okBus probing is allowed

Definition at line 41 of file efi_pci_api.h.

41  {
42  return 0;
43 }

◆ PCIAPI_INLINE() [2/7]

static __always_inline int PCIAPI_INLINE ( efi  ,
pci_read_config_byte   
)
inlinestatic

Read byte from PCI configuration space via EFI.

Parameters
pciPCI device
whereLocation within PCI configuration space
valueValue read
Return values
rcReturn status code

◆ efipci_read() [2/4]

return efipci_read ( pci  ,
EFIPCI_LOCATION(where, EFIPCI_WIDTH_BYTE ,
value   
)

◆ PCIAPI_INLINE() [3/7]

static __always_inline int PCIAPI_INLINE ( efi  ,
pci_read_config_word   
)
inlinestatic

Read word from PCI configuration space via EFI.

Parameters
pciPCI device
whereLocation within PCI configuration space
valueValue read
Return values
rcReturn status code

◆ efipci_read() [3/4]

return efipci_read ( pci  ,
EFIPCI_LOCATION(where, EFIPCI_WIDTH_WORD ,
value   
)

◆ PCIAPI_INLINE() [4/7]

static __always_inline int PCIAPI_INLINE ( efi  ,
pci_read_config_dword   
)
inlinestatic

Read dword from PCI configuration space via EFI.

Parameters
pciPCI device
whereLocation within PCI configuration space
valueValue read
Return values
rcReturn status code

◆ efipci_read() [4/4]

return efipci_read ( pci  ,
EFIPCI_LOCATION(where, EFIPCI_WIDTH_DWORD ,
value   
)

◆ PCIAPI_INLINE() [5/7]

static __always_inline int PCIAPI_INLINE ( efi  ,
pci_write_config_byte   
)
inlinestatic

Write byte to PCI configuration space via EFI.

Parameters
pciPCI device
whereLocation within PCI configuration space
valueValue to be written
Return values
rcReturn status code

◆ PCIAPI_INLINE() [6/7]

static __always_inline int PCIAPI_INLINE ( efi  ,
pci_write_config_word   
)
inlinestatic

Write word to PCI configuration space via EFI.

Parameters
pciPCI device
whereLocation within PCI configuration space
valueValue to be written
Return values
rcReturn status code

◆ PCIAPI_INLINE() [7/7]

static __always_inline int PCIAPI_INLINE ( efi  ,
pci_write_config_dword   
)
inlinestatic

Write dword to PCI configuration space via EFI.

Parameters
pciPCI device
whereLocation within PCI configuration space
valueValue to be written
Return values
rcReturn status code

Variable Documentation

◆ where

__always_inline int unsigned int where

Definition at line 55 of file efi_pci_api.h.

◆ value

__always_inline int unsigned int uint32_t value
Initial value:
{
*value = 0xff
static __always_inline int unsigned int uint8_t * value
Definition: efi_pci_api.h:56

Definition at line 56 of file efi_pci_api.h.