Zephyr Project API 3.7.0
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
pcie.h File Reference
#include <stddef.h>
#include <zephyr/devicetree.h>
#include <zephyr/dt-bindings/pcie/pcie.h>
#include <zephyr/types.h>
#include <zephyr/kernel.h>
#include <zephyr/sys/iterable_sections.h>

Go to the source code of this file.

Data Structures

struct  pcie_dev
 
struct  pcie_bar
 
struct  pcie_scan_opt
 Options for performing a scan for PCI devices. More...
 

Macros

#define PCIE_ID_IS_VALID(id)
 
#define PCIE_DT_ID(node_id)
 Get the PCIe Vendor and Device ID for a node.
 
#define PCIE_DT_INST_ID(inst)   PCIE_DT_ID(DT_DRV_INST(inst))
 Get the PCIe Vendor and Device ID for a node.
 
#define DEVICE_PCIE_DECLARE(node_id)
 Declare a PCIe context variable for a DTS node.
 
#define DEVICE_PCIE_INST_DECLARE(inst)   DEVICE_PCIE_DECLARE(DT_DRV_INST(inst))
 Declare a PCIe context variable for a DTS node.
 
#define DEVICE_PCIE_INIT(node_id, name)   .name = &Z_DEVICE_PCIE_NAME(node_id)
 Initialize a named struct member to point at a PCIe context.
 
#define DEVICE_PCIE_INST_INIT(inst, name)    DEVICE_PCIE_INIT(DT_DRV_INST(inst), name)
 Initialize a named struct member to point at a PCIe context.
 
#define PCIE_HOST_CONTROLLER(n)   PCIE_BDF(0, 0, n)
 Get the BDF for a given PCI host controller.
 
#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_INTERRUPT   0x00080000U /* interrupt status */
 
#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_TYPE_GET(w)   (((w) >> 16) & 0x7F)
 
#define PCIE_CONF_TYPE_STANDARD   0x0U
 
#define PCIE_CONF_TYPE_PCI_BRIDGE   0x1U
 
#define PCIE_CONF_TYPE_CARDBUS_BRIDGE   0x2U
 
#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   (0xFFFFFFFFU & PCIE_BDF_BUS_MASK)
 
#define PCIE_MAX_DEV   (0xFFFFFFFFU & PCIE_BDF_DEV_MASK)
 
#define PCIE_MAX_FUNC   (0xFFFFFFFFU & 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.
 

Typedefs

typedef uint32_t pcie_bdf_t
 A unique PCI(e) endpoint (bus, device, function).
 
typedef uint32_t pcie_id_t
 A unique PCI(e) identifier (vendor ID, device ID).
 
typedef bool(* pcie_scan_cb_t) (pcie_bdf_t bdf, pcie_id_t id, void *cb_data)
 Callback type used for scanning for PCI endpoints.
 

Enumerations

enum  { PCIE_SCAN_RECURSIVE = BIT(0) , PCIE_SCAN_CB_ALL = BIT(1) }
 

Functions

uint32_t pcie_conf_read (pcie_bdf_t bdf, unsigned int reg)
 Read a 32-bit word from an endpoint's configuration space.
 
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.
 
int pcie_scan (const struct pcie_scan_opt *opt)
 Scan for PCIe devices.
 
bool pcie_get_mbar (pcie_bdf_t bdf, unsigned int bar_index, struct pcie_bar *mbar)
 Get the MBAR at a specific BAR index.
 
bool pcie_probe_mbar (pcie_bdf_t bdf, unsigned int index, struct pcie_bar *mbar)
 Probe the nth MMIO address assigned to an endpoint.
 
bool pcie_get_iobar (pcie_bdf_t bdf, unsigned int bar_index, struct pcie_bar *iobar)
 Get the I/O BAR at a specific BAR index.
 
bool pcie_probe_iobar (pcie_bdf_t bdf, unsigned int index, struct pcie_bar *iobar)
 Probe the nth I/O BAR address assigned to an endpoint.
 
void pcie_set_cmd (pcie_bdf_t bdf, uint32_t bits, bool on)
 Set or reset bits in the endpoint command/status register.
 
unsigned int pcie_alloc_irq (pcie_bdf_t bdf)
 Allocate an IRQ for an endpoint.
 
unsigned int pcie_get_irq (pcie_bdf_t bdf)
 Return the IRQ assigned by the firmware/board to an endpoint.
 
void pcie_irq_enable (pcie_bdf_t bdf, unsigned int irq)
 Enable the PCI(e) endpoint to generate the specified IRQ.
 
uint32_t pcie_get_cap (pcie_bdf_t bdf, uint32_t cap_id)
 Find a PCI(e) capability in an endpoint's configuration space.
 
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.
 
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.