pci_subr.c revision 1.215.2.6 1 1.215.2.6 martin /* $NetBSD: pci_subr.c,v 1.215.2.6 2022/01/29 17:08:33 martin Exp $ */
2 1.3 cgd
3 1.1 mycroft /*
4 1.22 thorpej * Copyright (c) 1997 Zubin D. Dittia. All rights reserved.
5 1.40 cgd * Copyright (c) 1995, 1996, 1998, 2000
6 1.26 cgd * Christopher G. Demetriou. All rights reserved.
7 1.30 mycroft * Copyright (c) 1994 Charles M. Hannum. All rights reserved.
8 1.1 mycroft *
9 1.1 mycroft * Redistribution and use in source and binary forms, with or without
10 1.1 mycroft * modification, are permitted provided that the following conditions
11 1.1 mycroft * are met:
12 1.1 mycroft * 1. Redistributions of source code must retain the above copyright
13 1.1 mycroft * notice, this list of conditions and the following disclaimer.
14 1.1 mycroft * 2. Redistributions in binary form must reproduce the above copyright
15 1.1 mycroft * notice, this list of conditions and the following disclaimer in the
16 1.1 mycroft * documentation and/or other materials provided with the distribution.
17 1.1 mycroft * 3. All advertising materials mentioning features or use of this software
18 1.1 mycroft * must display the following acknowledgement:
19 1.30 mycroft * This product includes software developed by Charles M. Hannum.
20 1.1 mycroft * 4. The name of the author may not be used to endorse or promote products
21 1.1 mycroft * derived from this software without specific prior written permission.
22 1.1 mycroft *
23 1.1 mycroft * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 1.1 mycroft * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 1.1 mycroft * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 1.1 mycroft * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27 1.1 mycroft * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 1.1 mycroft * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 1.1 mycroft * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 1.1 mycroft * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 1.1 mycroft * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 1.1 mycroft * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 1.1 mycroft */
34 1.1 mycroft
35 1.1 mycroft /*
36 1.10 cgd * PCI autoconfiguration support functions.
37 1.45 thorpej *
38 1.45 thorpej * Note: This file is also built into a userland library (libpci).
39 1.45 thorpej * Pay attention to this when you make modifications.
40 1.1 mycroft */
41 1.47 lukem
42 1.47 lukem #include <sys/cdefs.h>
43 1.215.2.6 martin __KERNEL_RCSID(0, "$NetBSD: pci_subr.c,v 1.215.2.6 2022/01/29 17:08:33 martin Exp $");
44 1.21 enami
45 1.45 thorpej #ifdef _KERNEL_OPT
46 1.35 cgd #include "opt_pci.h"
47 1.45 thorpej #endif
48 1.1 mycroft
49 1.1 mycroft #include <sys/param.h>
50 1.1 mycroft
51 1.45 thorpej #ifdef _KERNEL
52 1.62 simonb #include <sys/systm.h>
53 1.73 ad #include <sys/intr.h>
54 1.80 pgoyette #include <sys/module.h>
55 1.215.2.4 martin #include <sys/kmem.h>
56 1.215.2.4 martin
57 1.215.2.4 martin #define MALLOC(sz) kmem_alloc(sz, KM_SLEEP)
58 1.215.2.4 martin #define FREE(p, sz) kmem_free(p, sz)
59 1.215.2.4 martin
60 1.45 thorpej #else
61 1.45 thorpej #include <pci.h>
62 1.155 pgoyette #include <stdarg.h>
63 1.72 joerg #include <stdbool.h>
64 1.46 enami #include <stdio.h>
65 1.135 msaitoh #include <stdlib.h>
66 1.117 msaitoh #include <string.h>
67 1.215.2.4 martin
68 1.215.2.4 martin #define MALLOC(sz) malloc(sz)
69 1.215.2.4 martin #define FREE(p, sz) free(p)
70 1.215.2.4 martin
71 1.45 thorpej #endif
72 1.24 thorpej
73 1.10 cgd #include <dev/pci/pcireg.h>
74 1.45 thorpej #ifdef _KERNEL
75 1.7 cgd #include <dev/pci/pcivar.h>
76 1.126 christos #else
77 1.126 christos #include <dev/pci/pci_verbose.h>
78 1.126 christos #include <dev/pci/pcidevs.h>
79 1.126 christos #include <dev/pci/pcidevs_data.h>
80 1.10 cgd #endif
81 1.10 cgd
82 1.199 msaitoh static int pci_conf_find_cap(const pcireg_t *, unsigned int, int *);
83 1.199 msaitoh static int pci_conf_find_extcap(const pcireg_t *, unsigned int, int *);
84 1.181 msaitoh static void pci_conf_print_pcie_power(uint8_t, unsigned int);
85 1.165 msaitoh
86 1.10 cgd /*
87 1.10 cgd * Descriptions of known PCI classes and subclasses.
88 1.10 cgd *
89 1.10 cgd * Subclasses are described in the same way as classes, but have a
90 1.10 cgd * NULL subclass pointer.
91 1.10 cgd */
92 1.10 cgd struct pci_class {
93 1.44 thorpej const char *name;
94 1.91 matt u_int val; /* as wide as pci_{,sub}class_t */
95 1.42 jdolecek const struct pci_class *subclasses;
96 1.10 cgd };
97 1.10 cgd
98 1.117 msaitoh /*
99 1.117 msaitoh * Class 0x00.
100 1.117 msaitoh * Before rev. 2.0.
101 1.117 msaitoh */
102 1.61 thorpej static const struct pci_class pci_subclass_prehistoric[] = {
103 1.65 christos { "miscellaneous", PCI_SUBCLASS_PREHISTORIC_MISC, NULL, },
104 1.65 christos { "VGA", PCI_SUBCLASS_PREHISTORIC_VGA, NULL, },
105 1.65 christos { NULL, 0, NULL, },
106 1.10 cgd };
107 1.10 cgd
108 1.117 msaitoh /*
109 1.117 msaitoh * Class 0x01.
110 1.130 msaitoh * Mass storage controller
111 1.117 msaitoh */
112 1.117 msaitoh
113 1.117 msaitoh /* ATA programming interface */
114 1.117 msaitoh static const struct pci_class pci_interface_ata[] = {
115 1.117 msaitoh { "with single DMA", PCI_INTERFACE_ATA_SINGLEDMA, NULL, },
116 1.117 msaitoh { "with chained DMA", PCI_INTERFACE_ATA_CHAINEDDMA, NULL, },
117 1.117 msaitoh { NULL, 0, NULL, },
118 1.117 msaitoh };
119 1.117 msaitoh
120 1.117 msaitoh /* SATA programming interface */
121 1.117 msaitoh static const struct pci_class pci_interface_sata[] = {
122 1.128 msaitoh { "vendor specific", PCI_INTERFACE_SATA_VND, NULL, },
123 1.117 msaitoh { "AHCI 1.0", PCI_INTERFACE_SATA_AHCI10, NULL, },
124 1.128 msaitoh { "Serial Storage Bus Interface", PCI_INTERFACE_SATA_SSBI, NULL, },
125 1.128 msaitoh { NULL, 0, NULL, },
126 1.128 msaitoh };
127 1.128 msaitoh
128 1.128 msaitoh /* Flash programming interface */
129 1.128 msaitoh static const struct pci_class pci_interface_nvm[] = {
130 1.128 msaitoh { "vendor specific", PCI_INTERFACE_NVM_VND, NULL, },
131 1.128 msaitoh { "NVMHCI 1.0", PCI_INTERFACE_NVM_NVMHCI10, NULL, },
132 1.215.2.5 martin { "NVMe I/O", PCI_INTERFACE_NVM_NVME_IO, NULL, },
133 1.215.2.5 martin { "NVMe admin", PCI_INTERFACE_NVM_NVME_ADMIN, NULL, },
134 1.215.2.5 martin { NULL, 0, NULL, },
135 1.215.2.5 martin };
136 1.215.2.5 martin
137 1.215.2.5 martin /* UFS programming interface */
138 1.215.2.5 martin static const struct pci_class pci_interface_ufs[] = {
139 1.215.2.5 martin { "vendor specific", PCI_INTERFACE_UFS_VND, NULL, },
140 1.215.2.5 martin { "UFSHCI", PCI_INTERFACE_UFS_UFSHCI, NULL, },
141 1.117 msaitoh { NULL, 0, NULL, },
142 1.117 msaitoh };
143 1.117 msaitoh
144 1.117 msaitoh /* Subclasses */
145 1.61 thorpej static const struct pci_class pci_subclass_mass_storage[] = {
146 1.65 christos { "SCSI", PCI_SUBCLASS_MASS_STORAGE_SCSI, NULL, },
147 1.65 christos { "IDE", PCI_SUBCLASS_MASS_STORAGE_IDE, NULL, },
148 1.65 christos { "floppy", PCI_SUBCLASS_MASS_STORAGE_FLOPPY, NULL, },
149 1.65 christos { "IPI", PCI_SUBCLASS_MASS_STORAGE_IPI, NULL, },
150 1.65 christos { "RAID", PCI_SUBCLASS_MASS_STORAGE_RAID, NULL, },
151 1.117 msaitoh { "ATA", PCI_SUBCLASS_MASS_STORAGE_ATA,
152 1.117 msaitoh pci_interface_ata, },
153 1.117 msaitoh { "SATA", PCI_SUBCLASS_MASS_STORAGE_SATA,
154 1.117 msaitoh pci_interface_sata, },
155 1.65 christos { "SAS", PCI_SUBCLASS_MASS_STORAGE_SAS, NULL, },
156 1.128 msaitoh { "Flash", PCI_SUBCLASS_MASS_STORAGE_NVM,
157 1.128 msaitoh pci_interface_nvm, },
158 1.215.2.5 martin { "UFS", PCI_SUBCLASS_MASS_STORAGE_UFS,
159 1.215.2.5 martin pci_interface_ufs, },
160 1.65 christos { "miscellaneous", PCI_SUBCLASS_MASS_STORAGE_MISC, NULL, },
161 1.65 christos { NULL, 0, NULL, },
162 1.10 cgd };
163 1.10 cgd
164 1.117 msaitoh /*
165 1.117 msaitoh * Class 0x02.
166 1.117 msaitoh * Network controller.
167 1.117 msaitoh */
168 1.61 thorpej static const struct pci_class pci_subclass_network[] = {
169 1.65 christos { "ethernet", PCI_SUBCLASS_NETWORK_ETHERNET, NULL, },
170 1.65 christos { "token ring", PCI_SUBCLASS_NETWORK_TOKENRING, NULL, },
171 1.65 christos { "FDDI", PCI_SUBCLASS_NETWORK_FDDI, NULL, },
172 1.65 christos { "ATM", PCI_SUBCLASS_NETWORK_ATM, NULL, },
173 1.65 christos { "ISDN", PCI_SUBCLASS_NETWORK_ISDN, NULL, },
174 1.65 christos { "WorldFip", PCI_SUBCLASS_NETWORK_WORLDFIP, NULL, },
175 1.65 christos { "PCMIG Multi Computing", PCI_SUBCLASS_NETWORK_PCIMGMULTICOMP, NULL, },
176 1.215.2.5 martin { "InfiniBand", PCI_SUBCLASS_NETWORK_INFINIBAND, NULL, },
177 1.215.2.5 martin { "Host fabric", PCI_SUBCLASS_NETWORK_HFC, NULL, },
178 1.65 christos { "miscellaneous", PCI_SUBCLASS_NETWORK_MISC, NULL, },
179 1.65 christos { NULL, 0, NULL, },
180 1.10 cgd };
181 1.10 cgd
182 1.117 msaitoh /*
183 1.117 msaitoh * Class 0x03.
184 1.117 msaitoh * Display controller.
185 1.117 msaitoh */
186 1.117 msaitoh
187 1.117 msaitoh /* VGA programming interface */
188 1.117 msaitoh static const struct pci_class pci_interface_vga[] = {
189 1.117 msaitoh { "", PCI_INTERFACE_VGA_VGA, NULL, },
190 1.117 msaitoh { "8514-compat", PCI_INTERFACE_VGA_8514, NULL, },
191 1.117 msaitoh { NULL, 0, NULL, },
192 1.117 msaitoh };
193 1.117 msaitoh /* Subclasses */
194 1.61 thorpej static const struct pci_class pci_subclass_display[] = {
195 1.117 msaitoh { "VGA", PCI_SUBCLASS_DISPLAY_VGA, pci_interface_vga,},
196 1.65 christos { "XGA", PCI_SUBCLASS_DISPLAY_XGA, NULL, },
197 1.65 christos { "3D", PCI_SUBCLASS_DISPLAY_3D, NULL, },
198 1.65 christos { "miscellaneous", PCI_SUBCLASS_DISPLAY_MISC, NULL, },
199 1.65 christos { NULL, 0, NULL, },
200 1.10 cgd };
201 1.10 cgd
202 1.117 msaitoh /*
203 1.117 msaitoh * Class 0x04.
204 1.117 msaitoh * Multimedia device.
205 1.117 msaitoh */
206 1.215.2.5 martin
207 1.215.2.5 martin /* HD Audio programming interface */
208 1.215.2.5 martin static const struct pci_class pci_interface_hda[] = {
209 1.215.2.5 martin { "HD Audio 1.0", PCI_INTERFACE_HDAUDIO, NULL, },
210 1.215.2.5 martin { "HD Audio 1.0 + vendor ext", PCI_INTERFACE_HDAUDIO_VND, NULL, },
211 1.215.2.5 martin { NULL, 0, NULL, },
212 1.215.2.5 martin };
213 1.215.2.5 martin
214 1.61 thorpej static const struct pci_class pci_subclass_multimedia[] = {
215 1.65 christos { "video", PCI_SUBCLASS_MULTIMEDIA_VIDEO, NULL, },
216 1.65 christos { "audio", PCI_SUBCLASS_MULTIMEDIA_AUDIO, NULL, },
217 1.65 christos { "telephony", PCI_SUBCLASS_MULTIMEDIA_TELEPHONY, NULL,},
218 1.215.2.5 martin { "mixed mode", PCI_SUBCLASS_MULTIMEDIA_HDAUDIO,
219 1.215.2.5 martin pci_interface_hda, },
220 1.65 christos { "miscellaneous", PCI_SUBCLASS_MULTIMEDIA_MISC, NULL, },
221 1.65 christos { NULL, 0, NULL, },
222 1.10 cgd };
223 1.10 cgd
224 1.117 msaitoh /*
225 1.117 msaitoh * Class 0x05.
226 1.117 msaitoh * Memory controller.
227 1.117 msaitoh */
228 1.61 thorpej static const struct pci_class pci_subclass_memory[] = {
229 1.65 christos { "RAM", PCI_SUBCLASS_MEMORY_RAM, NULL, },
230 1.65 christos { "flash", PCI_SUBCLASS_MEMORY_FLASH, NULL, },
231 1.65 christos { "miscellaneous", PCI_SUBCLASS_MEMORY_MISC, NULL, },
232 1.65 christos { NULL, 0, NULL, },
233 1.10 cgd };
234 1.10 cgd
235 1.117 msaitoh /*
236 1.117 msaitoh * Class 0x06.
237 1.117 msaitoh * Bridge device.
238 1.117 msaitoh */
239 1.117 msaitoh
240 1.117 msaitoh /* PCI bridge programming interface */
241 1.117 msaitoh static const struct pci_class pci_interface_pcibridge[] = {
242 1.215.2.1 martin { "", PCI_INTERFACE_BRIDGE_PCI_PCI, NULL, },
243 1.117 msaitoh { "subtractive decode", PCI_INTERFACE_BRIDGE_PCI_SUBDEC, NULL, },
244 1.117 msaitoh { NULL, 0, NULL, },
245 1.117 msaitoh };
246 1.117 msaitoh
247 1.128 msaitoh /* Semi-transparent PCI-to-PCI bridge programming interface */
248 1.117 msaitoh static const struct pci_class pci_interface_stpci[] = {
249 1.117 msaitoh { "primary side facing host", PCI_INTERFACE_STPCI_PRIMARY, NULL, },
250 1.117 msaitoh { "secondary side facing host", PCI_INTERFACE_STPCI_SECONDARY, NULL, },
251 1.117 msaitoh { NULL, 0, NULL, },
252 1.117 msaitoh };
253 1.117 msaitoh
254 1.128 msaitoh /* Advanced Switching programming interface */
255 1.128 msaitoh static const struct pci_class pci_interface_advsw[] = {
256 1.215.2.1 martin { "custom interface", PCI_INTERFACE_ADVSW_CUSTOM, NULL, },
257 1.215.2.1 martin { "ASI-SIG", PCI_INTERFACE_ADVSW_ASISIG, NULL, },
258 1.128 msaitoh { NULL, 0, NULL, },
259 1.128 msaitoh };
260 1.128 msaitoh
261 1.117 msaitoh /* Subclasses */
262 1.61 thorpej static const struct pci_class pci_subclass_bridge[] = {
263 1.65 christos { "host", PCI_SUBCLASS_BRIDGE_HOST, NULL, },
264 1.65 christos { "ISA", PCI_SUBCLASS_BRIDGE_ISA, NULL, },
265 1.65 christos { "EISA", PCI_SUBCLASS_BRIDGE_EISA, NULL, },
266 1.65 christos { "MicroChannel", PCI_SUBCLASS_BRIDGE_MC, NULL, },
267 1.117 msaitoh { "PCI", PCI_SUBCLASS_BRIDGE_PCI,
268 1.117 msaitoh pci_interface_pcibridge, },
269 1.65 christos { "PCMCIA", PCI_SUBCLASS_BRIDGE_PCMCIA, NULL, },
270 1.65 christos { "NuBus", PCI_SUBCLASS_BRIDGE_NUBUS, NULL, },
271 1.65 christos { "CardBus", PCI_SUBCLASS_BRIDGE_CARDBUS, NULL, },
272 1.65 christos { "RACEway", PCI_SUBCLASS_BRIDGE_RACEWAY, NULL, },
273 1.117 msaitoh { "Semi-transparent PCI", PCI_SUBCLASS_BRIDGE_STPCI,
274 1.117 msaitoh pci_interface_stpci, },
275 1.65 christos { "InfiniBand", PCI_SUBCLASS_BRIDGE_INFINIBAND, NULL, },
276 1.128 msaitoh { "advanced switching", PCI_SUBCLASS_BRIDGE_ADVSW,
277 1.128 msaitoh pci_interface_advsw, },
278 1.65 christos { "miscellaneous", PCI_SUBCLASS_BRIDGE_MISC, NULL, },
279 1.65 christos { NULL, 0, NULL, },
280 1.10 cgd };
281 1.10 cgd
282 1.117 msaitoh /*
283 1.117 msaitoh * Class 0x07.
284 1.117 msaitoh * Simple communications controller.
285 1.117 msaitoh */
286 1.117 msaitoh
287 1.117 msaitoh /* Serial controller programming interface */
288 1.117 msaitoh static const struct pci_class pci_interface_serial[] = {
289 1.129 msaitoh { "generic XT-compat", PCI_INTERFACE_SERIAL_XT, NULL, },
290 1.117 msaitoh { "16450-compat", PCI_INTERFACE_SERIAL_16450, NULL, },
291 1.117 msaitoh { "16550-compat", PCI_INTERFACE_SERIAL_16550, NULL, },
292 1.117 msaitoh { "16650-compat", PCI_INTERFACE_SERIAL_16650, NULL, },
293 1.117 msaitoh { "16750-compat", PCI_INTERFACE_SERIAL_16750, NULL, },
294 1.117 msaitoh { "16850-compat", PCI_INTERFACE_SERIAL_16850, NULL, },
295 1.117 msaitoh { "16950-compat", PCI_INTERFACE_SERIAL_16950, NULL, },
296 1.117 msaitoh { NULL, 0, NULL, },
297 1.117 msaitoh };
298 1.117 msaitoh
299 1.117 msaitoh /* Parallel controller programming interface */
300 1.117 msaitoh static const struct pci_class pci_interface_parallel[] = {
301 1.117 msaitoh { "", PCI_INTERFACE_PARALLEL, NULL,},
302 1.117 msaitoh { "bi-directional", PCI_INTERFACE_PARALLEL_BIDIRECTIONAL, NULL,},
303 1.117 msaitoh { "ECP 1.X-compat", PCI_INTERFACE_PARALLEL_ECP1X, NULL,},
304 1.128 msaitoh { "IEEE1284 controller", PCI_INTERFACE_PARALLEL_IEEE1284_CNTRL, NULL,},
305 1.128 msaitoh { "IEEE1284 target", PCI_INTERFACE_PARALLEL_IEEE1284_TGT, NULL,},
306 1.117 msaitoh { NULL, 0, NULL,},
307 1.117 msaitoh };
308 1.117 msaitoh
309 1.117 msaitoh /* Modem programming interface */
310 1.117 msaitoh static const struct pci_class pci_interface_modem[] = {
311 1.117 msaitoh { "", PCI_INTERFACE_MODEM, NULL,},
312 1.117 msaitoh { "Hayes&16450-compat", PCI_INTERFACE_MODEM_HAYES16450, NULL,},
313 1.117 msaitoh { "Hayes&16550-compat", PCI_INTERFACE_MODEM_HAYES16550, NULL,},
314 1.117 msaitoh { "Hayes&16650-compat", PCI_INTERFACE_MODEM_HAYES16650, NULL,},
315 1.117 msaitoh { "Hayes&16750-compat", PCI_INTERFACE_MODEM_HAYES16750, NULL,},
316 1.117 msaitoh { NULL, 0, NULL,},
317 1.117 msaitoh };
318 1.117 msaitoh
319 1.117 msaitoh /* Subclasses */
320 1.61 thorpej static const struct pci_class pci_subclass_communications[] = {
321 1.117 msaitoh { "serial", PCI_SUBCLASS_COMMUNICATIONS_SERIAL,
322 1.117 msaitoh pci_interface_serial, },
323 1.117 msaitoh { "parallel", PCI_SUBCLASS_COMMUNICATIONS_PARALLEL,
324 1.117 msaitoh pci_interface_parallel, },
325 1.115 msaitoh { "multi-port serial", PCI_SUBCLASS_COMMUNICATIONS_MPSERIAL, NULL,},
326 1.117 msaitoh { "modem", PCI_SUBCLASS_COMMUNICATIONS_MODEM,
327 1.117 msaitoh pci_interface_modem, },
328 1.115 msaitoh { "GPIB", PCI_SUBCLASS_COMMUNICATIONS_GPIB, NULL,},
329 1.115 msaitoh { "smartcard", PCI_SUBCLASS_COMMUNICATIONS_SMARTCARD, NULL,},
330 1.115 msaitoh { "miscellaneous", PCI_SUBCLASS_COMMUNICATIONS_MISC, NULL,},
331 1.115 msaitoh { NULL, 0, NULL,},
332 1.20 cgd };
333 1.20 cgd
334 1.117 msaitoh /*
335 1.117 msaitoh * Class 0x08.
336 1.117 msaitoh * Base system peripheral.
337 1.215.2.1 martin */
338 1.117 msaitoh
339 1.117 msaitoh /* PIC programming interface */
340 1.117 msaitoh static const struct pci_class pci_interface_pic[] = {
341 1.129 msaitoh { "generic 8259", PCI_INTERFACE_PIC_8259, NULL, },
342 1.117 msaitoh { "ISA PIC", PCI_INTERFACE_PIC_ISA, NULL, },
343 1.117 msaitoh { "EISA PIC", PCI_INTERFACE_PIC_EISA, NULL, },
344 1.117 msaitoh { "IO APIC", PCI_INTERFACE_PIC_IOAPIC, NULL, },
345 1.117 msaitoh { "IO(x) APIC", PCI_INTERFACE_PIC_IOXAPIC, NULL, },
346 1.117 msaitoh { NULL, 0, NULL, },
347 1.117 msaitoh };
348 1.117 msaitoh
349 1.117 msaitoh /* DMA programming interface */
350 1.117 msaitoh static const struct pci_class pci_interface_dma[] = {
351 1.129 msaitoh { "generic 8237", PCI_INTERFACE_DMA_8237, NULL, },
352 1.117 msaitoh { "ISA", PCI_INTERFACE_DMA_ISA, NULL, },
353 1.117 msaitoh { "EISA", PCI_INTERFACE_DMA_EISA, NULL, },
354 1.117 msaitoh { NULL, 0, NULL, },
355 1.117 msaitoh };
356 1.117 msaitoh
357 1.117 msaitoh /* Timer programming interface */
358 1.117 msaitoh static const struct pci_class pci_interface_tmr[] = {
359 1.129 msaitoh { "generic 8254", PCI_INTERFACE_TIMER_8254, NULL, },
360 1.117 msaitoh { "ISA", PCI_INTERFACE_TIMER_ISA, NULL, },
361 1.117 msaitoh { "EISA", PCI_INTERFACE_TIMER_EISA, NULL, },
362 1.128 msaitoh { "HPET", PCI_INTERFACE_TIMER_HPET, NULL, },
363 1.117 msaitoh { NULL, 0, NULL, },
364 1.117 msaitoh };
365 1.117 msaitoh
366 1.117 msaitoh /* RTC programming interface */
367 1.117 msaitoh static const struct pci_class pci_interface_rtc[] = {
368 1.117 msaitoh { "generic", PCI_INTERFACE_RTC_GENERIC, NULL, },
369 1.117 msaitoh { "ISA", PCI_INTERFACE_RTC_ISA, NULL, },
370 1.117 msaitoh { NULL, 0, NULL, },
371 1.117 msaitoh };
372 1.117 msaitoh
373 1.117 msaitoh /* Subclasses */
374 1.61 thorpej static const struct pci_class pci_subclass_system[] = {
375 1.117 msaitoh { "interrupt", PCI_SUBCLASS_SYSTEM_PIC, pci_interface_pic,},
376 1.117 msaitoh { "DMA", PCI_SUBCLASS_SYSTEM_DMA, pci_interface_dma,},
377 1.117 msaitoh { "timer", PCI_SUBCLASS_SYSTEM_TIMER, pci_interface_tmr,},
378 1.117 msaitoh { "RTC", PCI_SUBCLASS_SYSTEM_RTC, pci_interface_rtc,},
379 1.65 christos { "PCI Hot-Plug", PCI_SUBCLASS_SYSTEM_PCIHOTPLUG, NULL, },
380 1.65 christos { "SD Host Controller", PCI_SUBCLASS_SYSTEM_SDHC, NULL, },
381 1.124 msaitoh { "IOMMU", PCI_SUBCLASS_SYSTEM_IOMMU, NULL, },
382 1.124 msaitoh { "Root Complex Event Collector", PCI_SUBCLASS_SYSTEM_RCEC, NULL, },
383 1.65 christos { "miscellaneous", PCI_SUBCLASS_SYSTEM_MISC, NULL, },
384 1.65 christos { NULL, 0, NULL, },
385 1.20 cgd };
386 1.20 cgd
387 1.117 msaitoh /*
388 1.117 msaitoh * Class 0x09.
389 1.117 msaitoh * Input device.
390 1.117 msaitoh */
391 1.117 msaitoh
392 1.117 msaitoh /* Gameport programming interface */
393 1.117 msaitoh static const struct pci_class pci_interface_game[] = {
394 1.117 msaitoh { "generic", PCI_INTERFACE_GAMEPORT_GENERIC, NULL, },
395 1.117 msaitoh { "legacy", PCI_INTERFACE_GAMEPORT_LEGACY, NULL, },
396 1.117 msaitoh { NULL, 0, NULL, },
397 1.117 msaitoh };
398 1.117 msaitoh
399 1.117 msaitoh /* Subclasses */
400 1.61 thorpej static const struct pci_class pci_subclass_input[] = {
401 1.65 christos { "keyboard", PCI_SUBCLASS_INPUT_KEYBOARD, NULL, },
402 1.65 christos { "digitizer", PCI_SUBCLASS_INPUT_DIGITIZER, NULL, },
403 1.65 christos { "mouse", PCI_SUBCLASS_INPUT_MOUSE, NULL, },
404 1.65 christos { "scanner", PCI_SUBCLASS_INPUT_SCANNER, NULL, },
405 1.117 msaitoh { "game port", PCI_SUBCLASS_INPUT_GAMEPORT,
406 1.117 msaitoh pci_interface_game, },
407 1.65 christos { "miscellaneous", PCI_SUBCLASS_INPUT_MISC, NULL, },
408 1.65 christos { NULL, 0, NULL, },
409 1.20 cgd };
410 1.20 cgd
411 1.117 msaitoh /*
412 1.117 msaitoh * Class 0x0a.
413 1.117 msaitoh * Docking station.
414 1.117 msaitoh */
415 1.61 thorpej static const struct pci_class pci_subclass_dock[] = {
416 1.65 christos { "generic", PCI_SUBCLASS_DOCK_GENERIC, NULL, },
417 1.65 christos { "miscellaneous", PCI_SUBCLASS_DOCK_MISC, NULL, },
418 1.65 christos { NULL, 0, NULL, },
419 1.20 cgd };
420 1.20 cgd
421 1.117 msaitoh /*
422 1.117 msaitoh * Class 0x0b.
423 1.117 msaitoh * Processor.
424 1.117 msaitoh */
425 1.61 thorpej static const struct pci_class pci_subclass_processor[] = {
426 1.65 christos { "386", PCI_SUBCLASS_PROCESSOR_386, NULL, },
427 1.65 christos { "486", PCI_SUBCLASS_PROCESSOR_486, NULL, },
428 1.65 christos { "Pentium", PCI_SUBCLASS_PROCESSOR_PENTIUM, NULL, },
429 1.65 christos { "Alpha", PCI_SUBCLASS_PROCESSOR_ALPHA, NULL, },
430 1.65 christos { "PowerPC", PCI_SUBCLASS_PROCESSOR_POWERPC, NULL, },
431 1.65 christos { "MIPS", PCI_SUBCLASS_PROCESSOR_MIPS, NULL, },
432 1.65 christos { "Co-processor", PCI_SUBCLASS_PROCESSOR_COPROC, NULL, },
433 1.128 msaitoh { "miscellaneous", PCI_SUBCLASS_PROCESSOR_MISC, NULL, },
434 1.65 christos { NULL, 0, NULL, },
435 1.20 cgd };
436 1.20 cgd
437 1.117 msaitoh /*
438 1.117 msaitoh * Class 0x0c.
439 1.117 msaitoh * Serial bus controller.
440 1.117 msaitoh */
441 1.117 msaitoh
442 1.117 msaitoh /* IEEE1394 programming interface */
443 1.117 msaitoh static const struct pci_class pci_interface_ieee1394[] = {
444 1.117 msaitoh { "Firewire", PCI_INTERFACE_IEEE1394_FIREWIRE, NULL,},
445 1.117 msaitoh { "OpenHCI", PCI_INTERFACE_IEEE1394_OPENHCI, NULL,},
446 1.117 msaitoh { NULL, 0, NULL,},
447 1.117 msaitoh };
448 1.117 msaitoh
449 1.117 msaitoh /* USB programming interface */
450 1.117 msaitoh static const struct pci_class pci_interface_usb[] = {
451 1.117 msaitoh { "UHCI", PCI_INTERFACE_USB_UHCI, NULL, },
452 1.117 msaitoh { "OHCI", PCI_INTERFACE_USB_OHCI, NULL, },
453 1.117 msaitoh { "EHCI", PCI_INTERFACE_USB_EHCI, NULL, },
454 1.117 msaitoh { "xHCI", PCI_INTERFACE_USB_XHCI, NULL, },
455 1.215.2.5 martin { "USB4 HCI", PCI_INTERFACE_USB_USB4HCI, NULL, },
456 1.117 msaitoh { "other HC", PCI_INTERFACE_USB_OTHERHC, NULL, },
457 1.117 msaitoh { "device", PCI_INTERFACE_USB_DEVICE, NULL, },
458 1.117 msaitoh { NULL, 0, NULL, },
459 1.117 msaitoh };
460 1.117 msaitoh
461 1.117 msaitoh /* IPMI programming interface */
462 1.117 msaitoh static const struct pci_class pci_interface_ipmi[] = {
463 1.215.2.1 martin { "SMIC", PCI_INTERFACE_IPMI_SMIC, NULL, },
464 1.215.2.1 martin { "keyboard", PCI_INTERFACE_IPMI_KBD, NULL, },
465 1.215.2.1 martin { "block transfer", PCI_INTERFACE_IPMI_BLOCKXFER, NULL, },
466 1.215.2.1 martin { NULL, 0, NULL, },
467 1.117 msaitoh };
468 1.117 msaitoh
469 1.117 msaitoh /* Subclasses */
470 1.61 thorpej static const struct pci_class pci_subclass_serialbus[] = {
471 1.117 msaitoh { "IEEE1394", PCI_SUBCLASS_SERIALBUS_FIREWIRE,
472 1.117 msaitoh pci_interface_ieee1394, },
473 1.65 christos { "ACCESS.bus", PCI_SUBCLASS_SERIALBUS_ACCESS, NULL, },
474 1.65 christos { "SSA", PCI_SUBCLASS_SERIALBUS_SSA, NULL, },
475 1.117 msaitoh { "USB", PCI_SUBCLASS_SERIALBUS_USB,
476 1.117 msaitoh pci_interface_usb, },
477 1.32 cgd /* XXX Fiber Channel/_FIBRECHANNEL */
478 1.65 christos { "Fiber Channel", PCI_SUBCLASS_SERIALBUS_FIBER, NULL, },
479 1.65 christos { "SMBus", PCI_SUBCLASS_SERIALBUS_SMBUS, NULL, },
480 1.65 christos { "InfiniBand", PCI_SUBCLASS_SERIALBUS_INFINIBAND, NULL,},
481 1.117 msaitoh { "IPMI", PCI_SUBCLASS_SERIALBUS_IPMI,
482 1.117 msaitoh pci_interface_ipmi, },
483 1.65 christos { "SERCOS", PCI_SUBCLASS_SERIALBUS_SERCOS, NULL, },
484 1.65 christos { "CANbus", PCI_SUBCLASS_SERIALBUS_CANBUS, NULL, },
485 1.215.2.5 martin { "MIPI I3C", PCI_SUBCLASS_SERIALBUS_MIPI_I3C, NULL, },
486 1.114 msaitoh { "miscellaneous", PCI_SUBCLASS_SERIALBUS_MISC, NULL, },
487 1.65 christos { NULL, 0, NULL, },
488 1.32 cgd };
489 1.32 cgd
490 1.117 msaitoh /*
491 1.117 msaitoh * Class 0x0d.
492 1.117 msaitoh * Wireless Controller.
493 1.117 msaitoh */
494 1.61 thorpej static const struct pci_class pci_subclass_wireless[] = {
495 1.65 christos { "IrDA", PCI_SUBCLASS_WIRELESS_IRDA, NULL, },
496 1.128 msaitoh { "Consumer IR",/*XXX*/ PCI_SUBCLASS_WIRELESS_CONSUMERIR, NULL, },
497 1.65 christos { "RF", PCI_SUBCLASS_WIRELESS_RF, NULL, },
498 1.65 christos { "bluetooth", PCI_SUBCLASS_WIRELESS_BLUETOOTH, NULL, },
499 1.65 christos { "broadband", PCI_SUBCLASS_WIRELESS_BROADBAND, NULL, },
500 1.65 christos { "802.11a (5 GHz)", PCI_SUBCLASS_WIRELESS_802_11A, NULL, },
501 1.65 christos { "802.11b (2.4 GHz)", PCI_SUBCLASS_WIRELESS_802_11B, NULL, },
502 1.215.2.5 martin { "Cellular", PCI_SUBCLASS_WIRELESS_CELL, NULL, },
503 1.215.2.5 martin { "Cellular + Ethernet", PCI_SUBCLASS_WIRELESS_CELL_E, NULL, },
504 1.65 christos { "miscellaneous", PCI_SUBCLASS_WIRELESS_MISC, NULL, },
505 1.65 christos { NULL, 0, NULL, },
506 1.32 cgd };
507 1.32 cgd
508 1.117 msaitoh /*
509 1.117 msaitoh * Class 0x0e.
510 1.117 msaitoh * Intelligent IO controller.
511 1.117 msaitoh */
512 1.117 msaitoh
513 1.117 msaitoh /* Intelligent IO programming interface */
514 1.117 msaitoh static const struct pci_class pci_interface_i2o[] = {
515 1.215.2.1 martin { "FIFO at offset 0x40", PCI_INTERFACE_I2O_FIFOAT40, NULL, },
516 1.215.2.1 martin { NULL, 0, NULL, },
517 1.117 msaitoh };
518 1.117 msaitoh
519 1.117 msaitoh /* Subclasses */
520 1.61 thorpej static const struct pci_class pci_subclass_i2o[] = {
521 1.117 msaitoh { "standard", PCI_SUBCLASS_I2O_STANDARD, pci_interface_i2o,},
522 1.114 msaitoh { "miscellaneous", PCI_SUBCLASS_I2O_MISC, NULL, },
523 1.65 christos { NULL, 0, NULL, },
524 1.32 cgd };
525 1.32 cgd
526 1.117 msaitoh /*
527 1.117 msaitoh * Class 0x0f.
528 1.117 msaitoh * Satellite communication controller.
529 1.117 msaitoh */
530 1.61 thorpej static const struct pci_class pci_subclass_satcom[] = {
531 1.215.2.1 martin { "TV", PCI_SUBCLASS_SATCOM_TV, NULL, },
532 1.215.2.1 martin { "audio", PCI_SUBCLASS_SATCOM_AUDIO, NULL, },
533 1.215.2.1 martin { "voice", PCI_SUBCLASS_SATCOM_VOICE, NULL, },
534 1.65 christos { "data", PCI_SUBCLASS_SATCOM_DATA, NULL, },
535 1.114 msaitoh { "miscellaneous", PCI_SUBCLASS_SATCOM_MISC, NULL, },
536 1.65 christos { NULL, 0, NULL, },
537 1.32 cgd };
538 1.32 cgd
539 1.117 msaitoh /*
540 1.117 msaitoh * Class 0x10.
541 1.117 msaitoh * Encryption/Decryption controller.
542 1.117 msaitoh */
543 1.61 thorpej static const struct pci_class pci_subclass_crypto[] = {
544 1.215.2.1 martin { "network/computing", PCI_SUBCLASS_CRYPTO_NETCOMP, NULL, },
545 1.65 christos { "entertainment", PCI_SUBCLASS_CRYPTO_ENTERTAINMENT, NULL,},
546 1.215.2.1 martin { "miscellaneous", PCI_SUBCLASS_CRYPTO_MISC, NULL, },
547 1.65 christos { NULL, 0, NULL, },
548 1.32 cgd };
549 1.32 cgd
550 1.117 msaitoh /*
551 1.117 msaitoh * Class 0x11.
552 1.117 msaitoh * Data aquuisition and signal processing controller.
553 1.117 msaitoh */
554 1.61 thorpej static const struct pci_class pci_subclass_dasp[] = {
555 1.65 christos { "DPIO", PCI_SUBCLASS_DASP_DPIO, NULL, },
556 1.128 msaitoh { "performance counters", PCI_SUBCLASS_DASP_TIMEFREQ, NULL, },
557 1.65 christos { "synchronization", PCI_SUBCLASS_DASP_SYNC, NULL, },
558 1.65 christos { "management", PCI_SUBCLASS_DASP_MGMT, NULL, },
559 1.65 christos { "miscellaneous", PCI_SUBCLASS_DASP_MISC, NULL, },
560 1.65 christos { NULL, 0, NULL, },
561 1.20 cgd };
562 1.20 cgd
563 1.117 msaitoh /* List of classes */
564 1.163 msaitoh static const struct pci_class pci_classes[] = {
565 1.10 cgd { "prehistoric", PCI_CLASS_PREHISTORIC,
566 1.10 cgd pci_subclass_prehistoric, },
567 1.10 cgd { "mass storage", PCI_CLASS_MASS_STORAGE,
568 1.10 cgd pci_subclass_mass_storage, },
569 1.10 cgd { "network", PCI_CLASS_NETWORK,
570 1.10 cgd pci_subclass_network, },
571 1.10 cgd { "display", PCI_CLASS_DISPLAY,
572 1.11 cgd pci_subclass_display, },
573 1.10 cgd { "multimedia", PCI_CLASS_MULTIMEDIA,
574 1.10 cgd pci_subclass_multimedia, },
575 1.10 cgd { "memory", PCI_CLASS_MEMORY,
576 1.10 cgd pci_subclass_memory, },
577 1.10 cgd { "bridge", PCI_CLASS_BRIDGE,
578 1.10 cgd pci_subclass_bridge, },
579 1.20 cgd { "communications", PCI_CLASS_COMMUNICATIONS,
580 1.20 cgd pci_subclass_communications, },
581 1.20 cgd { "system", PCI_CLASS_SYSTEM,
582 1.20 cgd pci_subclass_system, },
583 1.20 cgd { "input", PCI_CLASS_INPUT,
584 1.20 cgd pci_subclass_input, },
585 1.20 cgd { "dock", PCI_CLASS_DOCK,
586 1.20 cgd pci_subclass_dock, },
587 1.20 cgd { "processor", PCI_CLASS_PROCESSOR,
588 1.20 cgd pci_subclass_processor, },
589 1.20 cgd { "serial bus", PCI_CLASS_SERIALBUS,
590 1.20 cgd pci_subclass_serialbus, },
591 1.32 cgd { "wireless", PCI_CLASS_WIRELESS,
592 1.32 cgd pci_subclass_wireless, },
593 1.32 cgd { "I2O", PCI_CLASS_I2O,
594 1.32 cgd pci_subclass_i2o, },
595 1.32 cgd { "satellite comm", PCI_CLASS_SATCOM,
596 1.32 cgd pci_subclass_satcom, },
597 1.32 cgd { "crypto", PCI_CLASS_CRYPTO,
598 1.32 cgd pci_subclass_crypto, },
599 1.32 cgd { "DASP", PCI_CLASS_DASP,
600 1.32 cgd pci_subclass_dasp, },
601 1.164 msaitoh { "processing accelerators", PCI_CLASS_ACCEL,
602 1.164 msaitoh NULL, },
603 1.164 msaitoh { "non-essential instrumentation", PCI_CLASS_INSTRUMENT,
604 1.164 msaitoh NULL, },
605 1.10 cgd { "undefined", PCI_CLASS_UNDEFINED,
606 1.65 christos NULL, },
607 1.65 christos { NULL, 0,
608 1.65 christos NULL, },
609 1.10 cgd };
610 1.10 cgd
611 1.126 christos DEV_VERBOSE_DEFINE(pci);
612 1.10 cgd
613 1.155 pgoyette /*
614 1.155 pgoyette * Append a formatted string to dest without writing more than len
615 1.155 pgoyette * characters (including the trailing NUL character). dest and len
616 1.155 pgoyette * are updated for use in subsequent calls to snappendf().
617 1.155 pgoyette *
618 1.155 pgoyette * Returns 0 on success, a negative value if vnsprintf() fails, or
619 1.155 pgoyette * a positive value if the dest buffer would have overflowed.
620 1.155 pgoyette */
621 1.155 pgoyette
622 1.215.2.1 martin static int __printflike(3, 4)
623 1.155 pgoyette snappendf(char **dest, size_t *len, const char * restrict fmt, ...)
624 1.155 pgoyette {
625 1.155 pgoyette va_list ap;
626 1.155 pgoyette int count;
627 1.155 pgoyette
628 1.155 pgoyette va_start(ap, fmt);
629 1.155 pgoyette count = vsnprintf(*dest, *len, fmt, ap);
630 1.155 pgoyette va_end(ap);
631 1.155 pgoyette
632 1.155 pgoyette /* Let vsnprintf() errors bubble up to caller */
633 1.155 pgoyette if (count < 0 || *len == 0)
634 1.155 pgoyette return count;
635 1.155 pgoyette
636 1.155 pgoyette /* Handle overflow */
637 1.155 pgoyette if ((size_t)count >= *len) {
638 1.155 pgoyette *dest += *len - 1;
639 1.155 pgoyette *len = 1;
640 1.155 pgoyette return 1;
641 1.155 pgoyette }
642 1.155 pgoyette
643 1.155 pgoyette /* Update dest & len to point at trailing NUL */
644 1.155 pgoyette *dest += count;
645 1.155 pgoyette *len -= count;
646 1.215.2.1 martin
647 1.155 pgoyette return 0;
648 1.155 pgoyette }
649 1.155 pgoyette
650 1.10 cgd void
651 1.58 itojun pci_devinfo(pcireg_t id_reg, pcireg_t class_reg, int showclass, char *cp,
652 1.58 itojun size_t l)
653 1.10 cgd {
654 1.163 msaitoh pci_class_t class;
655 1.10 cgd pci_subclass_t subclass;
656 1.10 cgd pci_interface_t interface;
657 1.10 cgd pci_revision_t revision;
658 1.126 christos char vendor[PCI_VENDORSTR_LEN], product[PCI_PRODUCTSTR_LEN];
659 1.117 msaitoh const struct pci_class *classp, *subclassp, *interfacep;
660 1.10 cgd
661 1.163 msaitoh class = PCI_CLASS(class_reg);
662 1.10 cgd subclass = PCI_SUBCLASS(class_reg);
663 1.10 cgd interface = PCI_INTERFACE(class_reg);
664 1.10 cgd revision = PCI_REVISION(class_reg);
665 1.10 cgd
666 1.126 christos pci_findvendor(vendor, sizeof(vendor), PCI_VENDOR(id_reg));
667 1.126 christos pci_findproduct(product, sizeof(product), PCI_VENDOR(id_reg),
668 1.126 christos PCI_PRODUCT(id_reg));
669 1.10 cgd
670 1.163 msaitoh classp = pci_classes;
671 1.10 cgd while (classp->name != NULL) {
672 1.163 msaitoh if (class == classp->val)
673 1.10 cgd break;
674 1.10 cgd classp++;
675 1.10 cgd }
676 1.10 cgd
677 1.10 cgd subclassp = (classp->name != NULL) ? classp->subclasses : NULL;
678 1.10 cgd while (subclassp && subclassp->name != NULL) {
679 1.10 cgd if (subclass == subclassp->val)
680 1.10 cgd break;
681 1.10 cgd subclassp++;
682 1.10 cgd }
683 1.10 cgd
684 1.119 njoly interfacep = (subclassp && subclassp->name != NULL) ?
685 1.119 njoly subclassp->subclasses : NULL;
686 1.117 msaitoh while (interfacep && interfacep->name != NULL) {
687 1.117 msaitoh if (interface == interfacep->val)
688 1.117 msaitoh break;
689 1.117 msaitoh interfacep++;
690 1.117 msaitoh }
691 1.117 msaitoh
692 1.155 pgoyette (void)snappendf(&cp, &l, "%s %s", vendor, product);
693 1.13 cgd if (showclass) {
694 1.155 pgoyette (void)snappendf(&cp, &l, " (");
695 1.13 cgd if (classp->name == NULL)
696 1.155 pgoyette (void)snappendf(&cp, &l,
697 1.155 pgoyette "class 0x%02x, subclass 0x%02x",
698 1.163 msaitoh class, subclass);
699 1.13 cgd else {
700 1.13 cgd if (subclassp == NULL || subclassp->name == NULL)
701 1.155 pgoyette (void)snappendf(&cp, &l,
702 1.78 drochner "%s, subclass 0x%02x",
703 1.20 cgd classp->name, subclass);
704 1.13 cgd else
705 1.155 pgoyette (void)snappendf(&cp, &l, "%s %s",
706 1.20 cgd subclassp->name, classp->name);
707 1.13 cgd }
708 1.117 msaitoh if ((interfacep == NULL) || (interfacep->name == NULL)) {
709 1.117 msaitoh if (interface != 0)
710 1.155 pgoyette (void)snappendf(&cp, &l, ", interface 0x%02x",
711 1.155 pgoyette interface);
712 1.117 msaitoh } else if (strncmp(interfacep->name, "", 1) != 0)
713 1.155 pgoyette (void)snappendf(&cp, &l, ", %s", interfacep->name);
714 1.20 cgd if (revision != 0)
715 1.155 pgoyette (void)snappendf(&cp, &l, ", revision 0x%02x", revision);
716 1.155 pgoyette (void)snappendf(&cp, &l, ")");
717 1.13 cgd }
718 1.22 thorpej }
719 1.22 thorpej
720 1.89 drochner #ifdef _KERNEL
721 1.89 drochner void
722 1.90 drochner pci_aprint_devinfo_fancy(const struct pci_attach_args *pa, const char *naive,
723 1.90 drochner const char *known, int addrev)
724 1.89 drochner {
725 1.89 drochner char devinfo[256];
726 1.89 drochner
727 1.90 drochner if (known) {
728 1.90 drochner aprint_normal(": %s", known);
729 1.90 drochner if (addrev)
730 1.90 drochner aprint_normal(" (rev. 0x%02x)",
731 1.90 drochner PCI_REVISION(pa->pa_class));
732 1.90 drochner aprint_normal("\n");
733 1.90 drochner } else {
734 1.90 drochner pci_devinfo(pa->pa_id, pa->pa_class, 0,
735 1.90 drochner devinfo, sizeof(devinfo));
736 1.90 drochner aprint_normal(": %s (rev. 0x%02x)\n", devinfo,
737 1.90 drochner PCI_REVISION(pa->pa_class));
738 1.90 drochner }
739 1.90 drochner if (naive)
740 1.90 drochner aprint_naive(": %s\n", naive);
741 1.90 drochner else
742 1.90 drochner aprint_naive("\n");
743 1.89 drochner }
744 1.89 drochner #endif
745 1.89 drochner
746 1.22 thorpej /*
747 1.22 thorpej * Print out most of the PCI configuration registers. Typically used
748 1.22 thorpej * in a device attach routine like this:
749 1.22 thorpej *
750 1.22 thorpej * #ifdef MYDEV_DEBUG
751 1.95 chs * printf("%s: ", device_xname(sc->sc_dev));
752 1.43 enami * pci_conf_print(pa->pa_pc, pa->pa_tag, NULL);
753 1.22 thorpej * #endif
754 1.22 thorpej */
755 1.26 cgd
756 1.26 cgd #define i2o(i) ((i) * 4)
757 1.26 cgd #define o2i(o) ((o) / 4)
758 1.112 msaitoh #define onoff2(str, rval, bit, onstr, offstr) \
759 1.112 msaitoh printf(" %s: %s\n", (str), ((rval) & (bit)) ? onstr : offstr);
760 1.112 msaitoh #define onoff(str, rval, bit) onoff2(str, rval, bit, "on", "off")
761 1.26 cgd
762 1.26 cgd static void
763 1.45 thorpej pci_conf_print_common(
764 1.45 thorpej #ifdef _KERNEL
765 1.71 christos pci_chipset_tag_t pc, pcitag_t tag,
766 1.45 thorpej #endif
767 1.45 thorpej const pcireg_t *regs)
768 1.22 thorpej {
769 1.163 msaitoh pci_class_t class;
770 1.163 msaitoh pci_subclass_t subclass;
771 1.163 msaitoh pci_interface_t interface;
772 1.163 msaitoh pci_revision_t revision;
773 1.163 msaitoh char vendor[PCI_VENDORSTR_LEN], product[PCI_PRODUCTSTR_LEN];
774 1.165 msaitoh const struct pci_class *classp, *subclassp, *interfacep;
775 1.59 mycroft const char *name;
776 1.26 cgd pcireg_t rval;
777 1.117 msaitoh unsigned int num;
778 1.22 thorpej
779 1.163 msaitoh rval = regs[o2i(PCI_CLASS_REG)];
780 1.163 msaitoh class = PCI_CLASS(rval);
781 1.163 msaitoh subclass = PCI_SUBCLASS(rval);
782 1.163 msaitoh interface = PCI_INTERFACE(rval);
783 1.163 msaitoh revision = PCI_REVISION(rval);
784 1.163 msaitoh
785 1.26 cgd rval = regs[o2i(PCI_ID_REG)];
786 1.126 christos name = pci_findvendor(vendor, sizeof(vendor), PCI_VENDOR(rval));
787 1.59 mycroft if (name)
788 1.59 mycroft printf(" Vendor Name: %s (0x%04x)\n", name,
789 1.26 cgd PCI_VENDOR(rval));
790 1.22 thorpej else
791 1.26 cgd printf(" Vendor ID: 0x%04x\n", PCI_VENDOR(rval));
792 1.126 christos name = pci_findproduct(product, sizeof(product), PCI_VENDOR(rval),
793 1.126 christos PCI_PRODUCT(rval));
794 1.59 mycroft if (name)
795 1.59 mycroft printf(" Device Name: %s (0x%04x)\n", name,
796 1.26 cgd PCI_PRODUCT(rval));
797 1.22 thorpej else
798 1.26 cgd printf(" Device ID: 0x%04x\n", PCI_PRODUCT(rval));
799 1.22 thorpej
800 1.26 cgd rval = regs[o2i(PCI_COMMAND_STATUS_REG)];
801 1.23 drochner
802 1.26 cgd printf(" Command register: 0x%04x\n", rval & 0xffff);
803 1.112 msaitoh onoff("I/O space accesses", rval, PCI_COMMAND_IO_ENABLE);
804 1.112 msaitoh onoff("Memory space accesses", rval, PCI_COMMAND_MEM_ENABLE);
805 1.112 msaitoh onoff("Bus mastering", rval, PCI_COMMAND_MASTER_ENABLE);
806 1.112 msaitoh onoff("Special cycles", rval, PCI_COMMAND_SPECIAL_ENABLE);
807 1.112 msaitoh onoff("MWI transactions", rval, PCI_COMMAND_INVALIDATE_ENABLE);
808 1.112 msaitoh onoff("Palette snooping", rval, PCI_COMMAND_PALETTE_ENABLE);
809 1.112 msaitoh onoff("Parity error checking", rval, PCI_COMMAND_PARITY_ENABLE);
810 1.112 msaitoh onoff("Address/data stepping", rval, PCI_COMMAND_STEPPING_ENABLE);
811 1.112 msaitoh onoff("System error (SERR)", rval, PCI_COMMAND_SERR_ENABLE);
812 1.115 msaitoh onoff("Fast back-to-back transactions", rval,
813 1.115 msaitoh PCI_COMMAND_BACKTOBACK_ENABLE);
814 1.112 msaitoh onoff("Interrupt disable", rval, PCI_COMMAND_INTERRUPT_DISABLE);
815 1.26 cgd
816 1.26 cgd printf(" Status register: 0x%04x\n", (rval >> 16) & 0xffff);
817 1.172 msaitoh onoff("Immediate Readiness", rval, PCI_STATUS_IMMD_READNESS);
818 1.115 msaitoh onoff2("Interrupt status", rval, PCI_STATUS_INT_STATUS, "active",
819 1.115 msaitoh "inactive");
820 1.112 msaitoh onoff("Capability List support", rval, PCI_STATUS_CAPLIST_SUPPORT);
821 1.112 msaitoh onoff("66 MHz capable", rval, PCI_STATUS_66MHZ_SUPPORT);
822 1.115 msaitoh onoff("User Definable Features (UDF) support", rval,
823 1.115 msaitoh PCI_STATUS_UDF_SUPPORT);
824 1.115 msaitoh onoff("Fast back-to-back capable", rval,
825 1.115 msaitoh PCI_STATUS_BACKTOBACK_SUPPORT);
826 1.112 msaitoh onoff("Data parity error detected", rval, PCI_STATUS_PARITY_ERROR);
827 1.22 thorpej
828 1.26 cgd printf(" DEVSEL timing: ");
829 1.22 thorpej switch (rval & PCI_STATUS_DEVSEL_MASK) {
830 1.22 thorpej case PCI_STATUS_DEVSEL_FAST:
831 1.22 thorpej printf("fast");
832 1.22 thorpej break;
833 1.22 thorpej case PCI_STATUS_DEVSEL_MEDIUM:
834 1.22 thorpej printf("medium");
835 1.22 thorpej break;
836 1.22 thorpej case PCI_STATUS_DEVSEL_SLOW:
837 1.22 thorpej printf("slow");
838 1.22 thorpej break;
839 1.26 cgd default:
840 1.26 cgd printf("unknown/reserved"); /* XXX */
841 1.26 cgd break;
842 1.22 thorpej }
843 1.159 msaitoh printf(" (0x%x)\n", __SHIFTOUT(rval, PCI_STATUS_DEVSEL_MASK));
844 1.22 thorpej
845 1.115 msaitoh onoff("Slave signaled Target Abort", rval,
846 1.115 msaitoh PCI_STATUS_TARGET_TARGET_ABORT);
847 1.115 msaitoh onoff("Master received Target Abort", rval,
848 1.115 msaitoh PCI_STATUS_MASTER_TARGET_ABORT);
849 1.112 msaitoh onoff("Master received Master Abort", rval, PCI_STATUS_MASTER_ABORT);
850 1.112 msaitoh onoff("Asserted System Error (SERR)", rval, PCI_STATUS_SPECIAL_ERROR);
851 1.112 msaitoh onoff("Parity error detected", rval, PCI_STATUS_PARITY_DETECT);
852 1.22 thorpej
853 1.26 cgd rval = regs[o2i(PCI_CLASS_REG)];
854 1.163 msaitoh for (classp = pci_classes; classp->name != NULL; classp++) {
855 1.163 msaitoh if (class == classp->val)
856 1.22 thorpej break;
857 1.22 thorpej }
858 1.166 msaitoh
859 1.166 msaitoh /*
860 1.166 msaitoh * ECN: Change Root Complex Event Collector Class Code
861 1.166 msaitoh * Old RCEC has subclass 0x06. It's the same as IOMMU. Read the type
862 1.166 msaitoh * in PCIe extend capability to know whether it's RCEC or IOMMU.
863 1.166 msaitoh */
864 1.166 msaitoh if ((class == PCI_CLASS_SYSTEM)
865 1.166 msaitoh && (subclass == PCI_SUBCLASS_SYSTEM_IOMMU)) {
866 1.166 msaitoh int pcie_capoff;
867 1.166 msaitoh pcireg_t reg;
868 1.166 msaitoh
869 1.199 msaitoh if (pci_conf_find_cap(regs, PCI_CAP_PCIEXPRESS, &pcie_capoff)) {
870 1.166 msaitoh reg = regs[o2i(pcie_capoff + PCIE_XCAP)];
871 1.215.2.5 martin if (PCIE_XCAP_TYPE(reg) == PCIE_XCAP_TYPE_RC_EVNTC)
872 1.166 msaitoh subclass = PCI_SUBCLASS_SYSTEM_RCEC;
873 1.166 msaitoh }
874 1.166 msaitoh }
875 1.22 thorpej subclassp = (classp->name != NULL) ? classp->subclasses : NULL;
876 1.22 thorpej while (subclassp && subclassp->name != NULL) {
877 1.163 msaitoh if (subclass == subclassp->val)
878 1.22 thorpej break;
879 1.22 thorpej subclassp++;
880 1.22 thorpej }
881 1.166 msaitoh
882 1.165 msaitoh interfacep = (subclassp && subclassp->name != NULL) ?
883 1.165 msaitoh subclassp->subclasses : NULL;
884 1.165 msaitoh while (interfacep && interfacep->name != NULL) {
885 1.165 msaitoh if (interface == interfacep->val)
886 1.165 msaitoh break;
887 1.165 msaitoh interfacep++;
888 1.165 msaitoh }
889 1.165 msaitoh
890 1.165 msaitoh if (classp->name != NULL)
891 1.163 msaitoh printf(" Class Name: %s (0x%02x)\n", classp->name, class);
892 1.165 msaitoh else
893 1.163 msaitoh printf(" Class ID: 0x%02x\n", class);
894 1.165 msaitoh if (subclassp != NULL && subclassp->name != NULL)
895 1.165 msaitoh printf(" Subclass Name: %s (0x%02x)\n",
896 1.165 msaitoh subclassp->name, PCI_SUBCLASS(rval));
897 1.165 msaitoh else
898 1.165 msaitoh printf(" Subclass ID: 0x%02x\n", PCI_SUBCLASS(rval));
899 1.165 msaitoh if ((interfacep != NULL) && (interfacep->name != NULL)
900 1.165 msaitoh && (strncmp(interfacep->name, "", 1) != 0))
901 1.165 msaitoh printf(" Interface Name: %s (0x%02x)\n",
902 1.165 msaitoh interfacep->name, interface);
903 1.165 msaitoh else
904 1.165 msaitoh printf(" Interface: 0x%02x\n", interface);
905 1.163 msaitoh printf(" Revision ID: 0x%02x\n", revision);
906 1.22 thorpej
907 1.26 cgd rval = regs[o2i(PCI_BHLC_REG)];
908 1.26 cgd printf(" BIST: 0x%02x\n", PCI_BIST(rval));
909 1.26 cgd printf(" Header Type: 0x%02x%s (0x%02x)\n", PCI_HDRTYPE_TYPE(rval),
910 1.26 cgd PCI_HDRTYPE_MULTIFN(rval) ? "+multifunction" : "",
911 1.26 cgd PCI_HDRTYPE(rval));
912 1.26 cgd printf(" Latency Timer: 0x%02x\n", PCI_LATTIMER(rval));
913 1.117 msaitoh num = PCI_CACHELINE(rval);
914 1.117 msaitoh printf(" Cache Line Size: %ubytes (0x%02x)\n", num * 4, num);
915 1.26 cgd }
916 1.22 thorpej
917 1.37 nathanw static int
918 1.45 thorpej pci_conf_print_bar(
919 1.45 thorpej #ifdef _KERNEL
920 1.45 thorpej pci_chipset_tag_t pc, pcitag_t tag,
921 1.45 thorpej #endif
922 1.167 msaitoh const pcireg_t *regs, int reg, const char *name)
923 1.26 cgd {
924 1.45 thorpej int width;
925 1.45 thorpej pcireg_t rval, rval64h;
926 1.167 msaitoh bool ioen, memen;
927 1.168 msaitoh #ifdef _KERNEL
928 1.167 msaitoh pcireg_t mask, mask64h = 0;
929 1.168 msaitoh #endif
930 1.167 msaitoh
931 1.167 msaitoh rval = regs[o2i(PCI_COMMAND_STATUS_REG)];
932 1.167 msaitoh ioen = rval & PCI_COMMAND_IO_ENABLE;
933 1.167 msaitoh memen = rval & PCI_COMMAND_MEM_ENABLE;
934 1.45 thorpej
935 1.37 nathanw width = 4;
936 1.27 cgd /*
937 1.27 cgd * Section 6.2.5.1, `Address Maps', tells us that:
938 1.27 cgd *
939 1.27 cgd * 1) The builtin software should have already mapped the
940 1.27 cgd * device in a reasonable way.
941 1.27 cgd *
942 1.27 cgd * 2) A device which wants 2^n bytes of memory will hardwire
943 1.27 cgd * the bottom n bits of the address to 0. As recommended,
944 1.27 cgd * we write all 1s and see what we get back.
945 1.27 cgd */
946 1.45 thorpej
947 1.27 cgd rval = regs[o2i(reg)];
948 1.45 thorpej if (PCI_MAPREG_TYPE(rval) == PCI_MAPREG_TYPE_MEM &&
949 1.45 thorpej PCI_MAPREG_MEM_TYPE(rval) == PCI_MAPREG_MEM_TYPE_64BIT) {
950 1.45 thorpej rval64h = regs[o2i(reg + 4)];
951 1.45 thorpej width = 8;
952 1.45 thorpej } else
953 1.45 thorpej rval64h = 0;
954 1.45 thorpej
955 1.45 thorpej #ifdef _KERNEL
956 1.167 msaitoh if (rval != 0 && memen) {
957 1.167 msaitoh int s;
958 1.167 msaitoh
959 1.24 thorpej /*
960 1.27 cgd * The following sequence seems to make some devices
961 1.27 cgd * (e.g. host bus bridges, which don't normally
962 1.27 cgd * have their space mapped) very unhappy, to
963 1.27 cgd * the point of crashing the system.
964 1.24 thorpej *
965 1.27 cgd * Therefore, if the mapping register is zero to
966 1.27 cgd * start out with, don't bother trying.
967 1.24 thorpej */
968 1.27 cgd s = splhigh();
969 1.27 cgd pci_conf_write(pc, tag, reg, 0xffffffff);
970 1.27 cgd mask = pci_conf_read(pc, tag, reg);
971 1.27 cgd pci_conf_write(pc, tag, reg, rval);
972 1.37 nathanw if (PCI_MAPREG_TYPE(rval) == PCI_MAPREG_TYPE_MEM &&
973 1.37 nathanw PCI_MAPREG_MEM_TYPE(rval) == PCI_MAPREG_MEM_TYPE_64BIT) {
974 1.37 nathanw pci_conf_write(pc, tag, reg + 4, 0xffffffff);
975 1.37 nathanw mask64h = pci_conf_read(pc, tag, reg + 4);
976 1.37 nathanw pci_conf_write(pc, tag, reg + 4, rval64h);
977 1.167 msaitoh }
978 1.27 cgd splx(s);
979 1.27 cgd } else
980 1.168 msaitoh mask = mask64h = 0;
981 1.45 thorpej #endif /* _KERNEL */
982 1.27 cgd
983 1.28 cgd printf(" Base address register at 0x%02x", reg);
984 1.28 cgd if (name)
985 1.28 cgd printf(" (%s)", name);
986 1.28 cgd printf("\n ");
987 1.27 cgd if (rval == 0) {
988 1.167 msaitoh printf("not implemented\n");
989 1.37 nathanw return width;
990 1.60 perry }
991 1.28 cgd printf("type: ");
992 1.28 cgd if (PCI_MAPREG_TYPE(rval) == PCI_MAPREG_TYPE_MEM) {
993 1.34 drochner const char *type, *prefetch;
994 1.27 cgd
995 1.27 cgd switch (PCI_MAPREG_MEM_TYPE(rval)) {
996 1.27 cgd case PCI_MAPREG_MEM_TYPE_32BIT:
997 1.27 cgd type = "32-bit";
998 1.27 cgd break;
999 1.27 cgd case PCI_MAPREG_MEM_TYPE_32BIT_1M:
1000 1.27 cgd type = "32-bit-1M";
1001 1.27 cgd break;
1002 1.27 cgd case PCI_MAPREG_MEM_TYPE_64BIT:
1003 1.27 cgd type = "64-bit";
1004 1.27 cgd break;
1005 1.27 cgd default:
1006 1.27 cgd type = "unknown (XXX)";
1007 1.27 cgd break;
1008 1.22 thorpej }
1009 1.34 drochner if (PCI_MAPREG_MEM_PREFETCHABLE(rval))
1010 1.34 drochner prefetch = "";
1011 1.27 cgd else
1012 1.34 drochner prefetch = "non";
1013 1.34 drochner printf("%s %sprefetchable memory\n", type, prefetch);
1014 1.37 nathanw switch (PCI_MAPREG_MEM_TYPE(rval)) {
1015 1.37 nathanw case PCI_MAPREG_MEM_TYPE_64BIT:
1016 1.168 msaitoh printf(" base: 0x%016llx",
1017 1.37 nathanw PCI_MAPREG_MEM64_ADDR(
1018 1.38 cgd ((((long long) rval64h) << 32) | rval)));
1019 1.167 msaitoh if (!memen)
1020 1.167 msaitoh printf(", disabled");
1021 1.38 cgd printf("\n");
1022 1.168 msaitoh #ifdef _KERNEL
1023 1.168 msaitoh printf(" size: 0x%016llx\n",
1024 1.168 msaitoh PCI_MAPREG_MEM64_SIZE(
1025 1.168 msaitoh ((((long long) mask64h) << 32) | mask)));
1026 1.168 msaitoh #endif
1027 1.37 nathanw break;
1028 1.37 nathanw case PCI_MAPREG_MEM_TYPE_32BIT:
1029 1.37 nathanw case PCI_MAPREG_MEM_TYPE_32BIT_1M:
1030 1.37 nathanw default:
1031 1.168 msaitoh printf(" base: 0x%08x",
1032 1.168 msaitoh PCI_MAPREG_MEM_ADDR(rval));
1033 1.167 msaitoh if (!memen)
1034 1.167 msaitoh printf(", disabled");
1035 1.38 cgd printf("\n");
1036 1.168 msaitoh #ifdef _KERNEL
1037 1.168 msaitoh printf(" size: 0x%08x\n",
1038 1.168 msaitoh PCI_MAPREG_MEM_SIZE(mask));
1039 1.168 msaitoh #endif
1040 1.37 nathanw break;
1041 1.37 nathanw }
1042 1.27 cgd } else {
1043 1.168 msaitoh #ifdef _KERNEL
1044 1.168 msaitoh if (ioen)
1045 1.168 msaitoh printf("%d-bit ", mask & ~0x0000ffff ? 32 : 16);
1046 1.168 msaitoh #endif
1047 1.168 msaitoh printf("I/O\n");
1048 1.168 msaitoh printf(" base: 0x%08x", PCI_MAPREG_IO_ADDR(rval));
1049 1.167 msaitoh if (!ioen)
1050 1.167 msaitoh printf(", disabled");
1051 1.38 cgd printf("\n");
1052 1.168 msaitoh #ifdef _KERNEL
1053 1.168 msaitoh printf(" size: 0x%08x\n", PCI_MAPREG_IO_SIZE(mask));
1054 1.168 msaitoh #endif
1055 1.22 thorpej }
1056 1.37 nathanw
1057 1.37 nathanw return width;
1058 1.27 cgd }
1059 1.28 cgd
1060 1.28 cgd static void
1061 1.44 thorpej pci_conf_print_regs(const pcireg_t *regs, int first, int pastlast)
1062 1.28 cgd {
1063 1.28 cgd int off, needaddr, neednl;
1064 1.28 cgd
1065 1.28 cgd needaddr = 1;
1066 1.28 cgd neednl = 0;
1067 1.28 cgd for (off = first; off < pastlast; off += 4) {
1068 1.28 cgd if ((off % 16) == 0 || needaddr) {
1069 1.28 cgd printf(" 0x%02x:", off);
1070 1.28 cgd needaddr = 0;
1071 1.28 cgd }
1072 1.28 cgd printf(" 0x%08x", regs[o2i(off)]);
1073 1.28 cgd neednl = 1;
1074 1.28 cgd if ((off % 16) == 12) {
1075 1.28 cgd printf("\n");
1076 1.28 cgd neednl = 0;
1077 1.28 cgd }
1078 1.28 cgd }
1079 1.28 cgd if (neednl)
1080 1.28 cgd printf("\n");
1081 1.28 cgd }
1082 1.28 cgd
1083 1.161 msaitoh static const char *
1084 1.161 msaitoh pci_conf_print_agp_calcycle(uint8_t cal)
1085 1.161 msaitoh {
1086 1.161 msaitoh
1087 1.161 msaitoh switch (cal) {
1088 1.161 msaitoh case 0x0:
1089 1.161 msaitoh return "4ms";
1090 1.161 msaitoh case 0x1:
1091 1.161 msaitoh return "16ms";
1092 1.161 msaitoh case 0x2:
1093 1.161 msaitoh return "64ms";
1094 1.161 msaitoh case 0x3:
1095 1.161 msaitoh return "256ms";
1096 1.161 msaitoh case 0x7:
1097 1.161 msaitoh return "Calibration Cycle Not Needed";
1098 1.161 msaitoh default:
1099 1.161 msaitoh return "(reserved)";
1100 1.161 msaitoh }
1101 1.161 msaitoh }
1102 1.161 msaitoh
1103 1.161 msaitoh static void
1104 1.161 msaitoh pci_conf_print_agp_datarate(pcireg_t reg, bool isagp3)
1105 1.161 msaitoh {
1106 1.161 msaitoh if (isagp3) {
1107 1.161 msaitoh /* AGP 3.0 */
1108 1.161 msaitoh if (reg & AGP_MODE_V3_RATE_4x)
1109 1.161 msaitoh printf("x4");
1110 1.161 msaitoh if (reg & AGP_MODE_V3_RATE_8x)
1111 1.161 msaitoh printf("x8");
1112 1.161 msaitoh } else {
1113 1.161 msaitoh /* AGP 2.0 */
1114 1.161 msaitoh if (reg & AGP_MODE_V2_RATE_1x)
1115 1.161 msaitoh printf("x1");
1116 1.161 msaitoh if (reg & AGP_MODE_V2_RATE_2x)
1117 1.161 msaitoh printf("x2");
1118 1.161 msaitoh if (reg & AGP_MODE_V2_RATE_4x)
1119 1.161 msaitoh printf("x4");
1120 1.161 msaitoh }
1121 1.161 msaitoh printf("\n");
1122 1.161 msaitoh }
1123 1.161 msaitoh
1124 1.132 msaitoh static void
1125 1.132 msaitoh pci_conf_print_agp_cap(const pcireg_t *regs, int capoff)
1126 1.132 msaitoh {
1127 1.132 msaitoh pcireg_t rval;
1128 1.161 msaitoh bool isagp3;
1129 1.132 msaitoh
1130 1.132 msaitoh printf("\n AGP Capabilities Register\n");
1131 1.132 msaitoh
1132 1.132 msaitoh rval = regs[o2i(capoff)];
1133 1.132 msaitoh printf(" Revision: %d.%d\n",
1134 1.132 msaitoh PCI_CAP_AGP_MAJOR(rval), PCI_CAP_AGP_MINOR(rval));
1135 1.132 msaitoh
1136 1.161 msaitoh rval = regs[o2i(capoff + PCI_AGP_STATUS)];
1137 1.161 msaitoh printf(" Status register: 0x%04x\n", rval);
1138 1.161 msaitoh printf(" RQ: %d\n",
1139 1.161 msaitoh (unsigned int)__SHIFTOUT(rval, AGP_MODE_RQ) + 1);
1140 1.161 msaitoh printf(" ARQSZ: %d\n",
1141 1.161 msaitoh (unsigned int)__SHIFTOUT(rval, AGP_MODE_ARQSZ));
1142 1.161 msaitoh printf(" CAL cycle: %s\n",
1143 1.161 msaitoh pci_conf_print_agp_calcycle(__SHIFTOUT(rval, AGP_MODE_CAL)));
1144 1.161 msaitoh onoff("SBA", rval, AGP_MODE_SBA);
1145 1.161 msaitoh onoff("htrans#", rval, AGP_MODE_HTRANS);
1146 1.161 msaitoh onoff("Over 4G", rval, AGP_MODE_4G);
1147 1.161 msaitoh onoff("Fast Write", rval, AGP_MODE_FW);
1148 1.161 msaitoh onoff("AGP 3.0 Mode", rval, AGP_MODE_MODE_3);
1149 1.161 msaitoh isagp3 = rval & AGP_MODE_MODE_3;
1150 1.161 msaitoh printf(" Data Rate Support: ");
1151 1.161 msaitoh pci_conf_print_agp_datarate(rval, isagp3);
1152 1.161 msaitoh
1153 1.161 msaitoh rval = regs[o2i(capoff + PCI_AGP_COMMAND)];
1154 1.161 msaitoh printf(" Command register: 0x%08x\n", rval);
1155 1.161 msaitoh printf(" PRQ: %d\n",
1156 1.161 msaitoh (unsigned int)__SHIFTOUT(rval, AGP_MODE_RQ) + 1);
1157 1.161 msaitoh printf(" PARQSZ: %d\n",
1158 1.161 msaitoh (unsigned int)__SHIFTOUT(rval, AGP_MODE_ARQSZ));
1159 1.161 msaitoh printf(" PCAL cycle: %s\n",
1160 1.161 msaitoh pci_conf_print_agp_calcycle(__SHIFTOUT(rval, AGP_MODE_CAL)));
1161 1.161 msaitoh onoff("SBA", rval, AGP_MODE_SBA);
1162 1.161 msaitoh onoff("AGP", rval, AGP_MODE_AGP);
1163 1.161 msaitoh onoff("Over 4G", rval, AGP_MODE_4G);
1164 1.161 msaitoh onoff("Fast Write", rval, AGP_MODE_FW);
1165 1.161 msaitoh if (isagp3) {
1166 1.161 msaitoh printf(" Data Rate Enable: ");
1167 1.161 msaitoh /*
1168 1.161 msaitoh * The Data Rate Enable bits are used only on 3.0 and the
1169 1.161 msaitoh * Command register has no AGP_MODE_MODE_3 bit, so pass the
1170 1.161 msaitoh * flag to print correctly.
1171 1.161 msaitoh */
1172 1.161 msaitoh pci_conf_print_agp_datarate(rval, isagp3);
1173 1.161 msaitoh }
1174 1.132 msaitoh }
1175 1.132 msaitoh
1176 1.115 msaitoh static const char *
1177 1.115 msaitoh pci_conf_print_pcipm_cap_aux(uint16_t caps)
1178 1.115 msaitoh {
1179 1.115 msaitoh
1180 1.115 msaitoh switch ((caps >> 6) & 7) {
1181 1.115 msaitoh case 0: return "self-powered";
1182 1.115 msaitoh case 1: return "55 mA";
1183 1.115 msaitoh case 2: return "100 mA";
1184 1.115 msaitoh case 3: return "160 mA";
1185 1.115 msaitoh case 4: return "220 mA";
1186 1.115 msaitoh case 5: return "270 mA";
1187 1.115 msaitoh case 6: return "320 mA";
1188 1.115 msaitoh case 7:
1189 1.115 msaitoh default: return "375 mA";
1190 1.115 msaitoh }
1191 1.115 msaitoh }
1192 1.115 msaitoh
1193 1.115 msaitoh static const char *
1194 1.115 msaitoh pci_conf_print_pcipm_cap_pmrev(uint8_t val)
1195 1.115 msaitoh {
1196 1.115 msaitoh static const char unk[] = "unknown";
1197 1.115 msaitoh static const char *pmrev[8] = {
1198 1.115 msaitoh unk, "1.0", "1.1", "1.2", unk, unk, unk, unk
1199 1.115 msaitoh };
1200 1.115 msaitoh if (val > 7)
1201 1.115 msaitoh return unk;
1202 1.115 msaitoh return pmrev[val];
1203 1.115 msaitoh }
1204 1.115 msaitoh
1205 1.27 cgd static void
1206 1.115 msaitoh pci_conf_print_pcipm_cap(const pcireg_t *regs, int capoff)
1207 1.27 cgd {
1208 1.115 msaitoh uint16_t caps, pmcsr;
1209 1.115 msaitoh
1210 1.115 msaitoh caps = regs[o2i(capoff)] >> PCI_PMCR_SHIFT;
1211 1.202 msaitoh pmcsr = regs[o2i(capoff + PCI_PMCSR)];
1212 1.115 msaitoh
1213 1.115 msaitoh printf("\n PCI Power Management Capabilities Register\n");
1214 1.27 cgd
1215 1.115 msaitoh printf(" Capabilities register: 0x%04x\n", caps);
1216 1.115 msaitoh printf(" Version: %s\n",
1217 1.115 msaitoh pci_conf_print_pcipm_cap_pmrev(caps & PCI_PMCR_VERSION_MASK));
1218 1.115 msaitoh onoff("PME# clock", caps, PCI_PMCR_PME_CLOCK);
1219 1.115 msaitoh onoff("Device specific initialization", caps, PCI_PMCR_DSI);
1220 1.115 msaitoh printf(" 3.3V auxiliary current: %s\n",
1221 1.115 msaitoh pci_conf_print_pcipm_cap_aux(caps));
1222 1.115 msaitoh onoff("D1 power management state support", caps, PCI_PMCR_D1SUPP);
1223 1.115 msaitoh onoff("D2 power management state support", caps, PCI_PMCR_D2SUPP);
1224 1.117 msaitoh onoff("PME# support D0", caps, PCI_PMCR_PME_D0);
1225 1.117 msaitoh onoff("PME# support D1", caps, PCI_PMCR_PME_D1);
1226 1.117 msaitoh onoff("PME# support D2", caps, PCI_PMCR_PME_D2);
1227 1.117 msaitoh onoff("PME# support D3 hot", caps, PCI_PMCR_PME_D3HOT);
1228 1.117 msaitoh onoff("PME# support D3 cold", caps, PCI_PMCR_PME_D3COLD);
1229 1.22 thorpej
1230 1.202 msaitoh printf(" Control/status register: 0x%08x\n", pmcsr);
1231 1.115 msaitoh printf(" Power state: D%d\n", pmcsr & PCI_PMCSR_STATE_MASK);
1232 1.115 msaitoh onoff("PCI Express reserved", (pmcsr >> 2), 1);
1233 1.117 msaitoh onoff("No soft reset", pmcsr, PCI_PMCSR_NO_SOFTRST);
1234 1.115 msaitoh printf(" PME# assertion: %sabled\n",
1235 1.115 msaitoh (pmcsr & PCI_PMCSR_PME_EN) ? "en" : "dis");
1236 1.157 msaitoh printf(" Data Select: %d\n",
1237 1.157 msaitoh __SHIFTOUT(pmcsr, PCI_PMCSR_DATASEL_MASK));
1238 1.157 msaitoh printf(" Data Scale: %d\n",
1239 1.157 msaitoh __SHIFTOUT(pmcsr, PCI_PMCSR_DATASCL_MASK));
1240 1.115 msaitoh onoff("PME# status", pmcsr, PCI_PMCSR_PME_STS);
1241 1.115 msaitoh printf(" Bridge Support Extensions register: 0x%02x\n",
1242 1.202 msaitoh (pmcsr >> 16) & 0xff);
1243 1.202 msaitoh onoff("B2/B3 support", pmcsr, PCI_PMCSR_B2B3_SUPPORT);
1244 1.202 msaitoh onoff("Bus Power/Clock Control Enable", pmcsr, PCI_PMCSR_BPCC_EN);
1245 1.202 msaitoh printf(" Data register: 0x%02x\n",
1246 1.202 msaitoh __SHIFTOUT(pmcsr, PCI_PMCSR_DATA));
1247 1.115 msaitoh }
1248 1.22 thorpej
1249 1.115 msaitoh /* XXX pci_conf_print_vpd_cap */
1250 1.115 msaitoh /* XXX pci_conf_print_slotid_cap */
1251 1.26 cgd
1252 1.115 msaitoh static void
1253 1.115 msaitoh pci_conf_print_msi_cap(const pcireg_t *regs, int capoff)
1254 1.115 msaitoh {
1255 1.115 msaitoh uint32_t ctl, mmc, mme;
1256 1.33 kleink
1257 1.115 msaitoh regs += o2i(capoff);
1258 1.115 msaitoh ctl = *regs++;
1259 1.115 msaitoh mmc = __SHIFTOUT(ctl, PCI_MSI_CTL_MMC_MASK);
1260 1.115 msaitoh mme = __SHIFTOUT(ctl, PCI_MSI_CTL_MME_MASK);
1261 1.33 kleink
1262 1.115 msaitoh printf("\n PCI Message Signaled Interrupt\n");
1263 1.26 cgd
1264 1.115 msaitoh printf(" Message Control register: 0x%04x\n", ctl >> 16);
1265 1.115 msaitoh onoff("MSI Enabled", ctl, PCI_MSI_CTL_MSI_ENABLE);
1266 1.115 msaitoh printf(" Multiple Message Capable: %s (%d vector%s)\n",
1267 1.115 msaitoh mmc > 0 ? "yes" : "no", 1 << mmc, mmc > 0 ? "s" : "");
1268 1.115 msaitoh printf(" Multiple Message Enabled: %s (%d vector%s)\n",
1269 1.115 msaitoh mme > 0 ? "on" : "off", 1 << mme, mme > 0 ? "s" : "");
1270 1.115 msaitoh onoff("64 Bit Address Capable", ctl, PCI_MSI_CTL_64BIT_ADDR);
1271 1.115 msaitoh onoff("Per-Vector Masking Capable", ctl, PCI_MSI_CTL_PERVEC_MASK);
1272 1.152 msaitoh onoff("Extended Message Data Capable", ctl, PCI_MSI_CTL_EXTMDATA_CAP);
1273 1.152 msaitoh onoff("Extended Message Data Enable", ctl, PCI_MSI_CTL_EXTMDATA_EN);
1274 1.115 msaitoh printf(" Message Address %sregister: 0x%08x\n",
1275 1.115 msaitoh ctl & PCI_MSI_CTL_64BIT_ADDR ? "(lower) " : "", *regs++);
1276 1.115 msaitoh if (ctl & PCI_MSI_CTL_64BIT_ADDR) {
1277 1.115 msaitoh printf(" Message Address %sregister: 0x%08x\n",
1278 1.115 msaitoh "(upper) ", *regs++);
1279 1.115 msaitoh }
1280 1.183 msaitoh printf(" Message Data register: ");
1281 1.183 msaitoh if (ctl & PCI_MSI_CTL_EXTMDATA_CAP)
1282 1.183 msaitoh printf("0x%08x\n", *regs);
1283 1.183 msaitoh else
1284 1.183 msaitoh printf("0x%04x\n", *regs & 0xffff);
1285 1.157 msaitoh regs++;
1286 1.115 msaitoh if (ctl & PCI_MSI_CTL_PERVEC_MASK) {
1287 1.115 msaitoh printf(" Vector Mask register: 0x%08x\n", *regs++);
1288 1.115 msaitoh printf(" Vector Pending register: 0x%08x\n", *regs++);
1289 1.22 thorpej }
1290 1.51 drochner }
1291 1.51 drochner
1292 1.115 msaitoh /* XXX pci_conf_print_cpci_hostwap_cap */
1293 1.122 msaitoh
1294 1.122 msaitoh /*
1295 1.122 msaitoh * For both command register and status register.
1296 1.122 msaitoh * The argument "idx" is index number (0 to 7).
1297 1.122 msaitoh */
1298 1.122 msaitoh static int
1299 1.122 msaitoh pcix_split_trans(unsigned int idx)
1300 1.122 msaitoh {
1301 1.122 msaitoh static int table[8] = {
1302 1.122 msaitoh 1, 2, 3, 4, 8, 12, 16, 32
1303 1.122 msaitoh };
1304 1.122 msaitoh
1305 1.122 msaitoh if (idx >= __arraycount(table))
1306 1.122 msaitoh return -1;
1307 1.122 msaitoh return table[idx];
1308 1.122 msaitoh }
1309 1.122 msaitoh
1310 1.122 msaitoh static void
1311 1.140 msaitoh pci_conf_print_pcix_cap_2ndbusmode(int num)
1312 1.140 msaitoh {
1313 1.140 msaitoh const char *maxfreq, *maxperiod;
1314 1.140 msaitoh
1315 1.140 msaitoh printf(" Mode: ");
1316 1.140 msaitoh if (num <= 0x07)
1317 1.140 msaitoh printf("PCI-X Mode 1\n");
1318 1.140 msaitoh else if (num <= 0x0b)
1319 1.140 msaitoh printf("PCI-X 266 (Mode 2)\n");
1320 1.140 msaitoh else
1321 1.140 msaitoh printf("PCI-X 533 (Mode 2)\n");
1322 1.215.2.1 martin
1323 1.140 msaitoh printf(" Error protection: %s\n", (num <= 3) ? "parity" : "ECC");
1324 1.140 msaitoh switch (num & 0x03) {
1325 1.140 msaitoh default:
1326 1.140 msaitoh case 0:
1327 1.140 msaitoh maxfreq = "N/A";
1328 1.140 msaitoh maxperiod = "N/A";
1329 1.140 msaitoh break;
1330 1.140 msaitoh case 1:
1331 1.140 msaitoh maxfreq = "66MHz";
1332 1.140 msaitoh maxperiod = "15ns";
1333 1.140 msaitoh break;
1334 1.140 msaitoh case 2:
1335 1.140 msaitoh maxfreq = "100MHz";
1336 1.140 msaitoh maxperiod = "10ns";
1337 1.140 msaitoh break;
1338 1.140 msaitoh case 3:
1339 1.140 msaitoh maxfreq = "133MHz";
1340 1.140 msaitoh maxperiod = "7.5ns";
1341 1.140 msaitoh break;
1342 1.140 msaitoh }
1343 1.140 msaitoh printf(" Max Clock Freq: %s\n", maxfreq);
1344 1.140 msaitoh printf(" Min Clock Period: %s\n", maxperiod);
1345 1.140 msaitoh }
1346 1.140 msaitoh
1347 1.140 msaitoh static void
1348 1.122 msaitoh pci_conf_print_pcix_cap(const pcireg_t *regs, int capoff)
1349 1.122 msaitoh {
1350 1.122 msaitoh pcireg_t reg;
1351 1.122 msaitoh int isbridge;
1352 1.122 msaitoh int i;
1353 1.122 msaitoh
1354 1.122 msaitoh isbridge = (PCI_HDRTYPE_TYPE(regs[o2i(PCI_BHLC_REG)])
1355 1.122 msaitoh & PCI_HDRTYPE_PPB) != 0 ? 1 : 0;
1356 1.122 msaitoh printf("\n PCI-X %s Capabilities Register\n",
1357 1.122 msaitoh isbridge ? "Bridge" : "Non-bridge");
1358 1.122 msaitoh
1359 1.122 msaitoh reg = regs[o2i(capoff)];
1360 1.122 msaitoh if (isbridge != 0) {
1361 1.122 msaitoh printf(" Secondary status register: 0x%04x\n",
1362 1.122 msaitoh (reg & 0xffff0000) >> 16);
1363 1.122 msaitoh onoff("64bit device", reg, PCIX_STATUS_64BIT);
1364 1.122 msaitoh onoff("133MHz capable", reg, PCIX_STATUS_133);
1365 1.122 msaitoh onoff("Split completion discarded", reg, PCIX_STATUS_SPLDISC);
1366 1.122 msaitoh onoff("Unexpected split completion", reg, PCIX_STATUS_SPLUNEX);
1367 1.122 msaitoh onoff("Split completion overrun", reg, PCIX_BRIDGE_ST_SPLOVRN);
1368 1.122 msaitoh onoff("Split request delayed", reg, PCIX_BRIDGE_ST_SPLRQDL);
1369 1.140 msaitoh pci_conf_print_pcix_cap_2ndbusmode(
1370 1.140 msaitoh __SHIFTOUT(reg, PCIX_BRIDGE_2NDST_CLKF));
1371 1.122 msaitoh printf(" Version: 0x%x\n",
1372 1.122 msaitoh (reg & PCIX_BRIDGE_2NDST_VER_MASK)
1373 1.122 msaitoh >> PCIX_BRIDGE_2NDST_VER_SHIFT);
1374 1.122 msaitoh onoff("266MHz capable", reg, PCIX_BRIDGE_ST_266);
1375 1.122 msaitoh onoff("533MHz capable", reg, PCIX_BRIDGE_ST_533);
1376 1.122 msaitoh } else {
1377 1.122 msaitoh printf(" Command register: 0x%04x\n",
1378 1.122 msaitoh (reg & 0xffff0000) >> 16);
1379 1.122 msaitoh onoff("Data Parity Error Recovery", reg,
1380 1.122 msaitoh PCIX_CMD_PERR_RECOVER);
1381 1.122 msaitoh onoff("Enable Relaxed Ordering", reg, PCIX_CMD_RELAXED_ORDER);
1382 1.122 msaitoh printf(" Maximum Burst Read Count: %u\n",
1383 1.122 msaitoh PCIX_CMD_BYTECNT(reg));
1384 1.122 msaitoh printf(" Maximum Split Transactions: %d\n",
1385 1.122 msaitoh pcix_split_trans((reg & PCIX_CMD_SPLTRANS_MASK)
1386 1.122 msaitoh >> PCIX_CMD_SPLTRANS_SHIFT));
1387 1.122 msaitoh }
1388 1.122 msaitoh reg = regs[o2i(capoff+PCIX_STATUS)]; /* Or PCIX_BRIDGE_PRI_STATUS */
1389 1.122 msaitoh printf(" %sStatus register: 0x%08x\n",
1390 1.122 msaitoh isbridge ? "Bridge " : "", reg);
1391 1.122 msaitoh printf(" Function: %d\n", PCIX_STATUS_FN(reg));
1392 1.122 msaitoh printf(" Device: %d\n", PCIX_STATUS_DEV(reg));
1393 1.122 msaitoh printf(" Bus: %d\n", PCIX_STATUS_BUS(reg));
1394 1.122 msaitoh onoff("64bit device", reg, PCIX_STATUS_64BIT);
1395 1.122 msaitoh onoff("133MHz capable", reg, PCIX_STATUS_133);
1396 1.122 msaitoh onoff("Split completion discarded", reg, PCIX_STATUS_SPLDISC);
1397 1.122 msaitoh onoff("Unexpected split completion", reg, PCIX_STATUS_SPLUNEX);
1398 1.122 msaitoh if (isbridge != 0) {
1399 1.122 msaitoh onoff("Split completion overrun", reg, PCIX_BRIDGE_ST_SPLOVRN);
1400 1.122 msaitoh onoff("Split request delayed", reg, PCIX_BRIDGE_ST_SPLRQDL);
1401 1.122 msaitoh } else {
1402 1.122 msaitoh onoff2("Device Complexity", reg, PCIX_STATUS_DEVCPLX,
1403 1.122 msaitoh "bridge device", "simple device");
1404 1.122 msaitoh printf(" Designed max memory read byte count: %d\n",
1405 1.122 msaitoh 512 << ((reg & PCIX_STATUS_MAXB_MASK)
1406 1.122 msaitoh >> PCIX_STATUS_MAXB_SHIFT));
1407 1.122 msaitoh printf(" Designed max outstanding split transaction: %d\n",
1408 1.122 msaitoh pcix_split_trans((reg & PCIX_STATUS_MAXST_MASK)
1409 1.122 msaitoh >> PCIX_STATUS_MAXST_SHIFT));
1410 1.122 msaitoh printf(" MAX cumulative Read Size: %u\n",
1411 1.122 msaitoh 8 << ((reg & 0x1c000000) >> PCIX_STATUS_MAXRS_SHIFT));
1412 1.122 msaitoh onoff("Received split completion error", reg,
1413 1.122 msaitoh PCIX_STATUS_SCERR);
1414 1.122 msaitoh }
1415 1.122 msaitoh onoff("266MHz capable", reg, PCIX_STATUS_266);
1416 1.122 msaitoh onoff("533MHz capable", reg, PCIX_STATUS_533);
1417 1.122 msaitoh
1418 1.122 msaitoh if (isbridge == 0)
1419 1.122 msaitoh return;
1420 1.122 msaitoh
1421 1.122 msaitoh /* Only for bridge */
1422 1.122 msaitoh for (i = 0; i < 2; i++) {
1423 1.163 msaitoh reg = regs[o2i(capoff + PCIX_BRIDGE_UP_STCR + (4 * i))];
1424 1.122 msaitoh printf(" %s split transaction control register: 0x%08x\n",
1425 1.122 msaitoh (i == 0) ? "Upstream" : "Downstream", reg);
1426 1.122 msaitoh printf(" Capacity: %d\n", reg & PCIX_BRIDGE_STCAP);
1427 1.122 msaitoh printf(" Commitment Limit: %d\n",
1428 1.122 msaitoh (reg & PCIX_BRIDGE_STCLIM) >> PCIX_BRIDGE_STCLIM_SHIFT);
1429 1.122 msaitoh }
1430 1.122 msaitoh }
1431 1.122 msaitoh
1432 1.141 msaitoh /* pci_conf_print_ht_slave_cap */
1433 1.141 msaitoh /* pci_conf_print_ht_host_cap */
1434 1.141 msaitoh /* pci_conf_print_ht_switch_cap */
1435 1.141 msaitoh /* pci_conf_print_ht_intr_cap */
1436 1.141 msaitoh /* pci_conf_print_ht_revid_cap */
1437 1.141 msaitoh /* pci_conf_print_ht_unitid_cap */
1438 1.141 msaitoh /* pci_conf_print_ht_extcnf_cap */
1439 1.141 msaitoh /* pci_conf_print_ht_addrmap_cap */
1440 1.141 msaitoh /* pci_conf_print_ht_msimap_cap */
1441 1.141 msaitoh
1442 1.141 msaitoh static void
1443 1.141 msaitoh pci_conf_print_ht_msimap_cap(const pcireg_t *regs, int capoff)
1444 1.141 msaitoh {
1445 1.141 msaitoh pcireg_t val;
1446 1.141 msaitoh uint32_t lo, hi;
1447 1.141 msaitoh
1448 1.141 msaitoh /*
1449 1.141 msaitoh * Print the rest of the command register bits. Others are
1450 1.141 msaitoh * printed in pci_conf_print_ht_cap().
1451 1.141 msaitoh */
1452 1.141 msaitoh val = regs[o2i(capoff + PCI_HT_CMD)];
1453 1.141 msaitoh onoff("Enable", val, PCI_HT_MSI_ENABLED);
1454 1.141 msaitoh onoff("Fixed", val, PCI_HT_MSI_FIXED);
1455 1.141 msaitoh
1456 1.141 msaitoh lo = regs[o2i(capoff + PCI_HT_MSI_ADDR_LO)];
1457 1.141 msaitoh hi = regs[o2i(capoff + PCI_HT_MSI_ADDR_HI)];
1458 1.141 msaitoh printf(" Address Low register: 0x%08x\n", lo);
1459 1.141 msaitoh printf(" Address high register: 0x%08x\n", hi);
1460 1.141 msaitoh printf(" Address: 0x%016" PRIx64 "\n",
1461 1.141 msaitoh (uint64_t)hi << 32 | (lo & PCI_HT_MSI_ADDR_LO_MASK));
1462 1.141 msaitoh }
1463 1.141 msaitoh
1464 1.141 msaitoh /* pci_conf_print_ht_droute_cap */
1465 1.141 msaitoh /* pci_conf_print_ht_vcset_cap */
1466 1.141 msaitoh /* pci_conf_print_ht_retry_cap */
1467 1.141 msaitoh /* pci_conf_print_ht_x86enc_cap */
1468 1.141 msaitoh /* pci_conf_print_ht_gen3_cap */
1469 1.141 msaitoh /* pci_conf_print_ht_fle_cap */
1470 1.141 msaitoh /* pci_conf_print_ht_pm_cap */
1471 1.141 msaitoh /* pci_conf_print_ht_hnc_cap */
1472 1.141 msaitoh
1473 1.141 msaitoh static const struct ht_types {
1474 1.141 msaitoh pcireg_t cap;
1475 1.141 msaitoh const char *name;
1476 1.141 msaitoh void (*printfunc)(const pcireg_t *, int);
1477 1.141 msaitoh } ht_captab[] = {
1478 1.141 msaitoh {PCI_HT_CAP_SLAVE, "Slave or Primary Interface", NULL },
1479 1.141 msaitoh {PCI_HT_CAP_HOST, "Host or Secondary Interface", NULL },
1480 1.141 msaitoh {PCI_HT_CAP_SWITCH, "Switch", NULL },
1481 1.141 msaitoh {PCI_HT_CAP_INTERRUPT, "Interrupt Discovery and Configuration", NULL},
1482 1.141 msaitoh {PCI_HT_CAP_REVID, "Revision ID", NULL },
1483 1.141 msaitoh {PCI_HT_CAP_UNITID_CLUMP, "UnitID Clumping", NULL },
1484 1.141 msaitoh {PCI_HT_CAP_EXTCNFSPACE, "Extended Configuration Space Access", NULL },
1485 1.141 msaitoh {PCI_HT_CAP_ADDRMAP, "Address Mapping", NULL },
1486 1.141 msaitoh {PCI_HT_CAP_MSIMAP, "MSI Mapping", pci_conf_print_ht_msimap_cap },
1487 1.141 msaitoh {PCI_HT_CAP_DIRECTROUTE, "Direct Route", NULL },
1488 1.141 msaitoh {PCI_HT_CAP_VCSET, "VCSet", NULL },
1489 1.141 msaitoh {PCI_HT_CAP_RETRYMODE, "Retry Mode", NULL },
1490 1.141 msaitoh {PCI_HT_CAP_X86ENCODE, "X86 Encoding", NULL },
1491 1.141 msaitoh {PCI_HT_CAP_GEN3, "Gen3", NULL },
1492 1.141 msaitoh {PCI_HT_CAP_FLE, "Function-Level Extension", NULL },
1493 1.141 msaitoh {PCI_HT_CAP_PM, "Power Management", NULL },
1494 1.141 msaitoh {PCI_HT_CAP_HIGHNODECNT, "High Node Count", NULL },
1495 1.141 msaitoh };
1496 1.141 msaitoh
1497 1.141 msaitoh static void
1498 1.141 msaitoh pci_conf_print_ht_cap(const pcireg_t *regs, int capoff)
1499 1.141 msaitoh {
1500 1.141 msaitoh pcireg_t val, foundcap;
1501 1.141 msaitoh unsigned int off;
1502 1.141 msaitoh
1503 1.141 msaitoh val = regs[o2i(capoff + PCI_HT_CMD)];
1504 1.141 msaitoh
1505 1.141 msaitoh printf("\n HyperTransport Capability Register at 0x%02x\n", capoff);
1506 1.141 msaitoh
1507 1.141 msaitoh printf(" Command register: 0x%04x\n", val >> 16);
1508 1.141 msaitoh foundcap = PCI_HT_CAP(val);
1509 1.141 msaitoh for (off = 0; off < __arraycount(ht_captab); off++) {
1510 1.141 msaitoh if (ht_captab[off].cap == foundcap)
1511 1.141 msaitoh break;
1512 1.141 msaitoh }
1513 1.141 msaitoh printf(" Capability Type: 0x%02x ", foundcap);
1514 1.141 msaitoh if (off >= __arraycount(ht_captab)) {
1515 1.141 msaitoh printf("(unknown)\n");
1516 1.141 msaitoh return;
1517 1.141 msaitoh }
1518 1.141 msaitoh printf("(%s)\n", ht_captab[off].name);
1519 1.141 msaitoh if (ht_captab[off].printfunc != NULL)
1520 1.142 msaitoh ht_captab[off].printfunc(regs, capoff);
1521 1.141 msaitoh }
1522 1.118 msaitoh
1523 1.118 msaitoh static void
1524 1.118 msaitoh pci_conf_print_vendspec_cap(const pcireg_t *regs, int capoff)
1525 1.118 msaitoh {
1526 1.118 msaitoh uint16_t caps;
1527 1.118 msaitoh
1528 1.118 msaitoh caps = regs[o2i(capoff)] >> PCI_VENDORSPECIFIC_SHIFT;
1529 1.118 msaitoh
1530 1.118 msaitoh printf("\n PCI Vendor Specific Capabilities Register\n");
1531 1.118 msaitoh printf(" Capabilities length: 0x%02x\n", caps & 0xff);
1532 1.118 msaitoh }
1533 1.118 msaitoh
1534 1.118 msaitoh static void
1535 1.118 msaitoh pci_conf_print_debugport_cap(const pcireg_t *regs, int capoff)
1536 1.118 msaitoh {
1537 1.118 msaitoh pcireg_t val;
1538 1.118 msaitoh
1539 1.118 msaitoh val = regs[o2i(capoff + PCI_DEBUG_BASER)];
1540 1.118 msaitoh
1541 1.118 msaitoh printf("\n Debugport Capability Register\n");
1542 1.118 msaitoh printf(" Debug base Register: 0x%04x\n",
1543 1.118 msaitoh val >> PCI_DEBUG_BASER_SHIFT);
1544 1.118 msaitoh printf(" port offset: 0x%04x\n",
1545 1.118 msaitoh (val & PCI_DEBUG_PORTOFF_MASK) >> PCI_DEBUG_PORTOFF_SHIFT);
1546 1.118 msaitoh printf(" BAR number: %u\n",
1547 1.118 msaitoh (val & PCI_DEBUG_BARNUM_MASK) >> PCI_DEBUG_BARNUM_SHIFT);
1548 1.118 msaitoh }
1549 1.118 msaitoh
1550 1.115 msaitoh /* XXX pci_conf_print_cpci_rsrcctl_cap */
1551 1.115 msaitoh /* XXX pci_conf_print_hotplug_cap */
1552 1.118 msaitoh
1553 1.118 msaitoh static void
1554 1.118 msaitoh pci_conf_print_subsystem_cap(const pcireg_t *regs, int capoff)
1555 1.118 msaitoh {
1556 1.118 msaitoh pcireg_t reg;
1557 1.118 msaitoh
1558 1.118 msaitoh reg = regs[o2i(capoff + PCI_CAP_SUBSYS_ID)];
1559 1.118 msaitoh
1560 1.118 msaitoh printf("\n Subsystem ID Capability Register\n");
1561 1.215 msaitoh printf(" Subsystem ID: 0x%08x\n", reg);
1562 1.118 msaitoh }
1563 1.118 msaitoh
1564 1.115 msaitoh /* XXX pci_conf_print_agp8_cap */
1565 1.192 msaitoh static void
1566 1.192 msaitoh pci_conf_print_secure_cap(const pcireg_t *regs, int capoff)
1567 1.192 msaitoh {
1568 1.192 msaitoh pcireg_t reg, reg2, val;
1569 1.192 msaitoh bool havemisc1;
1570 1.192 msaitoh
1571 1.192 msaitoh printf("\n Secure Capability Register\n");
1572 1.192 msaitoh reg = regs[o2i(capoff + PCI_SECURE_CAP)];
1573 1.193 msaitoh printf(" Capability Register: 0x%04x\n", reg >> 16);
1574 1.192 msaitoh val = __SHIFTOUT(reg, PCI_SECURE_CAP_TYPE);
1575 1.193 msaitoh printf(" Capability block type: ");
1576 1.192 msaitoh /* I know IOMMU Only */
1577 1.192 msaitoh if (val == PCI_SECURE_CAP_TYPE_IOMMU)
1578 1.192 msaitoh printf("IOMMU\n");
1579 1.192 msaitoh else {
1580 1.192 msaitoh printf("0x%x(unknown)\n", val);
1581 1.192 msaitoh return;
1582 1.192 msaitoh }
1583 1.192 msaitoh
1584 1.192 msaitoh val = __SHIFTOUT(reg, PCI_SECURE_CAP_REV);
1585 1.193 msaitoh printf(" Capability revision: 0x%02x ", val);
1586 1.192 msaitoh if (val == PCI_SECURE_CAP_REV_IOMMU)
1587 1.193 msaitoh printf("(IOMMU)\n");
1588 1.192 msaitoh else {
1589 1.192 msaitoh printf("(unknown)\n");
1590 1.192 msaitoh return;
1591 1.192 msaitoh }
1592 1.192 msaitoh onoff("IOTLB support", reg, PCI_SECURE_CAP_IOTLBSUP);
1593 1.192 msaitoh onoff("HyperTransport tunnel translation support", reg,
1594 1.192 msaitoh PCI_SECURE_CAP_HTTUNNEL);
1595 1.193 msaitoh onoff("Not present table entries cached", reg, PCI_SECURE_CAP_NPCACHE);
1596 1.192 msaitoh onoff("IOMMU Extended Feature Register support", reg,
1597 1.192 msaitoh PCI_SECURE_CAP_EFRSUP);
1598 1.192 msaitoh onoff("IOMMU Miscellaneous Information Register 1", reg,
1599 1.192 msaitoh PCI_SECURE_CAP_EXT);
1600 1.192 msaitoh havemisc1 = reg & PCI_SECURE_CAP_EXT;
1601 1.215.2.1 martin
1602 1.192 msaitoh reg = regs[o2i(capoff + PCI_SECURE_IOMMU_BAL)];
1603 1.192 msaitoh printf(" Base Address Low Register: 0x%08x\n", reg);
1604 1.192 msaitoh onoff("Enable", reg, PCI_SECURE_IOMMU_BAL_EN);
1605 1.192 msaitoh reg2 = regs[o2i(capoff + PCI_SECURE_IOMMU_BAH)];
1606 1.192 msaitoh printf(" Base Address High Register: 0x%08x\n", reg2);
1607 1.215 msaitoh printf(" Base Address: 0x%016" PRIx64 "\n",
1608 1.192 msaitoh ((uint64_t)reg2 << 32)
1609 1.192 msaitoh | (reg & (PCI_SECURE_IOMMU_BAL_H | PCI_SECURE_IOMMU_BAL_L)));
1610 1.215.2.1 martin
1611 1.192 msaitoh reg = regs[o2i(capoff + PCI_SECURE_IOMMU_RANGE)];
1612 1.192 msaitoh printf(" IOMMU Range Register: 0x%08x\n", reg);
1613 1.192 msaitoh printf(" HyperTransport UnitID: 0x%02x\n",
1614 1.192 msaitoh (uint32_t)__SHIFTOUT(reg, PCI_SECURE_IOMMU_RANGE_UNITID));
1615 1.192 msaitoh onoff("Range valid", reg, PCI_SECURE_IOMMU_RANGE_RNGVALID);
1616 1.192 msaitoh printf(" Device range bus number: 0x%02x\n",
1617 1.192 msaitoh (uint32_t)__SHIFTOUT(reg, PCI_SECURE_IOMMU_RANGE_BUSNUM));
1618 1.192 msaitoh printf(" First device: 0x%04x\n",
1619 1.192 msaitoh (uint32_t)__SHIFTOUT(reg, PCI_SECURE_IOMMU_RANGE_FIRSTDEV));
1620 1.192 msaitoh printf(" Last device: 0x%04x\n",
1621 1.192 msaitoh (uint32_t)__SHIFTOUT(reg, PCI_SECURE_IOMMU_RANGE_LASTDEV));
1622 1.192 msaitoh
1623 1.192 msaitoh reg = regs[o2i(capoff + PCI_SECURE_IOMMU_MISC0)];
1624 1.192 msaitoh printf(" Miscellaneous Information Register 0: 0x%08x\n", reg);
1625 1.193 msaitoh printf(" MSI Message number: 0x%02x\n",
1626 1.192 msaitoh (uint32_t)__SHIFTOUT(reg, PCI_SECURE_IOMMU_MISC0_MSINUM));
1627 1.192 msaitoh val = __SHIFTOUT(reg, PCI_SECURE_IOMMU_MISC0_GVASIZE);
1628 1.192 msaitoh printf(" Guest Virtual Address size: ");
1629 1.192 msaitoh if (val == PCI_SECURE_IOMMU_MISC0_GVASIZE_48B)
1630 1.192 msaitoh printf("48bits\n");
1631 1.192 msaitoh else
1632 1.192 msaitoh printf("0x%x(unknown)\n", val);
1633 1.192 msaitoh val = __SHIFTOUT(reg, PCI_SECURE_IOMMU_MISC0_PASIZE);
1634 1.192 msaitoh printf(" Physical Address size: %dbits\n", val);
1635 1.192 msaitoh val = __SHIFTOUT(reg, PCI_SECURE_IOMMU_MISC0_VASIZE);
1636 1.192 msaitoh printf(" Virtual Address size: %dbits\n", val);
1637 1.192 msaitoh onoff("ATS response address range reserved", reg,
1638 1.192 msaitoh PCI_SECURE_IOMMU_MISC0_ATSRESV);
1639 1.192 msaitoh printf(" Peripheral Page Request MSI Message number: 0x%02x\n",
1640 1.192 msaitoh (uint32_t)__SHIFTOUT(reg, PCI_SECURE_IOMMU_MISC0_MISNPPR));
1641 1.192 msaitoh
1642 1.192 msaitoh if (!havemisc1)
1643 1.192 msaitoh return;
1644 1.215.2.1 martin
1645 1.192 msaitoh reg = regs[o2i(capoff + PCI_SECURE_IOMMU_MISC1)];
1646 1.192 msaitoh printf(" Miscellaneous Information Register 1: 0x%08x\n", reg);
1647 1.192 msaitoh printf(" MSI Message number (GA): 0x%02x\n",
1648 1.192 msaitoh (uint32_t)__SHIFTOUT(reg, PCI_SECURE_IOMMU_MISC1_MSINUM));
1649 1.192 msaitoh }
1650 1.115 msaitoh
1651 1.51 drochner static void
1652 1.99 msaitoh pci_print_pcie_L0s_latency(uint32_t val)
1653 1.99 msaitoh {
1654 1.99 msaitoh
1655 1.99 msaitoh switch (val) {
1656 1.99 msaitoh case 0x0:
1657 1.99 msaitoh printf("Less than 64ns\n");
1658 1.99 msaitoh break;
1659 1.99 msaitoh case 0x1:
1660 1.99 msaitoh case 0x2:
1661 1.99 msaitoh case 0x3:
1662 1.99 msaitoh printf("%dns to less than %dns\n", 32 << val, 32 << (val + 1));
1663 1.99 msaitoh break;
1664 1.99 msaitoh case 0x4:
1665 1.99 msaitoh printf("512ns to less than 1us\n");
1666 1.99 msaitoh break;
1667 1.99 msaitoh case 0x5:
1668 1.99 msaitoh printf("1us to less than 2us\n");
1669 1.99 msaitoh break;
1670 1.99 msaitoh case 0x6:
1671 1.99 msaitoh printf("2us - 4us\n");
1672 1.99 msaitoh break;
1673 1.99 msaitoh case 0x7:
1674 1.99 msaitoh printf("More than 4us\n");
1675 1.99 msaitoh break;
1676 1.99 msaitoh }
1677 1.99 msaitoh }
1678 1.99 msaitoh
1679 1.99 msaitoh static void
1680 1.99 msaitoh pci_print_pcie_L1_latency(uint32_t val)
1681 1.99 msaitoh {
1682 1.99 msaitoh
1683 1.99 msaitoh switch (val) {
1684 1.99 msaitoh case 0x0:
1685 1.99 msaitoh printf("Less than 1us\n");
1686 1.99 msaitoh break;
1687 1.99 msaitoh case 0x6:
1688 1.99 msaitoh printf("32us - 64us\n");
1689 1.99 msaitoh break;
1690 1.99 msaitoh case 0x7:
1691 1.99 msaitoh printf("More than 64us\n");
1692 1.99 msaitoh break;
1693 1.99 msaitoh default:
1694 1.99 msaitoh printf("%dus to less than %dus\n", 1 << (val - 1), 1 << val);
1695 1.99 msaitoh break;
1696 1.99 msaitoh }
1697 1.99 msaitoh }
1698 1.99 msaitoh
1699 1.99 msaitoh static void
1700 1.105 msaitoh pci_print_pcie_compl_timeout(uint32_t val)
1701 1.105 msaitoh {
1702 1.105 msaitoh
1703 1.105 msaitoh switch (val) {
1704 1.105 msaitoh case 0x0:
1705 1.105 msaitoh printf("50us to 50ms\n");
1706 1.105 msaitoh break;
1707 1.105 msaitoh case 0x5:
1708 1.105 msaitoh printf("16ms to 55ms\n");
1709 1.105 msaitoh break;
1710 1.105 msaitoh case 0x6:
1711 1.105 msaitoh printf("65ms to 210ms\n");
1712 1.105 msaitoh break;
1713 1.105 msaitoh case 0x9:
1714 1.105 msaitoh printf("260ms to 900ms\n");
1715 1.105 msaitoh break;
1716 1.105 msaitoh case 0xa:
1717 1.105 msaitoh printf("1s to 3.5s\n");
1718 1.105 msaitoh break;
1719 1.105 msaitoh default:
1720 1.105 msaitoh printf("unknown %u value\n", val);
1721 1.105 msaitoh break;
1722 1.105 msaitoh }
1723 1.105 msaitoh }
1724 1.105 msaitoh
1725 1.215.2.5 martin static const char * const pcie_linkspeeds[] = {
1726 1.215.2.5 martin "2.5", "5.0", "8.0", "16.0", "32.0"
1727 1.215.2.5 martin };
1728 1.146 msaitoh
1729 1.185 msaitoh /*
1730 1.185 msaitoh * Print link speed. This function is used for the following register bits:
1731 1.185 msaitoh * Maximum Link Speed in LCAP
1732 1.185 msaitoh * Current Link Speed in LCSR
1733 1.185 msaitoh * Target Link Speed in LCSR2
1734 1.185 msaitoh * All of above bitfield's values start from 1.
1735 1.186 msaitoh * For LCSR2, 0 is allowed for a device which supports 2.5GT/s only (and
1736 1.186 msaitoh * this check also works for devices which compliant to versions of the base
1737 1.186 msaitoh * specification prior to 3.0.
1738 1.185 msaitoh */
1739 1.146 msaitoh static void
1740 1.186 msaitoh pci_print_pcie_linkspeed(int regnum, pcireg_t val)
1741 1.146 msaitoh {
1742 1.146 msaitoh
1743 1.186 msaitoh if ((regnum == PCIE_LCSR2) && (val == 0))
1744 1.186 msaitoh printf("2.5GT/s\n");
1745 1.186 msaitoh else if ((val < 1) || (val > __arraycount(pcie_linkspeeds)))
1746 1.146 msaitoh printf("unknown value (%u)\n", val);
1747 1.146 msaitoh else
1748 1.185 msaitoh printf("%sGT/s\n", pcie_linkspeeds[val - 1]);
1749 1.146 msaitoh }
1750 1.146 msaitoh
1751 1.185 msaitoh /*
1752 1.185 msaitoh * Print link speed "vector".
1753 1.185 msaitoh * This function is used for the following register bits:
1754 1.185 msaitoh * Supported Link Speeds Vector in LCAP2
1755 1.185 msaitoh * Lower SKP OS Generation Supported Speed Vector in LCAP2
1756 1.185 msaitoh * Lower SKP OS Reception Supported Speed Vector in LCAP2
1757 1.185 msaitoh * Enable Lower SKP OS Generation Vector in LCTL3
1758 1.185 msaitoh * All of above bitfield's values start from 0.
1759 1.185 msaitoh */
1760 1.146 msaitoh static void
1761 1.146 msaitoh pci_print_pcie_linkspeedvector(pcireg_t val)
1762 1.146 msaitoh {
1763 1.146 msaitoh unsigned int i;
1764 1.146 msaitoh
1765 1.146 msaitoh /* Start from 0 */
1766 1.146 msaitoh for (i = 0; i < 16; i++)
1767 1.146 msaitoh if (((val >> i) & 0x01) != 0) {
1768 1.146 msaitoh if (i >= __arraycount(pcie_linkspeeds))
1769 1.157 msaitoh printf(" unknown vector (0x%x)", 1 << i);
1770 1.146 msaitoh else
1771 1.146 msaitoh printf(" %sGT/s", pcie_linkspeeds[i]);
1772 1.146 msaitoh }
1773 1.146 msaitoh }
1774 1.146 msaitoh
1775 1.105 msaitoh static void
1776 1.157 msaitoh pci_print_pcie_link_deemphasis(pcireg_t val)
1777 1.157 msaitoh {
1778 1.157 msaitoh switch (val) {
1779 1.157 msaitoh case 0:
1780 1.157 msaitoh printf("-6dB");
1781 1.157 msaitoh break;
1782 1.157 msaitoh case 1:
1783 1.157 msaitoh printf("-3.5dB");
1784 1.157 msaitoh break;
1785 1.157 msaitoh default:
1786 1.157 msaitoh printf("(reserved value)");
1787 1.157 msaitoh }
1788 1.157 msaitoh }
1789 1.157 msaitoh
1790 1.215.2.6 martin static const struct _pcie_link_preset_preshoot_deemphasis {
1791 1.215.2.6 martin const char *preshoot;
1792 1.215.2.6 martin const char *deemphasis;
1793 1.215.2.6 martin } pcie_link_preset_preshoot_deemphasis[] = {
1794 1.215.2.6 martin { "0.0", "-6.0+-1.5" }, /* P0 */
1795 1.215.2.6 martin { "0.0", "-3.5+-1" }, /* P1 */
1796 1.215.2.6 martin { "0.0", "-4.4+-1.5" }, /* P2 */
1797 1.215.2.6 martin { "0.0", "-2.5+-1" }, /* P3 */
1798 1.215.2.6 martin { "0.0", "0.0" }, /* P4 */
1799 1.215.2.6 martin { "1.9+-1", "0.0" }, /* P5 */
1800 1.215.2.6 martin { "2.5+-1", "0.0" }, /* P6 */
1801 1.215.2.6 martin { "3.5+-1", "-6.0+-1.5" }, /* P7 */
1802 1.215.2.6 martin { "3.5+-1", "-3.5+-1" }, /* P8 */
1803 1.215.2.6 martin { "3.5+-1", "0.0" }, /* P9 */
1804 1.215.2.6 martin { "0.0", NULL } /* P10 */
1805 1.215.2.6 martin };
1806 1.215.2.6 martin
1807 1.215.2.6 martin static void
1808 1.215.2.6 martin pci_print_pcie_link_preset_preshoot_deemphasis(pcireg_t val)
1809 1.215.2.6 martin {
1810 1.215.2.6 martin const char *deemphasis;
1811 1.215.2.6 martin
1812 1.215.2.6 martin if (val >= __arraycount(pcie_link_preset_preshoot_deemphasis)) {
1813 1.215.2.6 martin /*
1814 1.215.2.6 martin * This may be printed because the default value of some
1815 1.215.2.6 martin * register fields is 0b1111.
1816 1.215.2.6 martin */
1817 1.215.2.6 martin printf("reserved value (0x%x)", val);
1818 1.215.2.6 martin return;
1819 1.215.2.6 martin }
1820 1.215.2.6 martin
1821 1.215.2.6 martin printf("Preshoot %sdB",
1822 1.215.2.6 martin pcie_link_preset_preshoot_deemphasis[val].preshoot);
1823 1.215.2.6 martin deemphasis = pcie_link_preset_preshoot_deemphasis[val].deemphasis;
1824 1.215.2.6 martin
1825 1.215.2.6 martin if (deemphasis != NULL)
1826 1.215.2.6 martin printf(", De-emphasis %sdB", deemphasis);
1827 1.215.2.6 martin }
1828 1.215.2.6 martin
1829 1.157 msaitoh static void
1830 1.72 joerg pci_conf_print_pcie_cap(const pcireg_t *regs, int capoff)
1831 1.72 joerg {
1832 1.101 msaitoh pcireg_t reg; /* for each register */
1833 1.101 msaitoh pcireg_t val; /* for each bitfield */
1834 1.72 joerg bool check_slot = false;
1835 1.209 msaitoh unsigned int pcie_devtype;
1836 1.181 msaitoh bool check_upstreamport = false;
1837 1.105 msaitoh unsigned int pciever;
1838 1.157 msaitoh unsigned int i;
1839 1.72 joerg
1840 1.72 joerg printf("\n PCI Express Capabilities Register\n");
1841 1.99 msaitoh /* Capability Register */
1842 1.101 msaitoh reg = regs[o2i(capoff)];
1843 1.157 msaitoh printf(" Capability register: 0x%04x\n", reg >> 16);
1844 1.200 msaitoh pciever = (unsigned int)(PCIE_XCAP_VER(reg));
1845 1.105 msaitoh printf(" Capability version: %u\n", pciever);
1846 1.99 msaitoh printf(" Device type: ");
1847 1.209 msaitoh pcie_devtype = PCIE_XCAP_TYPE(reg);
1848 1.209 msaitoh switch (pcie_devtype) {
1849 1.159 msaitoh case PCIE_XCAP_TYPE_PCIE_DEV: /* 0x0 */
1850 1.72 joerg printf("PCI Express Endpoint device\n");
1851 1.181 msaitoh check_upstreamport = true;
1852 1.72 joerg break;
1853 1.159 msaitoh case PCIE_XCAP_TYPE_PCI_DEV: /* 0x1 */
1854 1.75 jmcneill printf("Legacy PCI Express Endpoint device\n");
1855 1.181 msaitoh check_upstreamport = true;
1856 1.72 joerg break;
1857 1.215.2.5 martin case PCIE_XCAP_TYPE_RP: /* 0x4 */
1858 1.72 joerg printf("Root Port of PCI Express Root Complex\n");
1859 1.72 joerg check_slot = true;
1860 1.72 joerg break;
1861 1.159 msaitoh case PCIE_XCAP_TYPE_UP: /* 0x5 */
1862 1.72 joerg printf("Upstream Port of PCI Express Switch\n");
1863 1.181 msaitoh check_upstreamport = true;
1864 1.72 joerg break;
1865 1.159 msaitoh case PCIE_XCAP_TYPE_DOWN: /* 0x6 */
1866 1.72 joerg printf("Downstream Port of PCI Express Switch\n");
1867 1.72 joerg check_slot = true;
1868 1.72 joerg break;
1869 1.159 msaitoh case PCIE_XCAP_TYPE_PCIE2PCI: /* 0x7 */
1870 1.72 joerg printf("PCI Express to PCI/PCI-X Bridge\n");
1871 1.181 msaitoh check_upstreamport = true;
1872 1.72 joerg break;
1873 1.159 msaitoh case PCIE_XCAP_TYPE_PCI2PCIE: /* 0x8 */
1874 1.72 joerg printf("PCI/PCI-X to PCI Express Bridge\n");
1875 1.181 msaitoh /* Upstream port is not PCIe */
1876 1.179 msaitoh check_slot = true;
1877 1.72 joerg break;
1878 1.215.2.5 martin case PCIE_XCAP_TYPE_RCIEP: /* 0x9 */
1879 1.96 msaitoh printf("Root Complex Integrated Endpoint\n");
1880 1.96 msaitoh break;
1881 1.215.2.5 martin case PCIE_XCAP_TYPE_RC_EVNTC: /* 0xa */
1882 1.180 msaitoh printf("Root Complex Event Collector\n");
1883 1.96 msaitoh break;
1884 1.72 joerg default:
1885 1.72 joerg printf("unknown\n");
1886 1.72 joerg break;
1887 1.72 joerg }
1888 1.127 msaitoh onoff("Slot implemented", reg, PCIE_XCAP_SI);
1889 1.157 msaitoh printf(" Interrupt Message Number: 0x%02x\n",
1890 1.159 msaitoh (unsigned int)__SHIFTOUT(reg, PCIE_XCAP_IRQ));
1891 1.99 msaitoh
1892 1.99 msaitoh /* Device Capability Register */
1893 1.103 msaitoh reg = regs[o2i(capoff + PCIE_DCAP)];
1894 1.101 msaitoh printf(" Device Capabilities Register: 0x%08x\n", reg);
1895 1.99 msaitoh printf(" Max Payload Size Supported: %u bytes max\n",
1896 1.116 msaitoh 128 << (unsigned int)(reg & PCIE_DCAP_MAX_PAYLOAD));
1897 1.99 msaitoh printf(" Phantom Functions Supported: ");
1898 1.159 msaitoh switch (__SHIFTOUT(reg, PCIE_DCAP_PHANTOM_FUNCS)) {
1899 1.99 msaitoh case 0x0:
1900 1.99 msaitoh printf("not available\n");
1901 1.99 msaitoh break;
1902 1.99 msaitoh case 0x1:
1903 1.99 msaitoh printf("MSB\n");
1904 1.99 msaitoh break;
1905 1.99 msaitoh case 0x2:
1906 1.99 msaitoh printf("two MSB\n");
1907 1.99 msaitoh break;
1908 1.99 msaitoh case 0x3:
1909 1.99 msaitoh printf("All three bits\n");
1910 1.99 msaitoh break;
1911 1.99 msaitoh }
1912 1.99 msaitoh printf(" Extended Tag Field Supported: %dbit\n",
1913 1.103 msaitoh (reg & PCIE_DCAP_EXT_TAG_FIELD) == 0 ? 5 : 8);
1914 1.99 msaitoh printf(" Endpoint L0 Acceptable Latency: ");
1915 1.159 msaitoh pci_print_pcie_L0s_latency(__SHIFTOUT(reg, PCIE_DCAP_L0S_LATENCY));
1916 1.99 msaitoh printf(" Endpoint L1 Acceptable Latency: ");
1917 1.159 msaitoh pci_print_pcie_L1_latency(__SHIFTOUT(reg, PCIE_DCAP_L1_LATENCY));
1918 1.122 msaitoh onoff("Attention Button Present", reg, PCIE_DCAP_ATTN_BUTTON);
1919 1.122 msaitoh onoff("Attention Indicator Present", reg, PCIE_DCAP_ATTN_IND);
1920 1.112 msaitoh onoff("Power Indicator Present", reg, PCIE_DCAP_PWR_IND);
1921 1.112 msaitoh onoff("Role-Based Error Report", reg, PCIE_DCAP_ROLE_ERR_RPT);
1922 1.181 msaitoh if (check_upstreamport) {
1923 1.181 msaitoh printf(" Captured Slot Power Limit: ");
1924 1.181 msaitoh pci_conf_print_pcie_power(
1925 1.181 msaitoh __SHIFTOUT(reg, PCIE_DCAP_SLOT_PWR_LIM_VAL),
1926 1.181 msaitoh __SHIFTOUT(reg, PCIE_DCAP_SLOT_PWR_LIM_SCALE));
1927 1.181 msaitoh }
1928 1.112 msaitoh onoff("Function-Level Reset Capability", reg, PCIE_DCAP_FLR);
1929 1.99 msaitoh
1930 1.99 msaitoh /* Device Control Register */
1931 1.103 msaitoh reg = regs[o2i(capoff + PCIE_DCSR)];
1932 1.101 msaitoh printf(" Device Control Register: 0x%04x\n", reg & 0xffff);
1933 1.112 msaitoh onoff("Correctable Error Reporting Enable", reg,
1934 1.112 msaitoh PCIE_DCSR_ENA_COR_ERR);
1935 1.112 msaitoh onoff("Non Fatal Error Reporting Enable", reg, PCIE_DCSR_ENA_NFER);
1936 1.112 msaitoh onoff("Fatal Error Reporting Enable", reg, PCIE_DCSR_ENA_FER);
1937 1.112 msaitoh onoff("Unsupported Request Reporting Enable", reg, PCIE_DCSR_ENA_URR);
1938 1.112 msaitoh onoff("Enable Relaxed Ordering", reg, PCIE_DCSR_ENA_RELAX_ORD);
1939 1.99 msaitoh printf(" Max Payload Size: %d byte\n",
1940 1.159 msaitoh 128 << __SHIFTOUT(reg, PCIE_DCSR_MAX_PAYLOAD));
1941 1.112 msaitoh onoff("Extended Tag Field Enable", reg, PCIE_DCSR_EXT_TAG_FIELD);
1942 1.112 msaitoh onoff("Phantom Functions Enable", reg, PCIE_DCSR_PHANTOM_FUNCS);
1943 1.112 msaitoh onoff("Aux Power PM Enable", reg, PCIE_DCSR_AUX_POWER_PM);
1944 1.112 msaitoh onoff("Enable No Snoop", reg, PCIE_DCSR_ENA_NO_SNOOP);
1945 1.99 msaitoh printf(" Max Read Request Size: %d byte\n",
1946 1.159 msaitoh 128 << __SHIFTOUT(reg, PCIE_DCSR_MAX_READ_REQ));
1947 1.215.2.3 martin if (pcie_devtype == PCIE_XCAP_TYPE_PCIE2PCI)
1948 1.215.2.3 martin onoff("Bridge Config Retry Enable", reg,
1949 1.215.2.3 martin PCIE_DCSR_BRDG_CFG_RETRY);
1950 1.99 msaitoh
1951 1.99 msaitoh /* Device Status Register */
1952 1.103 msaitoh reg = regs[o2i(capoff + PCIE_DCSR)];
1953 1.101 msaitoh printf(" Device Status Register: 0x%04x\n", reg >> 16);
1954 1.112 msaitoh onoff("Correctable Error Detected", reg, PCIE_DCSR_CED);
1955 1.112 msaitoh onoff("Non Fatal Error Detected", reg, PCIE_DCSR_NFED);
1956 1.112 msaitoh onoff("Fatal Error Detected", reg, PCIE_DCSR_FED);
1957 1.112 msaitoh onoff("Unsupported Request Detected", reg, PCIE_DCSR_URD);
1958 1.112 msaitoh onoff("Aux Power Detected", reg, PCIE_DCSR_AUX_PWR);
1959 1.112 msaitoh onoff("Transaction Pending", reg, PCIE_DCSR_TRANSACTION_PND);
1960 1.159 msaitoh onoff("Emergency Power Reduction Detected", reg, PCIE_DCSR_EMGPWRREDD);
1961 1.99 msaitoh
1962 1.210 msaitoh if (PCIE_HAS_LINKREGS(pcie_devtype)) {
1963 1.105 msaitoh /* Link Capability Register */
1964 1.105 msaitoh reg = regs[o2i(capoff + PCIE_LCAP)];
1965 1.105 msaitoh printf(" Link Capabilities Register: 0x%08x\n", reg);
1966 1.105 msaitoh printf(" Maximum Link Speed: ");
1967 1.186 msaitoh pci_print_pcie_linkspeed(PCIE_LCAP, reg & PCIE_LCAP_MAX_SPEED);
1968 1.105 msaitoh printf(" Maximum Link Width: x%u lanes\n",
1969 1.159 msaitoh (unsigned int)__SHIFTOUT(reg, PCIE_LCAP_MAX_WIDTH));
1970 1.105 msaitoh printf(" Active State PM Support: ");
1971 1.159 msaitoh switch (__SHIFTOUT(reg, PCIE_LCAP_ASPM)) {
1972 1.145 msaitoh case 0x0:
1973 1.145 msaitoh printf("No ASPM support\n");
1974 1.145 msaitoh break;
1975 1.105 msaitoh case 0x1:
1976 1.145 msaitoh printf("L0s supported\n");
1977 1.145 msaitoh break;
1978 1.145 msaitoh case 0x2:
1979 1.145 msaitoh printf("L1 supported\n");
1980 1.105 msaitoh break;
1981 1.105 msaitoh case 0x3:
1982 1.105 msaitoh printf("L0s and L1 supported\n");
1983 1.105 msaitoh break;
1984 1.105 msaitoh }
1985 1.105 msaitoh printf(" L0 Exit Latency: ");
1986 1.159 msaitoh pci_print_pcie_L0s_latency(__SHIFTOUT(reg,PCIE_LCAP_L0S_EXIT));
1987 1.105 msaitoh printf(" L1 Exit Latency: ");
1988 1.159 msaitoh pci_print_pcie_L1_latency(__SHIFTOUT(reg, PCIE_LCAP_L1_EXIT));
1989 1.159 msaitoh printf(" Port Number: %u\n",
1990 1.159 msaitoh (unsigned int)__SHIFTOUT(reg, PCIE_LCAP_PORT));
1991 1.117 msaitoh onoff("Clock Power Management", reg, PCIE_LCAP_CLOCK_PM);
1992 1.117 msaitoh onoff("Surprise Down Error Report", reg,
1993 1.117 msaitoh PCIE_LCAP_SURPRISE_DOWN);
1994 1.117 msaitoh onoff("Data Link Layer Link Active", reg, PCIE_LCAP_DL_ACTIVE);
1995 1.117 msaitoh onoff("Link BW Notification Capable", reg,
1996 1.117 msaitoh PCIE_LCAP_LINK_BW_NOTIFY);
1997 1.117 msaitoh onoff("ASPM Optionally Compliance", reg,
1998 1.117 msaitoh PCIE_LCAP_ASPM_COMPLIANCE);
1999 1.105 msaitoh
2000 1.105 msaitoh /* Link Control Register */
2001 1.105 msaitoh reg = regs[o2i(capoff + PCIE_LCSR)];
2002 1.105 msaitoh printf(" Link Control Register: 0x%04x\n", reg & 0xffff);
2003 1.105 msaitoh printf(" Active State PM Control: ");
2004 1.159 msaitoh switch (reg & (PCIE_LCSR_ASPM_L1 | PCIE_LCSR_ASPM_L0S)) {
2005 1.105 msaitoh case 0:
2006 1.105 msaitoh printf("disabled\n");
2007 1.105 msaitoh break;
2008 1.105 msaitoh case 1:
2009 1.105 msaitoh printf("L0s Entry Enabled\n");
2010 1.105 msaitoh break;
2011 1.105 msaitoh case 2:
2012 1.105 msaitoh printf("L1 Entry Enabled\n");
2013 1.105 msaitoh break;
2014 1.105 msaitoh case 3:
2015 1.105 msaitoh printf("L0s and L1 Entry Enabled\n");
2016 1.105 msaitoh break;
2017 1.105 msaitoh }
2018 1.112 msaitoh onoff2("Read Completion Boundary Control", reg, PCIE_LCSR_RCB,
2019 1.112 msaitoh "128bytes", "64bytes");
2020 1.112 msaitoh onoff("Link Disable", reg, PCIE_LCSR_LINK_DIS);
2021 1.112 msaitoh onoff("Retrain Link", reg, PCIE_LCSR_RETRAIN);
2022 1.112 msaitoh onoff("Common Clock Configuration", reg, PCIE_LCSR_COMCLKCFG);
2023 1.112 msaitoh onoff("Extended Synch", reg, PCIE_LCSR_EXTNDSYNC);
2024 1.112 msaitoh onoff("Enable Clock Power Management", reg, PCIE_LCSR_ENCLKPM);
2025 1.159 msaitoh onoff("Hardware Autonomous Width Disable", reg,PCIE_LCSR_HAWD);
2026 1.112 msaitoh onoff("Link Bandwidth Management Interrupt Enable", reg,
2027 1.112 msaitoh PCIE_LCSR_LBMIE);
2028 1.112 msaitoh onoff("Link Autonomous Bandwidth Interrupt Enable", reg,
2029 1.112 msaitoh PCIE_LCSR_LABIE);
2030 1.146 msaitoh printf(" DRS Signaling Control: ");
2031 1.159 msaitoh switch (__SHIFTOUT(reg, PCIE_LCSR_DRSSGNL)) {
2032 1.146 msaitoh case 0:
2033 1.146 msaitoh printf("not reported\n");
2034 1.146 msaitoh break;
2035 1.146 msaitoh case 1:
2036 1.146 msaitoh printf("Interrupt Enabled\n");
2037 1.146 msaitoh break;
2038 1.146 msaitoh case 2:
2039 1.146 msaitoh printf("DRS to FRS Signaling Enabled\n");
2040 1.146 msaitoh break;
2041 1.146 msaitoh default:
2042 1.146 msaitoh printf("reserved\n");
2043 1.146 msaitoh break;
2044 1.146 msaitoh }
2045 1.105 msaitoh
2046 1.105 msaitoh /* Link Status Register */
2047 1.105 msaitoh reg = regs[o2i(capoff + PCIE_LCSR)];
2048 1.105 msaitoh printf(" Link Status Register: 0x%04x\n", reg >> 16);
2049 1.105 msaitoh printf(" Negotiated Link Speed: ");
2050 1.186 msaitoh pci_print_pcie_linkspeed(PCIE_LCSR,
2051 1.186 msaitoh __SHIFTOUT(reg, PCIE_LCSR_LINKSPEED));
2052 1.105 msaitoh printf(" Negotiated Link Width: x%u lanes\n",
2053 1.159 msaitoh (unsigned int)__SHIFTOUT(reg, PCIE_LCSR_NLW));
2054 1.112 msaitoh onoff("Training Error", reg, PCIE_LCSR_LINKTRAIN_ERR);
2055 1.112 msaitoh onoff("Link Training", reg, PCIE_LCSR_LINKTRAIN);
2056 1.112 msaitoh onoff("Slot Clock Configuration", reg, PCIE_LCSR_SLOTCLKCFG);
2057 1.112 msaitoh onoff("Data Link Layer Link Active", reg, PCIE_LCSR_DLACTIVE);
2058 1.112 msaitoh onoff("Link Bandwidth Management Status", reg,
2059 1.112 msaitoh PCIE_LCSR_LINK_BW_MGMT);
2060 1.112 msaitoh onoff("Link Autonomous Bandwidth Status", reg,
2061 1.112 msaitoh PCIE_LCSR_LINK_AUTO_BW);
2062 1.86 matt }
2063 1.99 msaitoh
2064 1.102 msaitoh if (check_slot == true) {
2065 1.187 msaitoh pcireg_t slcap;
2066 1.215.2.1 martin
2067 1.101 msaitoh /* Slot Capability Register */
2068 1.187 msaitoh slcap = reg = regs[o2i(capoff + PCIE_SLCAP)];
2069 1.157 msaitoh printf(" Slot Capability Register: 0x%08x\n", reg);
2070 1.117 msaitoh onoff("Attention Button Present", reg, PCIE_SLCAP_ABP);
2071 1.117 msaitoh onoff("Power Controller Present", reg, PCIE_SLCAP_PCP);
2072 1.117 msaitoh onoff("MRL Sensor Present", reg, PCIE_SLCAP_MSP);
2073 1.117 msaitoh onoff("Attention Indicator Present", reg, PCIE_SLCAP_AIP);
2074 1.117 msaitoh onoff("Power Indicator Present", reg, PCIE_SLCAP_PIP);
2075 1.117 msaitoh onoff("Hot-Plug Surprise", reg, PCIE_SLCAP_HPS);
2076 1.117 msaitoh onoff("Hot-Plug Capable", reg, PCIE_SLCAP_HPC);
2077 1.181 msaitoh printf(" Slot Power Limit Value: ");
2078 1.181 msaitoh pci_conf_print_pcie_power(__SHIFTOUT(reg, PCIE_SLCAP_SPLV),
2079 1.181 msaitoh __SHIFTOUT(reg, PCIE_SLCAP_SPLS));
2080 1.117 msaitoh onoff("Electromechanical Interlock Present", reg,
2081 1.117 msaitoh PCIE_SLCAP_EIP);
2082 1.117 msaitoh onoff("No Command Completed Support", reg, PCIE_SLCAP_NCCS);
2083 1.101 msaitoh printf(" Physical Slot Number: %d\n",
2084 1.103 msaitoh (unsigned int)(reg & PCIE_SLCAP_PSN) >> 19);
2085 1.101 msaitoh
2086 1.101 msaitoh /* Slot Control Register */
2087 1.103 msaitoh reg = regs[o2i(capoff + PCIE_SLCSR)];
2088 1.175 msaitoh printf(" Slot Control Register: 0x%04x\n", reg & 0xffff);
2089 1.117 msaitoh onoff("Attention Button Pressed Enabled", reg, PCIE_SLCSR_ABE);
2090 1.117 msaitoh onoff("Power Fault Detected Enabled", reg, PCIE_SLCSR_PFE);
2091 1.117 msaitoh onoff("MRL Sensor Changed Enabled", reg, PCIE_SLCSR_MSE);
2092 1.172 msaitoh onoff("Presence Detect Changed Enabled", reg, PCIE_SLCSR_PDE);
2093 1.117 msaitoh onoff("Command Completed Interrupt Enabled", reg,
2094 1.117 msaitoh PCIE_SLCSR_CCE);
2095 1.117 msaitoh onoff("Hot-Plug Interrupt Enabled", reg, PCIE_SLCSR_HPE);
2096 1.187 msaitoh /*
2097 1.187 msaitoh * For Attention Indicator Control and Power Indicator Control,
2098 1.187 msaitoh * it's allowed to be a read only value 0 if corresponding
2099 1.187 msaitoh * capability register bit is 0.
2100 1.187 msaitoh */
2101 1.187 msaitoh if (slcap & PCIE_SLCAP_AIP) {
2102 1.187 msaitoh printf(" Attention Indicator Control: ");
2103 1.187 msaitoh switch ((reg & PCIE_SLCSR_AIC) >> 6) {
2104 1.187 msaitoh case 0x0:
2105 1.187 msaitoh printf("reserved\n");
2106 1.187 msaitoh break;
2107 1.187 msaitoh case PCIE_SLCSR_IND_ON:
2108 1.187 msaitoh printf("on\n");
2109 1.187 msaitoh break;
2110 1.187 msaitoh case PCIE_SLCSR_IND_BLINK:
2111 1.187 msaitoh printf("blink\n");
2112 1.187 msaitoh break;
2113 1.187 msaitoh case PCIE_SLCSR_IND_OFF:
2114 1.187 msaitoh printf("off\n");
2115 1.187 msaitoh break;
2116 1.187 msaitoh }
2117 1.72 joerg }
2118 1.187 msaitoh if (slcap & PCIE_SLCAP_PIP) {
2119 1.187 msaitoh printf(" Power Indicator Control: ");
2120 1.187 msaitoh switch ((reg & PCIE_SLCSR_PIC) >> 8) {
2121 1.187 msaitoh case 0x0:
2122 1.187 msaitoh printf("reserved\n");
2123 1.187 msaitoh break;
2124 1.187 msaitoh case PCIE_SLCSR_IND_ON:
2125 1.187 msaitoh printf("on\n");
2126 1.187 msaitoh break;
2127 1.187 msaitoh case PCIE_SLCSR_IND_BLINK:
2128 1.187 msaitoh printf("blink\n");
2129 1.187 msaitoh break;
2130 1.187 msaitoh case PCIE_SLCSR_IND_OFF:
2131 1.187 msaitoh printf("off\n");
2132 1.187 msaitoh break;
2133 1.187 msaitoh }
2134 1.72 joerg }
2135 1.156 msaitoh printf(" Power Controller Control: Power %s\n",
2136 1.156 msaitoh reg & PCIE_SLCSR_PCC ? "off" : "on");
2137 1.117 msaitoh onoff("Electromechanical Interlock Control",
2138 1.117 msaitoh reg, PCIE_SLCSR_EIC);
2139 1.116 msaitoh onoff("Data Link Layer State Changed Enable", reg,
2140 1.116 msaitoh PCIE_SLCSR_DLLSCE);
2141 1.146 msaitoh onoff("Auto Slot Power Limit Disable", reg,
2142 1.146 msaitoh PCIE_SLCSR_AUTOSPLDIS);
2143 1.101 msaitoh
2144 1.101 msaitoh /* Slot Status Register */
2145 1.157 msaitoh printf(" Slot Status Register: 0x%04x\n", reg >> 16);
2146 1.117 msaitoh onoff("Attention Button Pressed", reg, PCIE_SLCSR_ABP);
2147 1.117 msaitoh onoff("Power Fault Detected", reg, PCIE_SLCSR_PFD);
2148 1.117 msaitoh onoff("MRL Sensor Changed", reg, PCIE_SLCSR_MSC);
2149 1.172 msaitoh onoff("Presence Detect Changed", reg, PCIE_SLCSR_PDC);
2150 1.117 msaitoh onoff("Command Completed", reg, PCIE_SLCSR_CC);
2151 1.117 msaitoh onoff("MRL Open", reg, PCIE_SLCSR_MS);
2152 1.117 msaitoh onoff("Card Present in slot", reg, PCIE_SLCSR_PDS);
2153 1.117 msaitoh onoff("Electromechanical Interlock engaged", reg,
2154 1.117 msaitoh PCIE_SLCSR_EIS);
2155 1.117 msaitoh onoff("Data Link Layer State Changed", reg, PCIE_SLCSR_LACS);
2156 1.101 msaitoh }
2157 1.101 msaitoh
2158 1.209 msaitoh if (PCIE_HAS_ROOTREGS(pcie_devtype)) {
2159 1.101 msaitoh /* Root Control Register */
2160 1.103 msaitoh reg = regs[o2i(capoff + PCIE_RCR)];
2161 1.175 msaitoh printf(" Root Control Register: 0x%04x\n", reg & 0xffff);
2162 1.117 msaitoh onoff("SERR on Correctable Error Enable", reg,
2163 1.117 msaitoh PCIE_RCR_SERR_CER);
2164 1.117 msaitoh onoff("SERR on Non-Fatal Error Enable", reg,
2165 1.117 msaitoh PCIE_RCR_SERR_NFER);
2166 1.117 msaitoh onoff("SERR on Fatal Error Enable", reg, PCIE_RCR_SERR_FER);
2167 1.117 msaitoh onoff("PME Interrupt Enable", reg, PCIE_RCR_PME_IE);
2168 1.117 msaitoh onoff("CRS Software Visibility Enable", reg, PCIE_RCR_CRS_SVE);
2169 1.101 msaitoh
2170 1.101 msaitoh /* Root Capability Register */
2171 1.157 msaitoh printf(" Root Capability Register: 0x%04x\n",
2172 1.101 msaitoh reg >> 16);
2173 1.133 msaitoh onoff("CRS Software Visibility", reg, PCIE_RCR_CRS_SV);
2174 1.101 msaitoh
2175 1.101 msaitoh /* Root Status Register */
2176 1.103 msaitoh reg = regs[o2i(capoff + PCIE_RSR)];
2177 1.157 msaitoh printf(" Root Status Register: 0x%08x\n", reg);
2178 1.157 msaitoh printf(" PME Requester ID: 0x%04x\n",
2179 1.104 msaitoh (unsigned int)(reg & PCIE_RSR_PME_REQESTER));
2180 1.117 msaitoh onoff("PME was asserted", reg, PCIE_RSR_PME_STAT);
2181 1.117 msaitoh onoff("another PME is pending", reg, PCIE_RSR_PME_PEND);
2182 1.72 joerg }
2183 1.105 msaitoh
2184 1.105 msaitoh /* PCIe DW9 to DW14 is for PCIe 2.0 and newer */
2185 1.105 msaitoh if (pciever < 2)
2186 1.105 msaitoh return;
2187 1.105 msaitoh
2188 1.105 msaitoh /* Device Capabilities 2 */
2189 1.105 msaitoh reg = regs[o2i(capoff + PCIE_DCAP2)];
2190 1.105 msaitoh printf(" Device Capabilities 2: 0x%08x\n", reg);
2191 1.157 msaitoh printf(" Completion Timeout Ranges Supported: ");
2192 1.157 msaitoh val = reg & PCIE_DCAP2_COMPT_RANGE;
2193 1.157 msaitoh switch (val) {
2194 1.157 msaitoh case 0:
2195 1.157 msaitoh printf("not supported\n");
2196 1.157 msaitoh break;
2197 1.157 msaitoh default:
2198 1.157 msaitoh for (i = 0; i <= 3; i++) {
2199 1.157 msaitoh if (((val >> i) & 0x01) != 0)
2200 1.157 msaitoh printf("%c", 'A' + i);
2201 1.157 msaitoh }
2202 1.157 msaitoh printf("\n");
2203 1.157 msaitoh }
2204 1.112 msaitoh onoff("Completion Timeout Disable Supported", reg,
2205 1.112 msaitoh PCIE_DCAP2_COMPT_DIS);
2206 1.112 msaitoh onoff("ARI Forwarding Supported", reg, PCIE_DCAP2_ARI_FWD);
2207 1.112 msaitoh onoff("AtomicOp Routing Supported", reg, PCIE_DCAP2_ATOM_ROUT);
2208 1.112 msaitoh onoff("32bit AtomicOp Completer Supported", reg, PCIE_DCAP2_32ATOM);
2209 1.112 msaitoh onoff("64bit AtomicOp Completer Supported", reg, PCIE_DCAP2_64ATOM);
2210 1.112 msaitoh onoff("128-bit CAS Completer Supported", reg, PCIE_DCAP2_128CAS);
2211 1.112 msaitoh onoff("No RO-enabled PR-PR passing", reg, PCIE_DCAP2_NO_ROPR_PASS);
2212 1.112 msaitoh onoff("LTR Mechanism Supported", reg, PCIE_DCAP2_LTR_MEC);
2213 1.157 msaitoh printf(" TPH Completer Supported: ");
2214 1.157 msaitoh switch (__SHIFTOUT(reg, PCIE_DCAP2_TPH_COMP)) {
2215 1.157 msaitoh case 0:
2216 1.172 msaitoh printf("Not supported\n");
2217 1.157 msaitoh break;
2218 1.157 msaitoh case 1:
2219 1.157 msaitoh printf("TPH\n");
2220 1.157 msaitoh break;
2221 1.157 msaitoh case 3:
2222 1.157 msaitoh printf("TPH and Extended TPH\n");
2223 1.157 msaitoh break;
2224 1.157 msaitoh default:
2225 1.157 msaitoh printf("(reserved value)\n");
2226 1.157 msaitoh break;
2227 1.157 msaitoh }
2228 1.145 msaitoh printf(" LN System CLS: ");
2229 1.145 msaitoh switch (__SHIFTOUT(reg, PCIE_DCAP2_LNSYSCLS)) {
2230 1.145 msaitoh case 0x0:
2231 1.145 msaitoh printf("Not supported or not in effect\n");
2232 1.145 msaitoh break;
2233 1.145 msaitoh case 0x1:
2234 1.145 msaitoh printf("64byte cachelines in effect\n");
2235 1.145 msaitoh break;
2236 1.145 msaitoh case 0x2:
2237 1.145 msaitoh printf("128byte cachelines in effect\n");
2238 1.145 msaitoh break;
2239 1.145 msaitoh case 0x3:
2240 1.145 msaitoh printf("Reserved\n");
2241 1.145 msaitoh break;
2242 1.145 msaitoh }
2243 1.215.2.3 martin onoff("10-bit Tag Completer Supported", reg, PCIE_DCAP2_TBT_COMP);
2244 1.215.2.3 martin onoff("10-bit Tag Requester Supported", reg, PCIE_DCAP2_TBT_REQ);
2245 1.105 msaitoh printf(" OBFF Supported: ");
2246 1.190 msaitoh switch (__SHIFTOUT(reg, PCIE_DCAP2_OBFF)) {
2247 1.105 msaitoh case 0x0:
2248 1.105 msaitoh printf("Not supported\n");
2249 1.105 msaitoh break;
2250 1.105 msaitoh case 0x1:
2251 1.105 msaitoh printf("Message only\n");
2252 1.105 msaitoh break;
2253 1.105 msaitoh case 0x2:
2254 1.105 msaitoh printf("WAKE# only\n");
2255 1.105 msaitoh break;
2256 1.105 msaitoh case 0x3:
2257 1.105 msaitoh printf("Both\n");
2258 1.105 msaitoh break;
2259 1.105 msaitoh }
2260 1.112 msaitoh onoff("Extended Fmt Field Supported", reg, PCIE_DCAP2_EXTFMT_FLD);
2261 1.112 msaitoh onoff("End-End TLP Prefix Supported", reg, PCIE_DCAP2_EETLP_PREF);
2262 1.157 msaitoh val = __SHIFTOUT(reg, PCIE_DCAP2_MAX_EETLP);
2263 1.157 msaitoh printf(" Max End-End TLP Prefixes: %u\n", (val == 0) ? 4 : val);
2264 1.152 msaitoh printf(" Emergency Power Reduction Supported: ");
2265 1.152 msaitoh switch (__SHIFTOUT(reg, PCIE_DCAP2_EMGPWRRED)) {
2266 1.152 msaitoh case 0x0:
2267 1.152 msaitoh printf("Not supported\n");
2268 1.152 msaitoh break;
2269 1.152 msaitoh case 0x1:
2270 1.152 msaitoh printf("Device Specific mechanism\n");
2271 1.152 msaitoh break;
2272 1.152 msaitoh case 0x2:
2273 1.152 msaitoh printf("Form Factor spec or Device Specific mechanism\n");
2274 1.152 msaitoh break;
2275 1.152 msaitoh case 0x3:
2276 1.152 msaitoh printf("Reserved\n");
2277 1.152 msaitoh break;
2278 1.152 msaitoh }
2279 1.152 msaitoh onoff("Emergency Power Reduction Initialization Required", reg,
2280 1.152 msaitoh PCIE_DCAP2_EMGPWRRED_INI);
2281 1.146 msaitoh onoff("FRS Supported", reg, PCIE_DCAP2_FRS);
2282 1.105 msaitoh
2283 1.105 msaitoh /* Device Control 2 */
2284 1.105 msaitoh reg = regs[o2i(capoff + PCIE_DCSR2)];
2285 1.105 msaitoh printf(" Device Control 2: 0x%04x\n", reg & 0xffff);
2286 1.105 msaitoh printf(" Completion Timeout Value: ");
2287 1.105 msaitoh pci_print_pcie_compl_timeout(reg & PCIE_DCSR2_COMPT_VAL);
2288 1.117 msaitoh onoff("Completion Timeout Disabled", reg, PCIE_DCSR2_COMPT_DIS);
2289 1.117 msaitoh onoff("ARI Forwarding Enabled", reg, PCIE_DCSR2_ARI_FWD);
2290 1.172 msaitoh onoff("AtomicOp Requester Enabled", reg, PCIE_DCSR2_ATOM_REQ);
2291 1.117 msaitoh onoff("AtomicOp Egress Blocking", reg, PCIE_DCSR2_ATOM_EBLK);
2292 1.117 msaitoh onoff("IDO Request Enabled", reg, PCIE_DCSR2_IDO_REQ);
2293 1.117 msaitoh onoff("IDO Completion Enabled", reg, PCIE_DCSR2_IDO_COMP);
2294 1.117 msaitoh onoff("LTR Mechanism Enabled", reg, PCIE_DCSR2_LTR_MEC);
2295 1.152 msaitoh onoff("Emergency Power Reduction Request", reg,
2296 1.152 msaitoh PCIE_DCSR2_EMGPWRRED_REQ);
2297 1.215.2.3 martin onoff("10-bit Tag Requester Enabled", reg, PCIE_DCSR2_TBT_REQ);
2298 1.105 msaitoh printf(" OBFF: ");
2299 1.190 msaitoh switch (__SHIFTOUT(reg, PCIE_DCSR2_OBFF_EN)) {
2300 1.105 msaitoh case 0x0:
2301 1.105 msaitoh printf("Disabled\n");
2302 1.105 msaitoh break;
2303 1.105 msaitoh case 0x1:
2304 1.105 msaitoh printf("Enabled with Message Signaling Variation A\n");
2305 1.105 msaitoh break;
2306 1.105 msaitoh case 0x2:
2307 1.105 msaitoh printf("Enabled with Message Signaling Variation B\n");
2308 1.105 msaitoh break;
2309 1.105 msaitoh case 0x3:
2310 1.105 msaitoh printf("Enabled using WAKE# signaling\n");
2311 1.105 msaitoh break;
2312 1.105 msaitoh }
2313 1.117 msaitoh onoff("End-End TLP Prefix Blocking on", reg, PCIE_DCSR2_EETLP);
2314 1.105 msaitoh
2315 1.210 msaitoh if (PCIE_HAS_LINKREGS(pcie_devtype)) {
2316 1.157 msaitoh bool drs_supported = false;
2317 1.146 msaitoh
2318 1.105 msaitoh /* Link Capability 2 */
2319 1.105 msaitoh reg = regs[o2i(capoff + PCIE_LCAP2)];
2320 1.157 msaitoh /* If the vector is 0, LCAP2 is not implemented */
2321 1.157 msaitoh if ((reg & PCIE_LCAP2_SUP_LNKSV) != 0) {
2322 1.157 msaitoh printf(" Link Capabilities 2: 0x%08x\n", reg);
2323 1.157 msaitoh printf(" Supported Link Speeds Vector:");
2324 1.157 msaitoh pci_print_pcie_linkspeedvector(
2325 1.157 msaitoh __SHIFTOUT(reg, PCIE_LCAP2_SUP_LNKSV));
2326 1.157 msaitoh printf("\n");
2327 1.157 msaitoh onoff("Crosslink Supported", reg, PCIE_LCAP2_CROSSLNK);
2328 1.157 msaitoh printf(" "
2329 1.157 msaitoh "Lower SKP OS Generation Supported Speed Vector:");
2330 1.157 msaitoh pci_print_pcie_linkspeedvector(
2331 1.157 msaitoh __SHIFTOUT(reg, PCIE_LCAP2_LOWSKPOS_GENSUPPSV));
2332 1.157 msaitoh printf("\n");
2333 1.157 msaitoh printf(" "
2334 1.157 msaitoh "Lower SKP OS Reception Supported Speed Vector:");
2335 1.157 msaitoh pci_print_pcie_linkspeedvector(
2336 1.157 msaitoh __SHIFTOUT(reg, PCIE_LCAP2_LOWSKPOS_RECSUPPSV));
2337 1.157 msaitoh printf("\n");
2338 1.215.2.3 martin onoff("Retimer Presence Detect Supported", reg,
2339 1.215.2.3 martin PCIE_LCAP2_RETIMERPD);
2340 1.157 msaitoh onoff("DRS Supported", reg, PCIE_LCAP2_DRS);
2341 1.157 msaitoh drs_supported = (reg & PCIE_LCAP2_DRS) ? true : false;
2342 1.157 msaitoh }
2343 1.105 msaitoh
2344 1.105 msaitoh /* Link Control 2 */
2345 1.105 msaitoh reg = regs[o2i(capoff + PCIE_LCSR2)];
2346 1.186 msaitoh /* If the vector is 0, LCAP2 is not implemented */
2347 1.105 msaitoh printf(" Link Control 2: 0x%04x\n", reg & 0xffff);
2348 1.105 msaitoh printf(" Target Link Speed: ");
2349 1.186 msaitoh pci_print_pcie_linkspeed(PCIE_LCSR2,
2350 1.186 msaitoh __SHIFTOUT(reg, PCIE_LCSR2_TGT_LSPEED));
2351 1.117 msaitoh onoff("Enter Compliance Enabled", reg, PCIE_LCSR2_ENT_COMPL);
2352 1.117 msaitoh onoff("HW Autonomous Speed Disabled", reg,
2353 1.117 msaitoh PCIE_LCSR2_HW_AS_DIS);
2354 1.157 msaitoh printf(" Selectable De-emphasis: ");
2355 1.157 msaitoh pci_print_pcie_link_deemphasis(
2356 1.157 msaitoh __SHIFTOUT(reg, PCIE_LCSR2_SEL_DEEMP));
2357 1.157 msaitoh printf("\n");
2358 1.105 msaitoh printf(" Transmit Margin: %u\n",
2359 1.215.2.3 martin (unsigned int)__SHIFTOUT(reg, PCIE_LCSR2_TX_MARGIN));
2360 1.117 msaitoh onoff("Enter Modified Compliance", reg, PCIE_LCSR2_EN_MCOMP);
2361 1.117 msaitoh onoff("Compliance SOS", reg, PCIE_LCSR2_COMP_SOS);
2362 1.215.2.6 martin printf(" Compliance Preset/De-emphasis: ");
2363 1.215.2.6 martin pci_print_pcie_link_preset_preshoot_deemphasis(
2364 1.157 msaitoh __SHIFTOUT(reg, PCIE_LCSR2_COMP_DEEMP));
2365 1.157 msaitoh printf("\n");
2366 1.105 msaitoh
2367 1.105 msaitoh /* Link Status 2 */
2368 1.117 msaitoh printf(" Link Status 2: 0x%04x\n", (reg >> 16) & 0xffff);
2369 1.157 msaitoh printf(" Current De-emphasis Level: ");
2370 1.157 msaitoh pci_print_pcie_link_deemphasis(
2371 1.157 msaitoh __SHIFTOUT(reg, PCIE_LCSR2_DEEMP_LVL));
2372 1.157 msaitoh printf("\n");
2373 1.117 msaitoh onoff("Equalization Complete", reg, PCIE_LCSR2_EQ_COMPL);
2374 1.117 msaitoh onoff("Equalization Phase 1 Successful", reg,
2375 1.117 msaitoh PCIE_LCSR2_EQP1_SUC);
2376 1.117 msaitoh onoff("Equalization Phase 2 Successful", reg,
2377 1.117 msaitoh PCIE_LCSR2_EQP2_SUC);
2378 1.117 msaitoh onoff("Equalization Phase 3 Successful", reg,
2379 1.117 msaitoh PCIE_LCSR2_EQP3_SUC);
2380 1.117 msaitoh onoff("Link Equalization Request", reg, PCIE_LCSR2_LNKEQ_REQ);
2381 1.146 msaitoh onoff("Retimer Presence Detected", reg, PCIE_LCSR2_RETIMERPD);
2382 1.146 msaitoh if (drs_supported) {
2383 1.146 msaitoh printf(" Downstream Component Presence: ");
2384 1.146 msaitoh switch (__SHIFTOUT(reg, PCIE_LCSR2_DSCOMPN)) {
2385 1.146 msaitoh case PCIE_DSCOMPN_DOWN_NOTDETERM:
2386 1.146 msaitoh printf("Link Down - Presence Not"
2387 1.146 msaitoh " Determined\n");
2388 1.146 msaitoh break;
2389 1.146 msaitoh case PCIE_DSCOMPN_DOWN_NOTPRES:
2390 1.146 msaitoh printf("Link Down - Component Not Present\n");
2391 1.146 msaitoh break;
2392 1.146 msaitoh case PCIE_DSCOMPN_DOWN_PRES:
2393 1.146 msaitoh printf("Link Down - Component Present\n");
2394 1.146 msaitoh break;
2395 1.146 msaitoh case PCIE_DSCOMPN_UP_PRES:
2396 1.146 msaitoh printf("Link Up - Component Present\n");
2397 1.146 msaitoh break;
2398 1.146 msaitoh case PCIE_DSCOMPN_UP_PRES_DRS:
2399 1.146 msaitoh printf("Link Up - Component Present and DRS"
2400 1.146 msaitoh " received\n");
2401 1.146 msaitoh break;
2402 1.146 msaitoh default:
2403 1.146 msaitoh printf("reserved\n");
2404 1.146 msaitoh break;
2405 1.146 msaitoh }
2406 1.146 msaitoh onoff("DRS Message Received", reg, PCIE_LCSR2_DRSRCV);
2407 1.146 msaitoh }
2408 1.105 msaitoh }
2409 1.105 msaitoh
2410 1.105 msaitoh /* Slot Capability 2 */
2411 1.105 msaitoh /* Slot Control 2 */
2412 1.105 msaitoh /* Slot Status 2 */
2413 1.72 joerg }
2414 1.72 joerg
2415 1.120 msaitoh static void
2416 1.120 msaitoh pci_conf_print_msix_cap(const pcireg_t *regs, int capoff)
2417 1.120 msaitoh {
2418 1.120 msaitoh pcireg_t reg;
2419 1.120 msaitoh
2420 1.120 msaitoh printf("\n MSI-X Capability Register\n");
2421 1.120 msaitoh
2422 1.120 msaitoh reg = regs[o2i(capoff + PCI_MSIX_CTL)];
2423 1.120 msaitoh printf(" Message Control register: 0x%04x\n",
2424 1.120 msaitoh (reg >> 16) & 0xff);
2425 1.215.2.1 martin printf(" Table Size: %d\n", PCI_MSIX_CTL_TBLSIZE(reg));
2426 1.120 msaitoh onoff("Function Mask", reg, PCI_MSIX_CTL_FUNCMASK);
2427 1.120 msaitoh onoff("MSI-X Enable", reg, PCI_MSIX_CTL_ENABLE);
2428 1.120 msaitoh reg = regs[o2i(capoff + PCI_MSIX_TBLOFFSET)];
2429 1.120 msaitoh printf(" Table offset register: 0x%08x\n", reg);
2430 1.157 msaitoh printf(" Table offset: 0x%08x\n",
2431 1.145 msaitoh (pcireg_t)(reg & PCI_MSIX_TBLOFFSET_MASK));
2432 1.145 msaitoh printf(" BIR: 0x%x\n", (pcireg_t)(reg & PCI_MSIX_TBLBIR_MASK));
2433 1.120 msaitoh reg = regs[o2i(capoff + PCI_MSIX_PBAOFFSET)];
2434 1.120 msaitoh printf(" Pending bit array register: 0x%08x\n", reg);
2435 1.157 msaitoh printf(" Pending bit array offset: 0x%08x\n",
2436 1.145 msaitoh (pcireg_t)(reg & PCI_MSIX_PBAOFFSET_MASK));
2437 1.145 msaitoh printf(" BIR: 0x%x\n", (pcireg_t)(reg & PCI_MSIX_PBABIR_MASK));
2438 1.120 msaitoh }
2439 1.120 msaitoh
2440 1.138 msaitoh static void
2441 1.138 msaitoh pci_conf_print_sata_cap(const pcireg_t *regs, int capoff)
2442 1.138 msaitoh {
2443 1.138 msaitoh pcireg_t reg;
2444 1.138 msaitoh
2445 1.138 msaitoh printf("\n Serial ATA Capability Register\n");
2446 1.138 msaitoh
2447 1.169 msaitoh reg = regs[o2i(capoff + PCI_SATA_REV)];
2448 1.138 msaitoh printf(" Revision register: 0x%04x\n", (reg >> 16) & 0xff);
2449 1.139 msaitoh printf(" Revision: %u.%u\n",
2450 1.139 msaitoh (unsigned int)__SHIFTOUT(reg, PCI_SATA_REV_MAJOR),
2451 1.139 msaitoh (unsigned int)__SHIFTOUT(reg, PCI_SATA_REV_MINOR));
2452 1.138 msaitoh
2453 1.138 msaitoh reg = regs[o2i(capoff + PCI_SATA_BAR)];
2454 1.138 msaitoh
2455 1.138 msaitoh printf(" BAR Register: 0x%08x\n", reg);
2456 1.140 msaitoh printf(" Register location: ");
2457 1.140 msaitoh if ((reg & PCI_SATA_BAR_SPEC) == PCI_SATA_BAR_INCONF)
2458 1.140 msaitoh printf("in config space\n");
2459 1.140 msaitoh else {
2460 1.140 msaitoh printf("BAR %d\n", (int)PCI_SATA_BAR_NUM(reg));
2461 1.140 msaitoh printf(" BAR offset: 0x%08x\n",
2462 1.140 msaitoh (pcireg_t)__SHIFTOUT(reg, PCI_SATA_BAR_OFFSET) * 4);
2463 1.140 msaitoh }
2464 1.138 msaitoh }
2465 1.138 msaitoh
2466 1.118 msaitoh static void
2467 1.118 msaitoh pci_conf_print_pciaf_cap(const pcireg_t *regs, int capoff)
2468 1.118 msaitoh {
2469 1.118 msaitoh pcireg_t reg;
2470 1.118 msaitoh
2471 1.118 msaitoh printf("\n Advanced Features Capability Register\n");
2472 1.118 msaitoh
2473 1.118 msaitoh reg = regs[o2i(capoff + PCI_AFCAPR)];
2474 1.118 msaitoh printf(" AF Capabilities register: 0x%02x\n", (reg >> 24) & 0xff);
2475 1.145 msaitoh printf(" AF Structure Length: 0x%02x\n",
2476 1.145 msaitoh (pcireg_t)__SHIFTOUT(reg, PCI_AF_LENGTH));
2477 1.118 msaitoh onoff("Transaction Pending", reg, PCI_AF_TP_CAP);
2478 1.118 msaitoh onoff("Function Level Reset", reg, PCI_AF_FLR_CAP);
2479 1.118 msaitoh reg = regs[o2i(capoff + PCI_AFCSR)];
2480 1.118 msaitoh printf(" AF Control register: 0x%02x\n", reg & 0xff);
2481 1.118 msaitoh /*
2482 1.118 msaitoh * Only PCI_AFCR_INITIATE_FLR is a member of the AF control register
2483 1.118 msaitoh * and it's always 0 on read
2484 1.118 msaitoh */
2485 1.118 msaitoh printf(" AF Status register: 0x%02x\n", (reg >> 8) & 0xff);
2486 1.118 msaitoh onoff("Transaction Pending", reg, PCI_AFSR_TP);
2487 1.118 msaitoh }
2488 1.77 jmcneill
2489 1.207 msaitoh static void
2490 1.207 msaitoh pci_conf_print_ea_cap_prop(unsigned int prop)
2491 1.207 msaitoh {
2492 1.207 msaitoh
2493 1.207 msaitoh switch (prop) {
2494 1.207 msaitoh case PCI_EA_PROP_MEM_NONPREF:
2495 1.207 msaitoh printf("Memory Space, Non-Prefetchable\n");
2496 1.207 msaitoh break;
2497 1.207 msaitoh case PCI_EA_PROP_MEM_PREF:
2498 1.207 msaitoh printf("Memory Space, Prefetchable\n");
2499 1.207 msaitoh break;
2500 1.207 msaitoh case PCI_EA_PROP_IO:
2501 1.207 msaitoh printf("I/O Space\n");
2502 1.207 msaitoh break;
2503 1.207 msaitoh case PCI_EA_PROP_VF_MEM_NONPREF:
2504 1.207 msaitoh printf("Resorce for VF use, Memory Space, Non-Prefetchable\n");
2505 1.207 msaitoh break;
2506 1.207 msaitoh case PCI_EA_PROP_VF_MEM_PREF:
2507 1.207 msaitoh printf("Resorce for VF use, Memory Space, Prefetch\n");
2508 1.207 msaitoh break;
2509 1.207 msaitoh case PCI_EA_PROP_BB_MEM_NONPREF:
2510 1.207 msaitoh printf("Behind the Bridge, Memory Space, Non-Pref\n");
2511 1.207 msaitoh break;
2512 1.207 msaitoh case PCI_EA_PROP_BB_MEM_PREF:
2513 1.207 msaitoh printf("Behind the Bridge, Memory Space. Prefetchable\n");
2514 1.207 msaitoh break;
2515 1.207 msaitoh case PCI_EA_PROP_BB_IO:
2516 1.207 msaitoh printf("Behind Bridge, I/O Space\n");
2517 1.207 msaitoh break;
2518 1.207 msaitoh case PCI_EA_PROP_MEM_UNAVAIL:
2519 1.207 msaitoh printf("Memory Space Unavailable\n");
2520 1.207 msaitoh break;
2521 1.207 msaitoh case PCI_EA_PROP_IO_UNAVAIL:
2522 1.207 msaitoh printf("IO Space Unavailable\n");
2523 1.207 msaitoh break;
2524 1.207 msaitoh case PCI_EA_PROP_UNAVAIL:
2525 1.207 msaitoh printf("Entry Unavailable for use\n");
2526 1.207 msaitoh break;
2527 1.207 msaitoh default:
2528 1.207 msaitoh printf("Reserved\n");
2529 1.207 msaitoh break;
2530 1.207 msaitoh }
2531 1.207 msaitoh }
2532 1.207 msaitoh
2533 1.207 msaitoh static void
2534 1.207 msaitoh pci_conf_print_ea_cap(const pcireg_t *regs, int capoff)
2535 1.207 msaitoh {
2536 1.207 msaitoh pcireg_t reg, reg2;
2537 1.207 msaitoh unsigned int entries, entoff, i;
2538 1.207 msaitoh
2539 1.207 msaitoh printf("\n Enhanced Allocation Capability Register\n");
2540 1.207 msaitoh
2541 1.207 msaitoh reg = regs[o2i(capoff + PCI_EA_CAP1)];
2542 1.207 msaitoh printf(" EA Num Entries register: 0x%04x\n", reg >> 16);
2543 1.207 msaitoh entries = __SHIFTOUT(reg, PCI_EA_CAP1_NUMENTRIES);
2544 1.207 msaitoh printf(" EA Num Entries: %u\n", entries);
2545 1.207 msaitoh
2546 1.207 msaitoh /* Type 1 only */
2547 1.207 msaitoh if (PCI_HDRTYPE_TYPE(regs[o2i(PCI_BHLC_REG)]) == PCI_HDRTYPE_PPB) {
2548 1.207 msaitoh reg = regs[o2i(capoff + PCI_EA_CAP2)];
2549 1.207 msaitoh printf(" EA Capability Second register: 0x%08x\n", reg);
2550 1.207 msaitoh printf(" Fixed Secondary Bus Number: %hhu\n",
2551 1.207 msaitoh (unsigned char)__SHIFTOUT(reg, PCI_EA_CAP2_SECONDARY));
2552 1.207 msaitoh printf(" Fixed Subordinate Bus Number: %hhu\n",
2553 1.207 msaitoh (unsigned char)__SHIFTOUT(reg, PCI_EA_CAP2_SUBORDINATE));
2554 1.207 msaitoh entoff = capoff + 8;
2555 1.207 msaitoh } else
2556 1.207 msaitoh entoff = capoff + 4;
2557 1.207 msaitoh
2558 1.207 msaitoh for (i = 0; i < entries; i++) {
2559 1.207 msaitoh uint64_t base, offset;
2560 1.207 msaitoh bool baseis64, offsetis64;
2561 1.207 msaitoh unsigned int bei, entry_size;
2562 1.207 msaitoh
2563 1.207 msaitoh printf(" Entry %u:\n", i);
2564 1.207 msaitoh /* The first DW */
2565 1.207 msaitoh reg = regs[o2i(entoff)];
2566 1.207 msaitoh printf(" The first register: 0x%08x\n", reg);
2567 1.207 msaitoh entry_size = __SHIFTOUT(reg, PCI_EA_ES);
2568 1.207 msaitoh printf(" Entry size: %u\n", entry_size);
2569 1.207 msaitoh printf(" BAR Equivalent Indicator: ");
2570 1.207 msaitoh bei = __SHIFTOUT(reg, PCI_EA_BEI);
2571 1.207 msaitoh switch (bei) {
2572 1.207 msaitoh case PCI_EA_BEI_BAR0:
2573 1.207 msaitoh case PCI_EA_BEI_BAR1:
2574 1.207 msaitoh case PCI_EA_BEI_BAR2:
2575 1.207 msaitoh case PCI_EA_BEI_BAR3:
2576 1.207 msaitoh case PCI_EA_BEI_BAR4:
2577 1.207 msaitoh case PCI_EA_BEI_BAR5:
2578 1.207 msaitoh printf("BAR %u\n", bei - PCI_EA_BEI_BAR0);
2579 1.207 msaitoh break;
2580 1.207 msaitoh case PCI_EA_BEI_BEHIND:
2581 1.207 msaitoh printf("Behind the function\n");
2582 1.207 msaitoh break;
2583 1.207 msaitoh case PCI_EA_BEI_NOTIND:
2584 1.207 msaitoh printf("Not Indicated\n");
2585 1.207 msaitoh break;
2586 1.207 msaitoh case PCI_EA_BEI_EXPROM:
2587 1.207 msaitoh printf("Expansion ROM\n");
2588 1.207 msaitoh break;
2589 1.207 msaitoh case PCI_EA_BEI_VFBAR0:
2590 1.207 msaitoh case PCI_EA_BEI_VFBAR1:
2591 1.207 msaitoh case PCI_EA_BEI_VFBAR2:
2592 1.207 msaitoh case PCI_EA_BEI_VFBAR3:
2593 1.207 msaitoh case PCI_EA_BEI_VFBAR4:
2594 1.207 msaitoh case PCI_EA_BEI_VFBAR5:
2595 1.207 msaitoh printf("VF BAR %u\n", bei - PCI_EA_BEI_VFBAR0);
2596 1.207 msaitoh break;
2597 1.207 msaitoh case PCI_EA_BEI_RESERVED:
2598 1.207 msaitoh default:
2599 1.207 msaitoh printf("Reserved\n");
2600 1.207 msaitoh break;
2601 1.207 msaitoh }
2602 1.215.2.1 martin
2603 1.207 msaitoh printf(" Primary Properties: ");
2604 1.207 msaitoh pci_conf_print_ea_cap_prop(__SHIFTOUT(reg, PCI_EA_PP));
2605 1.207 msaitoh printf(" Secondary Properties: ");
2606 1.207 msaitoh pci_conf_print_ea_cap_prop(__SHIFTOUT(reg, PCI_EA_SP));
2607 1.207 msaitoh onoff("Writable", reg, PCI_EA_W);
2608 1.207 msaitoh onoff("Enable for this entry", reg, PCI_EA_E);
2609 1.215.2.1 martin
2610 1.207 msaitoh if (entry_size == 0) {
2611 1.207 msaitoh entoff += 4;
2612 1.207 msaitoh continue;
2613 1.207 msaitoh }
2614 1.207 msaitoh
2615 1.207 msaitoh /* Base addr */
2616 1.207 msaitoh reg = regs[o2i(entoff + 4)];
2617 1.207 msaitoh base = reg & PCI_EA_LOWMASK;
2618 1.207 msaitoh baseis64 = reg & PCI_EA_BASEMAXOFFSET_64BIT;
2619 1.207 msaitoh printf(" Base Address Register Low: 0x%08x\n", reg);
2620 1.207 msaitoh if (baseis64) {
2621 1.207 msaitoh /* 64bit */
2622 1.207 msaitoh reg2 = regs[o2i(entoff + 12)];
2623 1.207 msaitoh printf(" Base Address Register high: 0x%08x\n",
2624 1.207 msaitoh reg2);
2625 1.207 msaitoh base |= (uint64_t)reg2 << 32;
2626 1.207 msaitoh }
2627 1.207 msaitoh
2628 1.207 msaitoh /* Offset addr */
2629 1.207 msaitoh reg = regs[o2i(entoff + 8)];
2630 1.207 msaitoh offset = reg & PCI_EA_LOWMASK;
2631 1.207 msaitoh offsetis64 = reg & PCI_EA_BASEMAXOFFSET_64BIT;
2632 1.207 msaitoh printf(" Max Offset Register Low: 0x%08x\n", reg);
2633 1.207 msaitoh if (offsetis64) {
2634 1.207 msaitoh /* 64bit */
2635 1.207 msaitoh reg2 = regs[o2i(entoff + (baseis64 ? 16 : 12))];
2636 1.207 msaitoh printf(" Max Offset Register high: 0x%08x\n",
2637 1.207 msaitoh reg2);
2638 1.207 msaitoh offset |= (uint64_t)reg2 << 32;
2639 1.207 msaitoh }
2640 1.207 msaitoh
2641 1.207 msaitoh printf(" range: 0x%016" PRIx64 "-0x%016" PRIx64
2642 1.207 msaitoh "\n", base, base + offset);
2643 1.207 msaitoh
2644 1.215.2.5 martin entoff += 4 + (4 * entry_size);
2645 1.207 msaitoh }
2646 1.207 msaitoh }
2647 1.207 msaitoh
2648 1.177 msaitoh /* XXX pci_conf_print_fpb_cap */
2649 1.177 msaitoh
2650 1.132 msaitoh static struct {
2651 1.132 msaitoh pcireg_t cap;
2652 1.132 msaitoh const char *name;
2653 1.132 msaitoh void (*printfunc)(const pcireg_t *, int);
2654 1.132 msaitoh } pci_captab[] = {
2655 1.132 msaitoh { PCI_CAP_RESERVED0, "reserved", NULL },
2656 1.132 msaitoh { PCI_CAP_PWRMGMT, "Power Management", pci_conf_print_pcipm_cap },
2657 1.132 msaitoh { PCI_CAP_AGP, "AGP", pci_conf_print_agp_cap },
2658 1.132 msaitoh { PCI_CAP_VPD, "VPD", NULL },
2659 1.132 msaitoh { PCI_CAP_SLOTID, "SlotID", NULL },
2660 1.215.2.1 martin { PCI_CAP_MSI, "MSI", pci_conf_print_msi_cap },
2661 1.132 msaitoh { PCI_CAP_CPCI_HOTSWAP, "CompactPCI Hot-swapping", NULL },
2662 1.132 msaitoh { PCI_CAP_PCIX, "PCI-X", pci_conf_print_pcix_cap },
2663 1.141 msaitoh { PCI_CAP_LDT, "HyperTransport", pci_conf_print_ht_cap },
2664 1.132 msaitoh { PCI_CAP_VENDSPEC, "Vendor-specific",
2665 1.132 msaitoh pci_conf_print_vendspec_cap },
2666 1.132 msaitoh { PCI_CAP_DEBUGPORT, "Debug Port", pci_conf_print_debugport_cap },
2667 1.132 msaitoh { PCI_CAP_CPCI_RSRCCTL, "CompactPCI Resource Control", NULL },
2668 1.132 msaitoh { PCI_CAP_HOTPLUG, "Hot-Plug", NULL },
2669 1.132 msaitoh { PCI_CAP_SUBVENDOR, "Subsystem vendor ID",
2670 1.132 msaitoh pci_conf_print_subsystem_cap },
2671 1.132 msaitoh { PCI_CAP_AGP8, "AGP 8x", NULL },
2672 1.192 msaitoh { PCI_CAP_SECURE, "Secure Device", pci_conf_print_secure_cap },
2673 1.132 msaitoh { PCI_CAP_PCIEXPRESS, "PCI Express", pci_conf_print_pcie_cap },
2674 1.132 msaitoh { PCI_CAP_MSIX, "MSI-X", pci_conf_print_msix_cap },
2675 1.138 msaitoh { PCI_CAP_SATA, "SATA", pci_conf_print_sata_cap },
2676 1.145 msaitoh { PCI_CAP_PCIAF, "Advanced Features", pci_conf_print_pciaf_cap},
2677 1.207 msaitoh { PCI_CAP_EA, "Enhanced Allocation", pci_conf_print_ea_cap },
2678 1.177 msaitoh { PCI_CAP_FPB, "Flattening Portal Bridge", NULL }
2679 1.132 msaitoh };
2680 1.132 msaitoh
2681 1.135 msaitoh static int
2682 1.199 msaitoh pci_conf_find_cap(const pcireg_t *regs, unsigned int capid, int *offsetp)
2683 1.135 msaitoh {
2684 1.135 msaitoh pcireg_t rval;
2685 1.199 msaitoh unsigned int capptr;
2686 1.135 msaitoh int off;
2687 1.135 msaitoh
2688 1.199 msaitoh if (!(regs[o2i(PCI_COMMAND_STATUS_REG)] & PCI_STATUS_CAPLIST_SUPPORT))
2689 1.199 msaitoh return 0;
2690 1.199 msaitoh
2691 1.199 msaitoh /* Determine the Capability List Pointer register to start with. */
2692 1.199 msaitoh switch (PCI_HDRTYPE_TYPE(regs[o2i(PCI_BHLC_REG)])) {
2693 1.199 msaitoh case 0: /* standard device header */
2694 1.199 msaitoh case 1: /* PCI-PCI bridge header */
2695 1.199 msaitoh capptr = PCI_CAPLISTPTR_REG;
2696 1.199 msaitoh break;
2697 1.199 msaitoh case 2: /* PCI-CardBus Bridge header */
2698 1.199 msaitoh capptr = PCI_CARDBUS_CAPLISTPTR_REG;
2699 1.199 msaitoh break;
2700 1.199 msaitoh default:
2701 1.199 msaitoh return 0;
2702 1.199 msaitoh }
2703 1.215.2.1 martin
2704 1.199 msaitoh for (off = PCI_CAPLIST_PTR(regs[o2i(capptr)]);
2705 1.141 msaitoh off != 0; off = PCI_CAPLIST_NEXT(rval)) {
2706 1.135 msaitoh rval = regs[o2i(off)];
2707 1.135 msaitoh if (capid == PCI_CAPLIST_CAP(rval)) {
2708 1.135 msaitoh if (offsetp != NULL)
2709 1.135 msaitoh *offsetp = off;
2710 1.135 msaitoh return 1;
2711 1.135 msaitoh }
2712 1.135 msaitoh }
2713 1.135 msaitoh return 0;
2714 1.135 msaitoh }
2715 1.135 msaitoh
2716 1.86 matt static void
2717 1.51 drochner pci_conf_print_caplist(
2718 1.51 drochner #ifdef _KERNEL
2719 1.71 christos pci_chipset_tag_t pc, pcitag_t tag,
2720 1.51 drochner #endif
2721 1.52 drochner const pcireg_t *regs, int capoff)
2722 1.51 drochner {
2723 1.51 drochner int off;
2724 1.132 msaitoh pcireg_t foundcap;
2725 1.51 drochner pcireg_t rval;
2726 1.132 msaitoh bool foundtable[__arraycount(pci_captab)];
2727 1.132 msaitoh unsigned int i;
2728 1.33 kleink
2729 1.132 msaitoh /* Clear table */
2730 1.132 msaitoh for (i = 0; i < __arraycount(pci_captab); i++)
2731 1.132 msaitoh foundtable[i] = false;
2732 1.132 msaitoh
2733 1.132 msaitoh /* Print capability register's offset and the type first */
2734 1.52 drochner for (off = PCI_CAPLIST_PTR(regs[o2i(capoff)]);
2735 1.141 msaitoh off != 0; off = PCI_CAPLIST_NEXT(regs[o2i(off)])) {
2736 1.51 drochner rval = regs[o2i(off)];
2737 1.51 drochner printf(" Capability register at 0x%02x\n", off);
2738 1.51 drochner
2739 1.51 drochner printf(" type: 0x%02x (", PCI_CAPLIST_CAP(rval));
2740 1.132 msaitoh foundcap = PCI_CAPLIST_CAP(rval);
2741 1.132 msaitoh if (foundcap < __arraycount(pci_captab)) {
2742 1.132 msaitoh printf("%s)\n", pci_captab[foundcap].name);
2743 1.132 msaitoh /* Mark as found */
2744 1.132 msaitoh foundtable[foundcap] = true;
2745 1.132 msaitoh } else
2746 1.132 msaitoh printf("unknown)\n");
2747 1.132 msaitoh }
2748 1.132 msaitoh
2749 1.132 msaitoh /*
2750 1.132 msaitoh * And then, print the detail of each capability registers
2751 1.132 msaitoh * in capability value's order.
2752 1.132 msaitoh */
2753 1.132 msaitoh for (i = 0; i < __arraycount(pci_captab); i++) {
2754 1.132 msaitoh if (foundtable[i] == false)
2755 1.132 msaitoh continue;
2756 1.132 msaitoh
2757 1.132 msaitoh /*
2758 1.132 msaitoh * The type was found. Search capability list again and
2759 1.215.2.5 martin * print all capabilities that the capability type is
2760 1.132 msaitoh * the same. This is required because some capabilities
2761 1.132 msaitoh * appear multiple times (e.g. HyperTransport capability).
2762 1.132 msaitoh */
2763 1.141 msaitoh for (off = PCI_CAPLIST_PTR(regs[o2i(capoff)]);
2764 1.141 msaitoh off != 0; off = PCI_CAPLIST_NEXT(regs[o2i(off)])) {
2765 1.141 msaitoh rval = regs[o2i(off)];
2766 1.141 msaitoh if ((PCI_CAPLIST_CAP(rval) == i)
2767 1.141 msaitoh && (pci_captab[i].printfunc != NULL))
2768 1.141 msaitoh pci_captab[i].printfunc(regs, off);
2769 1.141 msaitoh }
2770 1.135 msaitoh }
2771 1.135 msaitoh }
2772 1.135 msaitoh
2773 1.135 msaitoh /* Extended Capability */
2774 1.135 msaitoh
2775 1.135 msaitoh static void
2776 1.135 msaitoh pci_conf_print_aer_cap_uc(pcireg_t reg)
2777 1.135 msaitoh {
2778 1.135 msaitoh
2779 1.135 msaitoh onoff("Undefined", reg, PCI_AER_UC_UNDEFINED);
2780 1.135 msaitoh onoff("Data Link Protocol Error", reg, PCI_AER_UC_DL_PROTOCOL_ERROR);
2781 1.135 msaitoh onoff("Surprise Down Error", reg, PCI_AER_UC_SURPRISE_DOWN_ERROR);
2782 1.146 msaitoh onoff("Poisoned TLP Received", reg, PCI_AER_UC_POISONED_TLP);
2783 1.135 msaitoh onoff("Flow Control Protocol Error", reg, PCI_AER_UC_FC_PROTOCOL_ERROR);
2784 1.135 msaitoh onoff("Completion Timeout", reg, PCI_AER_UC_COMPLETION_TIMEOUT);
2785 1.135 msaitoh onoff("Completer Abort", reg, PCI_AER_UC_COMPLETER_ABORT);
2786 1.135 msaitoh onoff("Unexpected Completion", reg, PCI_AER_UC_UNEXPECTED_COMPLETION);
2787 1.135 msaitoh onoff("Receiver Overflow", reg, PCI_AER_UC_RECEIVER_OVERFLOW);
2788 1.135 msaitoh onoff("Malformed TLP", reg, PCI_AER_UC_MALFORMED_TLP);
2789 1.135 msaitoh onoff("ECRC Error", reg, PCI_AER_UC_ECRC_ERROR);
2790 1.135 msaitoh onoff("Unsupported Request Error", reg,
2791 1.135 msaitoh PCI_AER_UC_UNSUPPORTED_REQUEST_ERROR);
2792 1.135 msaitoh onoff("ACS Violation", reg, PCI_AER_UC_ACS_VIOLATION);
2793 1.135 msaitoh onoff("Uncorrectable Internal Error", reg, PCI_AER_UC_INTERNAL_ERROR);
2794 1.135 msaitoh onoff("MC Blocked TLP", reg, PCI_AER_UC_MC_BLOCKED_TLP);
2795 1.135 msaitoh onoff("AtomicOp Egress BLK", reg, PCI_AER_UC_ATOMIC_OP_EGRESS_BLOCKED);
2796 1.135 msaitoh onoff("TLP Prefix Blocked Error", reg,
2797 1.146 msaitoh PCI_AER_UC_TLP_PREFIX_BLOCKED_ERROR);
2798 1.146 msaitoh onoff("Poisoned TLP Egress Blocked", reg,
2799 1.146 msaitoh PCI_AER_UC_POISONTLP_EGRESS_BLOCKED);
2800 1.135 msaitoh }
2801 1.135 msaitoh
2802 1.135 msaitoh static void
2803 1.135 msaitoh pci_conf_print_aer_cap_cor(pcireg_t reg)
2804 1.135 msaitoh {
2805 1.135 msaitoh
2806 1.135 msaitoh onoff("Receiver Error", reg, PCI_AER_COR_RECEIVER_ERROR);
2807 1.135 msaitoh onoff("Bad TLP", reg, PCI_AER_COR_BAD_TLP);
2808 1.135 msaitoh onoff("Bad DLLP", reg, PCI_AER_COR_BAD_DLLP);
2809 1.135 msaitoh onoff("REPLAY_NUM Rollover", reg, PCI_AER_COR_REPLAY_NUM_ROLLOVER);
2810 1.135 msaitoh onoff("Replay Timer Timeout", reg, PCI_AER_COR_REPLAY_TIMER_TIMEOUT);
2811 1.135 msaitoh onoff("Advisory Non-Fatal Error", reg, PCI_AER_COR_ADVISORY_NF_ERROR);
2812 1.135 msaitoh onoff("Corrected Internal Error", reg, PCI_AER_COR_INTERNAL_ERROR);
2813 1.135 msaitoh onoff("Header Log Overflow", reg, PCI_AER_COR_HEADER_LOG_OVERFLOW);
2814 1.135 msaitoh }
2815 1.135 msaitoh
2816 1.135 msaitoh static void
2817 1.135 msaitoh pci_conf_print_aer_cap_control(pcireg_t reg, bool *tlp_prefix_log)
2818 1.135 msaitoh {
2819 1.135 msaitoh
2820 1.135 msaitoh printf(" First Error Pointer: 0x%04x\n",
2821 1.135 msaitoh (pcireg_t)__SHIFTOUT(reg, PCI_AER_FIRST_ERROR_PTR));
2822 1.135 msaitoh onoff("ECRC Generation Capable", reg, PCI_AER_ECRC_GEN_CAPABLE);
2823 1.135 msaitoh onoff("ECRC Generation Enable", reg, PCI_AER_ECRC_GEN_ENABLE);
2824 1.135 msaitoh onoff("ECRC Check Capable", reg, PCI_AER_ECRC_CHECK_CAPABLE);
2825 1.172 msaitoh onoff("ECRC Check Enable", reg, PCI_AER_ECRC_CHECK_ENABLE);
2826 1.135 msaitoh onoff("Multiple Header Recording Capable", reg,
2827 1.135 msaitoh PCI_AER_MULT_HDR_CAPABLE);
2828 1.146 msaitoh onoff("Multiple Header Recording Enable", reg,PCI_AER_MULT_HDR_ENABLE);
2829 1.146 msaitoh onoff("Completion Timeout Prefix/Header Log Capable", reg,
2830 1.146 msaitoh PCI_AER_COMPTOUTPRFXHDRLOG_CAP);
2831 1.135 msaitoh
2832 1.135 msaitoh /* This bit is RsvdP if the End-End TLP Prefix Supported bit is Clear */
2833 1.135 msaitoh if (!tlp_prefix_log)
2834 1.135 msaitoh return;
2835 1.135 msaitoh onoff("TLP Prefix Log Present", reg, PCI_AER_TLP_PREFIX_LOG_PRESENT);
2836 1.135 msaitoh *tlp_prefix_log = (reg & PCI_AER_TLP_PREFIX_LOG_PRESENT) ? true : false;
2837 1.135 msaitoh }
2838 1.135 msaitoh
2839 1.135 msaitoh static void
2840 1.135 msaitoh pci_conf_print_aer_cap_rooterr_cmd(pcireg_t reg)
2841 1.135 msaitoh {
2842 1.135 msaitoh
2843 1.135 msaitoh onoff("Correctable Error Reporting Enable", reg,
2844 1.135 msaitoh PCI_AER_ROOTERR_COR_ENABLE);
2845 1.135 msaitoh onoff("Non-Fatal Error Reporting Enable", reg,
2846 1.135 msaitoh PCI_AER_ROOTERR_NF_ENABLE);
2847 1.135 msaitoh onoff("Fatal Error Reporting Enable", reg, PCI_AER_ROOTERR_F_ENABLE);
2848 1.135 msaitoh }
2849 1.135 msaitoh
2850 1.135 msaitoh static void
2851 1.135 msaitoh pci_conf_print_aer_cap_rooterr_status(pcireg_t reg)
2852 1.135 msaitoh {
2853 1.135 msaitoh
2854 1.135 msaitoh onoff("ERR_COR Received", reg, PCI_AER_ROOTERR_COR_ERR);
2855 1.135 msaitoh onoff("Multiple ERR_COR Received", reg, PCI_AER_ROOTERR_MULTI_COR_ERR);
2856 1.135 msaitoh onoff("ERR_FATAL/NONFATAL_ERR Received", reg, PCI_AER_ROOTERR_UC_ERR);
2857 1.135 msaitoh onoff("Multiple ERR_FATAL/NONFATAL_ERR Received", reg,
2858 1.135 msaitoh PCI_AER_ROOTERR_MULTI_UC_ERR);
2859 1.159 msaitoh onoff("First Uncorrectable Fatal", reg,PCI_AER_ROOTERR_FIRST_UC_FATAL);
2860 1.159 msaitoh onoff("Non-Fatal Error Messages Received", reg,PCI_AER_ROOTERR_NF_ERR);
2861 1.135 msaitoh onoff("Fatal Error Messages Received", reg, PCI_AER_ROOTERR_F_ERR);
2862 1.158 msaitoh printf(" Advanced Error Interrupt Message Number: 0x%02x\n",
2863 1.159 msaitoh (unsigned int)__SHIFTOUT(reg, PCI_AER_ROOTERR_INT_MESSAGE));
2864 1.135 msaitoh }
2865 1.135 msaitoh
2866 1.135 msaitoh static void
2867 1.135 msaitoh pci_conf_print_aer_cap_errsrc_id(pcireg_t reg)
2868 1.135 msaitoh {
2869 1.135 msaitoh
2870 1.135 msaitoh printf(" Correctable Source ID: 0x%04x\n",
2871 1.135 msaitoh (pcireg_t)__SHIFTOUT(reg, PCI_AER_ERRSRC_ID_ERR_COR));
2872 1.135 msaitoh printf(" ERR_FATAL/NONFATAL Source ID: 0x%04x\n",
2873 1.135 msaitoh (pcireg_t)__SHIFTOUT(reg, PCI_AER_ERRSRC_ID_ERR_UC));
2874 1.135 msaitoh }
2875 1.135 msaitoh
2876 1.135 msaitoh static void
2877 1.199 msaitoh pci_conf_print_aer_cap(const pcireg_t *regs, int extcapoff)
2878 1.135 msaitoh {
2879 1.135 msaitoh pcireg_t reg;
2880 1.135 msaitoh int pcie_capoff;
2881 1.135 msaitoh int pcie_devtype = -1;
2882 1.135 msaitoh bool tlp_prefix_log = false;
2883 1.135 msaitoh
2884 1.199 msaitoh if (pci_conf_find_cap(regs, PCI_CAP_PCIEXPRESS, &pcie_capoff)) {
2885 1.135 msaitoh reg = regs[o2i(pcie_capoff)];
2886 1.143 msaitoh pcie_devtype = PCIE_XCAP_TYPE(reg);
2887 1.135 msaitoh /* PCIe DW9 to DW14 is for PCIe 2.0 and newer */
2888 1.135 msaitoh if (__SHIFTOUT(reg, PCIE_XCAP_VER_MASK) >= 2) {
2889 1.135 msaitoh reg = regs[o2i(pcie_capoff + PCIE_DCAP2)];
2890 1.135 msaitoh /* End-End TLP Prefix Supported */
2891 1.135 msaitoh if (reg & PCIE_DCAP2_EETLP_PREF) {
2892 1.135 msaitoh tlp_prefix_log = true;
2893 1.135 msaitoh }
2894 1.135 msaitoh }
2895 1.135 msaitoh }
2896 1.135 msaitoh
2897 1.135 msaitoh printf("\n Advanced Error Reporting Register\n");
2898 1.135 msaitoh
2899 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_AER_UC_STATUS)];
2900 1.135 msaitoh printf(" Uncorrectable Error Status register: 0x%08x\n", reg);
2901 1.135 msaitoh pci_conf_print_aer_cap_uc(reg);
2902 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_AER_UC_MASK)];
2903 1.135 msaitoh printf(" Uncorrectable Error Mask register: 0x%08x\n", reg);
2904 1.135 msaitoh pci_conf_print_aer_cap_uc(reg);
2905 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_AER_UC_SEVERITY)];
2906 1.135 msaitoh printf(" Uncorrectable Error Severity register: 0x%08x\n", reg);
2907 1.135 msaitoh pci_conf_print_aer_cap_uc(reg);
2908 1.135 msaitoh
2909 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_AER_COR_STATUS)];
2910 1.135 msaitoh printf(" Correctable Error Status register: 0x%08x\n", reg);
2911 1.135 msaitoh pci_conf_print_aer_cap_cor(reg);
2912 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_AER_COR_MASK)];
2913 1.135 msaitoh printf(" Correctable Error Mask register: 0x%08x\n", reg);
2914 1.135 msaitoh pci_conf_print_aer_cap_cor(reg);
2915 1.135 msaitoh
2916 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_AER_CAP_CONTROL)];
2917 1.135 msaitoh printf(" Advanced Error Capabilities and Control register: 0x%08x\n",
2918 1.135 msaitoh reg);
2919 1.135 msaitoh pci_conf_print_aer_cap_control(reg, &tlp_prefix_log);
2920 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_AER_HEADER_LOG)];
2921 1.135 msaitoh printf(" Header Log register:\n");
2922 1.135 msaitoh pci_conf_print_regs(regs, extcapoff + PCI_AER_HEADER_LOG,
2923 1.135 msaitoh extcapoff + PCI_AER_ROOTERR_CMD);
2924 1.135 msaitoh
2925 1.135 msaitoh switch (pcie_devtype) {
2926 1.215.2.5 martin case PCIE_XCAP_TYPE_RP: /* Root Port of PCI Express Root Complex */
2927 1.215.2.5 martin case PCIE_XCAP_TYPE_RC_EVNTC: /* Root Complex Event Collector */
2928 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_AER_ROOTERR_CMD)];
2929 1.135 msaitoh printf(" Root Error Command register: 0x%08x\n", reg);
2930 1.135 msaitoh pci_conf_print_aer_cap_rooterr_cmd(reg);
2931 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_AER_ROOTERR_STATUS)];
2932 1.135 msaitoh printf(" Root Error Status register: 0x%08x\n", reg);
2933 1.135 msaitoh pci_conf_print_aer_cap_rooterr_status(reg);
2934 1.135 msaitoh
2935 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_AER_ERRSRC_ID)];
2936 1.195 msaitoh printf(" Error Source Identification register: 0x%08x\n",
2937 1.195 msaitoh reg);
2938 1.135 msaitoh pci_conf_print_aer_cap_errsrc_id(reg);
2939 1.135 msaitoh break;
2940 1.135 msaitoh }
2941 1.135 msaitoh
2942 1.135 msaitoh if (tlp_prefix_log) {
2943 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_AER_TLP_PREFIX_LOG)];
2944 1.135 msaitoh printf(" TLP Prefix Log register: 0x%08x\n", reg);
2945 1.135 msaitoh }
2946 1.135 msaitoh }
2947 1.135 msaitoh
2948 1.215.2.2 martin /*
2949 1.215.2.2 martin * Helper function to print the arbitration phase register.
2950 1.215.2.2 martin *
2951 1.215.2.2 martin * phases: Number of phases in the arbitration tables.
2952 1.215.2.2 martin * arbsize: Number of bits in each phase.
2953 1.215.2.2 martin * indent: Add more two spaces if it's true.
2954 1.215.2.2 martin */
2955 1.135 msaitoh static void
2956 1.135 msaitoh pci_conf_print_vc_cap_arbtab(const pcireg_t *regs, int off, const char *name,
2957 1.215.2.2 martin const int phases, int arbsize, bool indent)
2958 1.135 msaitoh {
2959 1.135 msaitoh pcireg_t reg;
2960 1.215.2.2 martin int num_per_reg = 32 / arbsize;
2961 1.135 msaitoh int i, j;
2962 1.135 msaitoh
2963 1.215.2.2 martin printf("%s %s Arbitration Table:\n", indent ? " " : "", name);
2964 1.215.2.2 martin for (i = 0; i < phases; i += num_per_reg) {
2965 1.215.2.2 martin reg = regs[o2i(off + (sizeof(uint32_t) * (i / num_per_reg)))];
2966 1.215.2.2 martin for (j = 0; j < num_per_reg; j++) {
2967 1.215.2.2 martin printf("%s Phase[%d]: 0x%x\n", indent ? " " : "",
2968 1.215.2.2 martin i + j,
2969 1.215.2.2 martin (uint32_t)(reg & __BITS(arbsize - 1, 0)));
2970 1.215.2.2 martin reg >>= arbsize;
2971 1.215.2.2 martin }
2972 1.135 msaitoh }
2973 1.135 msaitoh }
2974 1.135 msaitoh
2975 1.215.2.2 martin /* For VC, bit 4-7 are reserved. For Port, bit 6-7 are reserved */
2976 1.215.2.2 martin static const int arb_phases[8] = {0, 32, 64, 128, 128, 256, 0, 0 };
2977 1.215.2.2 martin
2978 1.135 msaitoh static void
2979 1.199 msaitoh pci_conf_print_vc_cap(const pcireg_t *regs, int extcapoff)
2980 1.135 msaitoh {
2981 1.135 msaitoh pcireg_t reg, n;
2982 1.215.2.2 martin int arbtab, parbsize;
2983 1.215.2.2 martin pcireg_t arbsel;
2984 1.135 msaitoh int i, count;
2985 1.135 msaitoh
2986 1.135 msaitoh printf("\n Virtual Channel Register\n");
2987 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_VC_CAP1)];
2988 1.135 msaitoh printf(" Port VC Capability register 1: 0x%08x\n", reg);
2989 1.135 msaitoh count = __SHIFTOUT(reg, PCI_VC_CAP1_EXT_COUNT);
2990 1.135 msaitoh printf(" Extended VC Count: %d\n", count);
2991 1.135 msaitoh n = __SHIFTOUT(reg, PCI_VC_CAP1_LOWPRI_EXT_COUNT);
2992 1.135 msaitoh printf(" Low Priority Extended VC Count: %u\n", n);
2993 1.135 msaitoh n = __SHIFTOUT(reg, PCI_VC_CAP1_REFCLK);
2994 1.135 msaitoh printf(" Reference Clock: %s\n",
2995 1.140 msaitoh (n == PCI_VC_CAP1_REFCLK_100NS) ? "100ns" : "unknown");
2996 1.135 msaitoh parbsize = 1 << __SHIFTOUT(reg, PCI_VC_CAP1_PORT_ARB_TABLE_SIZE);
2997 1.135 msaitoh printf(" Port Arbitration Table Entry Size: %dbit\n", parbsize);
2998 1.135 msaitoh
2999 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_VC_CAP2)];
3000 1.135 msaitoh printf(" Port VC Capability register 2: 0x%08x\n", reg);
3001 1.135 msaitoh onoff("Hardware fixed arbitration scheme",
3002 1.135 msaitoh reg, PCI_VC_CAP2_ARB_CAP_HW_FIXED_SCHEME);
3003 1.135 msaitoh onoff("WRR arbitration with 32 phases",
3004 1.135 msaitoh reg, PCI_VC_CAP2_ARB_CAP_WRR_32);
3005 1.135 msaitoh onoff("WRR arbitration with 64 phases",
3006 1.135 msaitoh reg, PCI_VC_CAP2_ARB_CAP_WRR_64);
3007 1.135 msaitoh onoff("WRR arbitration with 128 phases",
3008 1.135 msaitoh reg, PCI_VC_CAP2_ARB_CAP_WRR_128);
3009 1.215.2.2 martin arbtab = __SHIFTOUT(reg, PCI_VC_CAP2_ARB_TABLE_OFFSET);
3010 1.215.2.2 martin printf(" VC Arbitration Table Offset: 0x%x\n", arbtab);
3011 1.135 msaitoh
3012 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_VC_CONTROL)] & 0xffff;
3013 1.135 msaitoh printf(" Port VC Control register: 0x%04x\n", reg);
3014 1.215.2.2 martin arbsel = __SHIFTOUT(reg, PCI_VC_CONTROL_VC_ARB_SELECT);
3015 1.215.2.2 martin printf(" VC Arbitration Select: 0x%x\n", arbsel);
3016 1.135 msaitoh
3017 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_VC_STATUS)] >> 16;
3018 1.135 msaitoh printf(" Port VC Status register: 0x%04x\n", reg);
3019 1.135 msaitoh onoff("VC Arbitration Table Status",
3020 1.135 msaitoh reg, PCI_VC_STATUS_LOAD_VC_ARB_TABLE);
3021 1.135 msaitoh
3022 1.215.2.2 martin if ((arbtab != 0) && (arbsel != 0))
3023 1.215.2.2 martin pci_conf_print_vc_cap_arbtab(regs, extcapoff + (arbtab * 16),
3024 1.215.2.2 martin "VC", arb_phases[arbsel], 4, false);
3025 1.215.2.2 martin
3026 1.135 msaitoh for (i = 0; i < count + 1; i++) {
3027 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_VC_RESOURCE_CAP(i))];
3028 1.135 msaitoh printf(" VC number %d\n", i);
3029 1.135 msaitoh printf(" VC Resource Capability Register: 0x%08x\n", reg);
3030 1.135 msaitoh onoff(" Non-configurable Hardware fixed arbitration scheme",
3031 1.135 msaitoh reg, PCI_VC_RESOURCE_CAP_PORT_ARB_CAP_HW_FIXED_SCHEME);
3032 1.135 msaitoh onoff(" WRR arbitration with 32 phases",
3033 1.135 msaitoh reg, PCI_VC_RESOURCE_CAP_PORT_ARB_CAP_WRR_32);
3034 1.135 msaitoh onoff(" WRR arbitration with 64 phases",
3035 1.135 msaitoh reg, PCI_VC_RESOURCE_CAP_PORT_ARB_CAP_WRR_64);
3036 1.135 msaitoh onoff(" WRR arbitration with 128 phases",
3037 1.135 msaitoh reg, PCI_VC_RESOURCE_CAP_PORT_ARB_CAP_WRR_128);
3038 1.135 msaitoh onoff(" Time-based WRR arbitration with 128 phases",
3039 1.135 msaitoh reg, PCI_VC_RESOURCE_CAP_PORT_ARB_CAP_TWRR_128);
3040 1.135 msaitoh onoff(" WRR arbitration with 256 phases",
3041 1.135 msaitoh reg, PCI_VC_RESOURCE_CAP_PORT_ARB_CAP_WRR_256);
3042 1.135 msaitoh onoff(" Advanced Packet Switching",
3043 1.135 msaitoh reg, PCI_VC_RESOURCE_CAP_ADV_PKT_SWITCH);
3044 1.135 msaitoh onoff(" Reject Snoop Transaction",
3045 1.135 msaitoh reg, PCI_VC_RESOURCE_CAP_REJCT_SNOOP_TRANS);
3046 1.135 msaitoh n = __SHIFTOUT(reg, PCI_VC_RESOURCE_CAP_MAX_TIME_SLOTS) + 1;
3047 1.135 msaitoh printf(" Maximum Time Slots: %d\n", n);
3048 1.215.2.2 martin arbtab = __SHIFTOUT(reg,
3049 1.215.2.2 martin PCI_VC_RESOURCE_CAP_PORT_ARB_TABLE_OFFSET);
3050 1.135 msaitoh printf(" Port Arbitration Table offset: 0x%02x\n",
3051 1.215.2.2 martin arbtab);
3052 1.135 msaitoh
3053 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_VC_RESOURCE_CTL(i))];
3054 1.135 msaitoh printf(" VC Resource Control Register: 0x%08x\n", reg);
3055 1.157 msaitoh printf(" TC/VC Map: 0x%02x\n",
3056 1.135 msaitoh (pcireg_t)__SHIFTOUT(reg, PCI_VC_RESOURCE_CTL_TCVC_MAP));
3057 1.135 msaitoh /*
3058 1.135 msaitoh * The load Port Arbitration Table bit is used to update
3059 1.135 msaitoh * the Port Arbitration logic and it's always 0 on read, so
3060 1.135 msaitoh * we don't print it.
3061 1.135 msaitoh */
3062 1.215.2.2 martin arbsel = __SHIFTOUT(reg, PCI_VC_RESOURCE_CTL_PORT_ARB_SELECT);
3063 1.215.2.2 martin printf(" Port Arbitration Select: 0x%x\n", arbsel);
3064 1.135 msaitoh n = __SHIFTOUT(reg, PCI_VC_RESOURCE_CTL_VC_ID);
3065 1.174 msaitoh printf(" VC ID: %d\n", n);
3066 1.135 msaitoh onoff(" VC Enable", reg, PCI_VC_RESOURCE_CTL_VC_ENABLE);
3067 1.135 msaitoh
3068 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_VC_RESOURCE_STA(i))] >> 16;
3069 1.135 msaitoh printf(" VC Resource Status Register: 0x%08x\n", reg);
3070 1.135 msaitoh onoff(" Port Arbitration Table Status",
3071 1.135 msaitoh reg, PCI_VC_RESOURCE_STA_PORT_ARB_TABLE);
3072 1.135 msaitoh onoff(" VC Negotiation Pending",
3073 1.135 msaitoh reg, PCI_VC_RESOURCE_STA_VC_NEG_PENDING);
3074 1.135 msaitoh
3075 1.215.2.2 martin if ((arbtab != 0) && (arbsel != 0))
3076 1.215.2.2 martin pci_conf_print_vc_cap_arbtab(regs,
3077 1.215.2.2 martin extcapoff + (arbtab * 16),
3078 1.215.2.2 martin "Port", arb_phases[arbsel], parbsize, true);
3079 1.135 msaitoh }
3080 1.135 msaitoh }
3081 1.135 msaitoh
3082 1.181 msaitoh /*
3083 1.181 msaitoh * Print Power limit. This encoding is the same among the following registers:
3084 1.181 msaitoh * - The Captured Slot Power Limit in the PCIe Device Capability Register.
3085 1.181 msaitoh * - The Slot Power Limit in the PCIe Slot Capability Register.
3086 1.181 msaitoh * - The Base Power in the Data register of Power Budgeting capability.
3087 1.181 msaitoh */
3088 1.160 msaitoh static void
3089 1.181 msaitoh pci_conf_print_pcie_power(uint8_t base, unsigned int scale)
3090 1.135 msaitoh {
3091 1.181 msaitoh unsigned int sdiv = 1;
3092 1.162 christos
3093 1.181 msaitoh if ((scale == 0) && (base > 0xef)) {
3094 1.181 msaitoh const char *s;
3095 1.162 christos
3096 1.181 msaitoh switch (base) {
3097 1.181 msaitoh case 0xf0:
3098 1.181 msaitoh s = "239W < x <= 250W";
3099 1.181 msaitoh break;
3100 1.181 msaitoh case 0xf1:
3101 1.181 msaitoh s = "250W < x <= 275W";
3102 1.181 msaitoh break;
3103 1.181 msaitoh case 0xf2:
3104 1.181 msaitoh s = "275W < x <= 300W";
3105 1.181 msaitoh break;
3106 1.181 msaitoh default:
3107 1.198 msaitoh s = "reserved for greater than 300W";
3108 1.181 msaitoh break;
3109 1.160 msaitoh }
3110 1.181 msaitoh printf("%s\n", s);
3111 1.184 msaitoh return;
3112 1.160 msaitoh }
3113 1.162 christos
3114 1.181 msaitoh for (unsigned int i = scale; i > 0; i--)
3115 1.181 msaitoh sdiv *= 10;
3116 1.181 msaitoh
3117 1.181 msaitoh printf("%u", base / sdiv);
3118 1.162 christos
3119 1.181 msaitoh if (scale != 0) {
3120 1.181 msaitoh printf(".%u", base % sdiv);
3121 1.135 msaitoh }
3122 1.181 msaitoh printf ("W\n");
3123 1.181 msaitoh return;
3124 1.135 msaitoh }
3125 1.135 msaitoh
3126 1.135 msaitoh static const char *
3127 1.135 msaitoh pci_conf_print_pwrbdgt_type(uint8_t reg)
3128 1.135 msaitoh {
3129 1.135 msaitoh
3130 1.135 msaitoh switch (reg) {
3131 1.135 msaitoh case 0x00:
3132 1.135 msaitoh return "PME Aux";
3133 1.135 msaitoh case 0x01:
3134 1.135 msaitoh return "Auxilary";
3135 1.135 msaitoh case 0x02:
3136 1.135 msaitoh return "Idle";
3137 1.135 msaitoh case 0x03:
3138 1.135 msaitoh return "Sustained";
3139 1.152 msaitoh case 0x04:
3140 1.152 msaitoh return "Sustained (Emergency Power Reduction)";
3141 1.152 msaitoh case 0x05:
3142 1.152 msaitoh return "Maximum (Emergency Power Reduction)";
3143 1.135 msaitoh case 0x07:
3144 1.160 msaitoh return "Maximum";
3145 1.135 msaitoh default:
3146 1.135 msaitoh return "Unknown";
3147 1.135 msaitoh }
3148 1.135 msaitoh }
3149 1.135 msaitoh
3150 1.135 msaitoh static const char *
3151 1.135 msaitoh pci_conf_print_pwrbdgt_pwrrail(uint8_t reg)
3152 1.135 msaitoh {
3153 1.135 msaitoh
3154 1.135 msaitoh switch (reg) {
3155 1.135 msaitoh case 0x00:
3156 1.135 msaitoh return "Power(12V)";
3157 1.135 msaitoh case 0x01:
3158 1.135 msaitoh return "Power(3.3V)";
3159 1.135 msaitoh case 0x02:
3160 1.135 msaitoh return "Power(1.5V or 1.8V)";
3161 1.135 msaitoh case 0x07:
3162 1.135 msaitoh return "Thermal";
3163 1.135 msaitoh default:
3164 1.135 msaitoh return "Unknown";
3165 1.135 msaitoh }
3166 1.135 msaitoh }
3167 1.135 msaitoh
3168 1.135 msaitoh static void
3169 1.199 msaitoh pci_conf_print_pwrbdgt_cap(const pcireg_t *regs, int extcapoff)
3170 1.135 msaitoh {
3171 1.135 msaitoh pcireg_t reg;
3172 1.135 msaitoh
3173 1.160 msaitoh printf("\n Power Budgeting\n");
3174 1.135 msaitoh
3175 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_PWRBDGT_DSEL)];
3176 1.135 msaitoh printf(" Data Select register: 0x%08x\n", reg);
3177 1.135 msaitoh
3178 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_PWRBDGT_DATA)];
3179 1.135 msaitoh printf(" Data register: 0x%08x\n", reg);
3180 1.160 msaitoh printf(" Base Power: ");
3181 1.181 msaitoh pci_conf_print_pcie_power(
3182 1.181 msaitoh __SHIFTOUT(reg, PCI_PWRBDGT_DATA_BASEPWR),
3183 1.181 msaitoh __SHIFTOUT(reg, PCI_PWRBDGT_DATA_SCALE));
3184 1.135 msaitoh printf(" PM Sub State: 0x%hhx\n",
3185 1.135 msaitoh (uint8_t)__SHIFTOUT(reg, PCI_PWRBDGT_PM_SUBSTAT));
3186 1.135 msaitoh printf(" PM State: D%u\n",
3187 1.135 msaitoh (unsigned int)__SHIFTOUT(reg, PCI_PWRBDGT_PM_STAT));
3188 1.135 msaitoh printf(" Type: %s\n",
3189 1.135 msaitoh pci_conf_print_pwrbdgt_type(
3190 1.135 msaitoh (uint8_t)(__SHIFTOUT(reg, PCI_PWRBDGT_TYPE))));
3191 1.135 msaitoh printf(" Power Rail: %s\n",
3192 1.135 msaitoh pci_conf_print_pwrbdgt_pwrrail(
3193 1.135 msaitoh (uint8_t)(__SHIFTOUT(reg, PCI_PWRBDGT_PWRRAIL))));
3194 1.135 msaitoh
3195 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_PWRBDGT_CAP)];
3196 1.135 msaitoh printf(" Power Budget Capability register: 0x%08x\n", reg);
3197 1.135 msaitoh onoff("System Allocated",
3198 1.135 msaitoh reg, PCI_PWRBDGT_CAP_SYSALLOC);
3199 1.135 msaitoh }
3200 1.135 msaitoh
3201 1.135 msaitoh static const char *
3202 1.135 msaitoh pci_conf_print_rclink_dcl_cap_elmtype(unsigned char type)
3203 1.135 msaitoh {
3204 1.135 msaitoh
3205 1.135 msaitoh switch (type) {
3206 1.135 msaitoh case 0x00:
3207 1.135 msaitoh return "Configuration Space Element";
3208 1.135 msaitoh case 0x01:
3209 1.135 msaitoh return "System Egress Port or internal sink (memory)";
3210 1.135 msaitoh case 0x02:
3211 1.135 msaitoh return "Internal Root Complex Link";
3212 1.135 msaitoh default:
3213 1.135 msaitoh return "Unknown";
3214 1.135 msaitoh }
3215 1.135 msaitoh }
3216 1.135 msaitoh
3217 1.135 msaitoh static void
3218 1.199 msaitoh pci_conf_print_rclink_dcl_cap(const pcireg_t *regs, int extcapoff)
3219 1.135 msaitoh {
3220 1.135 msaitoh pcireg_t reg;
3221 1.135 msaitoh unsigned char nent, linktype;
3222 1.135 msaitoh int i;
3223 1.135 msaitoh
3224 1.135 msaitoh printf("\n Root Complex Link Declaration\n");
3225 1.135 msaitoh
3226 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_RCLINK_DCL_ESDESC)];
3227 1.135 msaitoh printf(" Element Self Description Register: 0x%08x\n", reg);
3228 1.135 msaitoh printf(" Element Type: %s\n",
3229 1.135 msaitoh pci_conf_print_rclink_dcl_cap_elmtype((unsigned char)reg));
3230 1.135 msaitoh nent = __SHIFTOUT(reg, PCI_RCLINK_DCL_ESDESC_NUMLINKENT);
3231 1.135 msaitoh printf(" Number of Link Entries: %hhu\n", nent);
3232 1.135 msaitoh printf(" Component ID: %hhu\n",
3233 1.135 msaitoh (uint8_t)__SHIFTOUT(reg, PCI_RCLINK_DCL_ESDESC_COMPID));
3234 1.135 msaitoh printf(" Port Number: %hhu\n",
3235 1.135 msaitoh (uint8_t)__SHIFTOUT(reg, PCI_RCLINK_DCL_ESDESC_PORTNUM));
3236 1.135 msaitoh for (i = 0; i < nent; i++) {
3237 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_RCLINK_DCL_LINKDESC(i))];
3238 1.140 msaitoh printf(" Link Entry %d:\n", i + 1);
3239 1.140 msaitoh printf(" Link Description Register: 0x%08x\n", reg);
3240 1.215.2.1 martin onoff(" Link Valid", reg, PCI_RCLINK_DCL_LINKDESC_LVALID);
3241 1.135 msaitoh linktype = reg & PCI_RCLINK_DCL_LINKDESC_LTYPE;
3242 1.140 msaitoh onoff2(" Link Type", reg, PCI_RCLINK_DCL_LINKDESC_LTYPE,
3243 1.135 msaitoh "Configuration Space", "Memory-Mapped Space");
3244 1.140 msaitoh onoff(" Associated RCRB Header", reg,
3245 1.135 msaitoh PCI_RCLINK_DCL_LINKDESC_ARCRBH);
3246 1.140 msaitoh printf(" Target Component ID: %hhu\n",
3247 1.135 msaitoh (unsigned char)__SHIFTOUT(reg,
3248 1.135 msaitoh PCI_RCLINK_DCL_LINKDESC_TCOMPID));
3249 1.140 msaitoh printf(" Target Port Number: %hhu\n",
3250 1.135 msaitoh (unsigned char)__SHIFTOUT(reg,
3251 1.135 msaitoh PCI_RCLINK_DCL_LINKDESC_TPNUM));
3252 1.135 msaitoh
3253 1.135 msaitoh if (linktype == 0) {
3254 1.135 msaitoh /* Memory-Mapped Space */
3255 1.135 msaitoh reg = regs[o2i(extcapoff
3256 1.135 msaitoh + PCI_RCLINK_DCL_LINKADDR_LT0_LO(i))];
3257 1.140 msaitoh printf(" Link Address Low Register: 0x%08x\n",
3258 1.140 msaitoh reg);
3259 1.135 msaitoh reg = regs[o2i(extcapoff
3260 1.135 msaitoh + PCI_RCLINK_DCL_LINKADDR_LT0_HI(i))];
3261 1.140 msaitoh printf(" Link Address High Register: 0x%08x\n",
3262 1.140 msaitoh reg);
3263 1.135 msaitoh } else {
3264 1.135 msaitoh unsigned int nb;
3265 1.135 msaitoh pcireg_t lo, hi;
3266 1.135 msaitoh
3267 1.135 msaitoh /* Configuration Space */
3268 1.135 msaitoh lo = regs[o2i(extcapoff
3269 1.135 msaitoh + PCI_RCLINK_DCL_LINKADDR_LT1_LO(i))];
3270 1.140 msaitoh printf(" Configuration Space Low Register: "
3271 1.140 msaitoh "0x%08x\n", lo);
3272 1.135 msaitoh hi = regs[o2i(extcapoff
3273 1.135 msaitoh + PCI_RCLINK_DCL_LINKADDR_LT1_HI(i))];
3274 1.140 msaitoh printf(" Configuration Space High Register: "
3275 1.140 msaitoh "0x%08x\n", hi);
3276 1.135 msaitoh nb = __SHIFTOUT(lo, PCI_RCLINK_DCL_LINKADDR_LT1_N);
3277 1.140 msaitoh printf(" N: %u\n", nb);
3278 1.140 msaitoh printf(" Func: %hhu\n",
3279 1.135 msaitoh (unsigned char)__SHIFTOUT(lo,
3280 1.135 msaitoh PCI_RCLINK_DCL_LINKADDR_LT1_FUNC));
3281 1.140 msaitoh printf(" Dev: %hhu\n",
3282 1.135 msaitoh (unsigned char)__SHIFTOUT(lo,
3283 1.135 msaitoh PCI_RCLINK_DCL_LINKADDR_LT1_DEV));
3284 1.140 msaitoh printf(" Bus: %hhu\n",
3285 1.135 msaitoh (unsigned char)__SHIFTOUT(lo,
3286 1.135 msaitoh PCI_RCLINK_DCL_LINKADDR_LT1_BUS(nb)));
3287 1.135 msaitoh lo &= PCI_RCLINK_DCL_LINKADDR_LT1_BAL(i);
3288 1.140 msaitoh printf(" Configuration Space Base Address: "
3289 1.140 msaitoh "0x%016" PRIx64 "\n", ((uint64_t)hi << 32) + lo);
3290 1.135 msaitoh }
3291 1.135 msaitoh }
3292 1.135 msaitoh }
3293 1.135 msaitoh
3294 1.135 msaitoh /* XXX pci_conf_print_rclink_ctl_cap */
3295 1.135 msaitoh
3296 1.135 msaitoh static void
3297 1.199 msaitoh pci_conf_print_rcec_assoc_cap(const pcireg_t *regs, int extcapoff)
3298 1.135 msaitoh {
3299 1.135 msaitoh pcireg_t reg;
3300 1.135 msaitoh
3301 1.135 msaitoh printf("\n Root Complex Event Collector Association\n");
3302 1.135 msaitoh
3303 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_RCEC_ASSOC_ASSOCBITMAP)];
3304 1.135 msaitoh printf(" Association Bitmap for Root Complex Integrated Devices:"
3305 1.135 msaitoh " 0x%08x\n", reg);
3306 1.204 msaitoh
3307 1.204 msaitoh if (PCI_EXTCAPLIST_VERSION(regs[o2i(extcapoff)]) >= 2) {
3308 1.204 msaitoh reg = regs[o2i(extcapoff + PCI_RCEC_ASSOC_ASSOCBUSNUM)];
3309 1.204 msaitoh printf(" RCEC Associated Bus Numbers register: 0x%08x\n",
3310 1.204 msaitoh reg);
3311 1.204 msaitoh printf(" RCEC Next Bus: %u\n",
3312 1.204 msaitoh (unsigned int)__SHIFTOUT(reg,
3313 1.204 msaitoh PCI_RCEC_ASSOCBUSNUM_RCECNEXT));
3314 1.204 msaitoh printf(" RCEC Last Bus: %u\n",
3315 1.204 msaitoh (unsigned int)__SHIFTOUT(reg,
3316 1.204 msaitoh PCI_RCEC_ASSOCBUSNUM_RCECLAST));
3317 1.204 msaitoh }
3318 1.135 msaitoh }
3319 1.135 msaitoh
3320 1.135 msaitoh /* XXX pci_conf_print_mfvc_cap */
3321 1.135 msaitoh /* XXX pci_conf_print_vc2_cap */
3322 1.135 msaitoh /* XXX pci_conf_print_rcrb_cap */
3323 1.135 msaitoh /* XXX pci_conf_print_vendor_cap */
3324 1.135 msaitoh /* XXX pci_conf_print_cac_cap */
3325 1.135 msaitoh
3326 1.135 msaitoh static void
3327 1.199 msaitoh pci_conf_print_acs_cap(const pcireg_t *regs, int extcapoff)
3328 1.135 msaitoh {
3329 1.135 msaitoh pcireg_t reg, cap, ctl;
3330 1.135 msaitoh unsigned int size, i;
3331 1.135 msaitoh
3332 1.135 msaitoh printf("\n Access Control Services\n");
3333 1.135 msaitoh
3334 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_ACS_CAP)];
3335 1.135 msaitoh cap = reg & 0xffff;
3336 1.135 msaitoh ctl = reg >> 16;
3337 1.135 msaitoh printf(" ACS Capability register: 0x%08x\n", cap);
3338 1.135 msaitoh onoff("ACS Source Validation", cap, PCI_ACS_CAP_V);
3339 1.135 msaitoh onoff("ACS Transaction Blocking", cap, PCI_ACS_CAP_B);
3340 1.135 msaitoh onoff("ACS P2P Request Redirect", cap, PCI_ACS_CAP_R);
3341 1.135 msaitoh onoff("ACS P2P Completion Redirect", cap, PCI_ACS_CAP_C);
3342 1.135 msaitoh onoff("ACS Upstream Forwarding", cap, PCI_ACS_CAP_U);
3343 1.135 msaitoh onoff("ACS Egress Control", cap, PCI_ACS_CAP_E);
3344 1.135 msaitoh onoff("ACS Direct Translated P2P", cap, PCI_ACS_CAP_T);
3345 1.135 msaitoh size = __SHIFTOUT(cap, PCI_ACS_CAP_ECVSIZE);
3346 1.135 msaitoh if (size == 0)
3347 1.135 msaitoh size = 256;
3348 1.135 msaitoh printf(" Egress Control Vector Size: %u\n", size);
3349 1.135 msaitoh printf(" ACS Control register: 0x%08x\n", ctl);
3350 1.135 msaitoh onoff("ACS Source Validation Enable", ctl, PCI_ACS_CTL_V);
3351 1.135 msaitoh onoff("ACS Transaction Blocking Enable", ctl, PCI_ACS_CTL_B);
3352 1.135 msaitoh onoff("ACS P2P Request Redirect Enable", ctl, PCI_ACS_CTL_R);
3353 1.135 msaitoh onoff("ACS P2P Completion Redirect Enable", ctl, PCI_ACS_CTL_C);
3354 1.135 msaitoh onoff("ACS Upstream Forwarding Enable", ctl, PCI_ACS_CTL_U);
3355 1.135 msaitoh onoff("ACS Egress Control Enable", ctl, PCI_ACS_CTL_E);
3356 1.135 msaitoh onoff("ACS Direct Translated P2P Enable", ctl, PCI_ACS_CTL_T);
3357 1.135 msaitoh
3358 1.135 msaitoh /*
3359 1.135 msaitoh * If the P2P Egress Control Capability bit is 0, ignore the Egress
3360 1.135 msaitoh * Control vector.
3361 1.135 msaitoh */
3362 1.135 msaitoh if ((cap & PCI_ACS_CAP_E) == 0)
3363 1.135 msaitoh return;
3364 1.135 msaitoh for (i = 0; i < size; i += 32)
3365 1.157 msaitoh printf(" Egress Control Vector [%u..%u]: 0x%08x\n", i + 31,
3366 1.135 msaitoh i, regs[o2i(extcapoff + PCI_ACS_ECV + (i / 32) * 4 )]);
3367 1.135 msaitoh }
3368 1.135 msaitoh
3369 1.135 msaitoh static void
3370 1.199 msaitoh pci_conf_print_ari_cap(const pcireg_t *regs, int extcapoff)
3371 1.135 msaitoh {
3372 1.135 msaitoh pcireg_t reg, cap, ctl;
3373 1.135 msaitoh
3374 1.135 msaitoh printf("\n Alternative Routing-ID Interpretation Register\n");
3375 1.135 msaitoh
3376 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_ARI_CAP)];
3377 1.135 msaitoh cap = reg & 0xffff;
3378 1.135 msaitoh ctl = reg >> 16;
3379 1.135 msaitoh printf(" Capability register: 0x%08x\n", cap);
3380 1.135 msaitoh onoff("MVFC Function Groups Capability", reg, PCI_ARI_CAP_M);
3381 1.135 msaitoh onoff("ACS Function Groups Capability", reg, PCI_ARI_CAP_A);
3382 1.135 msaitoh printf(" Next Function Number: %u\n",
3383 1.135 msaitoh (unsigned int)__SHIFTOUT(reg, PCI_ARI_CAP_NXTFN));
3384 1.135 msaitoh printf(" Control register: 0x%08x\n", ctl);
3385 1.135 msaitoh onoff("MVFC Function Groups Enable", reg, PCI_ARI_CTL_M);
3386 1.135 msaitoh onoff("ACS Function Groups Enable", reg, PCI_ARI_CTL_A);
3387 1.135 msaitoh printf(" Function Group: %u\n",
3388 1.135 msaitoh (unsigned int)__SHIFTOUT(reg, PCI_ARI_CTL_FUNCGRP));
3389 1.135 msaitoh }
3390 1.135 msaitoh
3391 1.135 msaitoh static void
3392 1.199 msaitoh pci_conf_print_ats_cap(const pcireg_t *regs, int extcapoff)
3393 1.135 msaitoh {
3394 1.135 msaitoh pcireg_t reg, cap, ctl;
3395 1.135 msaitoh unsigned int num;
3396 1.135 msaitoh
3397 1.135 msaitoh printf("\n Address Translation Services\n");
3398 1.135 msaitoh
3399 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_ARI_CAP)];
3400 1.135 msaitoh cap = reg & 0xffff;
3401 1.135 msaitoh ctl = reg >> 16;
3402 1.135 msaitoh printf(" Capability register: 0x%04x\n", cap);
3403 1.135 msaitoh num = __SHIFTOUT(reg, PCI_ATS_CAP_INVQDEPTH);
3404 1.135 msaitoh if (num == 0)
3405 1.135 msaitoh num = 32;
3406 1.135 msaitoh printf(" Invalidate Queue Depth: %u\n", num);
3407 1.135 msaitoh onoff("Page Aligned Request", reg, PCI_ATS_CAP_PALIGNREQ);
3408 1.145 msaitoh onoff("Global Invalidate", reg, PCI_ATS_CAP_GLOBALINVL);
3409 1.203 msaitoh onoff("Relaxed Ordering", reg, PCI_ATS_CAP_RELAXORD);
3410 1.135 msaitoh
3411 1.135 msaitoh printf(" Control register: 0x%04x\n", ctl);
3412 1.135 msaitoh printf(" Smallest Translation Unit: %u\n",
3413 1.135 msaitoh (unsigned int)__SHIFTOUT(reg, PCI_ATS_CTL_STU));
3414 1.135 msaitoh onoff("Enable", reg, PCI_ATS_CTL_EN);
3415 1.135 msaitoh }
3416 1.135 msaitoh
3417 1.135 msaitoh static void
3418 1.199 msaitoh pci_conf_print_sernum_cap(const pcireg_t *regs, int extcapoff)
3419 1.135 msaitoh {
3420 1.135 msaitoh pcireg_t lo, hi;
3421 1.135 msaitoh
3422 1.135 msaitoh printf("\n Device Serial Number Register\n");
3423 1.135 msaitoh
3424 1.135 msaitoh lo = regs[o2i(extcapoff + PCI_SERIAL_LOW)];
3425 1.135 msaitoh hi = regs[o2i(extcapoff + PCI_SERIAL_HIGH)];
3426 1.135 msaitoh printf(" Serial Number: %02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\n",
3427 1.135 msaitoh hi >> 24, (hi >> 16) & 0xff, (hi >> 8) & 0xff, hi & 0xff,
3428 1.135 msaitoh lo >> 24, (lo >> 16) & 0xff, (lo >> 8) & 0xff, lo & 0xff);
3429 1.135 msaitoh }
3430 1.135 msaitoh
3431 1.135 msaitoh static void
3432 1.199 msaitoh pci_conf_print_sriov_cap(const pcireg_t *regs, int extcapoff)
3433 1.135 msaitoh {
3434 1.135 msaitoh char buf[sizeof("99999 MB")];
3435 1.135 msaitoh pcireg_t reg;
3436 1.135 msaitoh pcireg_t total_vfs;
3437 1.135 msaitoh int i;
3438 1.135 msaitoh bool first;
3439 1.135 msaitoh
3440 1.135 msaitoh printf("\n Single Root IO Virtualization Register\n");
3441 1.135 msaitoh
3442 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_SRIOV_CAP)];
3443 1.135 msaitoh printf(" Capabilities register: 0x%08x\n", reg);
3444 1.135 msaitoh onoff("VF Migration Capable", reg, PCI_SRIOV_CAP_VF_MIGRATION);
3445 1.135 msaitoh onoff("ARI Capable Hierarchy Preserved", reg,
3446 1.135 msaitoh PCI_SRIOV_CAP_ARI_CAP_HIER_PRESERVED);
3447 1.135 msaitoh if (reg & PCI_SRIOV_CAP_VF_MIGRATION) {
3448 1.158 msaitoh printf(" VF Migration Interrupt Message Number: 0x%03x\n",
3449 1.135 msaitoh (pcireg_t)__SHIFTOUT(reg,
3450 1.135 msaitoh PCI_SRIOV_CAP_VF_MIGRATION_INTMSG_N));
3451 1.135 msaitoh }
3452 1.135 msaitoh
3453 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_SRIOV_CTL)] & 0xffff;
3454 1.135 msaitoh printf(" Control register: 0x%04x\n", reg);
3455 1.135 msaitoh onoff("VF Enable", reg, PCI_SRIOV_CTL_VF_ENABLE);
3456 1.135 msaitoh onoff("VF Migration Enable", reg, PCI_SRIOV_CTL_VF_MIGRATION_SUPPORT);
3457 1.135 msaitoh onoff("VF Migration Interrupt Enable", reg,
3458 1.135 msaitoh PCI_SRIOV_CTL_VF_MIGRATION_INT_ENABLE);
3459 1.135 msaitoh onoff("VF Memory Space Enable", reg, PCI_SRIOV_CTL_VF_MSE);
3460 1.135 msaitoh onoff("ARI Capable Hierarchy", reg, PCI_SRIOV_CTL_ARI_CAP_HIER);
3461 1.135 msaitoh
3462 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_SRIOV_STA)] >> 16;
3463 1.135 msaitoh printf(" Status register: 0x%04x\n", reg);
3464 1.135 msaitoh onoff("VF Migration Status", reg, PCI_SRIOV_STA_VF_MIGRATION);
3465 1.135 msaitoh
3466 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_SRIOV_INITIAL_VFS)] & 0xffff;
3467 1.135 msaitoh printf(" InitialVFs register: 0x%04x\n", reg);
3468 1.135 msaitoh total_vfs = reg = regs[o2i(extcapoff + PCI_SRIOV_TOTAL_VFS)] >> 16;
3469 1.135 msaitoh printf(" TotalVFs register: 0x%04x\n", reg);
3470 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_SRIOV_NUM_VFS)] & 0xffff;
3471 1.135 msaitoh printf(" NumVFs register: 0x%04x\n", reg);
3472 1.135 msaitoh
3473 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_SRIOV_FUNC_DEP_LINK)] >> 16;
3474 1.135 msaitoh printf(" Function Dependency Link register: 0x%04x\n", reg);
3475 1.135 msaitoh
3476 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_SRIOV_VF_OFF)] & 0xffff;
3477 1.135 msaitoh printf(" First VF Offset register: 0x%04x\n", reg);
3478 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_SRIOV_VF_STRIDE)] >> 16;
3479 1.135 msaitoh printf(" VF Stride register: 0x%04x\n", reg);
3480 1.157 msaitoh reg = regs[o2i(extcapoff + PCI_SRIOV_VF_DID)] >> 16;
3481 1.157 msaitoh printf(" Device ID: 0x%04x\n", reg);
3482 1.135 msaitoh
3483 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_SRIOV_PAGE_CAP)];
3484 1.135 msaitoh printf(" Supported Page Sizes register: 0x%08x\n", reg);
3485 1.135 msaitoh printf(" Supported Page Size:");
3486 1.135 msaitoh for (i = 0, first = true; i < 32; i++) {
3487 1.135 msaitoh if (reg & __BIT(i)) {
3488 1.135 msaitoh #ifdef _KERNEL
3489 1.135 msaitoh format_bytes(buf, sizeof(buf), 1LL << (i + 12));
3490 1.135 msaitoh #else
3491 1.135 msaitoh humanize_number(buf, sizeof(buf), 1LL << (i + 12), "B",
3492 1.135 msaitoh HN_AUTOSCALE, 0);
3493 1.135 msaitoh #endif
3494 1.135 msaitoh printf("%s %s", first ? "" : ",", buf);
3495 1.135 msaitoh first = false;
3496 1.135 msaitoh }
3497 1.135 msaitoh }
3498 1.135 msaitoh printf("\n");
3499 1.135 msaitoh
3500 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_SRIOV_PAGE_SIZE)];
3501 1.135 msaitoh printf(" System Page Sizes register: 0x%08x\n", reg);
3502 1.135 msaitoh printf(" Page Size: ");
3503 1.135 msaitoh if (reg != 0) {
3504 1.171 msaitoh int bitpos = ffs(reg) -1;
3505 1.171 msaitoh
3506 1.171 msaitoh /* Assume only one bit is set. */
3507 1.135 msaitoh #ifdef _KERNEL
3508 1.171 msaitoh format_bytes(buf, sizeof(buf), 1LL << (bitpos + 12));
3509 1.135 msaitoh #else
3510 1.171 msaitoh humanize_number(buf, sizeof(buf), 1LL << (bitpos + 12),
3511 1.171 msaitoh "B", HN_AUTOSCALE, 0);
3512 1.135 msaitoh #endif
3513 1.135 msaitoh printf("%s", buf);
3514 1.135 msaitoh } else {
3515 1.135 msaitoh printf("unknown");
3516 1.135 msaitoh }
3517 1.135 msaitoh printf("\n");
3518 1.135 msaitoh
3519 1.135 msaitoh for (i = 0; i < 6; i++) {
3520 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_SRIOV_BAR(i))];
3521 1.135 msaitoh printf(" VF BAR%d register: 0x%08x\n", i, reg);
3522 1.135 msaitoh }
3523 1.135 msaitoh
3524 1.135 msaitoh if (total_vfs > 0) {
3525 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_SRIOV_VF_MIG_STA_AR)];
3526 1.135 msaitoh printf(" VF Migration State Array Offset register: 0x%08x\n",
3527 1.135 msaitoh reg);
3528 1.135 msaitoh printf(" VF Migration State Offset: 0x%08x\n",
3529 1.135 msaitoh (pcireg_t)__SHIFTOUT(reg, PCI_SRIOV_VF_MIG_STA_OFFSET));
3530 1.135 msaitoh i = __SHIFTOUT(reg, PCI_SRIOV_VF_MIG_STA_BIR);
3531 1.135 msaitoh printf(" VF Migration State BIR: ");
3532 1.135 msaitoh if (i >= 0 && i <= 5) {
3533 1.135 msaitoh printf("BAR%d", i);
3534 1.135 msaitoh } else {
3535 1.135 msaitoh printf("unknown BAR (%d)", i);
3536 1.135 msaitoh }
3537 1.135 msaitoh printf("\n");
3538 1.135 msaitoh }
3539 1.135 msaitoh }
3540 1.135 msaitoh
3541 1.135 msaitoh /* XXX pci_conf_print_mriov_cap */
3542 1.138 msaitoh
3543 1.138 msaitoh static void
3544 1.199 msaitoh pci_conf_print_multicast_cap(const pcireg_t *regs, int extcapoff)
3545 1.138 msaitoh {
3546 1.138 msaitoh pcireg_t reg, cap, ctl;
3547 1.138 msaitoh pcireg_t regl, regh;
3548 1.138 msaitoh uint64_t addr;
3549 1.138 msaitoh int n;
3550 1.138 msaitoh
3551 1.138 msaitoh printf("\n Multicast\n");
3552 1.138 msaitoh
3553 1.138 msaitoh reg = regs[o2i(extcapoff + PCI_MCAST_CTL)];
3554 1.138 msaitoh cap = reg & 0xffff;
3555 1.138 msaitoh ctl = reg >> 16;
3556 1.138 msaitoh printf(" Capability Register: 0x%04x\n", cap);
3557 1.139 msaitoh printf(" Max Group: %u\n",
3558 1.139 msaitoh (pcireg_t)(reg & PCI_MCAST_CAP_MAXGRP) + 1);
3559 1.138 msaitoh
3560 1.138 msaitoh /* Endpoint Only */
3561 1.138 msaitoh n = __SHIFTOUT(reg, PCI_MCAST_CAP_WINSIZEREQ);
3562 1.138 msaitoh if (n > 0)
3563 1.215.2.5 martin printf(" Window Size Requested: %d\n", 1 << (n - 1));
3564 1.138 msaitoh
3565 1.138 msaitoh onoff("ECRC Regeneration Supported", reg, PCI_MCAST_CAP_ECRCREGEN);
3566 1.138 msaitoh
3567 1.138 msaitoh printf(" Control Register: 0x%04x\n", ctl);
3568 1.139 msaitoh printf(" Num Group: %u\n",
3569 1.139 msaitoh (unsigned int)__SHIFTOUT(reg, PCI_MCAST_CTL_NUMGRP) + 1);
3570 1.138 msaitoh onoff("Enable", reg, PCI_MCAST_CTL_ENA);
3571 1.138 msaitoh
3572 1.138 msaitoh regl = regs[o2i(extcapoff + PCI_MCAST_BARL)];
3573 1.138 msaitoh regh = regs[o2i(extcapoff + PCI_MCAST_BARH)];
3574 1.138 msaitoh printf(" Base Address Register 0: 0x%08x\n", regl);
3575 1.138 msaitoh printf(" Base Address Register 1: 0x%08x\n", regh);
3576 1.139 msaitoh printf(" Index Position: %u\n",
3577 1.139 msaitoh (unsigned int)(regl & PCI_MCAST_BARL_INDPOS));
3578 1.138 msaitoh addr = ((uint64_t)regh << 32) | (regl & PCI_MCAST_BARL_ADDR);
3579 1.138 msaitoh printf(" Base Address: 0x%016" PRIx64 "\n", addr);
3580 1.138 msaitoh
3581 1.138 msaitoh regl = regs[o2i(extcapoff + PCI_MCAST_RECVL)];
3582 1.138 msaitoh regh = regs[o2i(extcapoff + PCI_MCAST_RECVH)];
3583 1.138 msaitoh printf(" Receive Register 0: 0x%08x\n", regl);
3584 1.138 msaitoh printf(" Receive Register 1: 0x%08x\n", regh);
3585 1.138 msaitoh
3586 1.138 msaitoh regl = regs[o2i(extcapoff + PCI_MCAST_BLOCKALLL)];
3587 1.138 msaitoh regh = regs[o2i(extcapoff + PCI_MCAST_BLOCKALLH)];
3588 1.138 msaitoh printf(" Block All Register 0: 0x%08x\n", regl);
3589 1.138 msaitoh printf(" Block All Register 1: 0x%08x\n", regh);
3590 1.138 msaitoh
3591 1.138 msaitoh regl = regs[o2i(extcapoff + PCI_MCAST_BLOCKUNTRNSL)];
3592 1.138 msaitoh regh = regs[o2i(extcapoff + PCI_MCAST_BLOCKUNTRNSH)];
3593 1.138 msaitoh printf(" Block Untranslated Register 0: 0x%08x\n", regl);
3594 1.138 msaitoh printf(" Block Untranslated Register 1: 0x%08x\n", regh);
3595 1.138 msaitoh
3596 1.138 msaitoh regl = regs[o2i(extcapoff + PCI_MCAST_OVERLAYL)];
3597 1.138 msaitoh regh = regs[o2i(extcapoff + PCI_MCAST_OVERLAYH)];
3598 1.138 msaitoh printf(" Overlay BAR 0: 0x%08x\n", regl);
3599 1.138 msaitoh printf(" Overlay BAR 1: 0x%08x\n", regh);
3600 1.138 msaitoh
3601 1.138 msaitoh n = regl & PCI_MCAST_OVERLAYL_SIZE;
3602 1.138 msaitoh printf(" Overlay Size: ");
3603 1.138 msaitoh if (n >= 6)
3604 1.138 msaitoh printf("%d\n", n);
3605 1.138 msaitoh else
3606 1.138 msaitoh printf("off\n");
3607 1.138 msaitoh addr = ((uint64_t)regh << 32) | (regl & PCI_MCAST_OVERLAYL_ADDR);
3608 1.138 msaitoh printf(" Overlay BAR: 0x%016" PRIx64 "\n", addr);
3609 1.138 msaitoh }
3610 1.135 msaitoh
3611 1.135 msaitoh static void
3612 1.199 msaitoh pci_conf_print_page_req_cap(const pcireg_t *regs, int extcapoff)
3613 1.135 msaitoh {
3614 1.135 msaitoh pcireg_t reg, ctl, sta;
3615 1.135 msaitoh
3616 1.135 msaitoh printf("\n Page Request\n");
3617 1.135 msaitoh
3618 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_PAGE_REQ_CTL)];
3619 1.135 msaitoh ctl = reg & 0xffff;
3620 1.135 msaitoh sta = reg >> 16;
3621 1.135 msaitoh printf(" Control Register: 0x%04x\n", ctl);
3622 1.215.2.2 martin onoff("Enable", reg, PCI_PAGE_REQ_CTL_E);
3623 1.135 msaitoh onoff("Reset", reg, PCI_PAGE_REQ_CTL_R);
3624 1.135 msaitoh
3625 1.135 msaitoh printf(" Status Register: 0x%04x\n", sta);
3626 1.135 msaitoh onoff("Response Failure", reg, PCI_PAGE_REQ_STA_RF);
3627 1.135 msaitoh onoff("Unexpected Page Request Group Index", reg,
3628 1.135 msaitoh PCI_PAGE_REQ_STA_UPRGI);
3629 1.135 msaitoh onoff("Stopped", reg, PCI_PAGE_REQ_STA_S);
3630 1.145 msaitoh onoff("PRG Response PASID Required", reg, PCI_PAGE_REQ_STA_PASIDR);
3631 1.135 msaitoh
3632 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_PAGE_REQ_OUTSTCAPA)];
3633 1.135 msaitoh printf(" Outstanding Page Request Capacity: %u\n", reg);
3634 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_PAGE_REQ_OUTSTALLOC)];
3635 1.135 msaitoh printf(" Outstanding Page Request Allocation: %u\n", reg);
3636 1.135 msaitoh }
3637 1.135 msaitoh
3638 1.135 msaitoh /* XXX pci_conf_print_amd_cap */
3639 1.153 msaitoh
3640 1.153 msaitoh #define MEM_PBUFSIZE sizeof("999GB")
3641 1.153 msaitoh
3642 1.153 msaitoh static void
3643 1.199 msaitoh pci_conf_print_resizbar_cap(const pcireg_t *regs, int extcapoff)
3644 1.153 msaitoh {
3645 1.153 msaitoh pcireg_t cap, ctl;
3646 1.153 msaitoh unsigned int bars, i, n;
3647 1.153 msaitoh char pbuf[MEM_PBUFSIZE];
3648 1.215.2.1 martin
3649 1.153 msaitoh printf("\n Resizable BAR\n");
3650 1.153 msaitoh
3651 1.153 msaitoh /* Get Number of Resizable BARs */
3652 1.153 msaitoh ctl = regs[o2i(extcapoff + PCI_RESIZBAR_CTL(0))];
3653 1.153 msaitoh bars = __SHIFTOUT(ctl, PCI_RESIZBAR_CTL_NUMBAR);
3654 1.153 msaitoh printf(" Number of Resizable BARs: ");
3655 1.153 msaitoh if (bars <= 6)
3656 1.153 msaitoh printf("%u\n", bars);
3657 1.153 msaitoh else {
3658 1.153 msaitoh printf("incorrect (%u)\n", bars);
3659 1.153 msaitoh return;
3660 1.153 msaitoh }
3661 1.153 msaitoh
3662 1.153 msaitoh for (n = 0; n < 6; n++) {
3663 1.153 msaitoh cap = regs[o2i(extcapoff + PCI_RESIZBAR_CAP(n))];
3664 1.153 msaitoh printf(" Capability register(%u): 0x%08x\n", n, cap);
3665 1.153 msaitoh if ((cap & PCI_RESIZBAR_CAP_SIZEMASK) == 0)
3666 1.153 msaitoh continue; /* Not Used */
3667 1.153 msaitoh printf(" Acceptable BAR sizes:");
3668 1.153 msaitoh for (i = 4; i <= 23; i++) {
3669 1.153 msaitoh if ((cap & (1 << i)) != 0) {
3670 1.153 msaitoh humanize_number(pbuf, MEM_PBUFSIZE,
3671 1.153 msaitoh (int64_t)1024 * 1024 << (i - 4), "B",
3672 1.154 martin #ifdef _KERNEL
3673 1.154 martin 1);
3674 1.154 martin #else
3675 1.153 msaitoh HN_AUTOSCALE, HN_NOSPACE);
3676 1.154 martin #endif
3677 1.153 msaitoh printf(" %s", pbuf);
3678 1.153 msaitoh }
3679 1.153 msaitoh }
3680 1.153 msaitoh printf("\n");
3681 1.153 msaitoh
3682 1.153 msaitoh ctl = regs[o2i(extcapoff + PCI_RESIZBAR_CTL(n))];
3683 1.153 msaitoh printf(" Control register(%u): 0x%08x\n", n, ctl);
3684 1.153 msaitoh printf(" BAR Index: %u\n",
3685 1.153 msaitoh (unsigned int)__SHIFTOUT(ctl, PCI_RESIZBAR_CTL_BARIDX));
3686 1.153 msaitoh humanize_number(pbuf, MEM_PBUFSIZE,
3687 1.153 msaitoh (int64_t)1024 * 1024
3688 1.153 msaitoh << __SHIFTOUT(ctl, PCI_RESIZBAR_CTL_BARSIZ),
3689 1.154 martin "B",
3690 1.154 martin #ifdef _KERNEL
3691 1.154 martin 1);
3692 1.154 martin #else
3693 1.154 martin HN_AUTOSCALE, HN_NOSPACE);
3694 1.154 martin #endif
3695 1.153 msaitoh printf(" BAR Size: %s\n", pbuf);
3696 1.153 msaitoh }
3697 1.153 msaitoh }
3698 1.149 msaitoh
3699 1.149 msaitoh static void
3700 1.199 msaitoh pci_conf_print_dpa_cap(const pcireg_t *regs, int extcapoff)
3701 1.149 msaitoh {
3702 1.149 msaitoh pcireg_t reg;
3703 1.149 msaitoh unsigned int substmax, i;
3704 1.149 msaitoh
3705 1.149 msaitoh printf("\n Dynamic Power Allocation\n");
3706 1.149 msaitoh
3707 1.149 msaitoh reg = regs[o2i(extcapoff + PCI_DPA_CAP)];
3708 1.149 msaitoh printf(" Capability register: 0x%08x\n", reg);
3709 1.149 msaitoh substmax = __SHIFTOUT(reg, PCI_DPA_CAP_SUBSTMAX);
3710 1.149 msaitoh printf(" Substate Max: %u\n", substmax);
3711 1.149 msaitoh printf(" Transition Latency Unit: ");
3712 1.149 msaitoh switch (__SHIFTOUT(reg, PCI_DPA_CAP_TLUINT)) {
3713 1.149 msaitoh case 0:
3714 1.149 msaitoh printf("1ms\n");
3715 1.149 msaitoh break;
3716 1.149 msaitoh case 1:
3717 1.149 msaitoh printf("10ms\n");
3718 1.149 msaitoh break;
3719 1.149 msaitoh case 2:
3720 1.149 msaitoh printf("100ms\n");
3721 1.149 msaitoh break;
3722 1.149 msaitoh default:
3723 1.149 msaitoh printf("reserved\n");
3724 1.149 msaitoh break;
3725 1.149 msaitoh }
3726 1.149 msaitoh printf(" Power Allocation Scale: ");
3727 1.149 msaitoh switch (__SHIFTOUT(reg, PCI_DPA_CAP_PAS)) {
3728 1.149 msaitoh case 0:
3729 1.149 msaitoh printf("10.0x\n");
3730 1.149 msaitoh break;
3731 1.149 msaitoh case 1:
3732 1.149 msaitoh printf("1.0x\n");
3733 1.149 msaitoh break;
3734 1.149 msaitoh case 2:
3735 1.149 msaitoh printf("0.1x\n");
3736 1.149 msaitoh break;
3737 1.149 msaitoh case 3:
3738 1.149 msaitoh printf("0.01x\n");
3739 1.149 msaitoh break;
3740 1.149 msaitoh }
3741 1.149 msaitoh printf(" Transition Latency Value 0: %u\n",
3742 1.149 msaitoh (unsigned int)__SHIFTOUT(reg, PCI_DPA_CAP_XLCY0));
3743 1.149 msaitoh printf(" Transition Latency Value 1: %u\n",
3744 1.149 msaitoh (unsigned int)__SHIFTOUT(reg, PCI_DPA_CAP_XLCY1));
3745 1.149 msaitoh
3746 1.149 msaitoh reg = regs[o2i(extcapoff + PCI_DPA_LATIND)];
3747 1.215.2.5 martin printf(" Latency Indicator register: 0x%08x\n", reg);
3748 1.149 msaitoh
3749 1.149 msaitoh reg = regs[o2i(extcapoff + PCI_DPA_CS)];
3750 1.149 msaitoh printf(" Status register: 0x%04x\n", reg & 0xffff);
3751 1.157 msaitoh printf(" Substate Status: 0x%02x\n",
3752 1.149 msaitoh (unsigned int)__SHIFTOUT(reg, PCI_DPA_CS_SUBSTSTAT));
3753 1.149 msaitoh onoff("Substate Control Enabled", reg, PCI_DPA_CS_SUBSTCTLEN);
3754 1.149 msaitoh printf(" Control register: 0x%04x\n", reg >> 16);
3755 1.157 msaitoh printf(" Substate Control: 0x%02x\n",
3756 1.149 msaitoh (unsigned int)__SHIFTOUT(reg, PCI_DPA_CS_SUBSTCTL));
3757 1.149 msaitoh
3758 1.149 msaitoh for (i = 0; i <= substmax; i++)
3759 1.149 msaitoh printf(" Substate Power Allocation register %d: 0x%02x\n",
3760 1.149 msaitoh i, (regs[PCI_DPA_PWRALLOC + (i / 4)] >> (i % 4) & 0xff));
3761 1.149 msaitoh }
3762 1.135 msaitoh
3763 1.135 msaitoh static const char *
3764 1.194 msaitoh pci_conf_print_tph_req_cap_sttabloc(uint8_t val)
3765 1.135 msaitoh {
3766 1.135 msaitoh
3767 1.135 msaitoh switch (val) {
3768 1.194 msaitoh case PCI_TPH_REQ_STTBLLOC_NONE:
3769 1.135 msaitoh return "Not Present";
3770 1.194 msaitoh case PCI_TPH_REQ_STTBLLOC_TPHREQ:
3771 1.135 msaitoh return "in the TPH Requester Capability Structure";
3772 1.194 msaitoh case PCI_TPH_REQ_STTBLLOC_MSIX:
3773 1.135 msaitoh return "in the MSI-X Table";
3774 1.135 msaitoh default:
3775 1.135 msaitoh return "Unknown";
3776 1.135 msaitoh }
3777 1.135 msaitoh }
3778 1.135 msaitoh
3779 1.135 msaitoh static void
3780 1.199 msaitoh pci_conf_print_tph_req_cap(const pcireg_t *regs, int extcapoff)
3781 1.135 msaitoh {
3782 1.135 msaitoh pcireg_t reg;
3783 1.205 msaitoh int size = 0, i, j;
3784 1.194 msaitoh uint8_t sttbloc;
3785 1.135 msaitoh
3786 1.135 msaitoh printf("\n TPH Requester Extended Capability\n");
3787 1.135 msaitoh
3788 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_TPH_REQ_CAP)];
3789 1.135 msaitoh printf(" TPH Requester Capabililty register: 0x%08x\n", reg);
3790 1.135 msaitoh onoff("No ST Mode Supported", reg, PCI_TPH_REQ_CAP_NOST);
3791 1.135 msaitoh onoff("Interrupt Vector Mode Supported", reg, PCI_TPH_REQ_CAP_INTVEC);
3792 1.135 msaitoh onoff("Device Specific Mode Supported", reg, PCI_TPH_REQ_CAP_DEVSPEC);
3793 1.215.2.5 martin onoff("Extend TPH Requester Supported", reg, PCI_TPH_REQ_CAP_XTPHREQ);
3794 1.194 msaitoh sttbloc = __SHIFTOUT(reg, PCI_TPH_REQ_CAP_STTBLLOC);
3795 1.135 msaitoh printf(" ST Table Location: %s\n",
3796 1.194 msaitoh pci_conf_print_tph_req_cap_sttabloc(sttbloc));
3797 1.205 msaitoh if (sttbloc == PCI_TPH_REQ_STTBLLOC_TPHREQ) {
3798 1.205 msaitoh size = __SHIFTOUT(reg, PCI_TPH_REQ_CAP_STTBLSIZ) + 1;
3799 1.205 msaitoh printf(" ST Table Size: %d\n", size);
3800 1.205 msaitoh }
3801 1.182 msaitoh
3802 1.182 msaitoh reg = regs[o2i(extcapoff + PCI_TPH_REQ_CTL)];
3803 1.182 msaitoh printf(" TPH Requester Control register: 0x%08x\n", reg);
3804 1.182 msaitoh printf(" ST Mode Select: ");
3805 1.182 msaitoh switch (__SHIFTOUT(reg, PCI_TPH_REQ_CTL_STSEL)) {
3806 1.182 msaitoh case PCI_TPH_REQ_CTL_STSEL_NO:
3807 1.182 msaitoh printf("No ST Mode\n");
3808 1.182 msaitoh break;
3809 1.182 msaitoh case PCI_TPH_REQ_CTL_STSEL_IV:
3810 1.182 msaitoh printf("Interrupt Vector Mode\n");
3811 1.182 msaitoh break;
3812 1.182 msaitoh case PCI_TPH_REQ_CTL_STSEL_DS:
3813 1.182 msaitoh printf("Device Specific Mode\n");
3814 1.182 msaitoh break;
3815 1.182 msaitoh default:
3816 1.211 khorben printf("(reserved value)\n");
3817 1.182 msaitoh break;
3818 1.182 msaitoh }
3819 1.182 msaitoh printf(" TPH Requester Enable: ");
3820 1.182 msaitoh switch (__SHIFTOUT(reg, PCI_TPH_REQ_CTL_TPHREQEN)) {
3821 1.182 msaitoh case PCI_TPH_REQ_CTL_TPHREQEN_NO: /* 0x0 */
3822 1.182 msaitoh printf("Not permitted\n");
3823 1.182 msaitoh break;
3824 1.182 msaitoh case PCI_TPH_REQ_CTL_TPHREQEN_TPH:
3825 1.182 msaitoh printf("TPH and not Extended TPH\n");
3826 1.182 msaitoh break;
3827 1.182 msaitoh case PCI_TPH_REQ_CTL_TPHREQEN_ETPH:
3828 1.182 msaitoh printf("TPH and Extended TPH");
3829 1.182 msaitoh break;
3830 1.182 msaitoh default:
3831 1.211 khorben printf("(reserved value)\n");
3832 1.182 msaitoh break;
3833 1.182 msaitoh }
3834 1.194 msaitoh
3835 1.194 msaitoh if (sttbloc != PCI_TPH_REQ_STTBLLOC_TPHREQ)
3836 1.194 msaitoh return;
3837 1.194 msaitoh
3838 1.135 msaitoh for (i = 0; i < size ; i += 2) {
3839 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_TPH_REQ_STTBL + i / 2)];
3840 1.135 msaitoh for (j = 0; j < 2 ; j++) {
3841 1.136 msaitoh uint32_t entry = reg;
3842 1.135 msaitoh
3843 1.135 msaitoh if (j != 0)
3844 1.135 msaitoh entry >>= 16;
3845 1.135 msaitoh entry &= 0xffff;
3846 1.137 joerg printf(" TPH ST Table Entry (%d): 0x%04"PRIx32"\n",
3847 1.135 msaitoh i + j, entry);
3848 1.135 msaitoh }
3849 1.135 msaitoh }
3850 1.135 msaitoh }
3851 1.135 msaitoh
3852 1.135 msaitoh static void
3853 1.199 msaitoh pci_conf_print_ltr_cap(const pcireg_t *regs, int extcapoff)
3854 1.135 msaitoh {
3855 1.135 msaitoh pcireg_t reg;
3856 1.135 msaitoh
3857 1.135 msaitoh printf("\n Latency Tolerance Reporting\n");
3858 1.188 msaitoh reg = regs[o2i(extcapoff + PCI_LTR_MAXSNOOPLAT)];
3859 1.188 msaitoh printf(" Max Snoop Latency Register: 0x%04x\n", reg & 0xffff);
3860 1.189 flxd printf(" Max Snoop Latency: %juns\n",
3861 1.189 flxd (uintmax_t)(__SHIFTOUT(reg, PCI_LTR_MAXSNOOPLAT_VAL)
3862 1.189 flxd * PCI_LTR_SCALETONS(__SHIFTOUT(reg, PCI_LTR_MAXSNOOPLAT_SCALE))));
3863 1.188 msaitoh printf(" Max No-Snoop Latency Register: 0x%04x\n", reg >> 16);
3864 1.189 flxd printf(" Max No-Snoop Latency: %juns\n",
3865 1.189 flxd (uintmax_t)(__SHIFTOUT(reg, PCI_LTR_MAXNOSNOOPLAT_VAL)
3866 1.189 flxd * PCI_LTR_SCALETONS(__SHIFTOUT(reg, PCI_LTR_MAXNOSNOOPLAT_SCALE))));
3867 1.135 msaitoh }
3868 1.135 msaitoh
3869 1.135 msaitoh static void
3870 1.199 msaitoh pci_conf_print_sec_pcie_cap(const pcireg_t *regs, int extcapoff)
3871 1.135 msaitoh {
3872 1.135 msaitoh int pcie_capoff;
3873 1.135 msaitoh pcireg_t reg;
3874 1.135 msaitoh int i, maxlinkwidth;
3875 1.135 msaitoh
3876 1.135 msaitoh printf("\n Secondary PCI Express Register\n");
3877 1.135 msaitoh
3878 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_SECPCIE_LCTL3)];
3879 1.135 msaitoh printf(" Link Control 3 register: 0x%08x\n", reg);
3880 1.135 msaitoh onoff("Perform Equalization", reg, PCI_SECPCIE_LCTL3_PERFEQ);
3881 1.135 msaitoh onoff("Link Equalization Request Interrupt Enable",
3882 1.135 msaitoh reg, PCI_SECPCIE_LCTL3_LINKEQREQ_IE);
3883 1.146 msaitoh printf(" Enable Lower SKP OS Generation Vector:");
3884 1.146 msaitoh pci_print_pcie_linkspeedvector(
3885 1.146 msaitoh __SHIFTOUT(reg, PCI_SECPCIE_LCTL3_ELSKPOSGENV));
3886 1.146 msaitoh printf("\n");
3887 1.135 msaitoh
3888 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_SECPCIE_LANEERR_STA)];
3889 1.135 msaitoh printf(" Lane Error Status register: 0x%08x\n", reg);
3890 1.135 msaitoh
3891 1.135 msaitoh /* Get Max Link Width */
3892 1.200 msaitoh if (pci_conf_find_cap(regs, PCI_CAP_PCIEXPRESS, &pcie_capoff)) {
3893 1.135 msaitoh reg = regs[o2i(pcie_capoff + PCIE_LCAP)];
3894 1.135 msaitoh maxlinkwidth = __SHIFTOUT(reg, PCIE_LCAP_MAX_WIDTH);
3895 1.135 msaitoh } else {
3896 1.215.2.6 martin printf("error: failed to get PCIe capability\n");
3897 1.135 msaitoh return;
3898 1.135 msaitoh }
3899 1.135 msaitoh for (i = 0; i < maxlinkwidth; i++) {
3900 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_SECPCIE_EQCTL(i))];
3901 1.135 msaitoh if (i % 2 != 0)
3902 1.135 msaitoh reg >>= 16;
3903 1.135 msaitoh else
3904 1.135 msaitoh reg &= 0xffff;
3905 1.157 msaitoh printf(" Equalization Control Register (Link %d): 0x%04x\n",
3906 1.135 msaitoh i, reg);
3907 1.135 msaitoh printf(" Downstream Port Transmit Preset: 0x%x\n",
3908 1.135 msaitoh (pcireg_t)__SHIFTOUT(reg,
3909 1.135 msaitoh PCI_SECPCIE_EQCTL_DP_XMIT_PRESET));
3910 1.135 msaitoh printf(" Downstream Port Receive Hint: 0x%x\n",
3911 1.135 msaitoh (pcireg_t)__SHIFTOUT(reg, PCI_SECPCIE_EQCTL_DP_RCV_HINT));
3912 1.135 msaitoh printf(" Upstream Port Transmit Preset: 0x%x\n",
3913 1.135 msaitoh (pcireg_t)__SHIFTOUT(reg,
3914 1.135 msaitoh PCI_SECPCIE_EQCTL_UP_XMIT_PRESET));
3915 1.135 msaitoh printf(" Upstream Port Receive Hint: 0x%x\n",
3916 1.135 msaitoh (pcireg_t)__SHIFTOUT(reg, PCI_SECPCIE_EQCTL_UP_RCV_HINT));
3917 1.135 msaitoh }
3918 1.135 msaitoh }
3919 1.135 msaitoh
3920 1.135 msaitoh /* XXX pci_conf_print_pmux_cap */
3921 1.135 msaitoh
3922 1.135 msaitoh static void
3923 1.199 msaitoh pci_conf_print_pasid_cap(const pcireg_t *regs, int extcapoff)
3924 1.135 msaitoh {
3925 1.135 msaitoh pcireg_t reg, cap, ctl;
3926 1.135 msaitoh unsigned int num;
3927 1.135 msaitoh
3928 1.135 msaitoh printf("\n Process Address Space ID\n");
3929 1.135 msaitoh
3930 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_PASID_CAP)];
3931 1.135 msaitoh cap = reg & 0xffff;
3932 1.135 msaitoh ctl = reg >> 16;
3933 1.135 msaitoh printf(" PASID Capability Register: 0x%04x\n", cap);
3934 1.135 msaitoh onoff("Execute Permission Supported", reg, PCI_PASID_CAP_XPERM);
3935 1.135 msaitoh onoff("Privileged Mode Supported", reg, PCI_PASID_CAP_PRIVMODE);
3936 1.135 msaitoh num = (1 << __SHIFTOUT(reg, PCI_PASID_CAP_MAXPASIDW)) - 1;
3937 1.135 msaitoh printf(" Max PASID Width: %u\n", num);
3938 1.135 msaitoh
3939 1.135 msaitoh printf(" PASID Control Register: 0x%04x\n", ctl);
3940 1.135 msaitoh onoff("PASID Enable", reg, PCI_PASID_CTL_PASID_EN);
3941 1.135 msaitoh onoff("Execute Permission Enable", reg, PCI_PASID_CTL_XPERM_EN);
3942 1.135 msaitoh onoff("Privileged Mode Enable", reg, PCI_PASID_CTL_PRIVMODE_EN);
3943 1.135 msaitoh }
3944 1.135 msaitoh
3945 1.135 msaitoh static void
3946 1.199 msaitoh pci_conf_print_lnr_cap(const pcireg_t *regs, int extcapoff)
3947 1.135 msaitoh {
3948 1.135 msaitoh pcireg_t reg, cap, ctl;
3949 1.135 msaitoh unsigned int num;
3950 1.135 msaitoh
3951 1.135 msaitoh printf("\n LN Requester\n");
3952 1.135 msaitoh
3953 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_LNR_CAP)];
3954 1.135 msaitoh cap = reg & 0xffff;
3955 1.135 msaitoh ctl = reg >> 16;
3956 1.135 msaitoh printf(" LNR Capability register: 0x%04x\n", cap);
3957 1.135 msaitoh onoff("LNR-64 Supported", reg, PCI_LNR_CAP_64);
3958 1.135 msaitoh onoff("LNR-128 Supported", reg, PCI_LNR_CAP_128);
3959 1.135 msaitoh num = 1 << __SHIFTOUT(reg, PCI_LNR_CAP_REGISTMAX);
3960 1.135 msaitoh printf(" LNR Registration MAX: %u\n", num);
3961 1.135 msaitoh
3962 1.135 msaitoh printf(" LNR Control register: 0x%04x\n", ctl);
3963 1.135 msaitoh onoff("LNR Enable", reg, PCI_LNR_CTL_EN);
3964 1.135 msaitoh onoff("LNR CLS", reg, PCI_LNR_CTL_CLS);
3965 1.135 msaitoh num = 1 << __SHIFTOUT(reg, PCI_LNR_CTL_REGISTLIM);
3966 1.135 msaitoh printf(" LNR Registration Limit: %u\n", num);
3967 1.135 msaitoh }
3968 1.135 msaitoh
3969 1.176 msaitoh static void
3970 1.176 msaitoh pci_conf_print_dpc_pio(pcireg_t r)
3971 1.176 msaitoh {
3972 1.176 msaitoh onoff("Cfg Request received UR Completion", r,PCI_DPC_RPPIO_CFGUR_CPL);
3973 1.176 msaitoh onoff("Cfg Request received CA Completion", r,PCI_DPC_RPPIO_CFGCA_CPL);
3974 1.176 msaitoh onoff("Cfg Request Completion Timeout", r, PCI_DPC_RPPIO_CFG_CTO);
3975 1.176 msaitoh onoff("I/O Request received UR Completion", r, PCI_DPC_RPPIO_IOUR_CPL);
3976 1.176 msaitoh onoff("I/O Request received CA Completion", r, PCI_DPC_RPPIO_IOCA_CPL);
3977 1.176 msaitoh onoff("I/O Request Completion Timeout", r, PCI_DPC_RPPIO_IO_CTO);
3978 1.176 msaitoh onoff("Mem Request received UR Completion", r,PCI_DPC_RPPIO_MEMUR_CPL);
3979 1.176 msaitoh onoff("Mem Request received CA Completion", r,PCI_DPC_RPPIO_MEMCA_CPL);
3980 1.176 msaitoh onoff("Mem Request Completion Timeout", r, PCI_DPC_RPPIO_MEM_CTO);
3981 1.176 msaitoh }
3982 1.176 msaitoh
3983 1.176 msaitoh static void
3984 1.199 msaitoh pci_conf_print_dpc_cap(const pcireg_t *regs, int extcapoff)
3985 1.176 msaitoh {
3986 1.176 msaitoh pcireg_t reg, cap, ctl, stat, errsrc;
3987 1.176 msaitoh const char *trigstr;
3988 1.176 msaitoh bool rpext;
3989 1.176 msaitoh
3990 1.176 msaitoh printf("\n Downstream Port Containment\n");
3991 1.176 msaitoh
3992 1.176 msaitoh reg = regs[o2i(extcapoff + PCI_DPC_CCR)];
3993 1.176 msaitoh cap = reg & 0xffff;
3994 1.176 msaitoh ctl = reg >> 16;
3995 1.176 msaitoh rpext = (reg & PCI_DPCCAP_RPEXT) ? true : false;
3996 1.176 msaitoh printf(" DPC Capability register: 0x%04x\n", cap);
3997 1.176 msaitoh printf(" DPC Interrupt Message Number: %02x\n",
3998 1.176 msaitoh (unsigned int)(cap & PCI_DPCCAP_IMSGN));
3999 1.176 msaitoh onoff("RP Extensions for DPC", reg, PCI_DPCCAP_RPEXT);
4000 1.176 msaitoh onoff("Poisoned TLP Egress Blocking Supported", reg,
4001 1.176 msaitoh PCI_DPCCAP_POISONTLPEB);
4002 1.176 msaitoh onoff("DPC Software Triggering Supported", reg, PCI_DPCCAP_SWTRIG);
4003 1.176 msaitoh printf(" RP PIO Log Size: %u\n",
4004 1.176 msaitoh (unsigned int)__SHIFTOUT(reg, PCI_DPCCAP_RPPIOLOGSZ));
4005 1.176 msaitoh onoff("DL_Active ERR_COR Signaling Supported", reg,
4006 1.176 msaitoh PCI_DPCCAP_DLACTECORS);
4007 1.176 msaitoh printf(" DPC Control register: 0x%04x\n", ctl);
4008 1.176 msaitoh switch (__SHIFTOUT(reg, PCI_DPCCTL_TIRGEN)) {
4009 1.176 msaitoh case 0:
4010 1.176 msaitoh trigstr = "disabled";
4011 1.176 msaitoh break;
4012 1.176 msaitoh case 1:
4013 1.176 msaitoh trigstr = "enabled(ERR_FATAL)";
4014 1.176 msaitoh break;
4015 1.176 msaitoh case 2:
4016 1.176 msaitoh trigstr = "enabled(ERR_NONFATAL or ERR_FATAL)";
4017 1.176 msaitoh break;
4018 1.176 msaitoh default:
4019 1.176 msaitoh trigstr = "(reserverd)";
4020 1.176 msaitoh break;
4021 1.176 msaitoh }
4022 1.176 msaitoh printf(" DPC Trigger Enable: %s\n", trigstr);
4023 1.176 msaitoh printf(" DPC Completion Control: %s Completion Status\n",
4024 1.176 msaitoh (reg & PCI_DPCCTL_COMPCTL)
4025 1.176 msaitoh ? "Unsupported Request(UR)" : "Completer Abort(CA)");
4026 1.176 msaitoh onoff("DPC Interrupt Enable", reg, PCI_DPCCTL_IE);
4027 1.176 msaitoh onoff("DPC ERR_COR Enable", reg, PCI_DPCCTL_ERRCOREN);
4028 1.176 msaitoh onoff("Poisoned TLP Egress Blocking Enable", reg,
4029 1.176 msaitoh PCI_DPCCTL_POISONTLPEB);
4030 1.176 msaitoh onoff("DPC Software Trigger", reg, PCI_DPCCTL_SWTRIG);
4031 1.176 msaitoh onoff("DL_Active ERR_COR Enable", reg, PCI_DPCCTL_DLACTECOR);
4032 1.176 msaitoh
4033 1.176 msaitoh reg = regs[o2i(extcapoff + PCI_DPC_STATESID)];
4034 1.176 msaitoh stat = reg & 0xffff;
4035 1.176 msaitoh errsrc = reg >> 16;
4036 1.176 msaitoh printf(" DPC Status register: 0x%04x\n", stat);
4037 1.176 msaitoh onoff("DPC Trigger Status", reg, PCI_DPCSTAT_TSTAT);
4038 1.176 msaitoh switch (__SHIFTOUT(reg, PCI_DPCSTAT_TREASON)) {
4039 1.176 msaitoh case 0:
4040 1.176 msaitoh trigstr = "an unmasked uncorrectable error";
4041 1.176 msaitoh break;
4042 1.176 msaitoh case 1:
4043 1.176 msaitoh trigstr = "receiving an ERR_NONFATAL";
4044 1.176 msaitoh break;
4045 1.176 msaitoh case 2:
4046 1.176 msaitoh trigstr = "receiving an ERR_FATAL";
4047 1.176 msaitoh break;
4048 1.176 msaitoh case 3:
4049 1.176 msaitoh trigstr = "DPC Trigger Reason Extension field";
4050 1.176 msaitoh break;
4051 1.176 msaitoh }
4052 1.176 msaitoh printf(" DPC Trigger Reason: Due to %s\n", trigstr);
4053 1.176 msaitoh onoff("DPC Interrupt Status", reg, PCI_DPCSTAT_ISTAT);
4054 1.176 msaitoh if (rpext)
4055 1.176 msaitoh onoff("DPC RP Busy", reg, PCI_DPCSTAT_RPBUSY);
4056 1.176 msaitoh switch (__SHIFTOUT(reg, PCI_DPCSTAT_TREASON)) {
4057 1.176 msaitoh case 0:
4058 1.176 msaitoh trigstr = "Due to RP PIO error";
4059 1.176 msaitoh break;
4060 1.176 msaitoh case 1:
4061 1.176 msaitoh trigstr = "Due to the DPC Software trigger bit";
4062 1.176 msaitoh break;
4063 1.176 msaitoh default:
4064 1.176 msaitoh trigstr = "(reserved)";
4065 1.176 msaitoh break;
4066 1.176 msaitoh }
4067 1.176 msaitoh printf(" DPC Trigger Reason Extension: %s\n", trigstr);
4068 1.176 msaitoh if (rpext)
4069 1.176 msaitoh printf(" RP PIO First Error Pointer: %02x\n",
4070 1.176 msaitoh (unsigned int)__SHIFTOUT(reg, PCI_DPCSTAT_RPPIOFEP));
4071 1.176 msaitoh printf(" DPC Error Source ID register: 0x%04x\n", errsrc);
4072 1.176 msaitoh
4073 1.176 msaitoh if (!rpext)
4074 1.176 msaitoh return;
4075 1.176 msaitoh /*
4076 1.176 msaitoh * All of the following registers are implemented by a device which has
4077 1.176 msaitoh * RP Extensions for DPC
4078 1.176 msaitoh */
4079 1.176 msaitoh
4080 1.176 msaitoh reg = regs[o2i(extcapoff + PCI_DPC_RPPIO_STAT)];
4081 1.215.2.1 martin printf(" RP PIO Status Register: 0x%08x\n", reg);
4082 1.176 msaitoh pci_conf_print_dpc_pio(reg);
4083 1.176 msaitoh
4084 1.176 msaitoh reg = regs[o2i(extcapoff + PCI_DPC_RPPIO_MASK)];
4085 1.215.2.1 martin printf(" RP PIO Mask Register: 0x%08x\n", reg);
4086 1.176 msaitoh pci_conf_print_dpc_pio(reg);
4087 1.176 msaitoh
4088 1.176 msaitoh reg = regs[o2i(extcapoff + PCI_DPC_RPPIO_SEVE)];
4089 1.215.2.1 martin printf(" RP PIO Severity Register: 0x%08x\n", reg);
4090 1.176 msaitoh pci_conf_print_dpc_pio(reg);
4091 1.176 msaitoh
4092 1.176 msaitoh reg = regs[o2i(extcapoff + PCI_DPC_RPPIO_SYSERR)];
4093 1.215.2.1 martin printf(" RP PIO SysError Register: 0x%08x\n", reg);
4094 1.176 msaitoh pci_conf_print_dpc_pio(reg);
4095 1.176 msaitoh
4096 1.176 msaitoh reg = regs[o2i(extcapoff + PCI_DPC_RPPIO_EXCPT)];
4097 1.215.2.1 martin printf(" RP PIO Exception Register: 0x%08x\n", reg);
4098 1.176 msaitoh pci_conf_print_dpc_pio(reg);
4099 1.176 msaitoh
4100 1.176 msaitoh printf(" RP PIO Header Log Register: start from 0x%03x\n",
4101 1.176 msaitoh extcapoff + PCI_DPC_RPPIO_HLOG);
4102 1.176 msaitoh printf(" RP PIO ImpSpec Log Register: start from 0x%03x\n",
4103 1.176 msaitoh extcapoff + PCI_DPC_RPPIO_IMPSLOG);
4104 1.201 msaitoh printf(" RP PIO TLP Prefix Log Register: start from 0x%03x\n",
4105 1.176 msaitoh extcapoff + PCI_DPC_RPPIO_TLPPLOG);
4106 1.176 msaitoh }
4107 1.176 msaitoh
4108 1.135 msaitoh
4109 1.135 msaitoh static int
4110 1.135 msaitoh pci_conf_l1pm_cap_tposcale(unsigned char scale)
4111 1.135 msaitoh {
4112 1.135 msaitoh
4113 1.135 msaitoh /* Return scale in us */
4114 1.135 msaitoh switch (scale) {
4115 1.135 msaitoh case 0x0:
4116 1.135 msaitoh return 2;
4117 1.135 msaitoh case 0x1:
4118 1.135 msaitoh return 10;
4119 1.135 msaitoh case 0x2:
4120 1.135 msaitoh return 100;
4121 1.135 msaitoh default:
4122 1.135 msaitoh return -1;
4123 1.135 msaitoh }
4124 1.135 msaitoh }
4125 1.135 msaitoh
4126 1.135 msaitoh static void
4127 1.199 msaitoh pci_conf_print_l1pm_cap(const pcireg_t *regs, int extcapoff)
4128 1.135 msaitoh {
4129 1.135 msaitoh pcireg_t reg;
4130 1.135 msaitoh int scale, val;
4131 1.200 msaitoh int pcie_capoff;
4132 1.135 msaitoh
4133 1.135 msaitoh printf("\n L1 PM Substates\n");
4134 1.135 msaitoh
4135 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_L1PM_CAP)];
4136 1.135 msaitoh printf(" L1 PM Substates Capability register: 0x%08x\n", reg);
4137 1.135 msaitoh onoff("PCI-PM L1.2 Supported", reg, PCI_L1PM_CAP_PCIPM12);
4138 1.135 msaitoh onoff("PCI-PM L1.1 Supported", reg, PCI_L1PM_CAP_PCIPM11);
4139 1.135 msaitoh onoff("ASPM L1.2 Supported", reg, PCI_L1PM_CAP_ASPM12);
4140 1.135 msaitoh onoff("ASPM L1.1 Supported", reg, PCI_L1PM_CAP_ASPM11);
4141 1.135 msaitoh onoff("L1 PM Substates Supported", reg, PCI_L1PM_CAP_L1PM);
4142 1.200 msaitoh /* The Link Activation Supported bit is only for Downstream Port */
4143 1.200 msaitoh if (pci_conf_find_cap(regs, PCI_CAP_PCIEXPRESS, &pcie_capoff)) {
4144 1.200 msaitoh uint32_t t = regs[o2i(pcie_capoff)];
4145 1.200 msaitoh
4146 1.215.2.5 martin if ((t == PCIE_XCAP_TYPE_RP) || (t == PCIE_XCAP_TYPE_DOWN))
4147 1.200 msaitoh onoff("Link Activation Supported", reg,
4148 1.200 msaitoh PCI_L1PM_CAP_LA);
4149 1.200 msaitoh }
4150 1.135 msaitoh printf(" Port Common Mode Restore Time: %uus\n",
4151 1.135 msaitoh (unsigned int)__SHIFTOUT(reg, PCI_L1PM_CAP_PCMRT));
4152 1.135 msaitoh scale = pci_conf_l1pm_cap_tposcale(
4153 1.135 msaitoh __SHIFTOUT(reg, PCI_L1PM_CAP_PTPOSCALE));
4154 1.135 msaitoh val = __SHIFTOUT(reg, PCI_L1PM_CAP_PTPOVAL);
4155 1.135 msaitoh printf(" Port T_POWER_ON: ");
4156 1.135 msaitoh if (scale == -1)
4157 1.135 msaitoh printf("unknown\n");
4158 1.135 msaitoh else
4159 1.135 msaitoh printf("%dus\n", val * scale);
4160 1.135 msaitoh
4161 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_L1PM_CTL1)];
4162 1.135 msaitoh printf(" L1 PM Substates Control register 1: 0x%08x\n", reg);
4163 1.135 msaitoh onoff("PCI-PM L1.2 Enable", reg, PCI_L1PM_CTL1_PCIPM12_EN);
4164 1.135 msaitoh onoff("PCI-PM L1.1 Enable", reg, PCI_L1PM_CTL1_PCIPM11_EN);
4165 1.135 msaitoh onoff("ASPM L1.2 Enable", reg, PCI_L1PM_CTL1_ASPM12_EN);
4166 1.135 msaitoh onoff("ASPM L1.1 Enable", reg, PCI_L1PM_CTL1_ASPM11_EN);
4167 1.200 msaitoh onoff("Link Activation Interrupt Enable", reg, PCI_L1PM_CTL1_LAIE);
4168 1.200 msaitoh onoff("Link Activation Control", reg, PCI_L1PM_CTL1_LA);
4169 1.135 msaitoh printf(" Common Mode Restore Time: %uus\n",
4170 1.135 msaitoh (unsigned int)__SHIFTOUT(reg, PCI_L1PM_CTL1_CMRT));
4171 1.135 msaitoh scale = PCI_LTR_SCALETONS(__SHIFTOUT(reg, PCI_L1PM_CTL1_LTRTHSCALE));
4172 1.135 msaitoh val = __SHIFTOUT(reg, PCI_L1PM_CTL1_LTRTHVAL);
4173 1.135 msaitoh printf(" LTR L1.2 THRESHOLD: %dus\n", val * scale);
4174 1.135 msaitoh
4175 1.135 msaitoh reg = regs[o2i(extcapoff + PCI_L1PM_CTL2)];
4176 1.135 msaitoh printf(" L1 PM Substates Control register 2: 0x%08x\n", reg);
4177 1.135 msaitoh scale = pci_conf_l1pm_cap_tposcale(
4178 1.135 msaitoh __SHIFTOUT(reg, PCI_L1PM_CTL2_TPOSCALE));
4179 1.135 msaitoh val = __SHIFTOUT(reg, PCI_L1PM_CTL2_TPOVAL);
4180 1.135 msaitoh printf(" T_POWER_ON: ");
4181 1.135 msaitoh if (scale == -1)
4182 1.135 msaitoh printf("unknown\n");
4183 1.135 msaitoh else
4184 1.135 msaitoh printf("%dus\n", val * scale);
4185 1.200 msaitoh
4186 1.200 msaitoh if (PCI_EXTCAPLIST_VERSION(regs[o2i(extcapoff)]) >= 2) {
4187 1.200 msaitoh reg = regs[o2i(extcapoff + PCI_L1PM_CTL2)];
4188 1.200 msaitoh printf(" L1 PM Substates Status register: 0x%08x\n", reg);
4189 1.200 msaitoh onoff("Link Activation Status", reg, PCI_L1PM_STAT_LA);
4190 1.200 msaitoh }
4191 1.135 msaitoh }
4192 1.135 msaitoh
4193 1.147 msaitoh static void
4194 1.199 msaitoh pci_conf_print_ptm_cap(const pcireg_t *regs, int extcapoff)
4195 1.147 msaitoh {
4196 1.147 msaitoh pcireg_t reg;
4197 1.147 msaitoh uint32_t val;
4198 1.147 msaitoh
4199 1.215.2.5 martin printf("\n Precision Time Measurement\n");
4200 1.147 msaitoh
4201 1.147 msaitoh reg = regs[o2i(extcapoff + PCI_PTM_CAP)];
4202 1.147 msaitoh printf(" PTM Capability register: 0x%08x\n", reg);
4203 1.147 msaitoh onoff("PTM Requester Capable", reg, PCI_PTM_CAP_REQ);
4204 1.147 msaitoh onoff("PTM Responder Capable", reg, PCI_PTM_CAP_RESP);
4205 1.147 msaitoh onoff("PTM Root Capable", reg, PCI_PTM_CAP_ROOT);
4206 1.147 msaitoh printf(" Local Clock Granularity: ");
4207 1.147 msaitoh val = __SHIFTOUT(reg, PCI_PTM_CAP_LCLCLKGRNL);
4208 1.147 msaitoh switch (val) {
4209 1.147 msaitoh case 0:
4210 1.147 msaitoh printf("Not implemented\n");
4211 1.147 msaitoh break;
4212 1.147 msaitoh case 0xffff:
4213 1.147 msaitoh printf("> 254ns\n");
4214 1.147 msaitoh break;
4215 1.147 msaitoh default:
4216 1.147 msaitoh printf("%uns\n", val);
4217 1.147 msaitoh break;
4218 1.147 msaitoh }
4219 1.147 msaitoh
4220 1.147 msaitoh reg = regs[o2i(extcapoff + PCI_PTM_CTL)];
4221 1.147 msaitoh printf(" PTM Control register: 0x%08x\n", reg);
4222 1.147 msaitoh onoff("PTM Enable", reg, PCI_PTM_CTL_EN);
4223 1.147 msaitoh onoff("Root Select", reg, PCI_PTM_CTL_ROOTSEL);
4224 1.147 msaitoh printf(" Effective Granularity: ");
4225 1.147 msaitoh val = __SHIFTOUT(reg, PCI_PTM_CTL_EFCTGRNL);
4226 1.147 msaitoh switch (val) {
4227 1.147 msaitoh case 0:
4228 1.147 msaitoh printf("Unknown\n");
4229 1.147 msaitoh break;
4230 1.147 msaitoh case 0xffff:
4231 1.147 msaitoh printf("> 254ns\n");
4232 1.147 msaitoh break;
4233 1.147 msaitoh default:
4234 1.147 msaitoh printf("%uns\n", val);
4235 1.147 msaitoh break;
4236 1.147 msaitoh }
4237 1.147 msaitoh }
4238 1.147 msaitoh
4239 1.135 msaitoh /* XXX pci_conf_print_mpcie_cap */
4240 1.135 msaitoh /* XXX pci_conf_print_frsq_cap */
4241 1.135 msaitoh /* XXX pci_conf_print_rtr_cap */
4242 1.135 msaitoh /* XXX pci_conf_print_desigvndsp_cap */
4243 1.153 msaitoh /* XXX pci_conf_print_vf_resizbar_cap */
4244 1.215.2.3 martin
4245 1.215.2.3 martin static void
4246 1.215.2.3 martin pci_conf_print_dlf_cap(const pcireg_t *regs, int extcapoff)
4247 1.215.2.3 martin {
4248 1.215.2.3 martin pcireg_t reg;
4249 1.215.2.3 martin
4250 1.215.2.3 martin printf("\n Data link Feature Register\n");
4251 1.215.2.3 martin reg = regs[o2i(extcapoff + PCI_DLF_CAP)];
4252 1.215.2.3 martin printf(" Capability register: 0x%08x\n", reg);
4253 1.215.2.3 martin onoff("Scaled Flow Control", reg, PCI_DLF_LFEAT_SCLFCTL);
4254 1.215.2.3 martin onoff("DLF Exchange enable", reg, PCI_DLF_CAP_XCHG);
4255 1.215.2.3 martin
4256 1.215.2.3 martin reg = regs[o2i(extcapoff + PCI_DLF_STAT)];
4257 1.215.2.3 martin printf(" Status register: 0x%08x\n", reg);
4258 1.215.2.3 martin onoff("Scaled Flow Control", reg, PCI_DLF_LFEAT_SCLFCTL);
4259 1.215.2.3 martin onoff("Remote DLF supported Valid", reg, PCI_DLF_STAT_RMTVALID);
4260 1.215.2.3 martin }
4261 1.215.2.3 martin
4262 1.215.2.6 martin static void
4263 1.215.2.6 martin pci_conf_print_pl16g_cap(const pcireg_t *regs, int extcapoff)
4264 1.215.2.6 martin {
4265 1.215.2.6 martin pcireg_t reg, lwidth;
4266 1.215.2.6 martin int pcie_capoff;
4267 1.215.2.6 martin unsigned int i, j;
4268 1.215.2.6 martin
4269 1.215.2.6 martin printf("\n Physical Layer 16.0 GT/s\n");
4270 1.215.2.6 martin reg = regs[o2i(extcapoff + PCI_PL16G_CAP)];
4271 1.215.2.6 martin printf(" Capability register: 0x%08x\n", reg);
4272 1.215.2.6 martin
4273 1.215.2.6 martin reg = regs[o2i(extcapoff + PCI_PL16G_CTL)];
4274 1.215.2.6 martin printf(" Control register: 0x%08x\n", reg);
4275 1.215.2.6 martin
4276 1.215.2.6 martin reg = regs[o2i(extcapoff + PCI_PL16G_STAT)];
4277 1.215.2.6 martin printf(" Status register: 0x%08x\n", reg);
4278 1.215.2.6 martin onoff("Equalization 16.0 GT/s Complete", reg, PCI_PL16G_STAT_EQ_COMPL);
4279 1.215.2.6 martin onoff("Equalization 16.0 GT/s Phase 1 Successful", reg,
4280 1.215.2.6 martin PCI_PL16G_STAT_EQ_P1S);
4281 1.215.2.6 martin onoff("Equalization 16.0 GT/s Phase 2 Successful", reg,
4282 1.215.2.6 martin PCI_PL16G_STAT_EQ_P2S);
4283 1.215.2.6 martin onoff("Equalization 16.0 GT/s Phase 3 Successful", reg,
4284 1.215.2.6 martin PCI_PL16G_STAT_EQ_P3S);
4285 1.215.2.6 martin
4286 1.215.2.6 martin reg = regs[o2i(extcapoff + PCI_PL16G_LDPMS)];
4287 1.215.2.6 martin printf(" Local Data Parity Mismatch Status register: 0x%08x\n",
4288 1.215.2.6 martin reg);
4289 1.215.2.6 martin
4290 1.215.2.6 martin reg = regs[o2i(extcapoff + PCI_PL16G_FRDPMS)];
4291 1.215.2.6 martin printf(" First Retimer Data Parity Mismatch Status register:"
4292 1.215.2.6 martin " 0x%08x\n", reg);
4293 1.215.2.6 martin
4294 1.215.2.6 martin reg = regs[o2i(extcapoff + PCI_PL16G_SRDPMS)];
4295 1.215.2.6 martin printf(" Second Retimer Data Parity Mismatch Status register:"
4296 1.215.2.6 martin " 0x%08x\n", reg);
4297 1.215.2.6 martin
4298 1.215.2.6 martin if (pci_conf_find_cap(regs, PCI_CAP_PCIEXPRESS, &pcie_capoff) == 0)
4299 1.215.2.6 martin return; /* error */
4300 1.215.2.6 martin
4301 1.215.2.6 martin reg = regs[o2i(pcie_capoff + PCIE_LCAP)];
4302 1.215.2.6 martin lwidth = __SHIFTOUT(reg, PCIE_LCAP_MAX_WIDTH);
4303 1.215.2.6 martin
4304 1.215.2.6 martin for (i = 0; i < lwidth;) {
4305 1.215.2.6 martin reg = regs[o2i(extcapoff + PCI_PL16G_LEC + i)];
4306 1.215.2.6 martin
4307 1.215.2.6 martin for (j = 0; j < 4; j++) {
4308 1.215.2.6 martin pcireg_t up, down;
4309 1.215.2.6 martin
4310 1.215.2.6 martin down = reg & 0x0000000f;
4311 1.215.2.6 martin up = (reg >> 4) & 0x0000000f;
4312 1.215.2.6 martin printf(" Lane %d downstream: ", i);
4313 1.215.2.6 martin pci_print_pcie_link_preset_preshoot_deemphasis(down);
4314 1.215.2.6 martin printf("\n Lane %d upstream: ", i);
4315 1.215.2.6 martin pci_print_pcie_link_preset_preshoot_deemphasis(up);
4316 1.215.2.6 martin printf("\n");
4317 1.215.2.6 martin
4318 1.215.2.6 martin reg >>= 8;
4319 1.215.2.6 martin i++;
4320 1.215.2.6 martin if (i >= lwidth)
4321 1.215.2.6 martin break;
4322 1.215.2.6 martin }
4323 1.215.2.6 martin }
4324 1.215.2.6 martin }
4325 1.215.2.6 martin
4326 1.215.2.6 martin static const char * const pcie_receive_number_dp[] = {
4327 1.215.2.6 martin [0] = ("Broadcast "
4328 1.215.2.6 martin "(Downstream Port Receiver and all Retimer Pseudo Port Receiver)"),
4329 1.215.2.6 martin [1] = "Rx(A) (Downstream Port Receiver)",
4330 1.215.2.6 martin [2] = "Rx(B) (Retimer X or Z Upstream Pseudo Port Receiver)",
4331 1.215.2.6 martin [3] = "Rx(C) (Retimer X or Z Downstream Pseudo Port Receiver)",
4332 1.215.2.6 martin [4] = "Rx(D) (Retimer Y Upstream Pseudo Port Receiver)",
4333 1.215.2.6 martin [5] = "Rx(E) (Retimer Y Downstream Pseudo Port Receiver)",
4334 1.215.2.6 martin [6] = "Reserved",
4335 1.215.2.6 martin [7] = "Reserved"
4336 1.215.2.6 martin };
4337 1.215.2.6 martin
4338 1.215.2.6 martin static const char * const pcie_receive_number_up[] = {
4339 1.215.2.6 martin "Broadcast (Upstream Port Receiver)",
4340 1.215.2.6 martin "Reserved",
4341 1.215.2.6 martin "Reserved",
4342 1.215.2.6 martin "Reserved",
4343 1.215.2.6 martin "Reserved",
4344 1.215.2.6 martin "Reserved",
4345 1.215.2.6 martin "Rx(F) (Upstream Port Receiver)",
4346 1.215.2.6 martin "Reserved"
4347 1.215.2.6 martin };
4348 1.215.2.6 martin
4349 1.215.2.6 martin /*
4350 1.215.2.6 martin * Print PCI_LMR_LANECSR. This function is used for both control and status
4351 1.215.2.6 martin * register. The reg argument in the lower 16bit has the control or status
4352 1.215.2.6 martin * register. The encoding is the same except the receive number, so use _LCTL_
4353 1.215.2.6 martin * macro.
4354 1.215.2.6 martin */
4355 1.215.2.6 martin static void
4356 1.215.2.6 martin pci_conf_print_lmr_lcsr(pcireg_t reg, bool up, bool dp)
4357 1.215.2.6 martin {
4358 1.215.2.6 martin int rnum;
4359 1.215.2.6 martin
4360 1.215.2.6 martin printf(" Receive Number: ");
4361 1.215.2.6 martin rnum = __SHIFTOUT(reg, PCI_LMR_LCTL_RNUM);
4362 1.215.2.6 martin if (up)
4363 1.215.2.6 martin printf("%s\n", pcie_receive_number_up[rnum]);
4364 1.215.2.6 martin else if (dp)
4365 1.215.2.6 martin printf("%s\n", pcie_receive_number_dp[rnum]);
4366 1.215.2.6 martin else
4367 1.215.2.6 martin printf("%x\n", rnum);
4368 1.215.2.6 martin
4369 1.215.2.6 martin printf(" Margin Type: %x\n",
4370 1.215.2.6 martin (uint32_t)__SHIFTOUT(reg, PCI_LMR_LCTL_MTYPE));
4371 1.215.2.6 martin printf(" Usage Model: %s\n",
4372 1.215.2.6 martin (__SHIFTOUT(reg, PCI_LMR_LCTL_UMODEL) == 0)
4373 1.215.2.6 martin ? "Lane Margining at Receiver" : "Reserved Encoding");
4374 1.215.2.6 martin printf(" Margin Payload: 0x%02x\n",
4375 1.215.2.6 martin (uint32_t)__SHIFTOUT(reg, PCI_LMR_LCTL_MPAYLOAD));
4376 1.215.2.6 martin }
4377 1.215.2.6 martin
4378 1.215.2.6 martin static void
4379 1.215.2.6 martin pci_conf_print_lmr_cap(const pcireg_t *regs, int extcapoff)
4380 1.215.2.6 martin {
4381 1.215.2.6 martin pcireg_t reg, lwidth;
4382 1.215.2.6 martin int pcie_capoff;
4383 1.215.2.6 martin int pcie_devtype;
4384 1.215.2.6 martin unsigned int i;
4385 1.215.2.6 martin bool up, dp;
4386 1.215.2.6 martin
4387 1.215.2.6 martin printf("\n Lane Margining at the Receiver\n");
4388 1.215.2.6 martin reg = regs[o2i(extcapoff + PCI_LMR_PCAPSTAT)];
4389 1.215.2.6 martin printf(" Port Capability register: 0x%04x\n", reg & 0xffff);
4390 1.215.2.6 martin onoff("Margining uses Driver Software", reg, PCI_LMR_PCAP_MUDS);
4391 1.215.2.6 martin printf(" Port Status register: 0x%04x\n", (reg >> 16) & 0xffff);
4392 1.215.2.6 martin onoff("Margining Ready", reg, PCI_LMR_PSTAT_MR);
4393 1.215.2.6 martin onoff("Margining Software Ready", reg, PCI_LMR_PSTAT_MSR);
4394 1.215.2.6 martin
4395 1.215.2.6 martin if (pci_conf_find_cap(regs, PCI_CAP_PCIEXPRESS, &pcie_capoff) == 0)
4396 1.215.2.6 martin return; /* error */
4397 1.215.2.6 martin
4398 1.215.2.6 martin up = dp = false;
4399 1.215.2.6 martin reg = regs[o2i(pcie_capoff)];
4400 1.215.2.6 martin pcie_devtype = PCIE_XCAP_TYPE(reg);
4401 1.215.2.6 martin switch (pcie_devtype) {
4402 1.215.2.6 martin case PCIE_XCAP_TYPE_PCIE_DEV: /* 0x0 */
4403 1.215.2.6 martin case PCIE_XCAP_TYPE_PCI_DEV: /* 0x1 */
4404 1.215.2.6 martin case PCIE_XCAP_TYPE_UP: /* 0x5 */
4405 1.215.2.6 martin case PCIE_XCAP_TYPE_PCIE2PCI: /* 0x7 */
4406 1.215.2.6 martin up = true;
4407 1.215.2.6 martin break;
4408 1.215.2.6 martin case PCIE_XCAP_TYPE_RP: /* 0x4 */
4409 1.215.2.6 martin case PCIE_XCAP_TYPE_DOWN: /* 0x6 */
4410 1.215.2.6 martin dp = true;
4411 1.215.2.6 martin break;
4412 1.215.2.6 martin default:
4413 1.215.2.6 martin printf("neither upstream nor downstream?(%x)\n", pcie_devtype);
4414 1.215.2.6 martin break;
4415 1.215.2.6 martin }
4416 1.215.2.6 martin
4417 1.215.2.6 martin reg = regs[o2i(pcie_capoff + PCIE_LCAP)];
4418 1.215.2.6 martin lwidth = __SHIFTOUT(reg, PCIE_LCAP_MAX_WIDTH);
4419 1.215.2.6 martin
4420 1.215.2.6 martin for (i = 0; i < lwidth; i++) {
4421 1.215.2.6 martin pcireg_t lctl, lstat;
4422 1.215.2.6 martin
4423 1.215.2.6 martin reg = regs[o2i(extcapoff + PCI_LMR_LANECSR + (i * 4))];
4424 1.215.2.6 martin
4425 1.215.2.6 martin lctl = reg & 0xffff;
4426 1.215.2.6 martin printf(" Lane %d control: 0x%04x\n", i, lctl);
4427 1.215.2.6 martin pci_conf_print_lmr_lcsr(lctl, up, dp);
4428 1.215.2.6 martin
4429 1.215.2.6 martin lstat = (reg >> 16) & 0xffff;
4430 1.215.2.6 martin printf(" Lane %d status: 0x%04x\n", i, lstat);
4431 1.215.2.6 martin pci_conf_print_lmr_lcsr(lstat, up, dp);
4432 1.215.2.6 martin }
4433 1.215.2.6 martin }
4434 1.215.2.6 martin
4435 1.177 msaitoh /* XXX pci_conf_print_hierarchyid_cap */
4436 1.191 msaitoh /* XXX pci_conf_print_npem_cap */
4437 1.135 msaitoh
4438 1.135 msaitoh #undef MS
4439 1.135 msaitoh #undef SM
4440 1.135 msaitoh #undef RW
4441 1.135 msaitoh
4442 1.135 msaitoh static struct {
4443 1.135 msaitoh pcireg_t cap;
4444 1.135 msaitoh const char *name;
4445 1.199 msaitoh void (*printfunc)(const pcireg_t *, int);
4446 1.135 msaitoh } pci_extcaptab[] = {
4447 1.135 msaitoh { 0, "reserved",
4448 1.135 msaitoh NULL },
4449 1.135 msaitoh { PCI_EXTCAP_AER, "Advanced Error Reporting",
4450 1.135 msaitoh pci_conf_print_aer_cap },
4451 1.135 msaitoh { PCI_EXTCAP_VC, "Virtual Channel",
4452 1.135 msaitoh pci_conf_print_vc_cap },
4453 1.135 msaitoh { PCI_EXTCAP_SERNUM, "Device Serial Number",
4454 1.135 msaitoh pci_conf_print_sernum_cap },
4455 1.135 msaitoh { PCI_EXTCAP_PWRBDGT, "Power Budgeting",
4456 1.135 msaitoh pci_conf_print_pwrbdgt_cap },
4457 1.135 msaitoh { PCI_EXTCAP_RCLINK_DCL,"Root Complex Link Declaration",
4458 1.135 msaitoh pci_conf_print_rclink_dcl_cap },
4459 1.135 msaitoh { PCI_EXTCAP_RCLINK_CTL,"Root Complex Internal Link Control",
4460 1.135 msaitoh NULL },
4461 1.135 msaitoh { PCI_EXTCAP_RCEC_ASSOC,"Root Complex Event Collector Association",
4462 1.135 msaitoh pci_conf_print_rcec_assoc_cap },
4463 1.135 msaitoh { PCI_EXTCAP_MFVC, "Multi-Function Virtual Channel",
4464 1.135 msaitoh NULL },
4465 1.135 msaitoh { PCI_EXTCAP_VC2, "Virtual Channel",
4466 1.135 msaitoh NULL },
4467 1.135 msaitoh { PCI_EXTCAP_RCRB, "RCRB Header",
4468 1.135 msaitoh NULL },
4469 1.135 msaitoh { PCI_EXTCAP_VENDOR, "Vendor Unique",
4470 1.135 msaitoh NULL },
4471 1.135 msaitoh { PCI_EXTCAP_CAC, "Configuration Access Correction",
4472 1.135 msaitoh NULL },
4473 1.135 msaitoh { PCI_EXTCAP_ACS, "Access Control Services",
4474 1.135 msaitoh pci_conf_print_acs_cap },
4475 1.135 msaitoh { PCI_EXTCAP_ARI, "Alternative Routing-ID Interpretation",
4476 1.135 msaitoh pci_conf_print_ari_cap },
4477 1.135 msaitoh { PCI_EXTCAP_ATS, "Address Translation Services",
4478 1.135 msaitoh pci_conf_print_ats_cap },
4479 1.135 msaitoh { PCI_EXTCAP_SRIOV, "Single Root IO Virtualization",
4480 1.135 msaitoh pci_conf_print_sriov_cap },
4481 1.135 msaitoh { PCI_EXTCAP_MRIOV, "Multiple Root IO Virtualization",
4482 1.135 msaitoh NULL },
4483 1.138 msaitoh { PCI_EXTCAP_MCAST, "Multicast",
4484 1.138 msaitoh pci_conf_print_multicast_cap },
4485 1.135 msaitoh { PCI_EXTCAP_PAGE_REQ, "Page Request",
4486 1.135 msaitoh pci_conf_print_page_req_cap },
4487 1.135 msaitoh { PCI_EXTCAP_AMD, "Reserved for AMD",
4488 1.135 msaitoh NULL },
4489 1.153 msaitoh { PCI_EXTCAP_RESIZBAR, "Resizable BAR",
4490 1.153 msaitoh pci_conf_print_resizbar_cap },
4491 1.135 msaitoh { PCI_EXTCAP_DPA, "Dynamic Power Allocation",
4492 1.149 msaitoh pci_conf_print_dpa_cap },
4493 1.135 msaitoh { PCI_EXTCAP_TPH_REQ, "TPH Requester",
4494 1.135 msaitoh pci_conf_print_tph_req_cap },
4495 1.135 msaitoh { PCI_EXTCAP_LTR, "Latency Tolerance Reporting",
4496 1.135 msaitoh pci_conf_print_ltr_cap },
4497 1.135 msaitoh { PCI_EXTCAP_SEC_PCIE, "Secondary PCI Express",
4498 1.135 msaitoh pci_conf_print_sec_pcie_cap },
4499 1.135 msaitoh { PCI_EXTCAP_PMUX, "Protocol Multiplexing",
4500 1.135 msaitoh NULL },
4501 1.135 msaitoh { PCI_EXTCAP_PASID, "Process Address Space ID",
4502 1.135 msaitoh pci_conf_print_pasid_cap },
4503 1.190 msaitoh { PCI_EXTCAP_LNR, "LN Requester",
4504 1.135 msaitoh pci_conf_print_lnr_cap },
4505 1.135 msaitoh { PCI_EXTCAP_DPC, "Downstream Port Containment",
4506 1.176 msaitoh pci_conf_print_dpc_cap },
4507 1.135 msaitoh { PCI_EXTCAP_L1PM, "L1 PM Substates",
4508 1.135 msaitoh pci_conf_print_l1pm_cap },
4509 1.215.2.5 martin { PCI_EXTCAP_PTM, "Precision Time Measurement",
4510 1.147 msaitoh pci_conf_print_ptm_cap },
4511 1.135 msaitoh { PCI_EXTCAP_MPCIE, "M-PCIe",
4512 1.135 msaitoh NULL },
4513 1.135 msaitoh { PCI_EXTCAP_FRSQ, "Function Reading Status Queueing",
4514 1.135 msaitoh NULL },
4515 1.135 msaitoh { PCI_EXTCAP_RTR, "Readiness Time Reporting",
4516 1.135 msaitoh NULL },
4517 1.135 msaitoh { PCI_EXTCAP_DESIGVNDSP, "Designated Vendor-Specific",
4518 1.135 msaitoh NULL },
4519 1.153 msaitoh { PCI_EXTCAP_VF_RESIZBAR, "VF Resizable BARs",
4520 1.151 msaitoh NULL },
4521 1.215.2.5 martin { PCI_EXTCAP_DLF, "Data link Feature", pci_conf_print_dlf_cap },
4522 1.215.2.6 martin { PCI_EXTCAP_PL16G, "Physical Layer 16.0 GT/s",
4523 1.215.2.6 martin pci_conf_print_pl16g_cap },
4524 1.215.2.6 martin { PCI_EXTCAP_LMR, "Lane Margining at the Receiver",
4525 1.215.2.6 martin pci_conf_print_lmr_cap },
4526 1.177 msaitoh { PCI_EXTCAP_HIERARCHYID, "Hierarchy ID",
4527 1.177 msaitoh NULL },
4528 1.191 msaitoh { PCI_EXTCAP_NPEM, "Native PCIe Enclosure Management",
4529 1.191 msaitoh NULL },
4530 1.135 msaitoh };
4531 1.135 msaitoh
4532 1.135 msaitoh static int
4533 1.199 msaitoh pci_conf_find_extcap(const pcireg_t *regs, unsigned int capid, int *offsetp)
4534 1.135 msaitoh {
4535 1.135 msaitoh int off;
4536 1.135 msaitoh pcireg_t rval;
4537 1.135 msaitoh
4538 1.135 msaitoh for (off = PCI_EXTCAPLIST_BASE;
4539 1.135 msaitoh off != 0;
4540 1.135 msaitoh off = PCI_EXTCAPLIST_NEXT(rval)) {
4541 1.135 msaitoh rval = regs[o2i(off)];
4542 1.135 msaitoh if (capid == PCI_EXTCAPLIST_CAP(rval)) {
4543 1.135 msaitoh if (offsetp != NULL)
4544 1.135 msaitoh *offsetp = off;
4545 1.135 msaitoh return 1;
4546 1.33 kleink }
4547 1.33 kleink }
4548 1.135 msaitoh return 0;
4549 1.135 msaitoh }
4550 1.135 msaitoh
4551 1.135 msaitoh static void
4552 1.135 msaitoh pci_conf_print_extcaplist(
4553 1.135 msaitoh #ifdef _KERNEL
4554 1.135 msaitoh pci_chipset_tag_t pc, pcitag_t tag,
4555 1.135 msaitoh #endif
4556 1.199 msaitoh const pcireg_t *regs)
4557 1.135 msaitoh {
4558 1.135 msaitoh int off;
4559 1.135 msaitoh pcireg_t foundcap;
4560 1.135 msaitoh pcireg_t rval;
4561 1.135 msaitoh bool foundtable[__arraycount(pci_extcaptab)];
4562 1.135 msaitoh unsigned int i;
4563 1.135 msaitoh
4564 1.135 msaitoh /* Check Extended capability structure */
4565 1.135 msaitoh off = PCI_EXTCAPLIST_BASE;
4566 1.135 msaitoh rval = regs[o2i(off)];
4567 1.135 msaitoh if (rval == 0xffffffff || rval == 0)
4568 1.135 msaitoh return;
4569 1.135 msaitoh
4570 1.135 msaitoh /* Clear table */
4571 1.135 msaitoh for (i = 0; i < __arraycount(pci_extcaptab); i++)
4572 1.135 msaitoh foundtable[i] = false;
4573 1.135 msaitoh
4574 1.135 msaitoh /* Print extended capability register's offset and the type first */
4575 1.135 msaitoh for (;;) {
4576 1.135 msaitoh printf(" Extended Capability Register at 0x%02x\n", off);
4577 1.135 msaitoh
4578 1.135 msaitoh foundcap = PCI_EXTCAPLIST_CAP(rval);
4579 1.135 msaitoh printf(" type: 0x%04x (", foundcap);
4580 1.135 msaitoh if (foundcap < __arraycount(pci_extcaptab)) {
4581 1.135 msaitoh printf("%s)\n", pci_extcaptab[foundcap].name);
4582 1.135 msaitoh /* Mark as found */
4583 1.135 msaitoh foundtable[foundcap] = true;
4584 1.135 msaitoh } else
4585 1.135 msaitoh printf("unknown)\n");
4586 1.135 msaitoh printf(" version: %d\n", PCI_EXTCAPLIST_VERSION(rval));
4587 1.135 msaitoh
4588 1.135 msaitoh off = PCI_EXTCAPLIST_NEXT(rval);
4589 1.135 msaitoh if (off == 0)
4590 1.135 msaitoh break;
4591 1.150 msaitoh else if (off <= PCI_CONF_SIZE) {
4592 1.150 msaitoh printf(" next pointer: 0x%03x (incorrect)\n", off);
4593 1.150 msaitoh return;
4594 1.150 msaitoh }
4595 1.135 msaitoh rval = regs[o2i(off)];
4596 1.135 msaitoh }
4597 1.135 msaitoh
4598 1.135 msaitoh /*
4599 1.135 msaitoh * And then, print the detail of each capability registers
4600 1.135 msaitoh * in capability value's order.
4601 1.135 msaitoh */
4602 1.135 msaitoh for (i = 0; i < __arraycount(pci_extcaptab); i++) {
4603 1.135 msaitoh if (foundtable[i] == false)
4604 1.135 msaitoh continue;
4605 1.135 msaitoh
4606 1.135 msaitoh /*
4607 1.135 msaitoh * The type was found. Search capability list again and
4608 1.215.2.5 martin * print all capabilities that the capability type is
4609 1.135 msaitoh * the same.
4610 1.135 msaitoh */
4611 1.199 msaitoh if (pci_conf_find_extcap(regs, i, &off) == 0)
4612 1.135 msaitoh continue;
4613 1.135 msaitoh rval = regs[o2i(off)];
4614 1.135 msaitoh if ((PCI_EXTCAPLIST_VERSION(rval) <= 0)
4615 1.135 msaitoh || (pci_extcaptab[i].printfunc == NULL))
4616 1.135 msaitoh continue;
4617 1.135 msaitoh
4618 1.199 msaitoh pci_extcaptab[i].printfunc(regs, off);
4619 1.135 msaitoh
4620 1.135 msaitoh }
4621 1.26 cgd }
4622 1.26 cgd
4623 1.79 dyoung /* Print the Secondary Status Register. */
4624 1.79 dyoung static void
4625 1.79 dyoung pci_conf_print_ssr(pcireg_t rval)
4626 1.79 dyoung {
4627 1.79 dyoung pcireg_t devsel;
4628 1.79 dyoung
4629 1.79 dyoung printf(" Secondary status register: 0x%04x\n", rval); /* XXX bits */
4630 1.112 msaitoh onoff("66 MHz capable", rval, __BIT(5));
4631 1.112 msaitoh onoff("User Definable Features (UDF) support", rval, __BIT(6));
4632 1.112 msaitoh onoff("Fast back-to-back capable", rval, __BIT(7));
4633 1.112 msaitoh onoff("Data parity error detected", rval, __BIT(8));
4634 1.79 dyoung
4635 1.79 dyoung printf(" DEVSEL timing: ");
4636 1.79 dyoung devsel = __SHIFTOUT(rval, __BITS(10, 9));
4637 1.79 dyoung switch (devsel) {
4638 1.79 dyoung case 0:
4639 1.79 dyoung printf("fast");
4640 1.79 dyoung break;
4641 1.79 dyoung case 1:
4642 1.79 dyoung printf("medium");
4643 1.79 dyoung break;
4644 1.79 dyoung case 2:
4645 1.79 dyoung printf("slow");
4646 1.79 dyoung break;
4647 1.79 dyoung default:
4648 1.79 dyoung printf("unknown/reserved"); /* XXX */
4649 1.79 dyoung break;
4650 1.79 dyoung }
4651 1.79 dyoung printf(" (0x%x)\n", devsel);
4652 1.79 dyoung
4653 1.112 msaitoh onoff("Signalled target abort", rval, __BIT(11));
4654 1.112 msaitoh onoff("Received target abort", rval, __BIT(12));
4655 1.112 msaitoh onoff("Received master abort", rval, __BIT(13));
4656 1.112 msaitoh onoff("Received system error", rval, __BIT(14));
4657 1.112 msaitoh onoff("Detected parity error", rval, __BIT(15));
4658 1.79 dyoung }
4659 1.79 dyoung
4660 1.27 cgd static void
4661 1.115 msaitoh pci_conf_print_type0(
4662 1.115 msaitoh #ifdef _KERNEL
4663 1.115 msaitoh pci_chipset_tag_t pc, pcitag_t tag,
4664 1.115 msaitoh #endif
4665 1.167 msaitoh const pcireg_t *regs)
4666 1.115 msaitoh {
4667 1.115 msaitoh int off, width;
4668 1.115 msaitoh pcireg_t rval;
4669 1.191 msaitoh const char *str;
4670 1.115 msaitoh
4671 1.115 msaitoh for (off = PCI_MAPREG_START; off < PCI_MAPREG_END; off += width) {
4672 1.115 msaitoh #ifdef _KERNEL
4673 1.167 msaitoh width = pci_conf_print_bar(pc, tag, regs, off, NULL);
4674 1.115 msaitoh #else
4675 1.115 msaitoh width = pci_conf_print_bar(regs, off, NULL);
4676 1.115 msaitoh #endif
4677 1.115 msaitoh }
4678 1.115 msaitoh
4679 1.170 msaitoh printf(" Cardbus CIS Pointer: 0x%08x\n",
4680 1.170 msaitoh regs[o2i(PCI_CARDBUS_CIS_REG)]);
4681 1.115 msaitoh
4682 1.115 msaitoh rval = regs[o2i(PCI_SUBSYS_ID_REG)];
4683 1.115 msaitoh printf(" Subsystem vendor ID: 0x%04x\n", PCI_VENDOR(rval));
4684 1.115 msaitoh printf(" Subsystem ID: 0x%04x\n", PCI_PRODUCT(rval));
4685 1.115 msaitoh
4686 1.191 msaitoh rval = regs[o2i(PCI_MAPREG_ROM)];
4687 1.191 msaitoh printf(" Expansion ROM Base Address Register: 0x%08x\n", rval);
4688 1.191 msaitoh printf(" base: 0x%08x\n", (uint32_t)PCI_MAPREG_ROM_ADDR(rval));
4689 1.191 msaitoh onoff("Expansion ROM Enable", rval, PCI_MAPREG_ROM_ENABLE);
4690 1.191 msaitoh printf(" Validation Status: ");
4691 1.191 msaitoh switch (__SHIFTOUT(rval, PCI_MAPREG_ROM_VALID_STAT)) {
4692 1.191 msaitoh case PCI_MAPREG_ROM_VSTAT_NOTSUPP:
4693 1.191 msaitoh str = "Validation not supported";
4694 1.191 msaitoh break;
4695 1.191 msaitoh case PCI_MAPREG_ROM_VSTAT_INPROG:
4696 1.191 msaitoh str = "Validation in Progress";
4697 1.191 msaitoh break;
4698 1.191 msaitoh case PCI_MAPREG_ROM_VSTAT_VPASS:
4699 1.191 msaitoh str = "Validation Pass. "
4700 1.191 msaitoh "Valid contents, trust test was not performed";
4701 1.191 msaitoh break;
4702 1.191 msaitoh case PCI_MAPREG_ROM_VSTAT_VPASSTRUST:
4703 1.191 msaitoh str = "Validation Pass. Valid and trusted contents";
4704 1.191 msaitoh break;
4705 1.191 msaitoh case PCI_MAPREG_ROM_VSTAT_VFAIL:
4706 1.191 msaitoh str = "Validation Fail. Invalid contents";
4707 1.191 msaitoh break;
4708 1.191 msaitoh case PCI_MAPREG_ROM_VSTAT_VFAILUNTRUST:
4709 1.191 msaitoh str = "Validation Fail. Valid but untrusted contents";
4710 1.191 msaitoh break;
4711 1.191 msaitoh case PCI_MAPREG_ROM_VSTAT_WPASS:
4712 1.191 msaitoh str = "Warning Pass. Validation passed with warning. "
4713 1.191 msaitoh "Valid contents, trust test was not performed";
4714 1.191 msaitoh break;
4715 1.191 msaitoh case PCI_MAPREG_ROM_VSTAT_WPASSTRUST:
4716 1.191 msaitoh str = "Warning Pass. Validation passed with warning. "
4717 1.191 msaitoh "Valid and trusted contents";
4718 1.191 msaitoh break;
4719 1.191 msaitoh }
4720 1.191 msaitoh printf("%s\n", str);
4721 1.191 msaitoh printf(" Validation Details: 0x%x\n",
4722 1.191 msaitoh (uint32_t)__SHIFTOUT(rval, PCI_MAPREG_ROM_VALID_DETAIL));
4723 1.115 msaitoh
4724 1.115 msaitoh if (regs[o2i(PCI_COMMAND_STATUS_REG)] & PCI_STATUS_CAPLIST_SUPPORT)
4725 1.115 msaitoh printf(" Capability list pointer: 0x%02x\n",
4726 1.115 msaitoh PCI_CAPLIST_PTR(regs[o2i(PCI_CAPLISTPTR_REG)]));
4727 1.115 msaitoh else
4728 1.115 msaitoh printf(" Reserved @ 0x34: 0x%08x\n", regs[o2i(0x34)]);
4729 1.115 msaitoh
4730 1.115 msaitoh printf(" Reserved @ 0x38: 0x%08x\n", regs[o2i(0x38)]);
4731 1.115 msaitoh
4732 1.115 msaitoh rval = regs[o2i(PCI_INTERRUPT_REG)];
4733 1.170 msaitoh printf(" Maximum Latency: 0x%02x\n", PCI_MAX_LAT(rval));
4734 1.170 msaitoh printf(" Minimum Grant: 0x%02x\n", PCI_MIN_GNT(rval));
4735 1.115 msaitoh printf(" Interrupt pin: 0x%02x ", PCI_INTERRUPT_PIN(rval));
4736 1.115 msaitoh switch (PCI_INTERRUPT_PIN(rval)) {
4737 1.115 msaitoh case PCI_INTERRUPT_PIN_NONE:
4738 1.115 msaitoh printf("(none)");
4739 1.115 msaitoh break;
4740 1.115 msaitoh case PCI_INTERRUPT_PIN_A:
4741 1.115 msaitoh printf("(pin A)");
4742 1.115 msaitoh break;
4743 1.115 msaitoh case PCI_INTERRUPT_PIN_B:
4744 1.115 msaitoh printf("(pin B)");
4745 1.115 msaitoh break;
4746 1.115 msaitoh case PCI_INTERRUPT_PIN_C:
4747 1.115 msaitoh printf("(pin C)");
4748 1.115 msaitoh break;
4749 1.115 msaitoh case PCI_INTERRUPT_PIN_D:
4750 1.115 msaitoh printf("(pin D)");
4751 1.115 msaitoh break;
4752 1.115 msaitoh default:
4753 1.115 msaitoh printf("(? ? ?)");
4754 1.115 msaitoh break;
4755 1.115 msaitoh }
4756 1.115 msaitoh printf("\n");
4757 1.115 msaitoh printf(" Interrupt line: 0x%02x\n", PCI_INTERRUPT_LINE(rval));
4758 1.115 msaitoh }
4759 1.115 msaitoh
4760 1.115 msaitoh static void
4761 1.45 thorpej pci_conf_print_type1(
4762 1.45 thorpej #ifdef _KERNEL
4763 1.45 thorpej pci_chipset_tag_t pc, pcitag_t tag,
4764 1.45 thorpej #endif
4765 1.167 msaitoh const pcireg_t *regs)
4766 1.27 cgd {
4767 1.37 nathanw int off, width;
4768 1.197 msaitoh pcireg_t rval, csreg;
4769 1.110 msaitoh uint32_t base, limit;
4770 1.110 msaitoh uint32_t base_h, limit_h;
4771 1.110 msaitoh uint64_t pbase, plimit;
4772 1.110 msaitoh int use_upper;
4773 1.27 cgd
4774 1.27 cgd /*
4775 1.27 cgd * This layout was cribbed from the TI PCI2030 PCI-to-PCI
4776 1.27 cgd * Bridge chip documentation, and may not be correct with
4777 1.27 cgd * respect to various standards. (XXX)
4778 1.27 cgd */
4779 1.27 cgd
4780 1.45 thorpej for (off = 0x10; off < 0x18; off += width) {
4781 1.45 thorpej #ifdef _KERNEL
4782 1.167 msaitoh width = pci_conf_print_bar(pc, tag, regs, off, NULL);
4783 1.45 thorpej #else
4784 1.45 thorpej width = pci_conf_print_bar(regs, off, NULL);
4785 1.45 thorpej #endif
4786 1.45 thorpej }
4787 1.27 cgd
4788 1.109 msaitoh rval = regs[o2i(PCI_BRIDGE_BUS_REG)];
4789 1.27 cgd printf(" Primary bus number: 0x%02x\n",
4790 1.212 msaitoh PCI_BRIDGE_BUS_NUM_PRIMARY(rval));
4791 1.27 cgd printf(" Secondary bus number: 0x%02x\n",
4792 1.212 msaitoh PCI_BRIDGE_BUS_NUM_SECONDARY(rval));
4793 1.27 cgd printf(" Subordinate bus number: 0x%02x\n",
4794 1.212 msaitoh PCI_BRIDGE_BUS_NUM_SUBORDINATE(rval));
4795 1.27 cgd printf(" Secondary bus latency timer: 0x%02x\n",
4796 1.212 msaitoh PCI_BRIDGE_BUS_SEC_LATTIMER_VAL(rval));
4797 1.27 cgd
4798 1.109 msaitoh rval = regs[o2i(PCI_BRIDGE_STATIO_REG)];
4799 1.109 msaitoh pci_conf_print_ssr(__SHIFTOUT(rval, __BITS(31, 16)));
4800 1.27 cgd
4801 1.110 msaitoh /* I/O region */
4802 1.27 cgd printf(" I/O region:\n");
4803 1.109 msaitoh printf(" base register: 0x%02x\n", (rval >> 0) & 0xff);
4804 1.109 msaitoh printf(" limit register: 0x%02x\n", (rval >> 8) & 0xff);
4805 1.110 msaitoh if (PCI_BRIDGE_IO_32BITS(rval))
4806 1.110 msaitoh use_upper = 1;
4807 1.110 msaitoh else
4808 1.110 msaitoh use_upper = 0;
4809 1.112 msaitoh onoff("32bit I/O", rval, use_upper);
4810 1.212 msaitoh base = PCI_BRIDGE_STATIO_IOBASE_ADDR(rval);
4811 1.212 msaitoh limit = PCI_BRIDGE_STATIO_IOLIMIT_ADDR(rval);
4812 1.110 msaitoh
4813 1.109 msaitoh rval = regs[o2i(PCI_BRIDGE_IOHIGH_REG)];
4814 1.212 msaitoh base_h = __SHIFTOUT(rval, PCI_BRIDGE_IOHIGH_BASE);
4815 1.212 msaitoh limit_h = __SHIFTOUT(rval, PCI_BRIDGE_IOHIGH_LIMIT);
4816 1.110 msaitoh printf(" base upper 16 bits register: 0x%04x\n", base_h);
4817 1.110 msaitoh printf(" limit upper 16 bits register: 0x%04x\n", limit_h);
4818 1.110 msaitoh
4819 1.110 msaitoh if (use_upper == 1) {
4820 1.110 msaitoh base |= base_h << 16;
4821 1.110 msaitoh limit |= limit_h << 16;
4822 1.110 msaitoh }
4823 1.110 msaitoh if (base < limit) {
4824 1.110 msaitoh if (use_upper == 1)
4825 1.196 msaitoh printf(" range: 0x%08x-0x%08x\n", base, limit);
4826 1.110 msaitoh else
4827 1.196 msaitoh printf(" range: 0x%04x-0x%04x\n", base, limit);
4828 1.121 msaitoh } else
4829 1.121 msaitoh printf(" range: not set\n");
4830 1.27 cgd
4831 1.110 msaitoh /* Non-prefetchable memory region */
4832 1.109 msaitoh rval = regs[o2i(PCI_BRIDGE_MEMORY_REG)];
4833 1.27 cgd printf(" Memory region:\n");
4834 1.212 msaitoh printf(" base register: 0x%04hx\n",
4835 1.212 msaitoh (uint16_t)__SHIFTOUT(rval, PCI_BRIDGE_MEMORY_BASE));
4836 1.212 msaitoh printf(" limit register: 0x%04hx\n",
4837 1.212 msaitoh (uint16_t)__SHIFTOUT(rval, PCI_BRIDGE_MEMORY_LIMIT));
4838 1.212 msaitoh base = PCI_BRIDGE_MEMORY_BASE_ADDR(rval);
4839 1.212 msaitoh limit = PCI_BRIDGE_MEMORY_LIMIT_ADDR(rval);
4840 1.110 msaitoh if (base < limit)
4841 1.196 msaitoh printf(" range: 0x%08x-0x%08x\n", base, limit);
4842 1.121 msaitoh else
4843 1.196 msaitoh printf(" range: not set\n");
4844 1.27 cgd
4845 1.110 msaitoh /* Prefetchable memory region */
4846 1.109 msaitoh rval = regs[o2i(PCI_BRIDGE_PREFETCHMEM_REG)];
4847 1.27 cgd printf(" Prefetchable memory region:\n");
4848 1.27 cgd printf(" base register: 0x%04x\n",
4849 1.109 msaitoh (rval >> 0) & 0xffff);
4850 1.27 cgd printf(" limit register: 0x%04x\n",
4851 1.109 msaitoh (rval >> 16) & 0xffff);
4852 1.212 msaitoh base_h = regs[o2i(PCI_BRIDGE_PREFETCHBASEUP32_REG)];
4853 1.212 msaitoh limit_h = regs[o2i(PCI_BRIDGE_PREFETCHLIMITUP32_REG)];
4854 1.109 msaitoh printf(" base upper 32 bits register: 0x%08x\n",
4855 1.110 msaitoh base_h);
4856 1.109 msaitoh printf(" limit upper 32 bits register: 0x%08x\n",
4857 1.110 msaitoh limit_h);
4858 1.110 msaitoh if (PCI_BRIDGE_PREFETCHMEM_64BITS(rval))
4859 1.110 msaitoh use_upper = 1;
4860 1.110 msaitoh else
4861 1.110 msaitoh use_upper = 0;
4862 1.112 msaitoh onoff("64bit memory address", rval, use_upper);
4863 1.212 msaitoh pbase = PCI_BRIDGE_PREFETCHMEM_BASE_ADDR(rval);
4864 1.212 msaitoh plimit = PCI_BRIDGE_PREFETCHMEM_LIMIT_ADDR(rval);
4865 1.110 msaitoh if (use_upper == 1) {
4866 1.110 msaitoh pbase |= (uint64_t)base_h << 32;
4867 1.110 msaitoh plimit |= (uint64_t)limit_h << 32;
4868 1.110 msaitoh }
4869 1.110 msaitoh if (pbase < plimit) {
4870 1.110 msaitoh if (use_upper == 1)
4871 1.196 msaitoh printf(" range: 0x%016" PRIx64 "-0x%016" PRIx64
4872 1.115 msaitoh "\n", pbase, plimit);
4873 1.110 msaitoh else
4874 1.196 msaitoh printf(" range: 0x%08x-0x%08x\n",
4875 1.110 msaitoh (uint32_t)pbase, (uint32_t)plimit);
4876 1.121 msaitoh } else
4877 1.196 msaitoh printf(" range: not set\n");
4878 1.27 cgd
4879 1.197 msaitoh csreg = regs[o2i(PCI_COMMAND_STATUS_REG)];
4880 1.197 msaitoh if (csreg & PCI_STATUS_CAPLIST_SUPPORT)
4881 1.53 drochner printf(" Capability list pointer: 0x%02x\n",
4882 1.53 drochner PCI_CAPLIST_PTR(regs[o2i(PCI_CAPLISTPTR_REG)]));
4883 1.53 drochner else
4884 1.53 drochner printf(" Reserved @ 0x34: 0x%08x\n", regs[o2i(0x34)]);
4885 1.53 drochner
4886 1.212 msaitoh printf(" Expansion ROM Base Address: 0x%08x\n",
4887 1.212 msaitoh regs[o2i(PCI_BRIDGE_EXPROMADDR_REG)]);
4888 1.27 cgd
4889 1.109 msaitoh rval = regs[o2i(PCI_INTERRUPT_REG)];
4890 1.27 cgd printf(" Interrupt line: 0x%02x\n",
4891 1.109 msaitoh (rval >> 0) & 0xff);
4892 1.27 cgd printf(" Interrupt pin: 0x%02x ",
4893 1.109 msaitoh (rval >> 8) & 0xff);
4894 1.109 msaitoh switch ((rval >> 8) & 0xff) {
4895 1.27 cgd case PCI_INTERRUPT_PIN_NONE:
4896 1.27 cgd printf("(none)");
4897 1.27 cgd break;
4898 1.27 cgd case PCI_INTERRUPT_PIN_A:
4899 1.27 cgd printf("(pin A)");
4900 1.27 cgd break;
4901 1.27 cgd case PCI_INTERRUPT_PIN_B:
4902 1.27 cgd printf("(pin B)");
4903 1.27 cgd break;
4904 1.27 cgd case PCI_INTERRUPT_PIN_C:
4905 1.27 cgd printf("(pin C)");
4906 1.27 cgd break;
4907 1.27 cgd case PCI_INTERRUPT_PIN_D:
4908 1.27 cgd printf("(pin D)");
4909 1.27 cgd break;
4910 1.27 cgd default:
4911 1.36 mrg printf("(? ? ?)");
4912 1.27 cgd break;
4913 1.27 cgd }
4914 1.27 cgd printf("\n");
4915 1.212 msaitoh rval = regs[o2i(PCI_BRIDGE_CONTROL_REG)];
4916 1.212 msaitoh printf(" Bridge control register: 0x%04hx\n",
4917 1.212 msaitoh (uint16_t)__SHIFTOUT(rval, PCI_BRIDGE_CONTROL));
4918 1.159 msaitoh onoff("Parity error response", rval, PCI_BRIDGE_CONTROL_PERE);
4919 1.159 msaitoh onoff("Secondary SERR forwarding", rval, PCI_BRIDGE_CONTROL_SERR);
4920 1.159 msaitoh onoff("ISA enable", rval, PCI_BRIDGE_CONTROL_ISA);
4921 1.159 msaitoh onoff("VGA enable", rval, PCI_BRIDGE_CONTROL_VGA);
4922 1.197 msaitoh /*
4923 1.197 msaitoh * VGA 16bit decode bit has meaning if the VGA enable bit or the
4924 1.197 msaitoh * VGA Palette Snoop Enable bit is set.
4925 1.197 msaitoh */
4926 1.197 msaitoh if (((rval & PCI_BRIDGE_CONTROL_VGA) != 0)
4927 1.197 msaitoh || ((csreg & PCI_COMMAND_PALETTE_ENABLE) != 0))
4928 1.197 msaitoh onoff("VGA 16bit enable", rval, PCI_BRIDGE_CONTROL_VGA16);
4929 1.159 msaitoh onoff("Master abort reporting", rval, PCI_BRIDGE_CONTROL_MABRT);
4930 1.159 msaitoh onoff("Secondary bus reset", rval, PCI_BRIDGE_CONTROL_SECBR);
4931 1.212 msaitoh onoff("Fast back-to-back enable", rval, PCI_BRIDGE_CONTROL_SECFASTB2B);
4932 1.212 msaitoh onoff("Primary Discard Timer", rval,
4933 1.212 msaitoh PCI_BRIDGE_CONTROL_PRI_DISC_TIMER);
4934 1.212 msaitoh onoff("Secondary Discard Timer",
4935 1.212 msaitoh rval, PCI_BRIDGE_CONTROL_SEC_DISC_TIMER);
4936 1.212 msaitoh onoff("Discard Timer Status", rval,
4937 1.212 msaitoh PCI_BRIDGE_CONTROL_DISC_TIMER_STAT);
4938 1.212 msaitoh onoff("Discard Timer SERR# Enable", rval,
4939 1.212 msaitoh PCI_BRIDGE_CONTROL_DISC_TIMER_SERR);
4940 1.27 cgd }
4941 1.27 cgd
4942 1.27 cgd static void
4943 1.45 thorpej pci_conf_print_type2(
4944 1.45 thorpej #ifdef _KERNEL
4945 1.45 thorpej pci_chipset_tag_t pc, pcitag_t tag,
4946 1.45 thorpej #endif
4947 1.167 msaitoh const pcireg_t *regs)
4948 1.27 cgd {
4949 1.27 cgd pcireg_t rval;
4950 1.27 cgd
4951 1.27 cgd /*
4952 1.27 cgd * XXX these need to be printed in more detail, need to be
4953 1.27 cgd * XXX checked against specs/docs, etc.
4954 1.27 cgd *
4955 1.79 dyoung * This layout was cribbed from the TI PCI1420 PCI-to-CardBus
4956 1.27 cgd * controller chip documentation, and may not be correct with
4957 1.27 cgd * respect to various standards. (XXX)
4958 1.27 cgd */
4959 1.27 cgd
4960 1.45 thorpej #ifdef _KERNEL
4961 1.28 cgd pci_conf_print_bar(pc, tag, regs, 0x10,
4962 1.167 msaitoh "CardBus socket/ExCA registers");
4963 1.45 thorpej #else
4964 1.45 thorpej pci_conf_print_bar(regs, 0x10, "CardBus socket/ExCA registers");
4965 1.45 thorpej #endif
4966 1.27 cgd
4967 1.109 msaitoh /* Capability list pointer and secondary status register */
4968 1.109 msaitoh rval = regs[o2i(PCI_CARDBUS_CAPLISTPTR_REG)];
4969 1.53 drochner if (regs[o2i(PCI_COMMAND_STATUS_REG)] & PCI_STATUS_CAPLIST_SUPPORT)
4970 1.53 drochner printf(" Capability list pointer: 0x%02x\n",
4971 1.109 msaitoh PCI_CAPLIST_PTR(rval));
4972 1.53 drochner else
4973 1.135 msaitoh printf(" Reserved @ 0x14: 0x%04x\n",
4974 1.135 msaitoh (pcireg_t)__SHIFTOUT(rval, __BITS(15, 0)));
4975 1.109 msaitoh pci_conf_print_ssr(__SHIFTOUT(rval, __BITS(31, 16)));
4976 1.27 cgd
4977 1.109 msaitoh rval = regs[o2i(PCI_BRIDGE_BUS_REG)];
4978 1.27 cgd printf(" PCI bus number: 0x%02x\n",
4979 1.109 msaitoh (rval >> 0) & 0xff);
4980 1.27 cgd printf(" CardBus bus number: 0x%02x\n",
4981 1.109 msaitoh (rval >> 8) & 0xff);
4982 1.27 cgd printf(" Subordinate bus number: 0x%02x\n",
4983 1.109 msaitoh (rval >> 16) & 0xff);
4984 1.27 cgd printf(" CardBus latency timer: 0x%02x\n",
4985 1.109 msaitoh (rval >> 24) & 0xff);
4986 1.27 cgd
4987 1.27 cgd /* XXX Print more prettily */
4988 1.27 cgd printf(" CardBus memory region 0:\n");
4989 1.27 cgd printf(" base register: 0x%08x\n", regs[o2i(0x1c)]);
4990 1.27 cgd printf(" limit register: 0x%08x\n", regs[o2i(0x20)]);
4991 1.27 cgd printf(" CardBus memory region 1:\n");
4992 1.27 cgd printf(" base register: 0x%08x\n", regs[o2i(0x24)]);
4993 1.27 cgd printf(" limit register: 0x%08x\n", regs[o2i(0x28)]);
4994 1.27 cgd printf(" CardBus I/O region 0:\n");
4995 1.27 cgd printf(" base register: 0x%08x\n", regs[o2i(0x2c)]);
4996 1.27 cgd printf(" limit register: 0x%08x\n", regs[o2i(0x30)]);
4997 1.27 cgd printf(" CardBus I/O region 1:\n");
4998 1.27 cgd printf(" base register: 0x%08x\n", regs[o2i(0x34)]);
4999 1.27 cgd printf(" limit register: 0x%08x\n", regs[o2i(0x38)]);
5000 1.27 cgd
5001 1.109 msaitoh rval = regs[o2i(PCI_INTERRUPT_REG)];
5002 1.27 cgd printf(" Interrupt line: 0x%02x\n",
5003 1.109 msaitoh (rval >> 0) & 0xff);
5004 1.27 cgd printf(" Interrupt pin: 0x%02x ",
5005 1.109 msaitoh (rval >> 8) & 0xff);
5006 1.109 msaitoh switch ((rval >> 8) & 0xff) {
5007 1.27 cgd case PCI_INTERRUPT_PIN_NONE:
5008 1.27 cgd printf("(none)");
5009 1.27 cgd break;
5010 1.27 cgd case PCI_INTERRUPT_PIN_A:
5011 1.27 cgd printf("(pin A)");
5012 1.27 cgd break;
5013 1.27 cgd case PCI_INTERRUPT_PIN_B:
5014 1.27 cgd printf("(pin B)");
5015 1.27 cgd break;
5016 1.27 cgd case PCI_INTERRUPT_PIN_C:
5017 1.27 cgd printf("(pin C)");
5018 1.27 cgd break;
5019 1.27 cgd case PCI_INTERRUPT_PIN_D:
5020 1.27 cgd printf("(pin D)");
5021 1.27 cgd break;
5022 1.27 cgd default:
5023 1.36 mrg printf("(? ? ?)");
5024 1.27 cgd break;
5025 1.27 cgd }
5026 1.27 cgd printf("\n");
5027 1.170 msaitoh rval = (regs[o2i(PCI_BRIDGE_CONTROL_REG)] >> 16) & 0xffff;
5028 1.27 cgd printf(" Bridge control register: 0x%04x\n", rval);
5029 1.112 msaitoh onoff("Parity error response", rval, __BIT(0));
5030 1.112 msaitoh onoff("SERR# enable", rval, __BIT(1));
5031 1.112 msaitoh onoff("ISA enable", rval, __BIT(2));
5032 1.112 msaitoh onoff("VGA enable", rval, __BIT(3));
5033 1.112 msaitoh onoff("Master abort mode", rval, __BIT(5));
5034 1.112 msaitoh onoff("Secondary (CardBus) bus reset", rval, __BIT(6));
5035 1.115 msaitoh onoff("Functional interrupts routed by ExCA registers", rval,
5036 1.115 msaitoh __BIT(7));
5037 1.112 msaitoh onoff("Memory window 0 prefetchable", rval, __BIT(8));
5038 1.112 msaitoh onoff("Memory window 1 prefetchable", rval, __BIT(9));
5039 1.112 msaitoh onoff("Write posting enable", rval, __BIT(10));
5040 1.28 cgd
5041 1.28 cgd rval = regs[o2i(0x40)];
5042 1.28 cgd printf(" Subsystem vendor ID: 0x%04x\n", PCI_VENDOR(rval));
5043 1.28 cgd printf(" Subsystem ID: 0x%04x\n", PCI_PRODUCT(rval));
5044 1.28 cgd
5045 1.45 thorpej #ifdef _KERNEL
5046 1.167 msaitoh pci_conf_print_bar(pc, tag, regs, 0x44, "legacy-mode registers");
5047 1.45 thorpej #else
5048 1.45 thorpej pci_conf_print_bar(regs, 0x44, "legacy-mode registers");
5049 1.45 thorpej #endif
5050 1.27 cgd }
5051 1.27 cgd
5052 1.26 cgd void
5053 1.45 thorpej pci_conf_print(
5054 1.45 thorpej #ifdef _KERNEL
5055 1.45 thorpej pci_chipset_tag_t pc, pcitag_t tag,
5056 1.45 thorpej void (*printfn)(pci_chipset_tag_t, pcitag_t, const pcireg_t *)
5057 1.45 thorpej #else
5058 1.45 thorpej int pcifd, u_int bus, u_int dev, u_int func
5059 1.45 thorpej #endif
5060 1.45 thorpej )
5061 1.26 cgd {
5062 1.215.2.4 martin pcireg_t *regs;
5063 1.52 drochner int off, capoff, endoff, hdrtype;
5064 1.125 matt const char *type_name;
5065 1.45 thorpej #ifdef _KERNEL
5066 1.167 msaitoh void (*type_printfn)(pci_chipset_tag_t, pcitag_t, const pcireg_t *);
5067 1.45 thorpej #else
5068 1.125 matt void (*type_printfn)(const pcireg_t *);
5069 1.45 thorpej #endif
5070 1.26 cgd
5071 1.215.2.4 martin regs = MALLOC(PCI_EXTCONF_SIZE);
5072 1.215.2.4 martin
5073 1.26 cgd printf("PCI configuration registers:\n");
5074 1.26 cgd
5075 1.135 msaitoh for (off = 0; off < PCI_EXTCONF_SIZE; off += 4) {
5076 1.45 thorpej #ifdef _KERNEL
5077 1.26 cgd regs[o2i(off)] = pci_conf_read(pc, tag, off);
5078 1.45 thorpej #else
5079 1.45 thorpej if (pcibus_conf_read(pcifd, bus, dev, func, off,
5080 1.45 thorpej ®s[o2i(off)]) == -1)
5081 1.45 thorpej regs[o2i(off)] = 0;
5082 1.45 thorpej #endif
5083 1.45 thorpej }
5084 1.26 cgd
5085 1.26 cgd /* common header */
5086 1.26 cgd printf(" Common header:\n");
5087 1.28 cgd pci_conf_print_regs(regs, 0, 16);
5088 1.28 cgd
5089 1.26 cgd printf("\n");
5090 1.45 thorpej #ifdef _KERNEL
5091 1.26 cgd pci_conf_print_common(pc, tag, regs);
5092 1.45 thorpej #else
5093 1.45 thorpej pci_conf_print_common(regs);
5094 1.45 thorpej #endif
5095 1.26 cgd printf("\n");
5096 1.26 cgd
5097 1.26 cgd /* type-dependent header */
5098 1.26 cgd hdrtype = PCI_HDRTYPE_TYPE(regs[o2i(PCI_BHLC_REG)]);
5099 1.26 cgd switch (hdrtype) { /* XXX make a table, eventually */
5100 1.26 cgd case 0:
5101 1.27 cgd /* Standard device header */
5102 1.125 matt type_name = "\"normal\" device";
5103 1.125 matt type_printfn = &pci_conf_print_type0;
5104 1.52 drochner capoff = PCI_CAPLISTPTR_REG;
5105 1.28 cgd endoff = 64;
5106 1.27 cgd break;
5107 1.27 cgd case 1:
5108 1.27 cgd /* PCI-PCI bridge header */
5109 1.125 matt type_name = "PCI-PCI bridge";
5110 1.125 matt type_printfn = &pci_conf_print_type1;
5111 1.52 drochner capoff = PCI_CAPLISTPTR_REG;
5112 1.28 cgd endoff = 64;
5113 1.26 cgd break;
5114 1.27 cgd case 2:
5115 1.27 cgd /* PCI-CardBus bridge header */
5116 1.125 matt type_name = "PCI-CardBus bridge";
5117 1.125 matt type_printfn = &pci_conf_print_type2;
5118 1.52 drochner capoff = PCI_CARDBUS_CAPLISTPTR_REG;
5119 1.28 cgd endoff = 72;
5120 1.27 cgd break;
5121 1.26 cgd default:
5122 1.125 matt type_name = NULL;
5123 1.125 matt type_printfn = 0;
5124 1.52 drochner capoff = -1;
5125 1.28 cgd endoff = 64;
5126 1.28 cgd break;
5127 1.26 cgd }
5128 1.27 cgd printf(" Type %d ", hdrtype);
5129 1.125 matt if (type_name != NULL)
5130 1.125 matt printf("(%s) ", type_name);
5131 1.27 cgd printf("header:\n");
5132 1.28 cgd pci_conf_print_regs(regs, 16, endoff);
5133 1.27 cgd printf("\n");
5134 1.125 matt if (type_printfn) {
5135 1.45 thorpej #ifdef _KERNEL
5136 1.167 msaitoh (*type_printfn)(pc, tag, regs);
5137 1.45 thorpej #else
5138 1.125 matt (*type_printfn)(regs);
5139 1.45 thorpej #endif
5140 1.45 thorpej } else
5141 1.26 cgd printf(" Don't know how to pretty-print type %d header.\n",
5142 1.26 cgd hdrtype);
5143 1.26 cgd printf("\n");
5144 1.51 drochner
5145 1.55 jdolecek /* capability list, if present */
5146 1.52 drochner if ((regs[o2i(PCI_COMMAND_STATUS_REG)] & PCI_STATUS_CAPLIST_SUPPORT)
5147 1.52 drochner && (capoff > 0)) {
5148 1.51 drochner #ifdef _KERNEL
5149 1.52 drochner pci_conf_print_caplist(pc, tag, regs, capoff);
5150 1.51 drochner #else
5151 1.52 drochner pci_conf_print_caplist(regs, capoff);
5152 1.51 drochner #endif
5153 1.51 drochner printf("\n");
5154 1.51 drochner }
5155 1.26 cgd
5156 1.26 cgd /* device-dependent header */
5157 1.26 cgd printf(" Device-dependent header:\n");
5158 1.135 msaitoh pci_conf_print_regs(regs, endoff, PCI_CONF_SIZE);
5159 1.206 msaitoh #ifdef _KERNEL
5160 1.26 cgd printf("\n");
5161 1.26 cgd if (printfn)
5162 1.26 cgd (*printfn)(pc, tag, regs);
5163 1.26 cgd else
5164 1.26 cgd printf(" Don't know how to pretty-print device-dependent header.\n");
5165 1.45 thorpej #endif /* _KERNEL */
5166 1.135 msaitoh
5167 1.135 msaitoh if (regs[o2i(PCI_EXTCAPLIST_BASE)] == 0xffffffff ||
5168 1.135 msaitoh regs[o2i(PCI_EXTCAPLIST_BASE)] == 0)
5169 1.215.2.4 martin goto out;
5170 1.135 msaitoh
5171 1.206 msaitoh printf("\n");
5172 1.135 msaitoh #ifdef _KERNEL
5173 1.199 msaitoh pci_conf_print_extcaplist(pc, tag, regs);
5174 1.135 msaitoh #else
5175 1.199 msaitoh pci_conf_print_extcaplist(regs);
5176 1.135 msaitoh #endif
5177 1.135 msaitoh printf("\n");
5178 1.135 msaitoh
5179 1.135 msaitoh /* Extended Configuration Space, if present */
5180 1.135 msaitoh printf(" Extended Configuration Space:\n");
5181 1.135 msaitoh pci_conf_print_regs(regs, PCI_EXTCAPLIST_BASE, PCI_EXTCONF_SIZE);
5182 1.215.2.4 martin
5183 1.215.2.4 martin out:
5184 1.215.2.4 martin FREE(regs, PCI_EXTCONF_SIZE);
5185 1.1 mycroft }
5186