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