Zephyr API Documentation  3.6.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
pcie.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2019 Intel Corporation
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_INCLUDE_DRIVERS_PCIE_PCIE_H_
8#define ZEPHYR_INCLUDE_DRIVERS_PCIE_PCIE_H_
9
17#include <stddef.h>
18#include <zephyr/devicetree.h>
20#include <zephyr/types.h>
21#include <zephyr/kernel.h>
23
24#ifdef __cplusplus
25extern "C" {
26#endif
27
38
48
49/* Helper macro to exclude invalid PCIe identifiers. We should really only
50 * need to look for PCIE_ID_NONE, but because of some broken PCI host controllers
51 * we have try cases where both VID & DID are zero or just one of them is
52 * zero (0x0000) and the other is all ones (0xFFFF).
53 */
54#define PCIE_ID_IS_VALID(id) ((id != PCIE_ID_NONE) && \
55 (id != PCIE_ID(0x0000, 0x0000)) && \
56 (id != PCIE_ID(0xFFFF, 0x0000)) && \
57 (id != PCIE_ID(0x0000, 0xFFFF)))
58
59struct pcie_dev {
64};
65
66#define Z_DEVICE_PCIE_NAME(node_id) _CONCAT(pcie_dev_, DT_DEP_ORD(node_id))
67
74#define PCIE_DT_ID(node_id) PCIE_ID(DT_PROP_OR(node_id, vendor_id, 0xffff), \
75 DT_PROP_OR(node_id, device_id, 0xffff))
76
86#define PCIE_DT_INST_ID(inst) PCIE_DT_ID(DT_DRV_INST(inst))
87
96#define DEVICE_PCIE_DECLARE(node_id) \
97 STRUCT_SECTION_ITERABLE(pcie_dev, Z_DEVICE_PCIE_NAME(node_id)) = { \
98 .bdf = PCIE_BDF_NONE, \
99 .id = PCIE_DT_ID(node_id), \
100 .class_rev = DT_PROP_OR(node_id, class_rev, 0), \
101 .class_rev_mask = DT_PROP_OR(node_id, class_rev_mask, 0), \
102 }
103
112#define DEVICE_PCIE_INST_DECLARE(inst) DEVICE_PCIE_DECLARE(DT_DRV_INST(inst))
113
138#define DEVICE_PCIE_INIT(node_id, name) .name = &Z_DEVICE_PCIE_NAME(node_id)
139
149#define DEVICE_PCIE_INST_INIT(inst, name) \
150 DEVICE_PCIE_INIT(DT_DRV_INST(inst), name)
151
152struct pcie_bar {
154 size_t size;
155};
156
157/*
158 * These functions are arch-, board-, or SoC-specific.
159 */
160
173__deprecated extern pcie_bdf_t pcie_bdf_lookup(pcie_id_t id);
174
184extern uint32_t pcie_conf_read(pcie_bdf_t bdf, unsigned int reg);
185
195extern void pcie_conf_write(pcie_bdf_t bdf, unsigned int reg, uint32_t data);
196
205typedef bool (*pcie_scan_cb_t)(pcie_bdf_t bdf, pcie_id_t id, void *cb_data);
206
207enum {
212};
213
218
221
223 void *cb_data;
224
227};
228
236int pcie_scan(const struct pcie_scan_opt *opt);
237
248__deprecated extern bool pcie_probe(pcie_bdf_t bdf, pcie_id_t id);
249
257extern bool pcie_get_mbar(pcie_bdf_t bdf,
258 unsigned int bar_index,
259 struct pcie_bar *mbar);
260
275 unsigned int index,
276 struct pcie_bar *mbar);
277
286 unsigned int bar_index,
287 struct pcie_bar *iobar);
288
303 unsigned int index,
304 struct pcie_bar *iobar);
305
313extern void pcie_set_cmd(pcie_bdf_t bdf, uint32_t bits, bool on);
314
315#ifndef CONFIG_PCIE_CONTROLLER
329extern unsigned int pcie_alloc_irq(pcie_bdf_t bdf);
330#endif /* CONFIG_PCIE_CONTROLLER */
331
338extern unsigned int pcie_get_irq(pcie_bdf_t bdf);
339
352extern void pcie_irq_enable(pcie_bdf_t bdf, unsigned int irq);
353
362
371
384 unsigned int irq,
385 unsigned int priority,
386 void (*routine)(const void *parameter),
387 const void *parameter,
389
400#define PCIE_HOST_CONTROLLER(n) PCIE_BDF(0, 0, n)
401
402/*
403 * Configuration word 13 contains the head of the capabilities list.
404 */
405
406#define PCIE_CONF_CAPPTR 13U /* capabilities pointer */
407#define PCIE_CONF_CAPPTR_FIRST(w) (((w) >> 2) & 0x3FU)
408
409/*
410 * The first word of every capability contains a capability identifier,
411 * and a link to the next capability (or 0) in configuration space.
412 */
413
414#define PCIE_CONF_CAP_ID(w) ((w) & 0xFFU)
415#define PCIE_CONF_CAP_NEXT(w) (((w) >> 10) & 0x3FU)
416
417/*
418 * The extended PCI Express capabilities lie at the end of the PCI configuration space
419 */
420
421#define PCIE_CONF_EXT_CAPPTR 64U
422
423/*
424 * The first word of every capability contains an extended capability identifier,
425 * and a link to the next capability (or 0) in the extended configuration space.
426 */
427
428#define PCIE_CONF_EXT_CAP_ID(w) ((w) & 0xFFFFU)
429#define PCIE_CONF_EXT_CAP_VER(w) (((w) >> 16) & 0xFU)
430#define PCIE_CONF_EXT_CAP_NEXT(w) (((w) >> 20) & 0xFFFU)
431
432/*
433 * Configuration word 0 aligns directly with pcie_id_t.
434 */
435
436#define PCIE_CONF_ID 0U
437
438/*
439 * Configuration word 1 contains command and status bits.
440 */
441
442#define PCIE_CONF_CMDSTAT 1U /* command/status register */
443
444#define PCIE_CONF_CMDSTAT_IO 0x00000001U /* I/O access enable */
445#define PCIE_CONF_CMDSTAT_MEM 0x00000002U /* mem access enable */
446#define PCIE_CONF_CMDSTAT_MASTER 0x00000004U /* bus master enable */
447#define PCIE_CONF_CMDSTAT_INTERRUPT 0x00080000U /* interrupt status */
448#define PCIE_CONF_CMDSTAT_CAPS 0x00100000U /* capabilities list */
449
450/*
451 * Configuration word 2 has additional function identification that
452 * we only care about for debug output (PCIe shell commands).
453 */
454
455#define PCIE_CONF_CLASSREV 2U /* class/revision register */
456
457#define PCIE_CONF_CLASSREV_CLASS(w) (((w) >> 24) & 0xFFU)
458#define PCIE_CONF_CLASSREV_SUBCLASS(w) (((w) >> 16) & 0xFFU)
459#define PCIE_CONF_CLASSREV_PROGIF(w) (((w) >> 8) & 0xFFU)
460#define PCIE_CONF_CLASSREV_REV(w) ((w) & 0xFFU)
461
462/*
463 * The only part of configuration word 3 that is of interest to us is
464 * the header type, as we use it to distinguish functional endpoints
465 * from bridges (which are, for our purposes, transparent).
466 */
467
468#define PCIE_CONF_TYPE 3U
469
470#define PCIE_CONF_MULTIFUNCTION(w) (((w) & 0x00800000U) != 0U)
471#define PCIE_CONF_TYPE_BRIDGE(w) (((w) & 0x007F0000U) != 0U)
472#define PCIE_CONF_TYPE_GET(w) (((w) >> 16) & 0x7F)
473
474#define PCIE_CONF_TYPE_STANDARD 0x0U
475#define PCIE_CONF_TYPE_PCI_BRIDGE 0x1U
476#define PCIE_CONF_TYPE_CARDBUS_BRIDGE 0x2U
477
478/*
479 * Words 4-9 are BARs are I/O or memory decoders. Memory decoders may
480 * be 64-bit decoders, in which case the next configuration word holds
481 * the high-order bits (and is, thus, not a BAR itself).
482 */
483
484#define PCIE_CONF_BAR0 4U
485#define PCIE_CONF_BAR1 5U
486#define PCIE_CONF_BAR2 6U
487#define PCIE_CONF_BAR3 7U
488#define PCIE_CONF_BAR4 8U
489#define PCIE_CONF_BAR5 9U
490
491#define PCIE_CONF_BAR_IO(w) (((w) & 0x00000001U) == 0x00000001U)
492#define PCIE_CONF_BAR_MEM(w) (((w) & 0x00000001U) != 0x00000001U)
493#define PCIE_CONF_BAR_64(w) (((w) & 0x00000006U) == 0x00000004U)
494#define PCIE_CONF_BAR_ADDR(w) ((w) & ~0xfUL)
495#define PCIE_CONF_BAR_IO_ADDR(w) ((w) & ~0x3UL)
496#define PCIE_CONF_BAR_FLAGS(w) ((w) & 0xfUL)
497#define PCIE_CONF_BAR_NONE 0U
498
499#define PCIE_CONF_BAR_INVAL 0xFFFFFFF0U
500#define PCIE_CONF_BAR_INVAL64 0xFFFFFFFFFFFFFFF0UL
501
502#define PCIE_CONF_BAR_INVAL_FLAGS(w) \
503 ((((w) & 0x00000006U) == 0x00000006U) || \
504 (((w) & 0x00000006U) == 0x00000002U))
505
506/*
507 * Type 1 Header has files related to bus management
508 */
509#define PCIE_BUS_NUMBER 6U
510
511#define PCIE_BUS_PRIMARY_NUMBER(w) ((w) & 0xffUL)
512#define PCIE_BUS_SECONDARY_NUMBER(w) (((w) >> 8) & 0xffUL)
513#define PCIE_BUS_SUBORDINATE_NUMBER(w) (((w) >> 16) & 0xffUL)
514#define PCIE_SECONDARY_LATENCY_TIMER(w) (((w) >> 24) & 0xffUL)
515
516#define PCIE_BUS_NUMBER_VAL(prim, sec, sub, lat) \
517 (((prim) & 0xffUL) | \
518 (((sec) & 0xffUL) << 8) | \
519 (((sub) & 0xffUL) << 16) | \
520 (((lat) & 0xffUL) << 24))
521
522/*
523 * Type 1 words 7 to 12 setups Bridge Memory base and limits
524 */
525#define PCIE_IO_SEC_STATUS 7U
526
527#define PCIE_IO_BASE(w) ((w) & 0xffUL)
528#define PCIE_IO_LIMIT(w) (((w) >> 8) & 0xffUL)
529#define PCIE_SEC_STATUS(w) (((w) >> 16) & 0xffffUL)
530
531#define PCIE_IO_SEC_STATUS_VAL(iob, iol, sec_status) \
532 (((iob) & 0xffUL) | \
533 (((iol) & 0xffUL) << 8) | \
534 (((sec_status) & 0xffffUL) << 16))
535
536#define PCIE_MEM_BASE_LIMIT 8U
537
538#define PCIE_MEM_BASE(w) ((w) & 0xffffUL)
539#define PCIE_MEM_LIMIT(w) (((w) >> 16) & 0xffffUL)
540
541#define PCIE_MEM_BASE_LIMIT_VAL(memb, meml) \
542 (((memb) & 0xffffUL) | \
543 (((meml) & 0xffffUL) << 16))
544
545#define PCIE_PREFETCH_BASE_LIMIT 9U
546
547#define PCIE_PREFETCH_BASE(w) ((w) & 0xffffUL)
548#define PCIE_PREFETCH_LIMIT(w) (((w) >> 16) & 0xffffUL)
549
550#define PCIE_PREFETCH_BASE_LIMIT_VAL(pmemb, pmeml) \
551 (((pmemb) & 0xffffUL) | \
552 (((pmeml) & 0xffffUL) << 16))
553
554#define PCIE_PREFETCH_BASE_UPPER 10U
555
556#define PCIE_PREFETCH_LIMIT_UPPER 11U
557
558#define PCIE_IO_BASE_LIMIT_UPPER 12U
559
560#define PCIE_IO_BASE_UPPER(w) ((w) & 0xffffUL)
561#define PCIE_IO_LIMIT_UPPER(w) (((w) >> 16) & 0xffffUL)
562
563#define PCIE_IO_BASE_LIMIT_UPPER_VAL(iobu, iolu) \
564 (((iobu) & 0xffffUL) | \
565 (((iolu) & 0xffffUL) << 16))
566
567/*
568 * Word 15 contains information related to interrupts.
569 *
570 * We're only interested in the low byte, which is [supposed to be] set by
571 * the firmware to indicate which wire IRQ the device interrupt is routed to.
572 */
573
574#define PCIE_CONF_INTR 15U
575
576#define PCIE_CONF_INTR_IRQ(w) ((w) & 0xFFU)
577#define PCIE_CONF_INTR_IRQ_NONE 0xFFU /* no interrupt routed */
578
579#define PCIE_MAX_BUS (0xFFFFFFFFU & PCIE_BDF_BUS_MASK)
580#define PCIE_MAX_DEV (0xFFFFFFFFU & PCIE_BDF_DEV_MASK)
581#define PCIE_MAX_FUNC (0xFFFFFFFFU & PCIE_BDF_FUNC_MASK)
582
597#define PCIE_IRQ_CONNECT(bdf_p, irq_p, priority_p, \
598 isr_p, isr_param_p, flags_p) \
599 ARCH_PCIE_IRQ_CONNECT(bdf_p, irq_p, priority_p, \
600 isr_p, isr_param_p, flags_p)
601
602#ifdef __cplusplus
603}
604#endif
605
610#endif /* ZEPHYR_INCLUDE_DRIVERS_PCIE_PCIE_H_ */
Devicetree main header.
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.
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.
bool pcie_probe(pcie_bdf_t bdf, pcie_id_t id)
Probe for the presence of a PCI(e) endpoint.
uint32_t pcie_id_t
A unique PCI(e) identifier (vendor ID, device ID).
Definition: pcie.h:47
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.
uint32_t pcie_bdf_t
A unique PCI(e) endpoint (bus, device, function).
Definition: pcie.h:37
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:205
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.
pcie_bdf_t pcie_bdf_lookup(pcie_id_t id)
Look up the BDF based on PCI(e) vendor & device ID.
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.
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-busses.
Definition: pcie.h:209
@ PCIE_SCAN_CB_ALL
Do the callback for all endpoint types, including bridges.
Definition: pcie.h:211
#define BIT(n)
Unsigned integer with bit position n set (signed in assembly language).
Definition: util_macro.h:44
Public kernel APIs.
flags
Definition: parser.h:96
#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
Definition: pcie.h:152
uintptr_t phys_addr
Definition: pcie.h:153
size_t size
Definition: pcie.h:154
Definition: pcie.h:59
pcie_id_t id
Definition: pcie.h:61
uint32_t class_rev_mask
Definition: pcie.h:63
pcie_bdf_t bdf
Definition: pcie.h:60
uint32_t class_rev
Definition: pcie.h:62
Options for performing a scan for PCI devices.
Definition: pcie.h:215
uint8_t bus
Initial bus number to scan.
Definition: pcie.h:217
void * cb_data
Custom data to pass to the scan callback.
Definition: pcie.h:223
pcie_scan_cb_t cb
Function to call for each found endpoint.
Definition: pcie.h:220
uint32_t flags
Scan flags.
Definition: pcie.h:226