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)
 
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  )

◆ pci_find_capability_common()

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

Definition at line 8 of file pciextra.c.

9  {
10  uint8_t id;
11  int ttl = 48;
12 
13  while ( ttl-- && pos >= 0x40 ) {
14  pos &= ~3;
15  pci_read_config_byte ( pci, pos + PCI_CAP_ID, &id );
16  DBG ( "PCI Capability: %d\n", id );
17  if ( id == 0xff )
18  break;
19  if ( id == cap )
20  return pos;
21  pci_read_config_byte ( pci, pos + PCI_CAP_NEXT, &pos );
22  }
23  return 0;
24 }
#define PCI_CAP_NEXT
Next capability.
Definition: pci.h:102
uint8_t id
Request identifier.
Definition: ena.h:12
#define PCI_CAP_ID
Capability ID.
Definition: pci.h:93
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 38 of file pciextra.c.

38  {
40  uint8_t pos;
41  uint8_t hdr_type;
42 
44  if ( ! ( status & PCI_STATUS_CAP_LIST ) )
45  return 0;
46 
47  pci_read_config_byte ( pci, PCI_HEADER_TYPE, &hdr_type );
48  switch ( hdr_type & PCI_HEADER_TYPE_MASK ) {
51  default:
53  break;
56  break;
57  }
58  return pci_find_capability_common ( pci, pos, cap );
59 }
#define PCI_HEADER_TYPE_BRIDGE
PCI-to-PCI bridge header.
Definition: pci.h:55
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:8
#define PCI_CAPABILITY_LIST
PCI capabilities pointer.
Definition: pci.h:84
#define PCI_HEADER_TYPE_MASK
Header type mask.
Definition: pci.h:57
#define PCI_HEADER_TYPE_CARDBUS
CardBus header.
Definition: pci.h:56
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:53
#define PCI_CB_CAPABILITY_LIST
CardBus capabilities pointer.
Definition: pci.h:87
#define PCI_HEADER_TYPE_NORMAL
Normal header.
Definition: pci.h:54
unsigned char uint8_t
Definition: stdint.h:10
#define PCI_STATUS
PCI status.
Definition: pci.h:35
uint8_t status
Status.
Definition: ena.h:16
#define PCI_STATUS_CAP_LIST
Capabilities list.
Definition: pci.h:36
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 75 of file pciextra.c.

75  {
76  uint8_t new_pos;
77 
78  pci_read_config_byte ( pci, pos + PCI_CAP_NEXT, &new_pos );
79  return pci_find_capability_common ( pci, new_pos, cap );
80 }
static int pci_find_capability_common(struct pci_device *pci, uint8_t pos, int cap)
Definition: pciextra.c:8
#define PCI_CAP_NEXT
Next capability.
Definition: pci.h:102
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 88 of file pciextra.c.

88  {
89  struct pci_config_backup backup;
91 
92  /* Back up configuration space */
93  pci_backup ( pci, &backup, PCI_CONFIG_BACKUP_STANDARD, NULL );
94 
95  /* Perform a PCIe function-level reset */
96  pci_read_config_word ( pci, ( exp + PCI_EXP_DEVCTL ), &control );
98  pci_write_config_word ( pci, ( exp + PCI_EXP_DEVCTL ), control );
99 
100  /* Allow time for reset to complete */
102 
103  /* Restore configuration */
104  pci_restore ( pci, &backup, PCI_CONFIG_BACKUP_STANDARD, NULL );
105 }
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:87
unsigned short uint16_t
Definition: stdint.h:11
#define PCI_CONFIG_BACKUP_STANDARD
Limit of standard PCI configuration space.
Definition: pcibackup.h:18
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:171
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:112
A PCI configuration space backup.
Definition: pcibackup.h:21
uint32_t control
Control.
Definition: myson.h:14
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
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:67
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
#define PCI_EXP_DEVCTL
PCI Express.
Definition: pci.h:111

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().