iPXE
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.
int pci_find_next_capability (struct pci_device *pci, int pos, int cap)
 Look for another PCI capability.
void pci_reset (struct pci_device *pci, unsigned int exp)
 Perform PCI Express function-level reset (FLR)

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ pci_find_capability_common()

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}
unsigned char uint8_t
Definition stdint.h:10
uint8_t id
Request identifier.
Definition ena.h:1
#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.
#define PCI_CAP_NEXT
Next capability.
Definition pci.h:103
#define PCI_CAP_ID
Capability ID.
Definition pci.h:94

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}
unsigned short uint16_t
Definition stdint.h:11
uint8_t status
Status.
Definition ena.h:5
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_STATUS
PCI status.
Definition pci.h:36
#define PCI_HEADER_TYPE_CARDBUS
CardBus header.
Definition pci.h:57
#define PCI_STATUS_CAP_LIST
Capabilities list.
Definition pci.h:37
#define PCI_HEADER_TYPE_MASK
Header type mask.
Definition pci.h:58
#define PCI_CAPABILITY_LIST
PCI capabilities pointer.
Definition pci.h:85
#define PCI_HEADER_TYPE_NORMAL
Normal header.
Definition pci.h:55
#define PCI_HEADER_TYPE_BRIDGE
PCI-to-PCI bridge header.
Definition pci.h:56
static int pci_find_capability_common(struct pci_device *pci, uint8_t pos, int cap)
Definition pciextra.c:9

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}

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 */
95
96 /* Perform a PCIe function-level reset */
97 pci_read_config_word ( pci, ( exp + PCI_EXP_DEVCTL ), &control );
100
101 /* Allow time for reset to complete */
103
104 /* Restore configuration */
106}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
int pci_write_config_word(struct pci_device *pci, unsigned int where, uint16_t value)
Write 16-bit word to PCI configuration space.
uint32_t control
Control.
Definition myson.h:3
#define PCI_EXP_DEVCTL_FLR
Function level reset.
Definition pci.h:113
#define PCI_EXP_DEVCTL
PCI Express.
Definition pci.h:112
#define PCI_EXP_FLR_DELAY_MS
PCI Express function level reset delay (in ms)
Definition pci.h:172
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
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 PCI_CONFIG_BACKUP_STANDARD
Limit of standard PCI configuration space.
Definition pcibackup.h:19
A PCI configuration space backup.
Definition pcibackup.h:22
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition timer.c:79

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