7#ifndef ZEPHYR_INCLUDE_DRIVERS_PCIE_PCIE_H_
8#define ZEPHYR_INCLUDE_DRIVERS_PCIE_PCIE_H_
58#define PCIE_ID_IS_VALID(id) ((id != PCIE_ID_NONE) && \
59 (id != PCIE_ID(0x0000, 0x0000)) && \
60 (id != PCIE_ID(0xFFFF, 0x0000)) && \
61 (id != PCIE_ID(0x0000, 0xFFFF)))
70#define Z_DEVICE_PCIE_NAME(node_id) _CONCAT(pcie_dev_, DT_DEP_ORD(node_id))
78#define PCIE_DT_ID(node_id) PCIE_ID(DT_PROP_OR(node_id, vendor_id, 0xffff), \
79 DT_PROP_OR(node_id, device_id, 0xffff))
90#define PCIE_DT_INST_ID(inst) PCIE_DT_ID(DT_DRV_INST(inst))
100#define DEVICE_PCIE_DECLARE(node_id) \
101 STRUCT_SECTION_ITERABLE(pcie_dev, Z_DEVICE_PCIE_NAME(node_id)) = { \
102 .bdf = PCIE_BDF_NONE, \
103 .id = PCIE_DT_ID(node_id), \
104 .class_rev = DT_PROP_OR(node_id, class_rev, 0), \
105 .class_rev_mask = DT_PROP_OR(node_id, class_rev_mask, 0), \
116#define DEVICE_PCIE_INST_DECLARE(inst) DEVICE_PCIE_DECLARE(DT_DRV_INST(inst))
142#define DEVICE_PCIE_INIT(node_id, name) .name = &Z_DEVICE_PCIE_NAME(node_id)
153#define DEVICE_PCIE_INST_INIT(inst, name) \
154 DEVICE_PCIE_INIT(DT_DRV_INST(inst), name)
236 unsigned int bar_index,
264 unsigned int bar_index,
293#ifndef CONFIG_PCIE_CONTROLLER
363 unsigned int priority,
364 void (*routine)(
const void *parameter),
365 const void *parameter,
378#define PCIE_HOST_CONTROLLER(n) PCIE_BDF(0, 0, n)
384#define PCIE_CONF_CAPPTR 13U
385#define PCIE_CONF_CAPPTR_FIRST(w) (((w) >> 2) & 0x3FU)
392#define PCIE_CONF_CAP_ID(w) ((w) & 0xFFU)
393#define PCIE_CONF_CAP_NEXT(w) (((w) >> 10) & 0x3FU)
399#define PCIE_CONF_EXT_CAPPTR 64U
406#define PCIE_CONF_EXT_CAP_ID(w) ((w) & 0xFFFFU)
407#define PCIE_CONF_EXT_CAP_VER(w) (((w) >> 16) & 0xFU)
408#define PCIE_CONF_EXT_CAP_NEXT(w) (((w) >> 20) & 0xFFFU)
414#define PCIE_CONF_ID 0U
420#define PCIE_CONF_CMDSTAT 1U
422#define PCIE_CONF_CMDSTAT_IO 0x00000001U
423#define PCIE_CONF_CMDSTAT_MEM 0x00000002U
424#define PCIE_CONF_CMDSTAT_MASTER 0x00000004U
425#define PCIE_CONF_CMDSTAT_SERR 0x00000100U
426#define PCIE_CONF_CMDSTAT_INTERRUPT 0x00080000U
427#define PCIE_CONF_CMDSTAT_CAPS 0x00100000U
434#define PCIE_CONF_CLASSREV 2U
436#define PCIE_CONF_CLASSREV_CLASS(w) (((w) >> 24) & 0xFFU)
437#define PCIE_CONF_CLASSREV_SUBCLASS(w) (((w) >> 16) & 0xFFU)
438#define PCIE_CONF_CLASSREV_PROGIF(w) (((w) >> 8) & 0xFFU)
439#define PCIE_CONF_CLASSREV_REV(w) ((w) & 0xFFU)
447#define PCIE_CONF_TYPE 3U
449#define PCIE_CONF_MULTIFUNCTION(w) (((w) & 0x00800000U) != 0U)
450#define PCIE_CONF_TYPE_BRIDGE(w) (((w) & 0x007F0000U) != 0U)
451#define PCIE_CONF_TYPE_GET(w) (((w) >> 16) & 0x7F)
453#define PCIE_CONF_TYPE_STANDARD 0x0U
454#define PCIE_CONF_TYPE_PCI_BRIDGE 0x1U
455#define PCIE_CONF_TYPE_CARDBUS_BRIDGE 0x2U
463#define PCIE_CONF_BAR0 4U
464#define PCIE_CONF_BAR1 5U
465#define PCIE_CONF_BAR2 6U
466#define PCIE_CONF_BAR3 7U
467#define PCIE_CONF_BAR4 8U
468#define PCIE_CONF_BAR5 9U
470#define PCIE_CONF_BAR_IO(w) (((w) & 0x00000001U) == 0x00000001U)
471#define PCIE_CONF_BAR_MEM(w) (((w) & 0x00000001U) != 0x00000001U)
472#define PCIE_CONF_BAR_64(w) (((w) & 0x00000006U) == 0x00000004U)
473#define PCIE_CONF_BAR_ADDR(w) ((w) & ~0xfUL)
474#define PCIE_CONF_BAR_IO_ADDR(w) ((w) & ~0x3UL)
475#define PCIE_CONF_BAR_FLAGS(w) ((w) & 0xfUL)
476#define PCIE_CONF_BAR_NONE 0U
478#define PCIE_CONF_BAR_INVAL 0xFFFFFFF0U
479#define PCIE_CONF_BAR_INVAL64 0xFFFFFFFFFFFFFFF0UL
481#define PCIE_CONF_BAR_INVAL_FLAGS(w) \
482 ((((w) & 0x00000006U) == 0x00000006U) || \
483 (((w) & 0x00000006U) == 0x00000002U))
488#define PCIE_BUS_NUMBER 6U
490#define PCIE_BUS_PRIMARY_NUMBER(w) ((w) & 0xffUL)
491#define PCIE_BUS_SECONDARY_NUMBER(w) (((w) >> 8) & 0xffUL)
492#define PCIE_BUS_SUBORDINATE_NUMBER(w) (((w) >> 16) & 0xffUL)
493#define PCIE_SECONDARY_LATENCY_TIMER(w) (((w) >> 24) & 0xffUL)
495#define PCIE_BUS_NUMBER_VAL(prim, sec, sub, lat) \
496 (((prim) & 0xffUL) | \
497 (((sec) & 0xffUL) << 8) | \
498 (((sub) & 0xffUL) << 16) | \
499 (((lat) & 0xffUL) << 24))
504#define PCIE_IO_SEC_STATUS 7U
506#define PCIE_IO_BASE(w) ((w) & 0xffUL)
507#define PCIE_IO_LIMIT(w) (((w) >> 8) & 0xffUL)
508#define PCIE_SEC_STATUS(w) (((w) >> 16) & 0xffffUL)
510#define PCIE_IO_SEC_STATUS_VAL(iob, iol, sec_status) \
511 (((iob) & 0xffUL) | \
512 (((iol) & 0xffUL) << 8) | \
513 (((sec_status) & 0xffffUL) << 16))
515#define PCIE_MEM_BASE_LIMIT 8U
517#define PCIE_MEM_BASE(w) ((w) & 0xffffUL)
518#define PCIE_MEM_LIMIT(w) (((w) >> 16) & 0xffffUL)
520#define PCIE_MEM_BASE_LIMIT_VAL(memb, meml) \
521 (((memb) & 0xffffUL) | \
522 (((meml) & 0xffffUL) << 16))
524#define PCIE_PREFETCH_BASE_LIMIT 9U
526#define PCIE_PREFETCH_BASE(w) ((w) & 0xffffUL)
527#define PCIE_PREFETCH_LIMIT(w) (((w) >> 16) & 0xffffUL)
529#define PCIE_PREFETCH_BASE_LIMIT_VAL(pmemb, pmeml) \
530 (((pmemb) & 0xffffUL) | \
531 (((pmeml) & 0xffffUL) << 16))
533#define PCIE_PREFETCH_BASE_UPPER 10U
535#define PCIE_PREFETCH_LIMIT_UPPER 11U
537#define PCIE_IO_BASE_LIMIT_UPPER 12U
539#define PCIE_IO_BASE_UPPER(w) ((w) & 0xffffUL)
540#define PCIE_IO_LIMIT_UPPER(w) (((w) >> 16) & 0xffffUL)
542#define PCIE_IO_BASE_LIMIT_UPPER_VAL(iobu, iolu) \
543 (((iobu) & 0xffffUL) | \
544 (((iolu) & 0xffffUL) << 16))
553#define PCIE_CONF_INTR 15U
555#define PCIE_CONF_INTR_IRQ(w) ((w) & 0xFFU)
556#define PCIE_CONF_INTR_IRQ_NONE 0xFFU
558#define PCIE_MAX_BUS (0xFFFFFFFFU & PCIE_BDF_BUS_MASK)
559#define PCIE_MAX_DEV (0xFFFFFFFFU & PCIE_BDF_DEV_MASK)
560#define PCIE_MAX_FUNC (0xFFFFFFFFU & PCIE_BDF_FUNC_MASK)
576#define PCIE_IRQ_CONNECT(bdf_p, irq_p, priority_p, \
577 isr_p, isr_param_p, flags_p) \
578 ARCH_PCIE_IRQ_CONNECT(bdf_p, irq_p, priority_p, \
579 isr_p, isr_param_p, flags_p)
uint32_t pcie_conf_read(pcie_bdf_t bdf, unsigned int reg)
Read a 32-bit word from 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.
uint32_t pcie_id_t
A unique PCI(e) identifier (vendor ID, device ID).
Definition pcie.h:51
void pcie_set_cmd(pcie_bdf_t bdf, uint32_t bits, bool on)
Set or reset bits in the endpoint command/status register.
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.
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.
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_scan_cb_t)(pcie_bdf_t bdf, pcie_id_t id, void *cb_data)
Callback type used for scanning for PCI endpoints.
Definition pcie.h:195
int pcie_scan(const struct pcie_scan_opt *opt)
Scan for PCIe devices.
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.
unsigned int pcie_alloc_irq(pcie_bdf_t bdf)
Allocate an IRQ for an endpoint.
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_mbar(pcie_bdf_t bdf, unsigned int bar_index, struct pcie_bar *mbar)
Get the MBAR at a specific BAR index.
unsigned int pcie_get_irq(pcie_bdf_t bdf)
Return the IRQ assigned by the firmware/board to an endpoint.
uint32_t pcie_bdf_t
A unique PCI(e) endpoint (bus, device, function).
Definition pcie.h:42
void pcie_irq_enable(pcie_bdf_t bdf, unsigned int irq)
Enable the PCI(e) endpoint to generate the specified IRQ.
@ PCIE_SCAN_RECURSIVE
Scan all available PCI host controllers and sub-buses.
Definition pcie.h:199
@ PCIE_SCAN_CB_ALL
Do the callback for all endpoint types, including bridges.
Definition pcie.h:201
#define BIT(n)
Unsigned integer with bit position n set (signed in assembly language).
Definition util_macro.h:44
flags
Definition parser.h:97
#define bool
Definition stdbool.h:13
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:105
uintptr_t phys_addr
Definition pcie.h:157
size_t size
Definition pcie.h:158
pcie_id_t id
Definition pcie.h:65
uint32_t class_rev_mask
Definition pcie.h:67
pcie_bdf_t bdf
Definition pcie.h:64
uint32_t class_rev
Definition pcie.h:66
Options for performing a scan for PCI devices.
Definition pcie.h:205
uint8_t bus
Initial bus number to scan.
Definition pcie.h:207
void * cb_data
Custom data to pass to the scan callback.
Definition pcie.h:213
pcie_scan_cb_t cb
Function to call for each found endpoint.
Definition pcie.h:210
uint32_t flags
Scan flags.
Definition pcie.h:216