iPXE
Functions
pciextra.c File Reference
#include <stdint.h>
#include <ipxe/timer.h>
#include <ipxe/pci.h>
#include <ipxe/pcibackup.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
 FILE_SECBOOT (PERMITTED)
 
static int pci_find_capability_common (struct pci_device *pci, uint8_t pos, int cap)
 
int pci_find_capability (struct pci_device *pci, int cap)
 Look for a PCI capability. More...
 
int pci_find_next_capability (struct pci_device *pci, int pos, int cap)
 Look for another PCI capability. More...
 
void pci_reset (struct pci_device *pci, unsigned int exp)
 Perform PCI Express function-level reset (FLR) More...
 

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED  )

◆ pci_find_capability_common()

static int pci_find_capability_common ( struct pci_device pci,
uint8_t  pos,
int  cap 
)
static

Definition at line 9 of file pciextra.c.

10  {
11  uint8_t id;
12  int ttl = 48;
13 
14  while ( ttl-- && pos >= 0x40 ) {
15  pos &= ~3;
16  pci_read_config_byte ( pci, pos + PCI_CAP_ID, &id );
17  DBG ( "PCI Capability: %d\n", id );
18  if ( id == 0xff )
19  break;
20  if ( id == cap )
21  return pos;
22  pci_read_config_byte ( pci, pos + PCI_CAP_NEXT, &pos );
23  }
24  return 0;
25 }
#define PCI_CAP_NEXT
Next capability.
Definition: pci.h:103
uint8_t id
Request identifier.
Definition: ena.h:12
#define PCI_CAP_ID
Capability ID.
Definition: pci.h:94
unsigned char uint8_t
Definition: stdint.h:10
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498
int pci_read_config_byte(struct pci_device *pci, unsigned int where, uint8_t *value)
Read byte from PCI configuration space.

References DBG, id, PCI_CAP_ID, PCI_CAP_NEXT, and pci_read_config_byte().

Referenced by pci_find_capability(), and pci_find_next_capability().

◆ pci_find_capability()

int pci_find_capability ( struct pci_device pci,
int  cap 
)

Look for a PCI capability.

Parameters
pciPCI device to query
capCapability code
Return values
addressAddress of capability, or 0 if not found

Determine whether or not a device supports a given PCI capability. Returns the address of the requested capability structure within the device's PCI configuration space, or 0 if the device does not support it.

Definition at line 39 of file pciextra.c.

39  {
41  uint8_t pos;
42  uint8_t hdr_type;
43 
45  if ( ! ( status & PCI_STATUS_CAP_LIST ) )
46  return 0;
47 
48  pci_read_config_byte ( pci, PCI_HEADER_TYPE, &hdr_type );
49  switch ( hdr_type & PCI_HEADER_TYPE_MASK ) {
52  default:
54  break;
57  break;
58  }
59  return pci_find_capability_common ( pci, pos, cap );
60 }
#define PCI_HEADER_TYPE_BRIDGE
PCI-to-PCI bridge header.
Definition: pci.h:56
unsigned short uint16_t
Definition: stdint.h:11
static int pci_find_capability_common(struct pci_device *pci, uint8_t pos, int cap)
Definition: pciextra.c:9
#define PCI_CAPABILITY_LIST
PCI capabilities pointer.
Definition: pci.h:85
#define PCI_HEADER_TYPE_MASK
Header type mask.
Definition: pci.h:58
#define PCI_HEADER_TYPE_CARDBUS
CardBus header.
Definition: pci.h:57
int pci_read_config_word(struct pci_device *pci, unsigned int where, uint16_t *value)
Read 16-bit word from PCI configuration space.
#define PCI_HEADER_TYPE
PCI header type.
Definition: pci.h:54
#define PCI_CB_CAPABILITY_LIST
CardBus capabilities pointer.
Definition: pci.h:88
#define PCI_HEADER_TYPE_NORMAL
Normal header.
Definition: pci.h:55
unsigned char uint8_t
Definition: stdint.h:10
#define PCI_STATUS
PCI status.
Definition: pci.h:36
uint8_t status
Status.
Definition: ena.h:16
#define PCI_STATUS_CAP_LIST
Capabilities list.
Definition: pci.h:37
int pci_read_config_byte(struct pci_device *pci, unsigned int where, uint8_t *value)
Read byte from PCI configuration space.

References PCI_CAPABILITY_LIST, PCI_CB_CAPABILITY_LIST, pci_find_capability_common(), PCI_HEADER_TYPE, PCI_HEADER_TYPE_BRIDGE, PCI_HEADER_TYPE_CARDBUS, PCI_HEADER_TYPE_MASK, PCI_HEADER_TYPE_NORMAL, pci_read_config_byte(), pci_read_config_word(), PCI_STATUS, PCI_STATUS_CAP_LIST, and status.

Referenced by ath5k_hw_attach(), ath5k_hw_nic_wakeup(), bnx2_init_board(), ice_probe(), intelxl_probe(), intelxlvf_probe(), myri10ge_pci_probe(), pci_msix_enable(), pci_vpd_init(), pciea_offset(), sky2_reset(), sky2_rx_start(), tg3_get_invariants(), undinet_irq_is_broken(), and virtio_pci_find_capability().

◆ pci_find_next_capability()

int pci_find_next_capability ( struct pci_device pci,
int  pos,
int  cap 
)

Look for another PCI capability.

Parameters
pciPCI device to query
posAddress of the current capability
capCapability code
Return values
addressAddress of capability, or 0 if not found

Determine whether or not a device supports a given PCI capability starting the search at a given address within the device's PCI configuration space. Returns the address of the next capability structure within the device's PCI configuration space, or 0 if the device does not support another such capability.

Definition at line 76 of file pciextra.c.

76  {
77  uint8_t new_pos;
78 
79  pci_read_config_byte ( pci, pos + PCI_CAP_NEXT, &new_pos );
80  return pci_find_capability_common ( pci, new_pos, cap );
81 }
static int pci_find_capability_common(struct pci_device *pci, uint8_t pos, int cap)
Definition: pciextra.c:9
#define PCI_CAP_NEXT
Next capability.
Definition: pci.h:103
unsigned char uint8_t
Definition: stdint.h:10
int pci_read_config_byte(struct pci_device *pci, unsigned int where, uint8_t *value)
Read byte from PCI configuration space.

References PCI_CAP_NEXT, pci_find_capability_common(), and pci_read_config_byte().

Referenced by virtio_pci_find_capability().

◆ pci_reset()

void pci_reset ( struct pci_device pci,
unsigned int  exp 
)

Perform PCI Express function-level reset (FLR)

Parameters
pciPCI device
expPCI Express Capability address

Definition at line 89 of file pciextra.c.

89  {
90  struct pci_config_backup backup;
92 
93  /* Back up configuration space */
94  pci_backup ( pci, &backup, PCI_CONFIG_BACKUP_STANDARD, NULL );
95 
96  /* Perform a PCIe function-level reset */
97  pci_read_config_word ( pci, ( exp + PCI_EXP_DEVCTL ), &control );
99  pci_write_config_word ( pci, ( exp + PCI_EXP_DEVCTL ), control );
100 
101  /* Allow time for reset to complete */
103 
104  /* Restore configuration */
105  pci_restore ( pci, &backup, PCI_CONFIG_BACKUP_STANDARD, NULL );
106 }
void pci_restore(struct pci_device *pci, struct pci_config_backup *backup, unsigned int limit, const uint8_t *exclude)
Restore PCI configuration space.
Definition: pcibackup.c:88
unsigned short uint16_t
Definition: stdint.h:11
#define PCI_CONFIG_BACKUP_STANDARD
Limit of standard PCI configuration space.
Definition: pcibackup.h:19
int pci_write_config_word(struct pci_device *pci, unsigned int where, uint16_t value)
Write 16-bit word to PCI configuration space.
#define PCI_EXP_FLR_DELAY_MS
PCI Express function level reset delay (in ms)
Definition: pci.h:172
int pci_read_config_word(struct pci_device *pci, unsigned int where, uint16_t *value)
Read 16-bit word from PCI configuration space.
#define PCI_EXP_DEVCTL_FLR
Function level reset.
Definition: pci.h:113
A PCI configuration space backup.
Definition: pcibackup.h:22
uint32_t control
Control.
Definition: myson.h:14
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:79
void pci_backup(struct pci_device *pci, struct pci_config_backup *backup, unsigned int limit, const uint8_t *exclude)
Back up PCI configuration space.
Definition: pcibackup.c:68
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
#define PCI_EXP_DEVCTL
PCI Express.
Definition: pci.h:112

References control, mdelay(), NULL, pci_backup(), PCI_CONFIG_BACKUP_STANDARD, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_FLR, PCI_EXP_FLR_DELAY_MS, pci_read_config_word(), pci_restore(), and pci_write_config_word().

Referenced by ice_probe(), ice_remove(), intelxl_probe(), intelxl_remove(), intelxlvf_probe(), and intelxlvf_remove().