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