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