
PCI config space (256 Bytes per Device)
PCI config space 本质上是 64 个 32-bit 寄存器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
| pci 0000:00:00.0: config space: 00000000: 86 80 34 3e 00000004: 06 00 90 20 00000008: 0c 00 00 06 0000000c: 00 00 00 00 00000010: 00 00 00 00 <- BAR0 00000014: 00 00 00 00 <- BAR1 00000018: 00 00 00 00 <- BAR2 0000001c: 00 00 00 00 <- BAR3 00000020: 00 00 00 00 <- BAR4 00000024: 00 00 00 00 <- BAR5 00000028: 00 00 00 00 0000002c: 28 10 20 09 00000030: 00 00 00 00 00000034: e0 00 00 00 00000038: 00 00 00 00 0000003c: 00 00 00 00 00000040: 01 90 d1 fe 00000044: 00 00 00 00 00000048: 01 00 d1 fe 0000004c: 00 00 00 00 00000050: c1 02 00 00 00000054: b1 80 00 00 00000058: 47 00 70 8f 0000005c: 07 01 00 8a 00000060: 01 00 00 e0 00000064: 00 00 00 00 00000068: 01 80 d1 fe 0000006c: 00 00 00 00 00000070: 00 00 00 fc 00000074: 01 00 00 00 00000078: 00 0c 00 fc 0000007c: 7f 00 00 00 00000080: 01 00 00 00 00000084: 00 00 00 00 00000088: 1a 00 00 00 0000008c: 00 00 00 00 00000090: 01 00 00 fc 00000094: 01 00 00 00 00000098: 01 00 70 6c 0000009c: 02 00 00 00 000000a0: 01 00 00 00 000000a4: 02 00 00 00 000000a8: 01 00 80 6c 000000ac: 02 00 00 00 000000b0: 01 00 80 8b 000000b4: 01 00 00 8b 000000b8: 01 00 00 8a 000000bc: 01 00 80 8f 000000c0: 00 00 00 00 000000c4: 00 00 00 00 000000c8: 00 00 00 00 000000cc: 00 00 00 00 000000d0: 00 00 00 00 000000d4: 00 00 00 00 000000d8: 00 00 00 00 000000dc: 00 00 00 00 000000e0: 09 00 10 01 000000e4: c1 60 61 7a 000000e8: 8c 80 11 94 000000ec: 00 c0 04 00 000000f0: 00 00 00 00 000000f4: c8 0f 0c 00 000000f8: 00 00 00 00 000000fc: 00 00 00 00 pci 0000:00:00.0: [8086:3e34] type 00 class 0x060000 conventional PCI endpoint pci 0000:00:02.0: config space: 00000000: 86 80 a0 3e 00000004: 07 00 10 00 00000008: 02 00 00 03 0000000c: 00 00 00 00 00000010: 04 00 00 c0 <- BAR 0 * (type=mem) 00000014: 00 00 00 00 <- BAR 1 00000018: 0c 00 00 b0 <- BAR 2 * (type=mem) 0000001c: 00 00 00 00 <- BAR 3 00000020: 01 40 00 00 <- BAR 4 * (type=io) 00000024: 00 00 00 00 <- BAR 5 00000028: 00 00 00 00 0000002c: 28 10 20 09 00000030: 00 00 00 00 00000034: 40 00 00 00 <- Capability Pointer : 40h 00000038: 00 00 00 00 0000003c: ff 01 00 00 00000040: 09 70 0c 01 <- Capability Next : 70h, ID: 09h (Vendor Specific) 00000044: c1 60 61 7a 00000048: 8c 80 11 94 0000004c: 00 00 00 00 00000050: c1 02 00 00 00000054: b1 80 00 00 00000058: 00 00 00 00 0000005c: 01 00 80 8b 00000060: 00 00 01 00 00000064: 00 00 00 00 00000068: 00 00 00 00 0000006c: 00 00 00 00 00000070: 10 ac 92 00 <- Capability Next : ach, ID: 10h (PCI Express) 00000074: 00 80 00 10 00000078: 00 00 00 00 0000007c: 00 00 00 00 00000080: 00 00 00 00 00000084: 00 00 00 00 00000088: 00 00 00 00 0000008c: 00 00 00 00 00000090: 00 00 00 00 00000094: 00 00 00 00 00000098: 00 00 00 00 0000009c: 00 00 00 00 000000a0: 00 00 00 00 000000a4: 00 00 00 00 000000a8: 00 00 00 00 000000ac: 05 d0 00 00 <- Capability Next : d0h, ID: 05h (Message Signaled Interrupts) 000000b0: 00 00 00 00 000000b4: 00 00 00 00 000000b8: 00 00 00 00 000000bc: 00 00 00 00 000000c0: 00 00 00 00 000000c4: 00 00 00 00 000000c8: 00 00 00 00 000000cc: 00 00 00 00 000000d0: 01 00 22 00 <- Capability Last : 00h, ID: 01h (PCI Power Management Interface) 000000d4: 00 00 00 00 000000d8: 00 00 00 00 000000dc: 00 00 00 00 000000e0: 00 00 00 00 000000e4: 00 00 00 00 000000e8: 00 80 00 00 000000ec: 00 00 00 00 000000f0: 00 00 00 00 000000f4: 00 00 00 00 000000f8: 00 00 00 00 000000fc: 18 00 e1 88 pci 0000:00:02.0: [8086:3ea0] type 00 class 0x030000 PCIe Root Complex Integrated Endpoint pci 0000:00:02.0: BAR 0 [mem 0xc0000000-0xc0ffffff 64bit] <- FB (mmapped Write-Combining) pci 0000:00:02.0: BAR 2 [mem 0xb0000000-0xbfffffff 64bit pref] <- (mapped Write-Through) pci 0000:00:02.0: BAR 4 [io 0x4000-0x403f] pci 0000:00:02.0: Video device with shadowed ROM at [mem 0x000c0000-0x000dffff] ... pci 0000:01:00.0: config space: 00000000: de 10 13 1d 00000004: 00 00 10 00 00000008: a1 00 02 03 0000000c: 00 00 00 00 00000010: 00 00 00 c1 <- BAR 0 * (type=mem) 00000014: 0c 00 00 90 <- BAR 1 * (type=mem) 00000018: 00 00 00 00 <- BAR 2 0000001c: 0c 00 00 a0 <- BAR 3 * (type=mem) 00000020: 00 00 00 00 <- BAR 4 00000024: 01 30 00 00 <- BAR 5 * (type=io) 00000028: 00 00 00 00 0000002c: 28 10 20 09 00000030: 00 00 f8 ff 00000034: 60 00 00 00 <- Capability Pointer : 60h 00000038: 00 00 00 00 0000003c: ff 01 00 00 00000040: 28 10 20 09 00000044: 00 00 00 00 00000048: 00 00 00 00 0000004c: 00 00 00 00 00000050: 00 00 00 00 00000054: 01 00 00 00 00000058: ce d6 23 00 0000005c: 00 00 00 00 00000060: 01 68 03 00 <- Capability Next : 68h, ID: 01h (PCI Power Management Interface) 00000064: 08 00 00 00 00000068: 05 78 80 00 <- Capability Next : 78h, ID: 05h (Message Signaled Interrupts) 0000006c: 00 00 00 00 00000070: 00 00 00 00 00000074: 00 00 00 00 00000078: 10 00 02 00 <- Capability Last : 00h, ID: 10h (PCI Express) 0000007c: e1 8d e8 07 00000080: 30 29 09 00 00000084: 43 4c 45 00 00000088: 42 01 43 10 0000008c: 00 00 00 00 00000090: 00 00 00 00 00000094: 00 00 00 00 00000098: 00 00 00 00 0000009c: 13 08 04 00 000000a0: 00 00 00 00 000000a4: 0e 00 00 00 000000a8: 03 00 1e 00 000000ac: 00 00 00 00 000000b0: 00 00 00 00 000000b4: 09 00 14 01 000000b8: 00 00 00 00 000000bc: 00 00 00 00 000000c0: 00 00 00 00 000000c4: 00 00 00 00 000000c8: 00 00 00 00 000000cc: 00 00 00 00 000000d0: 00 00 00 00 000000d4: 00 00 00 00 000000d8: 00 00 00 00 000000dc: 00 00 00 00 000000e0: 00 00 00 00 000000e4: 00 00 00 00 000000e8: 00 00 00 00 000000ec: 00 00 00 00 000000f0: 00 00 00 00 000000f4: 00 00 00 00 000000f8: 00 00 00 00 000000fc: 00 00 00 00 pci 0000:01:00.0: [10de:1d13] type 00 class 0x030200 PCIe Endpoint pci 0000:01:00.0: BAR 0 [mem 0xc1000000-0xc1ffffff] pci 0000:01:00.0: BAR 1 [mem 0x90000000-0x9fffffff 64bit pref] pci 0000:01:00.0: BAR 3 [mem 0xa0000000-0xa1ffffff 64bit pref] pci 0000:01:00.0: BAR 5 [io 0x3000-0x307f] pci 0000:01:00.0: ROM [mem 0xfff80000-0xffffffff pref]
|
上面的 PCI config space dump 可以通过内核启动参数 pci=earlydump 开启打印。所谓 earlydump 是指打印的是内核未经修改的 config space, 也就是说是 UEFI 初始化过的 config space, 像 BAR 里的物理地址一般不会是这个设备最终的物理内存起始地址,内核一般都会重新规划 PCI 设备的物理内存地址空间,由内核重新填入的 BAR 值,可以通过
1
| lspci -vvv -s <Bus:Dev.Func>
|
或
1
| lspci -xxx -s <Bus:Dev.Func>
|
来查看。
Access to config space
内核访问 PCI config space 的 API 都定义在 drivers/pci/access.c
中
1
| int pci_read_config_byte(const struct pci_dev *dev, int where, u8 *val);
|
消失的南桥和北桥

参考