|
30 | 30 | #ifndef PCI_H_
|
31 | 31 | #define PCI_H_
|
32 | 32 |
|
33 |
| -#define PCIM_BAR_MEM_BASE 0xFFFFFFF0U |
| 33 | +/* |
| 34 | + * PCIM_xxx: mask to locate subfield in register |
| 35 | + * PCIR_xxx: config register offset |
| 36 | + * PCIC_xxx: device class |
| 37 | + * PCIS_xxx: device subclass |
| 38 | + * PCIP_xxx: device programming interface |
| 39 | + * PCIV_xxx: PCI vendor ID (only required to fixup ancient devices) |
| 40 | + * PCID_xxx: device ID |
| 41 | + * PCIY_xxx: capability identification number |
| 42 | + * PCIZ_xxx: extended capability identification number |
| 43 | + */ |
34 | 44 |
|
| 45 | +/* some PCI bus constants */ |
35 | 46 | #define PCI_BUSMAX 0xFFU
|
36 | 47 | #define PCI_SLOTMAX 0x1FU
|
37 | 48 | #define PCI_FUNCMAX 0x7U
|
| 49 | +#define PCI_BAR_COUNT 0x6U |
| 50 | +#define PCI_REGMAX 0xFFU |
| 51 | + |
| 52 | +#define PCI_BUS(bdf) (((bdf) >> 8U) & 0xFFU) |
| 53 | +#define PCI_SLOT(bdf) (((bdf) >> 3U) & 0x1FU) |
| 54 | +#define PCI_FUNC(bdf) ((bdf) & 0x7U) |
| 55 | + |
| 56 | +/* I/O ports */ |
| 57 | +#define PCI_CONFIG_ADDR 0xCF8U |
| 58 | +#define PCI_CONFIG_DATA 0xCFCU |
38 | 59 |
|
| 60 | +#define PCI_CFG_ENABLE 0x80000000U |
| 61 | + |
| 62 | +/* PCI config header registers for all devices */ |
39 | 63 | #define PCIR_VENDOR 0x00U
|
40 | 64 | #define PCIR_DEVICE 0x02U
|
41 | 65 | #define PCIR_COMMAND 0x04U
|
| 66 | +#define PCIM_CMD_INTxDIS 0x400U |
| 67 | +#define PCIR_STATUS 0x06U |
| 68 | +#define PCIM_STATUS_CAPPRESENT 0x0010U |
42 | 69 | #define PCIR_REVID 0x08U
|
43 | 70 | #define PCIR_SUBCLASS 0x0AU
|
44 | 71 | #define PCIR_CLASS 0x0BU
|
45 | 72 | #define PCIR_HDRTYPE 0x0EU
|
| 73 | +#define PCIM_HDRTYPE 0x7FU |
46 | 74 | #define PCIM_HDRTYPE_NORMAL 0x00U
|
| 75 | +#define PCIM_HDRTYPE_BRIDGE 0x01U |
47 | 76 | #define PCIM_MFDEV 0x80U
|
| 77 | +#define PCIR_BARS 0x10U |
| 78 | +#define PCIM_BAR_SPACE 0x01U |
| 79 | +#define PCIM_BAR_IO_SPACE 0x01U |
| 80 | +#define PCIM_BAR_MEM_TYPE 0x06U |
| 81 | +#define PCIM_BAR_MEM_32 0x00U |
| 82 | +#define PCIM_BAR_MEM_1MB 0x02U |
| 83 | +#define PCIM_BAR_MEM_64 0x04U |
| 84 | +#define PCIM_BAR_MEM_BASE 0xFFFFFFF0U |
| 85 | +#define PCIR_CAP_PTR 0x34U |
| 86 | + |
| 87 | +/* config registers for header type 1 (PCI-to-PCI bridge) devices */ |
| 88 | +#define PCIR_PRIBUS_1 0x18U |
| 89 | +#define PCIR_SECBUS_1 0x19U |
| 90 | +#define PCIR_SUBBUS_1 0x1AU |
48 | 91 |
|
| 92 | +/* Capability Register Offsets */ |
| 93 | +#define PCICAP_ID 0x0U |
| 94 | +#define PCICAP_NEXTPTR 0x1U |
| 95 | + |
| 96 | +/* Capability Identification Numbers */ |
| 97 | +#define PCIY_MSI 0x05U |
| 98 | +#define PCIY_MSIX 0x11U |
| 99 | + |
| 100 | +/* PCI Message Signalled Interrupts (MSI) */ |
| 101 | +#define PCIR_MSI_CTRL 0x02U |
| 102 | +#define PCIM_MSICTRL_64BIT 0x80U |
| 103 | +#define PCIM_MSICTRL_MSI_ENABLE 0x01U |
| 104 | +#define PCIR_MSI_ADDR 0x4U |
| 105 | +#define PCIR_MSI_ADDR_HIGH 0x8U |
| 106 | +#define PCIR_MSI_DATA 0x8U |
| 107 | +#define PCIR_MSI_DATA_64BIT 0xCU |
| 108 | +#define PCIR_MSI_MASK 0x10U |
| 109 | +#define PCIM_MSICTRL_MMC_MASK 0x000EU |
| 110 | +#define PCIM_MSICTRL_MME_MASK 0x0070U |
| 111 | + |
| 112 | +/* PCI device class */ |
49 | 113 | #define PCIC_BRIDGE 0x06U
|
50 | 114 | #define PCIS_BRIDGE_HOST 0x00U
|
51 | 115 |
|
52 |
| -#define PCI_CONFIG_ADDR 0xCF8U |
53 |
| -#define PCI_CONFIG_DATA 0xCFCU |
| 116 | +/* MSI-X definitions */ |
| 117 | +#define PCIR_MSIX_CTRL 0x2U |
| 118 | +#define PCIR_MSIX_TABLE 0x4U |
| 119 | +#define PCIR_MSIX_PBA 0x8U |
54 | 120 |
|
55 |
| -#define PCI_CFG_ENABLE 0x80000000U |
| 121 | +#define PCIM_MSIXCTRL_MSIX_ENABLE 0x8000U |
| 122 | +#define PCIM_MSIXCTRL_FUNCTION_MASK 0x4000U |
| 123 | +#define PCIM_MSIXCTRL_TABLE_SIZE 0x07FFU |
| 124 | +#define PCIM_MSIX_BIR_MASK 0x7U |
| 125 | +#define PCIM_MSIX_VCTRL_MASK 0x1U |
| 126 | + |
| 127 | +#define MSIX_CAPLEN 12U |
| 128 | +#define MSIX_TABLE_ENTRY_SIZE 16U |
| 129 | + |
| 130 | +union pci_bdf { |
| 131 | + uint16_t value; |
| 132 | + struct { |
| 133 | + uint8_t f : 3; /* BITs 0-2 */ |
| 134 | + uint8_t d : 5; /* BITs 3-7 */ |
| 135 | + uint8_t b; /* BITs 8-15 */ |
| 136 | + } bits; |
| 137 | +}; |
| 138 | + |
| 139 | +enum pci_bar_type { |
| 140 | + PCIBAR_NONE = 0, |
| 141 | + PCIBAR_MEM32, |
| 142 | + PCIBAR_MEM64, |
| 143 | +}; |
56 | 144 |
|
57 | 145 | static inline uint32_t pci_bar_offset(uint32_t idx)
|
58 | 146 | {
|
|
0 commit comments