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