Zephyr API Documentation
3.0.0
A Scalable Open Source RTOS
|
|
3.0.0 |
Go to the source code of this file.
Data Structures | |
struct | pcie_mbar |
Macros | |
#define | PCIE_CONF_CAPPTR 13U /* capabilities pointer */ |
#define | PCIE_CONF_CAPPTR_FIRST(w) (((w) >> 2) & 0x3FU) |
#define | PCIE_CONF_CAP_ID(w) ((w) & 0xFFU) |
#define | PCIE_CONF_CAP_NEXT(w) (((w) >> 10) & 0x3FU) |
#define | PCIE_CONF_EXT_CAPPTR 64U |
#define | PCIE_CONF_EXT_CAP_ID(w) ((w) & 0xFFFFU) |
#define | PCIE_CONF_EXT_CAP_VER(w) (((w) >> 16) & 0xFU) |
#define | PCIE_CONF_EXT_CAP_NEXT(w) (((w) >> 20) & 0xFFFU) |
#define | PCIE_CONF_ID 0U |
#define | PCIE_CONF_CMDSTAT 1U /* command/status register */ |
#define | PCIE_CONF_CMDSTAT_IO 0x00000001U /* I/O access enable */ |
#define | PCIE_CONF_CMDSTAT_MEM 0x00000002U /* mem access enable */ |
#define | PCIE_CONF_CMDSTAT_MASTER 0x00000004U /* bus master enable */ |
#define | PCIE_CONF_CMDSTAT_CAPS 0x00100000U /* capabilities list */ |
#define | PCIE_CONF_CLASSREV 2U /* class/revision register */ |
#define | PCIE_CONF_CLASSREV_CLASS(w) (((w) >> 24) & 0xFFU) |
#define | PCIE_CONF_CLASSREV_SUBCLASS(w) (((w) >> 16) & 0xFFU) |
#define | PCIE_CONF_CLASSREV_PROGIF(w) (((w) >> 8) & 0xFFU) |
#define | PCIE_CONF_CLASSREV_REV(w) ((w) & 0xFFU) |
#define | PCIE_CONF_TYPE 3U |
#define | PCIE_CONF_MULTIFUNCTION(w) (((w) & 0x00800000U) != 0U) |
#define | PCIE_CONF_TYPE_BRIDGE(w) (((w) & 0x007F0000U) != 0U) |
#define | PCIE_CONF_BAR0 4U |
#define | PCIE_CONF_BAR1 5U |
#define | PCIE_CONF_BAR2 6U |
#define | PCIE_CONF_BAR3 7U |
#define | PCIE_CONF_BAR4 8U |
#define | PCIE_CONF_BAR5 9U |
#define | PCIE_CONF_BAR_IO(w) (((w) & 0x00000001U) == 0x00000001U) |
#define | PCIE_CONF_BAR_MEM(w) (((w) & 0x00000001U) != 0x00000001U) |
#define | PCIE_CONF_BAR_64(w) (((w) & 0x00000006U) == 0x00000004U) |
#define | PCIE_CONF_BAR_ADDR(w) ((w) & ~0xfUL) |
#define | PCIE_CONF_BAR_IO_ADDR(w) ((w) & ~0x3UL) |
#define | PCIE_CONF_BAR_FLAGS(w) ((w) & 0xfUL) |
#define | PCIE_CONF_BAR_NONE 0U |
#define | PCIE_CONF_BAR_INVAL 0xFFFFFFF0U |
#define | PCIE_CONF_BAR_INVAL64 0xFFFFFFFFFFFFFFF0UL |
#define | PCIE_CONF_BAR_INVAL_FLAGS(w) |
#define | PCIE_BUS_NUMBER 6U |
#define | PCIE_BUS_PRIMARY_NUMBER(w) ((w) & 0xffUL) |
#define | PCIE_BUS_SECONDARY_NUMBER(w) (((w) >> 8) & 0xffUL) |
#define | PCIE_BUS_SUBORDINATE_NUMBER(w) (((w) >> 16) & 0xffUL) |
#define | PCIE_SECONDARY_LATENCY_TIMER(w) (((w) >> 24) & 0xffUL) |
#define | PCIE_BUS_NUMBER_VAL(prim, sec, sub, lat) |
#define | PCIE_IO_SEC_STATUS 7U |
#define | PCIE_IO_BASE(w) ((w) & 0xffUL) |
#define | PCIE_IO_LIMIT(w) (((w) >> 8) & 0xffUL) |
#define | PCIE_SEC_STATUS(w) (((w) >> 16) & 0xffffUL) |
#define | PCIE_IO_SEC_STATUS_VAL(iob, iol, sec_status) |
#define | PCIE_MEM_BASE_LIMIT 8U |
#define | PCIE_MEM_BASE(w) ((w) & 0xffffUL) |
#define | PCIE_MEM_LIMIT(w) (((w) >> 16) & 0xffffUL) |
#define | PCIE_MEM_BASE_LIMIT_VAL(memb, meml) |
#define | PCIE_PREFETCH_BASE_LIMIT 9U |
#define | PCIE_PREFETCH_BASE(w) ((w) & 0xffffUL) |
#define | PCIE_PREFETCH_LIMIT(w) (((w) >> 16) & 0xffffUL) |
#define | PCIE_PREFETCH_BASE_LIMIT_VAL(pmemb, pmeml) |
#define | PCIE_PREFETCH_BASE_UPPER 10U |
#define | PCIE_PREFETCH_LIMIT_UPPER 11U |
#define | PCIE_IO_BASE_LIMIT_UPPER 12U |
#define | PCIE_IO_BASE_UPPER(w) ((w) & 0xffffUL) |
#define | PCIE_IO_LIMIT_UPPER(w) (((w) >> 16) & 0xffffUL) |
#define | PCIE_IO_BASE_LIMIT_UPPER_VAL(iobu, iolu) |
#define | PCIE_CONF_INTR 15U |
#define | PCIE_CONF_INTR_IRQ(w) ((w) & 0xFFU) |
#define | PCIE_CONF_INTR_IRQ_NONE 0xFFU /* no interrupt routed */ |
#define | PCIE_MAX_BUS (0xFFFFFFFF & PCIE_BDF_BUS_MASK) |
#define | PCIE_MAX_DEV (0xFFFFFFFF & PCIE_BDF_DEV_MASK) |
#define | PCIE_MAX_FUNC (0xFFFFFFFF & PCIE_BDF_FUNC_MASK) |
#define | PCIE_IRQ_CONNECT(bdf_p, irq_p, priority_p, isr_p, isr_param_p, flags_p) |
Initialize an interrupt handler for a PCIe endpoint IRQ. More... | |
Typedefs | |
typedef uint32_t | pcie_bdf_t |
A unique PCI(e) endpoint (bus, device, function). More... | |
typedef uint32_t | pcie_id_t |
A unique PCI(e) identifier (vendor ID, device ID). More... | |
Functions | |
pcie_bdf_t | pcie_bdf_lookup (pcie_id_t id) |
Look up the BDF based on PCI(e) vendor & device ID. More... | |
uint32_t | pcie_conf_read (pcie_bdf_t bdf, unsigned int reg) |
Read a 32-bit word from an endpoint's configuration space. More... | |
void | pcie_conf_write (pcie_bdf_t bdf, unsigned int reg, uint32_t data) |
Write a 32-bit word to an endpoint's configuration space. More... | |
bool | pcie_probe (pcie_bdf_t bdf, pcie_id_t id) |
Probe for the presence of a PCI(e) endpoint. More... | |
bool | pcie_get_mbar (pcie_bdf_t bdf, unsigned int bar_index, struct pcie_mbar *mbar) |
Get the MBAR at a specific BAR index. More... | |
bool | pcie_probe_mbar (pcie_bdf_t bdf, unsigned int index, struct pcie_mbar *mbar) |
Probe the nth MMIO address assigned to an endpoint. More... | |
void | pcie_set_cmd (pcie_bdf_t bdf, uint32_t bits, bool on) |
Set or reset bits in the endpoint command/status register. More... | |
unsigned int | pcie_alloc_irq (pcie_bdf_t bdf) |
Allocate an IRQ for an endpoint. More... | |
unsigned int | pcie_get_irq (pcie_bdf_t bdf) |
Return the IRQ assigned by the firmware/board to an endpoint. More... | |
void | pcie_irq_enable (pcie_bdf_t bdf, unsigned int irq) |
Enable the PCI(e) endpoint to generate the specified IRQ. More... | |
uint32_t | pcie_get_cap (pcie_bdf_t bdf, uint32_t cap_id) |
Find a PCI(e) capability in an endpoint's configuration space. More... | |
uint32_t | pcie_get_ext_cap (pcie_bdf_t bdf, uint32_t cap_id) |
Find an Extended PCI(e) capability in an endpoint's configuration space. More... | |
bool | pcie_connect_dynamic_irq (pcie_bdf_t bdf, unsigned int irq, unsigned int priority, void(*routine)(const void *parameter), const void *parameter, uint32_t flags) |
Dynamically connect a PCIe endpoint IRQ to an ISR handler. More... | |
#define PCIE_BUS_NUMBER 6U |
#define PCIE_BUS_NUMBER_VAL | ( | prim, | |
sec, | |||
sub, | |||
lat | |||
) |
#define PCIE_BUS_PRIMARY_NUMBER | ( | w | ) | ((w) & 0xffUL) |
#define PCIE_BUS_SECONDARY_NUMBER | ( | w | ) | (((w) >> 8) & 0xffUL) |
#define PCIE_BUS_SUBORDINATE_NUMBER | ( | w | ) | (((w) >> 16) & 0xffUL) |
#define PCIE_CONF_BAR0 4U |
#define PCIE_CONF_BAR1 5U |
#define PCIE_CONF_BAR2 6U |
#define PCIE_CONF_BAR3 7U |
#define PCIE_CONF_BAR4 8U |
#define PCIE_CONF_BAR5 9U |
#define PCIE_CONF_BAR_64 | ( | w | ) | (((w) & 0x00000006U) == 0x00000004U) |
#define PCIE_CONF_BAR_ADDR | ( | w | ) | ((w) & ~0xfUL) |
#define PCIE_CONF_BAR_FLAGS | ( | w | ) | ((w) & 0xfUL) |
#define PCIE_CONF_BAR_INVAL 0xFFFFFFF0U |
#define PCIE_CONF_BAR_INVAL64 0xFFFFFFFFFFFFFFF0UL |
#define PCIE_CONF_BAR_INVAL_FLAGS | ( | w | ) |
#define PCIE_CONF_BAR_IO | ( | w | ) | (((w) & 0x00000001U) == 0x00000001U) |
#define PCIE_CONF_BAR_IO_ADDR | ( | w | ) | ((w) & ~0x3UL) |
#define PCIE_CONF_BAR_MEM | ( | w | ) | (((w) & 0x00000001U) != 0x00000001U) |
#define PCIE_CONF_BAR_NONE 0U |
#define PCIE_CONF_CAP_ID | ( | w | ) | ((w) & 0xFFU) |
#define PCIE_CONF_CAP_NEXT | ( | w | ) | (((w) >> 10) & 0x3FU) |
#define PCIE_CONF_CAPPTR 13U /* capabilities pointer */ |
#define PCIE_CONF_CAPPTR_FIRST | ( | w | ) | (((w) >> 2) & 0x3FU) |
#define PCIE_CONF_CLASSREV 2U /* class/revision register */ |
#define PCIE_CONF_CLASSREV_CLASS | ( | w | ) | (((w) >> 24) & 0xFFU) |
#define PCIE_CONF_CLASSREV_PROGIF | ( | w | ) | (((w) >> 8) & 0xFFU) |
#define PCIE_CONF_CLASSREV_REV | ( | w | ) | ((w) & 0xFFU) |
#define PCIE_CONF_CLASSREV_SUBCLASS | ( | w | ) | (((w) >> 16) & 0xFFU) |
#define PCIE_CONF_CMDSTAT 1U /* command/status register */ |
#define PCIE_CONF_CMDSTAT_CAPS 0x00100000U /* capabilities list */ |
#define PCIE_CONF_CMDSTAT_IO 0x00000001U /* I/O access enable */ |
#define PCIE_CONF_CMDSTAT_MASTER 0x00000004U /* bus master enable */ |
#define PCIE_CONF_CMDSTAT_MEM 0x00000002U /* mem access enable */ |
#define PCIE_CONF_EXT_CAP_ID | ( | w | ) | ((w) & 0xFFFFU) |
#define PCIE_CONF_EXT_CAP_NEXT | ( | w | ) | (((w) >> 20) & 0xFFFU) |
#define PCIE_CONF_EXT_CAP_VER | ( | w | ) | (((w) >> 16) & 0xFU) |
#define PCIE_CONF_EXT_CAPPTR 64U |
#define PCIE_CONF_ID 0U |
#define PCIE_CONF_INTR 15U |
#define PCIE_CONF_INTR_IRQ | ( | w | ) | ((w) & 0xFFU) |
#define PCIE_CONF_INTR_IRQ_NONE 0xFFU /* no interrupt routed */ |
#define PCIE_CONF_MULTIFUNCTION | ( | w | ) | (((w) & 0x00800000U) != 0U) |
#define PCIE_CONF_TYPE 3U |
#define PCIE_CONF_TYPE_BRIDGE | ( | w | ) | (((w) & 0x007F0000U) != 0U) |
#define PCIE_IO_BASE | ( | w | ) | ((w) & 0xffUL) |
#define PCIE_IO_BASE_LIMIT_UPPER 12U |
#define PCIE_IO_BASE_LIMIT_UPPER_VAL | ( | iobu, | |
iolu | |||
) |
#define PCIE_IO_BASE_UPPER | ( | w | ) | ((w) & 0xffffUL) |
#define PCIE_IO_LIMIT | ( | w | ) | (((w) >> 8) & 0xffUL) |
#define PCIE_IO_LIMIT_UPPER | ( | w | ) | (((w) >> 16) & 0xffffUL) |
#define PCIE_IO_SEC_STATUS 7U |
#define PCIE_IO_SEC_STATUS_VAL | ( | iob, | |
iol, | |||
sec_status | |||
) |
#define PCIE_IRQ_CONNECT | ( | bdf_p, | |
irq_p, | |||
priority_p, | |||
isr_p, | |||
isr_param_p, | |||
flags_p | |||
) |
Initialize an interrupt handler for a PCIe endpoint IRQ.
This routine is only meant to be used by drivers using PCIe bus and having fixed or MSI based IRQ (so no runtime detection of the IRQ). In case of runtime detection see pcie_connect_dynamic_irq()
bdf_p | PCIe endpoint BDF |
irq_p | IRQ line number. |
priority_p | Interrupt priority. |
isr_p | Address of interrupt service routine. |
isr_param_p | Parameter passed to interrupt service routine. |
flags_p | Architecture-specific IRQ configuration flags.. |
#define PCIE_MAX_BUS (0xFFFFFFFF & PCIE_BDF_BUS_MASK) |
#define PCIE_MAX_DEV (0xFFFFFFFF & PCIE_BDF_DEV_MASK) |
#define PCIE_MAX_FUNC (0xFFFFFFFF & PCIE_BDF_FUNC_MASK) |
#define PCIE_MEM_BASE | ( | w | ) | ((w) & 0xffffUL) |
#define PCIE_MEM_BASE_LIMIT 8U |
#define PCIE_MEM_BASE_LIMIT_VAL | ( | memb, | |
meml | |||
) |
#define PCIE_MEM_LIMIT | ( | w | ) | (((w) >> 16) & 0xffffUL) |
#define PCIE_PREFETCH_BASE | ( | w | ) | ((w) & 0xffffUL) |
#define PCIE_PREFETCH_BASE_LIMIT 9U |
#define PCIE_PREFETCH_BASE_LIMIT_VAL | ( | pmemb, | |
pmeml | |||
) |
#define PCIE_PREFETCH_BASE_UPPER 10U |
#define PCIE_PREFETCH_LIMIT | ( | w | ) | (((w) >> 16) & 0xffffUL) |
#define PCIE_PREFETCH_LIMIT_UPPER 11U |
#define PCIE_SEC_STATUS | ( | w | ) | (((w) >> 16) & 0xffffUL) |
#define PCIE_SECONDARY_LATENCY_TIMER | ( | w | ) | (((w) >> 24) & 0xffUL) |
A unique PCI(e) endpoint (bus, device, function).
A PCI(e) endpoint is uniquely identified topologically using a (bus, device, function) tuple. The internal structure is documented in include/dt-bindings/pcie/pcie.h: see PCIE_BDF() and friends, since these tuples are referenced from devicetree.
A unique PCI(e) identifier (vendor ID, device ID).
The PCIE_CONF_ID register for each endpoint is a (vendor ID, device ID) pair, which is meant to tell the system what the PCI(e) endpoint is. Again, look to PCIE_ID_* macros in include/dt-bindings/pcie/pcie.h for more.
unsigned int pcie_alloc_irq | ( | pcie_bdf_t | bdf | ) |
Allocate an IRQ for an endpoint.
This function first checks the IRQ register and if it contains a valid value this is returned. If the register does not contain a valid value allocation of a new one is attempted. Such function is only exposed if CONFIG_PCIE_CONTROLLER is unset. It is thus available where architecture tied dynamic IRQ allocation for PCIe device makes sense.
bdf | the PCI(e) endpoint |
pcie_bdf_t pcie_bdf_lookup | ( | pcie_id_t | id | ) |
Look up the BDF based on PCI(e) vendor & device ID.
This function is used to look up the BDF for a device given its vendor and device ID.
id | PCI(e) vendor & device ID encoded using PCIE_ID() |
uint32_t pcie_conf_read | ( | pcie_bdf_t | bdf, |
unsigned int | reg | ||
) |
Read a 32-bit word from an endpoint's configuration space.
This function is exported by the arch/SoC/board code.
bdf | PCI(e) endpoint |
reg | the configuration word index (not address) |
void pcie_conf_write | ( | pcie_bdf_t | bdf, |
unsigned int | reg, | ||
uint32_t | data | ||
) |
Write a 32-bit word to an endpoint's configuration space.
This function is exported by the arch/SoC/board code.
bdf | PCI(e) endpoint |
reg | the configuration word index (not address) |
data | the value to write |
bool pcie_connect_dynamic_irq | ( | pcie_bdf_t | bdf, |
unsigned int | irq, | ||
unsigned int | priority, | ||
void(*)(const void *parameter) | routine, | ||
const void * | parameter, | ||
uint32_t | flags | ||
) |
Dynamically connect a PCIe endpoint IRQ to an ISR handler.
bdf | the PCI endpoint to examine |
irq | the IRQ to connect (see pcie_alloc_irq()) |
priority | priority of the IRQ |
routine | the ISR handler to connect to the IRQ |
parameter | the parameter to provide to the handler |
flags | IRQ connection flags |
uint32_t pcie_get_cap | ( | pcie_bdf_t | bdf, |
uint32_t | cap_id | ||
) |
Find a PCI(e) capability in an endpoint's configuration space.
bdf | the PCI endpoint to examine |
cap_id | the capability ID of interest |
uint32_t pcie_get_ext_cap | ( | pcie_bdf_t | bdf, |
uint32_t | cap_id | ||
) |
Find an Extended PCI(e) capability in an endpoint's configuration space.
bdf | the PCI endpoint to examine |
cap_id | the capability ID of interest |
unsigned int pcie_get_irq | ( | pcie_bdf_t | bdf | ) |
Return the IRQ assigned by the firmware/board to an endpoint.
bdf | the PCI(e) endpoint |
bool pcie_get_mbar | ( | pcie_bdf_t | bdf, |
unsigned int | bar_index, | ||
struct pcie_mbar * | mbar | ||
) |
Get the MBAR at a specific BAR index.
bdf | the PCI(e) endpoint |
bar_index | 0-based BAR index |
mbar | Pointer to struct pcie_mbar |
void pcie_irq_enable | ( | pcie_bdf_t | bdf, |
unsigned int | irq | ||
) |
Enable the PCI(e) endpoint to generate the specified IRQ.
bdf | the PCI(e) endpoint |
irq | the IRQ to generate |
If MSI is enabled and the endpoint supports it, the endpoint will be configured to generate the specified IRQ via MSI. Otherwise, it is assumed that the IRQ has been routed by the boot firmware to the specified IRQ, and the IRQ is enabled (at the I/O APIC, or wherever appropriate).
bool pcie_probe | ( | pcie_bdf_t | bdf, |
pcie_id_t | id | ||
) |
Probe for the presence of a PCI(e) endpoint.
bdf | the endpoint to probe |
id | the endpoint ID to expect, or PCIE_ID_NONE for "any device" |
bool pcie_probe_mbar | ( | pcie_bdf_t | bdf, |
unsigned int | index, | ||
struct pcie_mbar * | mbar | ||
) |
Probe the nth MMIO address assigned to an endpoint.
bdf | the PCI(e) endpoint |
index | (0-based) index |
mbar | Pointer to struct pcie_mbar |
A PCI(e) endpoint has 0 or more memory-mapped regions. This function allows the caller to enumerate them by calling with index=0..n. Value of n has to be below 6, as there is a maximum of 6 BARs. The indices are order-preserving with respect to the endpoint BARs: e.g., index 0 will return the lowest-numbered memory BAR on the endpoint.
void pcie_set_cmd | ( | pcie_bdf_t | bdf, |
uint32_t | bits, | ||
bool | on | ||
) |
Set or reset bits in the endpoint command/status register.
bdf | the PCI(e) endpoint |
bits | the powerset of bits of interest |
on | use true to set bits, false to reset them |