Module Name: src
Committed By: martin
Date: Mon Aug 5 10:09:53 UTC 2013
Modified Files:
src/doc [netbsd-6]: CHANGES-6.2
src/sys/dev/pci [netbsd-6]: pci_subr.c pcireg.h
Log Message:
Pullup
sys/dev/pci/pcireg.h 1.74-1.82 and 1.84 via patch
sys/dev/pci/pci_subr.c 1.92-1.102, 1.104-1.105 via patch
Add some PCI(e) register and bit definitions in pcireg.h.
Fix the definition of PCI_PCIE_SLCAP_PSN.
Fix a bug that IRQ(MSI) bits in PCIe capability register is incorrectly
decoded.
Print more registers in "pcictl dump".
Fix bug in comment.
Requested by msaitoh in ticket #928
To generate a diff of this commit:
cvs rdiff -u -r1.1.2.28 -r1.1.2.29 src/doc/CHANGES-6.2
cvs rdiff -u -r1.90 -r1.90.2.1 src/sys/dev/pci/pci_subr.c
cvs rdiff -u -r1.73 -r1.73.8.1 src/sys/dev/pci/pcireg.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/doc/CHANGES-6.2
diff -u src/doc/CHANGES-6.2:1.1.2.28 src/doc/CHANGES-6.2:1.1.2.29
--- src/doc/CHANGES-6.2:1.1.2.28 Fri Aug 2 20:12:30 2013
+++ src/doc/CHANGES-6.2 Mon Aug 5 10:09:53 2013
@@ -1,4 +1,4 @@
-# $NetBSD: CHANGES-6.2,v 1.1.2.28 2013/08/02 20:12:30 martin Exp $
+# $NetBSD: CHANGES-6.2,v 1.1.2.29 2013/08/05 10:09:53 martin Exp $
A complete list of changes from the 6.1 release until the 6.2 release:
@@ -456,3 +456,15 @@ sys/kern/uipc_socket.c 1.216
Fix an inversion in checking for authorization to drop TCP connections
found (and the obvious fix suggested) by Sander Bos.
[spz, ticket #927]
+
+sys/dev/pci/pcireg.h 1.74-1.82 and 1.84 via patch
+sys/dev/pci/pci_subr.c 1.92-1.102, 1.104-1.105 via patch
+
+ Add some PCI(e) register and bit definitions in pcireg.h.
+ Fix the definition of PCI_PCIE_SLCAP_PSN.
+ Fix a bug that IRQ(MSI) bits in PCIe capability register is incorrectly
+ decoded.
+ Print more registers in "pcictl dump".
+ Fix bug in comment.
+ [msaitoh, ticket #928]
+
Index: src/sys/dev/pci/pci_subr.c
diff -u src/sys/dev/pci/pci_subr.c:1.90 src/sys/dev/pci/pci_subr.c:1.90.2.1
--- src/sys/dev/pci/pci_subr.c:1.90 Sun Jan 29 11:31:38 2012
+++ src/sys/dev/pci/pci_subr.c Mon Aug 5 10:09:53 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: pci_subr.c,v 1.90 2012/01/29 11:31:38 drochner Exp $ */
+/* $NetBSD: pci_subr.c,v 1.90.2.1 2013/08/05 10:09:53 martin Exp $ */
/*
* Copyright (c) 1997 Zubin D. Dittia. All rights reserved.
@@ -40,7 +40,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pci_subr.c,v 1.90 2012/01/29 11:31:38 drochner Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pci_subr.c,v 1.90.2.1 2013/08/05 10:09:53 martin Exp $");
#ifdef _KERNEL_OPT
#include "opt_pci.h"
@@ -90,6 +90,7 @@ static const struct pci_class pci_subcla
{ "ATA", PCI_SUBCLASS_MASS_STORAGE_ATA, NULL, },
{ "SATA", PCI_SUBCLASS_MASS_STORAGE_SATA, NULL, },
{ "SAS", PCI_SUBCLASS_MASS_STORAGE_SAS, NULL, },
+ { "NVM", PCI_SUBCLASS_MASS_STORAGE_NVM, NULL, },
{ "miscellaneous", PCI_SUBCLASS_MASS_STORAGE_MISC, NULL, },
{ NULL, 0, NULL, },
};
@@ -118,6 +119,7 @@ static const struct pci_class pci_subcla
{ "video", PCI_SUBCLASS_MULTIMEDIA_VIDEO, NULL, },
{ "audio", PCI_SUBCLASS_MULTIMEDIA_AUDIO, NULL, },
{ "telephony", PCI_SUBCLASS_MULTIMEDIA_TELEPHONY, NULL,},
+ { "HD audio", PCI_SUBCLASS_MULTIMEDIA_HDAUDIO, NULL, },
{ "miscellaneous", PCI_SUBCLASS_MULTIMEDIA_MISC, NULL, },
{ NULL, 0, NULL, },
};
@@ -452,7 +454,7 @@ pci_aprint_devinfo_fancy(const struct pc
* in a device attach routine like this:
*
* #ifdef MYDEV_DEBUG
- * printf("%s: ", device_xname(&sc->sc_dev));
+ * printf("%s: ", device_xname(sc->sc_dev));
* pci_conf_print(pa->pa_pc, pa->pa_tag, NULL);
* #endif
*/
@@ -807,24 +809,112 @@ pci_conf_print_type0(
}
static void
+pci_print_pcie_L0s_latency(uint32_t val)
+{
+
+ switch (val) {
+ case 0x0:
+ printf("Less than 64ns\n");
+ break;
+ case 0x1:
+ case 0x2:
+ case 0x3:
+ printf("%dns to less than %dns\n", 32 << val, 32 << (val + 1));
+ break;
+ case 0x4:
+ printf("512ns to less than 1us\n");
+ break;
+ case 0x5:
+ printf("1us to less than 2us\n");
+ break;
+ case 0x6:
+ printf("2us - 4us\n");
+ break;
+ case 0x7:
+ printf("More than 4us\n");
+ break;
+ }
+}
+
+static void
+pci_print_pcie_L1_latency(uint32_t val)
+{
+
+ switch (val) {
+ case 0x0:
+ printf("Less than 1us\n");
+ break;
+ case 0x6:
+ printf("32us - 64us\n");
+ break;
+ case 0x7:
+ printf("More than 64us\n");
+ break;
+ default:
+ printf("%dus to less than %dus\n", 1 << (val - 1), 1 << val);
+ break;
+ }
+}
+
+static void
+pci_print_pcie_compl_timeout(uint32_t val)
+{
+
+ switch (val) {
+ case 0x0:
+ printf("50us to 50ms\n");
+ break;
+ case 0x5:
+ printf("16ms to 55ms\n");
+ break;
+ case 0x6:
+ printf("65ms to 210ms\n");
+ break;
+ case 0x9:
+ printf("260ms to 900ms\n");
+ break;
+ case 0xa:
+ printf("1s to 3.5s\n");
+ break;
+ default:
+ printf("unknown %u value\n", val);
+ break;
+ }
+}
+
+static void
pci_conf_print_pcie_cap(const pcireg_t *regs, int capoff)
{
+ pcireg_t reg; /* for each register */
+ pcireg_t val; /* for each bitfield */
+ bool check_link = false;
bool check_slot = false;
+ bool check_rootport = false;
+ unsigned int pciever;
+ static const char * const linkspeeds[] = {"2.5", "5.0", "8.0"};
+ int i;
printf("\n PCI Express Capabilities Register\n");
- printf(" Capability version: %x\n",
- (unsigned int)((regs[o2i(capoff)] & 0x000f0000) >> 16));
- printf(" Device type: ");
- switch ((regs[o2i(capoff)] & 0x00f00000) >> 20) {
+ /* Capability Register */
+ reg = regs[o2i(capoff)];
+ printf(" Capability register: %04x\n", reg >> 16);
+ pciever = (unsigned int)((reg & 0x000f0000) >> 16);
+ printf(" Capability version: %u\n", pciever);
+ printf(" Device type: ");
+ switch ((reg & 0x00f00000) >> 20) {
case 0x0:
printf("PCI Express Endpoint device\n");
+ check_link = true;
break;
case 0x1:
printf("Legacy PCI Express Endpoint device\n");
+ check_link = true;
break;
case 0x4:
printf("Root Port of PCI Express Root Complex\n");
+ check_link = true;
check_slot = true;
+ check_rootport = true;
break;
case 0x5:
printf("Upstream Port of PCI Express Switch\n");
@@ -832,6 +922,7 @@ pci_conf_print_pcie_cap(const pcireg_t *
case 0x6:
printf("Downstream Port of PCI Express Switch\n");
check_slot = true;
+ check_rootport = true;
break;
case 0x7:
printf("PCI Express to PCI/PCI-X Bridge\n");
@@ -839,53 +930,249 @@ pci_conf_print_pcie_cap(const pcireg_t *
case 0x8:
printf("PCI/PCI-X to PCI Express Bridge\n");
break;
+ case 0x9:
+ printf("Root Complex Integrated Endpoint\n");
+ break;
+ case 0xa:
+ check_rootport = true;
+ printf("Root Complex Event Collector\n");
+ break;
default:
printf("unknown\n");
break;
}
- if (check_slot && (regs[o2i(capoff)] & 0x01000000) != 0)
- printf(" Slot implemented\n");
- printf(" Interrupt Message Number: %x\n",
- (unsigned int)((regs[o2i(capoff)] & 0x4e000000) >> 27));
- printf(" Link Capabilities Register: 0x%08x\n",
- regs[o2i(capoff + 0x0c)]);
- printf(" Maximum Link Speed: ");
- if ((regs[o2i(capoff + 0x0c)] & 0x000f) != 1) {
- printf("unknown %u value\n",
- (regs[o2i(capoff + 0x0c)] & 0x000f));
- } else {
- printf("2.5Gb/s\n");
- }
- printf(" Maximum Link Width: x%u lanes\n",
- (regs[o2i(capoff + 0x0c)] & 0x03f0) >> 4);
- printf(" Port Number: %u\n", regs[o2i(capoff + 0x0c)] >> 24);
- printf(" Link Status Register: 0x%04x\n",
- regs[o2i(capoff + 0x10)] >> 16);
- printf(" Negotiated Link Speed: ");
- if (((regs[o2i(capoff + 0x10)] >> 16) & 0x000f) != 1) {
- printf("unknown %u value\n",
- (regs[o2i(capoff + 0x10)] >> 16) & 0x000f);
- } else {
- printf("2.5Gb/s\n");
+ if (check_slot && (reg & PCI_PCIE_XCAP_SI) != 0)
+ printf(" Slot implemented\n");
+ printf(" Interrupt Message Number: %x\n",
+ (unsigned int)((reg & PCI_PCIE_XCAP_IRQ) >> 27));
+
+ /* Device Capability Register */
+ reg = regs[o2i(capoff + PCI_PCIE_DCAP)];
+ printf(" Device Capabilities Register: 0x%08x\n", reg);
+ printf(" Max Payload Size Supported: %u bytes max\n",
+ (unsigned int)(reg & PCI_PCIE_DCAP_MAX_PAYLOAD) * 256);
+ printf(" Phantom Functions Supported: ");
+ switch ((reg & PCI_PCIE_DCAP_PHANTOM_FUNCS) >> 3) {
+ case 0x0:
+ printf("not available\n");
+ break;
+ case 0x1:
+ printf("MSB\n");
+ break;
+ case 0x2:
+ printf("two MSB\n");
+ break;
+ case 0x3:
+ printf("All three bits\n");
+ break;
}
- printf(" Negotiated Link Width: x%u lanes\n",
- (regs[o2i(capoff + 0x10)] >> 20) & 0x003f);
- if ((regs[o2i(capoff + 0x18)] & 0x07ff) != 0) {
- printf(" Slot Control Register:\n");
- if ((regs[o2i(capoff + 0x18)] & 0x0001) != 0)
+ printf(" Extended Tag Field Supported: %dbit\n",
+ (reg & PCI_PCIE_DCAP_EXT_TAG_FIELD) == 0 ? 5 : 8);
+ printf(" Endpoint L0 Acceptable Latency: ");
+ pci_print_pcie_L0s_latency((reg & PCI_PCIE_DCAP_L0S_LATENCY) >> 6);
+ printf(" Endpoint L1 Acceptable Latency: ");
+ pci_print_pcie_L1_latency((reg & PCI_PCIE_DCAP_L1_LATENCY) >> 9);
+ printf(" Attention Button Present: %s\n",
+ (reg & PCI_PCIE_DCAP_ATTN_BUTTON) != 0 ? "yes" : "no");
+ printf(" Attention Indicator Present: %s\n",
+ (reg & PCI_PCIE_DCAP_ATTN_IND) != 0 ? "yes" : "no");
+ printf(" Power Indicator Present: %s\n",
+ (reg & PCI_PCIE_DCAP_PWR_IND) != 0 ? "yes" : "no");
+ printf(" Role-Based Error Report: %s\n",
+ (reg & PCI_PCIE_DCAP_ROLE_ERR_RPT) != 0 ? "yes" : "no");
+ printf(" Captured Slot Power Limit Value: %d\n",
+ (unsigned int)(reg & PCI_PCIE_DCAP_SLOT_PWR_LIM_VAL) >> 18);
+ printf(" Captured Slot Power Limit Scale: %d\n",
+ (unsigned int)(reg & PCI_PCIE_DCAP_SLOT_PWR_LIM_SCALE) >> 26);
+ printf(" Function-Level Reset Capability: %s\n",
+ (reg & PCI_PCIE_DCAP_FLR) != 0 ? "yes" : "no");
+
+ /* Device Control Register */
+ reg = regs[o2i(capoff + PCI_PCIE_DCSR)];
+ printf(" Device Control Register: 0x%04x\n", reg & 0xffff);
+ printf(" Correctable Error Reporting Enable: %s\n",
+ (reg & PCI_PCIE_DCSR_ENA_COR_ERR) != 0 ? "on" : "off");
+ printf(" Non Fatal Error Reporting Enable: %s\n",
+ (reg & PCI_PCIE_DCSR_ENA_NFER) != 0 ? "on" : "off");
+ printf(" Fatal Error Reporting Enable: %s\n",
+ (reg & PCI_PCIE_DCSR_ENA_FER) != 0 ? "on" : "off");
+ printf(" Unsupported Request Reporting Enable: %s\n",
+ (reg & PCI_PCIE_DCSR_ENA_URR) != 0 ? "on" : "off");
+ printf(" Enable Relaxed Ordering: %s\n",
+ (reg & PCI_PCIE_DCSR_ENA_RELAX_ORD) != 0 ? "on" : "off");
+ printf(" Max Payload Size: %d byte\n",
+ 128 << (((unsigned int)(reg & PCI_PCIE_DCSR_MAX_PAYLOAD) >> 5)));
+ printf(" Extended Tag Field Enable: %s\n",
+ (reg & PCI_PCIE_DCSR_EXT_TAG_FIELD) != 0 ? "on" : "off");
+ printf(" Phantom Functions Enable: %s\n",
+ (reg & PCI_PCIE_DCSR_PHANTOM_FUNCS) != 0 ? "on" : "off");
+ printf(" Aux Power PM Enable: %s\n",
+ (reg & PCI_PCIE_DCSR_AUX_POWER_PM) != 0 ? "on" : "off");
+ printf(" Enable No Snoop: %s\n",
+ (reg & PCI_PCIE_DCSR_ENA_NO_SNOOP) != 0 ? "on" : "off");
+ printf(" Max Read Request Size: %d byte\n",
+ 128 << ((unsigned int)(reg & PCI_PCIE_DCSR_MAX_READ_REQ) >> 12));
+
+ /* Device Status Register */
+ reg = regs[o2i(capoff + PCI_PCIE_DCSR)];
+ printf(" Device Status Register: 0x%04x\n", reg >> 16);
+ printf(" Correctable Error Detected: %s\n",
+ (reg & PCI_PCIE_DCSR_CED) != 0 ? "on" : "off");
+ printf(" Non Fatal Error Detected: %s\n",
+ (reg & PCI_PCIE_DCSR_NFED) != 0 ? "on" : "off");
+ printf(" Fatal Error Detected: %s\n",
+ (reg & PCI_PCIE_DCSR_FED) != 0 ? "on" : "off");
+ printf(" Unsupported Request Detected: %s\n",
+ (reg & PCI_PCIE_DCSR_URD) != 0 ? "on" : "off");
+ printf(" Aux Power Detected: %s\n",
+ (reg & PCI_PCIE_DCSR_AUX_PWR) != 0 ? "on" : "off");
+ printf(" Transaction Pending: %s\n",
+ (reg & PCI_PCIE_DCSR_TRANSACTION_PND) != 0 ? "on" : "off");
+
+ if (check_link) {
+ /* Link Capability Register */
+ reg = regs[o2i(capoff + PCI_PCIE_LCAP)];
+ printf(" Link Capabilities Register: 0x%08x\n", reg);
+ printf(" Maximum Link Speed: ");
+ val = reg & PCI_PCIE_LCAP_MAX_SPEED;
+ if (val < 1 || val > 3) {
+ printf("unknown %u value\n", val);
+ } else {
+ printf("%sGT/s\n", linkspeeds[val - 1]);
+ }
+ printf(" Maximum Link Width: x%u lanes\n",
+ (unsigned int)(reg & PCI_PCIE_LCAP_MAX_WIDTH) >> 4);
+ printf(" Active State PM Support: ");
+ val = (reg & PCI_PCIE_LCAP_ASPM) >> 10;
+ switch (val) {
+ case 0x1:
+ printf("L0s Entry supported\n");
+ break;
+ case 0x3:
+ printf("L0s and L1 supported\n");
+ break;
+ default:
+ printf("Reserved value\n");
+ break;
+ }
+ printf(" L0 Exit Latency: ");
+ pci_print_pcie_L0s_latency((reg & PCI_PCIE_LCAP_L0S_EXIT) >> 12);
+ printf(" L1 Exit Latency: ");
+ pci_print_pcie_L1_latency((reg & PCI_PCIE_LCAP_L1_EXIT) >> 15);
+ printf(" Port Number: %u\n", reg >> 24);
+
+ /* Link Control Register */
+ reg = regs[o2i(capoff + PCI_PCIE_LCSR)];
+ printf(" Link Control Register: 0x%04x\n", reg & 0xffff);
+ printf(" Active State PM Control: ");
+ val = reg & (PCI_PCIE_LCSR_ASPM_L1 | PCI_PCIE_LCSR_ASPM_L0S);
+ switch (val) {
+ case 0:
+ printf("disabled\n");
+ break;
+ case 1:
+ printf("L0s Entry Enabled\n");
+ break;
+ case 2:
+ printf("L1 Entry Enabled\n");
+ break;
+ case 3:
+ printf("L0s and L1 Entry Enabled\n");
+ break;
+ }
+ printf(" Read Completion Boundary Control: %dbyte\n",
+ (reg & PCI_PCIE_LCSR_RCB) != 0 ? 128 : 64);
+ printf(" Link Disable: %s\n",
+ (reg & PCI_PCIE_LCSR_LINK_DIS) != 0 ? "on" : "off");
+ printf(" Retrain Link: %s\n",
+ (reg & PCI_PCIE_LCSR_RETRAIN) != 0 ? "on" : "off");
+ printf(" Common Clock Configuration: %s\n",
+ (reg & PCI_PCIE_LCSR_COMCLKCFG) != 0 ? "on" : "off");
+ printf(" Extended Synch: %s\n",
+ (reg & PCI_PCIE_LCSR_EXTNDSYNC) != 0 ? "on" : "off");
+ printf(" Enable Clock Power Management: %s\n",
+ (reg & PCI_PCIE_LCSR_ENCLKPM) != 0 ? "on" : "off");
+ printf(" Hardware Autonomous Width Disable: %s\n",
+ (reg & PCI_PCIE_LCSR_HAWD) != 0 ? "on" : "off");
+ printf(" Link Bandwidth Management Interrupt Enable: %s\n",
+ (reg & PCI_PCIE_LCSR_LBMIE) != 0 ? "on" : "off");
+ printf(" Link Autonomous Bandwidth Interrupt Enable: %s\n",
+ (reg & PCI_PCIE_LCSR_LABIE) != 0 ? "on" : "off");
+
+ /* Link Status Register */
+ reg = regs[o2i(capoff + PCI_PCIE_LCSR)];
+ printf(" Link Status Register: 0x%04x\n", reg >> 16);
+ printf(" Negotiated Link Speed: ");
+ if (((reg >> 16) & 0x000f) < 1 ||
+ ((reg >> 16) & 0x000f) > 3) {
+ printf("unknown %u value\n",
+ (unsigned int)(reg & PCI_PCIE_LCSR_LINKSPEED) >> 16);
+ } else {
+ printf("%sGT/s\n",
+ linkspeeds[((reg & PCI_PCIE_LCSR_LINKSPEED) >> 16) - 1]);
+ }
+ printf(" Negotiated Link Width: x%u lanes\n",
+ (reg >> 20) & 0x003f);
+ printf(" Training Error: %s\n",
+ (reg & PCI_PCIE_LCSR_LINKTRAIN_ERR) != 0 ? "on" : "off");
+ printf(" Link Training: %s\n",
+ (reg & PCI_PCIE_LCSR_LINKTRAIN) != 0 ? "on" : "off");
+ printf(" Slot Clock Configuration: %s\n",
+ (reg & PCI_PCIE_LCSR_SLOTCLKCFG) != 0 ? "on" : "off");
+ printf(" Data Link Layer Link Active: %s\n",
+ (reg & PCI_PCIE_LCSR_DLACTIVE) != 0 ? "on" : "off");
+ printf(" Link Bandwidth Management Status: %s\n",
+ (reg & PCI_PCIE_LCSR_LINK_BW_MGMT) != 0 ? "on" : "off");
+ printf(" Link Autonomous Bandwidth Status: %s\n",
+ (reg & PCI_PCIE_LCSR_LINK_AUTO_BW) != 0 ? "on" : "off");
+ }
+
+ if (check_slot == true) {
+ /* Slot Capability Register */
+ reg = regs[o2i(capoff + PCI_PCIE_SLCAP)];
+ printf(" Slot Capability Register: %08x\n", reg);
+ if ((reg & PCI_PCIE_SLCAP_ABP) != 0)
+ printf(" Attention Button Present\n");
+ if ((reg & PCI_PCIE_SLCAP_PCP) != 0)
+ printf(" Power Controller Present\n");
+ if ((reg & PCI_PCIE_SLCAP_MSP) != 0)
+ printf(" MRL Sensor Present\n");
+ if ((reg & PCI_PCIE_SLCAP_AIP) != 0)
+ printf(" Attention Indicator Present\n");
+ if ((reg & PCI_PCIE_SLCAP_PIP) != 0)
+ printf(" Power Indicator Present\n");
+ if ((reg & PCI_PCIE_SLCAP_HPS) != 0)
+ printf(" Hot-Plug Surprise\n");
+ if ((reg & PCI_PCIE_SLCAP_HPC) != 0)
+ printf(" Hot-Plug Capable\n");
+ printf(" Slot Power Limit Value: %d\n",
+ (unsigned int)(reg & PCI_PCIE_SLCAP_SPLV) >> 7);
+ printf(" Slot Power Limit Scale: %d\n",
+ (unsigned int)(reg & PCI_PCIE_SLCAP_SPLS) >> 15);
+ if ((reg & PCI_PCIE_SLCAP_EIP) != 0)
+ printf(" Electromechanical Interlock Present\n");
+ if ((reg & PCI_PCIE_SLCAP_NCCS) != 0)
+ printf(" No Command Completed Support\n");
+ printf(" Physical Slot Number: %d\n",
+ (unsigned int)(reg & PCI_PCIE_SLCAP_PSN) >> 19);
+
+ /* Slot Control Register */
+ reg = regs[o2i(capoff + PCI_PCIE_SLCSR)];
+ printf(" Slot Control Register: %04x\n", reg & 0xffff);
+ if ((reg & PCI_PCIE_SLCSR_ABE) != 0)
printf(" Attention Button Pressed Enabled\n");
- if ((regs[o2i(capoff + 0x18)] & 0x0002) != 0)
+ if ((reg & PCI_PCIE_SLCSR_PFE) != 0)
printf(" Power Fault Detected Enabled\n");
- if ((regs[o2i(capoff + 0x18)] & 0x0004) != 0)
+ if ((reg & PCI_PCIE_SLCSR_MSE) != 0)
printf(" MRL Sensor Changed Enabled\n");
- if ((regs[o2i(capoff + 0x18)] & 0x0008) != 0)
- printf(" Presense Detected Changed Enabled\n");
- if ((regs[o2i(capoff + 0x18)] & 0x0010) != 0)
+ if ((reg & PCI_PCIE_SLCSR_PDE) != 0)
+ printf(" Presense Detect Changed Enabled\n");
+ if ((reg & PCI_PCIE_SLCSR_CCE) != 0)
printf(" Command Completed Interrupt Enabled\n");
- if ((regs[o2i(capoff + 0x18)] & 0x0020) != 0)
+ if ((reg & PCI_PCIE_SLCSR_HPE) != 0)
printf(" Hot-Plug Interrupt Enabled\n");
printf(" Attention Indicator Control: ");
- switch ((regs[o2i(capoff + 0x18)] & 0x00c0) >> 6) {
+ switch ((reg & PCI_PCIE_SLCSR_AIC) >> 6) {
case 0x0:
printf("reserved\n");
break;
@@ -900,7 +1187,7 @@ pci_conf_print_pcie_cap(const pcireg_t *
break;
}
printf(" Power Indicator Control: ");
- switch ((regs[o2i(capoff + 0x18)] & 0x0300) >> 8) {
+ switch ((reg & PCI_PCIE_SLCSR_PIC) >> 8) {
case 0x0:
printf("reserved\n");
break;
@@ -915,11 +1202,206 @@ pci_conf_print_pcie_cap(const pcireg_t *
break;
}
printf(" Power Controller Control: ");
- if ((regs[o2i(capoff + 0x18)] & 0x0400) != 0)
+ if ((reg & PCI_PCIE_SLCSR_PCC) != 0)
printf("off\n");
else
printf("on\n");
+ if ((reg & PCI_PCIE_SLCSR_EIC) != 0)
+ printf(" Electromechanical Interlock Control\n");
+ if ((reg & PCI_PCIE_SLCSR_LACS) != 0)
+ printf(" Data Link Layer State Changed Enable\n");
+
+ /* Slot Status Register */
+ printf(" Slot Status Register: %04x\n", reg >> 16);
+ if ((reg & PCI_PCIE_SLCSR_ABP) != 0)
+ printf(" Attention Button Pressed\n");
+ if ((reg & PCI_PCIE_SLCSR_PFD) != 0)
+ printf(" Power Fault Detected\n");
+ if ((reg & PCI_PCIE_SLCSR_MSC) != 0)
+ printf(" MRL Sensor Changed\n");
+ if ((reg & PCI_PCIE_SLCSR_PDC) != 0)
+ printf(" Presense Detect Changed\n");
+ if ((reg & PCI_PCIE_SLCSR_CC) != 0)
+ printf(" Command Completed\n");
+ if ((reg & PCI_PCIE_SLCSR_MS) != 0)
+ printf(" MRL Open\n");
+ if ((reg & PCI_PCIE_SLCSR_PDS) != 0)
+ printf(" Card Present in slot\n");
+ if ((reg & PCI_PCIE_SLCSR_EIS) != 0)
+ printf(" Electromechanical Interlock engaged\n");
+ if ((reg & PCI_PCIE_SLCSR_LACS) != 0)
+ printf(" Data Link Layer State Changed\n");
+ }
+
+ if (check_rootport == true) {
+ /* Root Control Register */
+ reg = regs[o2i(capoff + PCI_PCIE_RCR)];
+ printf(" Root Control Register: %04x\n", reg & 0xffff);
+ if ((reg & PCI_PCIE_RCR_SERR_CER) != 0)
+ printf(" SERR on Correctable Error Enable\n");
+ if ((reg & PCI_PCIE_RCR_SERR_NFER) != 0)
+ printf(" SERR on Non-Fatal Error Enable\n");
+ if ((reg & PCI_PCIE_RCR_SERR_FER) != 0)
+ printf(" SERR on Fatal Error Enable\n");
+ if ((reg & PCI_PCIE_RCR_PME_IE) != 0)
+ printf(" PME Interrupt Enable\n");
+
+ /* Root Capability Register */
+ printf(" Root Capability Register: %04x\n",
+ reg >> 16);
+
+ /* Root Status Register */
+ reg = regs[o2i(capoff + PCI_PCIE_RSR)];
+ printf(" Root Status Register: %08x\n", reg);
+ printf(" PME Requester ID: %04x\n",
+ (unsigned int)(reg & PCI_PCIE_RSR_PME_REQESTER));
+ if ((reg & PCI_PCIE_RSR_PME_STAT) != 0)
+ printf(" PME was asserted\n");
+ if ((reg & PCI_PCIE_RSR_PME_PEND) != 0)
+ printf(" another PME is pending\n");
+ }
+
+ /* PCIe DW9 to DW14 is for PCIe 2.0 and newer */
+ if (pciever < 2)
+ return;
+
+ /* Device Capabilities 2 */
+ reg = regs[o2i(capoff +PCI_PCIE_DCAP2)];
+ printf(" Device Capabilities 2: 0x%08x\n", reg);
+ printf(" Completion Timeout Ranges Supported: %u \n",
+ (unsigned int)(reg &PCI_PCIE_DCAP2_COMPT_RANGE));
+ printf(" Completion Timeout Disable Supported: %s\n",
+ (reg &PCI_PCIE_DCAP2_COMPT_DIS) != 0 ? "yes" : "no");
+ printf(" ARI Forwarding Supported: %s\n",
+ (reg &PCI_PCIE_DCAP2_ARI_FWD) != 0 ? "yes" : "no");
+ printf(" AtomicOp Routing Supported: %s\n",
+ (reg &PCI_PCIE_DCAP2_ATOM_ROUT) != 0 ? "yes" : "no");
+ printf(" 32bit AtomicOp Completer Supported: %s\n",
+ (reg &PCI_PCIE_DCAP2_32ATOM) != 0 ? "yes" : "no");
+ printf(" 64bit AtomicOp Completer Supported: %s\n",
+ (reg &PCI_PCIE_DCAP2_64ATOM) != 0 ? "yes" : "no");
+ printf(" 128-bit CAS Completer Supported: %s\n",
+ (reg &PCI_PCIE_DCAP2_128CAS) != 0 ? "yes" : "no");
+ printf(" No RO-enabled PR-PR passing: %s\n",
+ (reg &PCI_PCIE_DCAP2_NO_ROPR_PASS) != 0 ? "yes" : "no");
+ printf(" LTR Mechanism Supported: %s\n",
+ (reg &PCI_PCIE_DCAP2_LTR_MEC) != 0 ? "yes" : "no");
+ printf(" TPH Completer Supported: %u\n",
+ (unsigned int)(reg &PCI_PCIE_DCAP2_TPH_COMP) >> 12);
+ printf(" OBFF Supported: ");
+ switch ((reg &PCI_PCIE_DCAP2_OBFF) >> 18) {
+ case 0x0:
+ printf("Not supported\n");
+ break;
+ case 0x1:
+ printf("Message only\n");
+ break;
+ case 0x2:
+ printf("WAKE# only\n");
+ break;
+ case 0x3:
+ printf("Both\n");
+ break;
+ }
+ printf(" Extended Fmt Field Supported: %s\n",
+ (reg &PCI_PCIE_DCAP2_EXTFMT_FLD) != 0 ? "yes" : "no");
+ printf(" End-End TLP Prefix Supported: %s\n",
+ (reg &PCI_PCIE_DCAP2_EETLP_PREF) != 0 ? "yes" : "no");
+ printf(" Max End-End TLP Prefixes: %u\n",
+ (unsigned int)(reg &PCI_PCIE_DCAP2_MAX_EETLP) >> 22);
+
+ /* Device Control 2 */
+ reg = regs[o2i(capoff +PCI_PCIE_DCSR2)];
+ printf(" Device Control 2: 0x%04x\n", reg & 0xffff);
+ printf(" Completion Timeout Value: ");
+ pci_print_pcie_compl_timeout(reg &PCI_PCIE_DCSR2_COMPT_VAL);
+ if ((reg &PCI_PCIE_DCSR2_COMPT_DIS) != 0)
+ printf(" Completion Timeout Disabled\n");
+ if ((reg &PCI_PCIE_DCSR2_ARI_FWD) != 0)
+ printf(" ARI Forwarding Enabled\n");
+ if ((reg &PCI_PCIE_DCSR2_ATOM_REQ) != 0)
+ printf(" AtomicOp Rquester Enabled\n");
+ if ((reg &PCI_PCIE_DCSR2_ATOM_EBLK) != 0)
+ printf(" AtomicOp Egress Blocking on\n");
+ if ((reg &PCI_PCIE_DCSR2_IDO_REQ) != 0)
+ printf(" IDO Request Enabled\n");
+ if ((reg &PCI_PCIE_DCSR2_IDO_COMP) != 0)
+ printf(" IDO Completion Enabled\n");
+ if ((reg &PCI_PCIE_DCSR2_LTR_MEC) != 0)
+ printf(" LTR Mechanism Enabled\n");
+ printf(" OBFF: ");
+ switch ((reg &PCI_PCIE_DCSR2_OBFF_EN) >> 13) {
+ case 0x0:
+ printf("Disabled\n");
+ break;
+ case 0x1:
+ printf("Enabled with Message Signaling Variation A\n");
+ break;
+ case 0x2:
+ printf("Enabled with Message Signaling Variation B\n");
+ break;
+ case 0x3:
+ printf("Enabled using WAKE# signaling\n");
+ break;
}
+ if ((reg &PCI_PCIE_DCSR2_EETLP) != 0)
+ printf(" End-End TLP Prefix Blocking on\n");
+
+ if (check_link) {
+ /* Link Capability 2 */
+ reg = regs[o2i(capoff +PCI_PCIE_LCAP2)];
+ printf(" Link Capabilities 2: 0x%08x\n", reg);
+ val = (reg &PCI_PCIE_LCAP2_SUP_LNKSV) >> 1;
+ printf(" Supported Link Speed Vector:");
+ for (i = 0; i <= 2; i++) {
+ if (((val >> i) & 0x01) != 0)
+ printf(" %sGT/s", linkspeeds[i]);
+ }
+ printf("\n");
+
+ /* Link Control 2 */
+ reg = regs[o2i(capoff +PCI_PCIE_LCSR2)];
+ printf(" Link Control 2: 0x%04x\n", reg & 0xffff);
+ printf(" Target Link Speed: ");
+ val = reg &PCI_PCIE_LCSR2_TGT_LSPEED;
+ if (val < 1 || val > 3) {
+ printf("unknown %u value\n", val);
+ } else {
+ printf("%sGT/s\n", linkspeeds[val - 1]);
+ }
+ if ((reg &PCI_PCIE_LCSR2_ENT_COMPL) != 0)
+ printf(" Enter Compliance Enabled\n");
+ if ((reg &PCI_PCIE_LCSR2_HW_AS_DIS) != 0)
+ printf(" HW Autonomous Speed Disabled\n");
+ if ((reg &PCI_PCIE_LCSR2_SEL_DEEMP) != 0)
+ printf(" Selectable De-emphasis\n");
+ printf(" Transmit Margin: %u\n",
+ (unsigned int)(reg &PCI_PCIE_LCSR2_TX_MARGIN) >> 7);
+ if ((reg &PCI_PCIE_LCSR2_EN_MCOMP) != 0)
+ printf(" Enter Modified Compliance\n");
+ if ((reg &PCI_PCIE_LCSR2_COMP_SOS) != 0)
+ printf(" Compliance SOS\n");
+ printf(" Compliance Present/De-emphasis: %u\n",
+ (unsigned int)(reg &PCI_PCIE_LCSR2_COMP_DEEMP) >> 12);
+
+ /* Link Status 2 */
+ if ((reg &PCI_PCIE_LCSR2_DEEMP_LVL) != 0)
+ printf(" Current De-emphasis Level\n");
+ if ((reg &PCI_PCIE_LCSR2_EQ_COMPL) != 0)
+ printf(" Equalization Complete\n");
+ if ((reg &PCI_PCIE_LCSR2_EQP1_SUC) != 0)
+ printf(" Equalization Phase 1 Successful\n");
+ if ((reg &PCI_PCIE_LCSR2_EQP2_SUC) != 0)
+ printf(" Equalization Phase 2 Successful\n");
+ if ((reg &PCI_PCIE_LCSR2_EQP3_SUC) != 0)
+ printf(" Equalization Phase 3 Successful\n");
+ if ((reg &PCI_PCIE_LCSR2_LNKEQ_REQ) != 0)
+ printf(" Link Equalization Request\n");
+ }
+
+ /* Slot Capability 2 */
+ /* Slot Control 2 */
+ /* Slot Status 2 */
}
static const char *
@@ -1082,6 +1564,9 @@ pci_conf_print_caplist(
case PCI_CAP_HOTPLUG:
printf("Hot-Plug");
break;
+ case PCI_CAP_SUBVENDOR:
+ printf("Sub Vendor ID");
+ break;
case PCI_CAP_AGP8:
printf("AGP 8x");
break;
Index: src/sys/dev/pci/pcireg.h
diff -u src/sys/dev/pci/pcireg.h:1.73 src/sys/dev/pci/pcireg.h:1.73.8.1
--- src/sys/dev/pci/pcireg.h:1.73 Wed Aug 17 00:59:47 2011
+++ src/sys/dev/pci/pcireg.h Mon Aug 5 10:09:53 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: pcireg.h,v 1.73 2011/08/17 00:59:47 dyoung Exp $ */
+/* $NetBSD: pcireg.h,v 1.73.8.1 2013/08/05 10:09:53 martin Exp $ */
/*
* Copyright (c) 1995, 1996, 1999, 2000
@@ -179,6 +179,7 @@ typedef u_int8_t pci_revision_t;
#define PCI_SUBCLASS_MASS_STORAGE_ATA 0x05
#define PCI_SUBCLASS_MASS_STORAGE_SATA 0x06
#define PCI_SUBCLASS_MASS_STORAGE_SAS 0x07
+#define PCI_SUBCLASS_MASS_STORAGE_NVM 0x08
#define PCI_SUBCLASS_MASS_STORAGE_MISC 0x80
/* 0x02 network subclasses */
@@ -462,6 +463,7 @@ typedef u_int8_t pci_revision_t;
#define PCI_CAP_DEBUGPORT 0x0a
#define PCI_CAP_CPCI_RSRCCTL 0x0b
#define PCI_CAP_HOTPLUG 0x0c
+#define PCI_CAP_SUBVENDOR 0x0d
#define PCI_CAP_AGP8 0x0e
#define PCI_CAP_SECURE 0x0f
#define PCI_CAP_PCIEXPRESS 0x10
@@ -643,19 +645,75 @@ struct pci_msix_table_entry {
#define PCI_PCIE_XCAP_TYPE_DOWN __SHIFTIN(0x6, PCI_PCIE_XCAP_TYPE_MASK)
#define PCI_PCIE_XCAP_TYPE_PCIE2PCI __SHIFTIN(0x7, PCI_PCIE_XCAP_TYPE_MASK)
#define PCI_PCIE_XCAP_TYPE_PCI2PCIE __SHIFTIN(0x8, PCI_PCIE_XCAP_TYPE_MASK)
+#define PCI_PCIE_XCAP_TYPE_ROOT_INTEP __SHIFTIN(0x9, PCI_PCIE_XCAP_TYPE_MASK)
+#define PCI_PCIE_XCAP_TYPE_ROOT_EVNTC __SHIFTIN(0xa, PCI_PCIE_XCAP_TYPE_MASK)
#define PCI_PCIE_XCAP_SI __SHIFTIN(__BIT(8), PCI_PCIE_XCAP_MASK) /* Slot Implemented */
+#define PCI_PCIE_XCAP_IRQ __SHIFTIN(__BITS(13, 9), PCI_PCIE_XCAP_MASK)
#define PCI_PCIE_DCAP 0x04 /* Device Capabilities Register */
+#define PCI_PCIE_DCAP_MAX_PAYLOAD __BITS(2, 0)
+#define PCI_PCIE_DCAP_PHANTOM_FUNCS __BITS(4, 3)
+#define PCI_PCIE_DCAP_EXT_TAG_FIELD __BIT(5)
+#define PCI_PCIE_DCAP_L0S_LATENCY __BITS(8, 6)
+#define PCI_PCIE_DCAP_L1_LATENCY __BITS(11, 9)
+#define PCI_PCIE_DCAP_ATTN_BUTTON __BIT(12)
+#define PCI_PCIE_DCAP_ATTN_IND __BIT(13)
+#define PCI_PCIE_DCAP_PWR_IND __BIT(14)
+#define PCI_PCIE_DCAP_ROLE_ERR_RPT __BIT(15)
+#define PCI_PCIE_DCAP_SLOT_PWR_LIM_VAL __BITS(25, 18)
+#define PCI_PCIE_DCAP_SLOT_PWR_LIM_SCALE __BITS(27, 26)
+#define PCI_PCIE_DCAP_FLR __BIT(28)
#define PCI_PCIE_DCSR 0x08 /* Device Control & Status Register */
-#define PCI_PCIE_DCSR_MAX_READ_REQ __BITS(14, 12)
+#define PCI_PCIE_DCSR_ENA_COR_ERR __BIT(0)
+#define PCI_PCIE_DCSR_ENA_NFER __BIT(1)
+#define PCI_PCIE_DCSR_ENA_FER __BIT(2)
+#define PCI_PCIE_DCSR_ENA_URR __BIT(3)
+#define PCI_PCIE_DCSR_ENA_RELAX_ORD __BIT(4)
+#define PCI_PCIE_DCSR_MAX_PAYLOAD __BITS(7, 5)
+#define PCI_PCIE_DCSR_EXT_TAG_FIELD __BIT(8)
+#define PCI_PCIE_DCSR_PHANTOM_FUNCS __BIT(9)
+#define PCI_PCIE_DCSR_AUX_POWER_PM __BIT(10)
#define PCI_PCIE_DCSR_ENA_NO_SNOOP __BIT(11)
-#define PCI_PCIE_DCSR_CED __BIT(0 + 16)
-#define PCI_PCIE_DCSR_NFED __BIT(1 + 16)
-#define PCI_PCIE_DCSR_FED __BIT(2 + 16)
-#define PCI_PCIE_DCSR_URD __BIT(3 + 16)
-#define PCI_PCIE_LCAP 0x0c
+#define PCI_PCIE_DCSR_MAX_READ_REQ __BITS(14, 12)
+#define PCI_PCIE_DCSR_BRDG_CFG_RETRY __BIT(15)
+#define PCI_PCIE_DCSR_INITIATE_FLR __BIT(15)
+#define PCI_PCIE_DCSR_CED __BIT(0 + 16)
+#define PCI_PCIE_DCSR_NFED __BIT(1 + 16)
+#define PCI_PCIE_DCSR_FED __BIT(2 + 16)
+#define PCI_PCIE_DCSR_URD __BIT(3 + 16)
+#define PCI_PCIE_DCSR_AUX_PWR __BIT(4 + 16)
+#define PCI_PCIE_DCSR_TRANSACTION_PND __BIT(5 + 16)
+#define PCI_PCIE_LCAP 0x0c /* Link Capabilities Register */
+#define PCI_PCIE_LCAP_MAX_SPEED __BITS(3, 0)
+#define PCI_PCIE_LCAP_MAX_WIDTH __BITS(9, 4)
+#define PCI_PCIE_LCAP_ASPM __BITS(11, 10)
+#define PCI_PCIE_LCAP_L0S_EXIT __BITS(14, 12)
+#define PCI_PCIE_LCAP_L1_EXIT __BITS(17, 15)
+#define PCI_PCIE_LCAP_CLOCK_PM __BIT(18)
+#define PCI_PCIE_LCAP_SURPRISE_DOWN __BIT(19)
+#define PCI_PCIE_LCAP_DL_ACTIVE __BIT(20)
+#define PCI_PCIE_LCAP_LINK_BW_NOTIFY __BIT(21)
+#define PCI_PCIE_LCAP_ASPM_COMPLIANCE __BIT(22)
+#define PCI_PCIE_LCAP_PORT __BITS(31, 24)
#define PCI_PCIE_LCSR 0x10 /* Link Control & Status Register */
#define PCI_PCIE_LCSR_ASPM_L0S __BIT(0)
#define PCI_PCIE_LCSR_ASPM_L1 __BIT(1)
+#define PCI_PCIE_LCSR_RCB __BIT(3)
+#define PCI_PCIE_LCSR_LINK_DIS __BIT(4)
+#define PCI_PCIE_LCSR_RETRAIN __BIT(5)
+#define PCI_PCIE_LCSR_COMCLKCFG __BIT(6)
+#define PCI_PCIE_LCSR_EXTNDSYNC __BIT(7)
+#define PCI_PCIE_LCSR_ENCLKPM __BIT(8)
+#define PCI_PCIE_LCSR_HAWD __BIT(9)
+#define PCI_PCIE_LCSR_LBMIE __BIT(10)
+#define PCI_PCIE_LCSR_LABIE __BIT(11)
+#define PCI_PCIE_LCSR_LINKSPEED __BITS(19,16)
+#define PCI_PCIE_LCSR_NLW __BITS(25,20)
+#define PCI_PCIE_LCSR_LINKTRAIN_ERR __BIT(26)
+#define PCI_PCIE_LCSR_LINKTRAIN __BIT(27)
+#define PCI_PCIE_LCSR_SLOTCLKCFG __BIT(28)
+#define PCI_PCIE_LCSR_DLACTIVE __BIT(29)
+#define PCI_PCIE_LCSR_LINK_BW_MGMT __BIT(30)
+#define PCI_PCIE_LCSR_LINK_AUTO_BW __BIT(31)
#define PCI_PCIE_SLCAP 0x14 /* Slot Capabilities Register */
#define PCI_PCIE_SLCAP_ABP __BIT(0) /* Attention Button Present */
#define PCI_PCIE_SLCAP_PCP __BIT(1) /* Power Controller Present */
@@ -666,13 +724,24 @@ struct pci_msix_table_entry {
#define PCI_PCIE_SLCAP_PIP __BIT(4) /* Power Indicator Present */
#define PCI_PCIE_SLCAP_HPS __BIT(5) /* Hot-Plug Surprise */
#define PCI_PCIE_SLCAP_HPC __BIT(6) /* Hot-Plug Capable */
-#define PCI_PCIE_SLCSR 0x18
+#define PCI_PCIE_SLCAP_SPLV __BITS(14, 7)
+#define PCI_PCIE_SLCAP_SPLS __BITS(16, 15)
+#define PCI_PCIE_SLCAP_EIP __BIT(17)
+#define PCI_PCIE_SLCAP_NCCS __BIT(18)
+#define PCI_PCIE_SLCAP_PSN __BITS(31, 19)
+#define PCI_PCIE_SLCSR 0x18 /* Slot Control & Status Register */
#define PCI_PCIE_SLCSR_ABE __BIT(0)
#define PCI_PCIE_SLCSR_PFE __BIT(1)
#define PCI_PCIE_SLCSR_MSE __BIT(2)
#define PCI_PCIE_SLCSR_PDE __BIT(3)
#define PCI_PCIE_SLCSR_CCE __BIT(4)
#define PCI_PCIE_SLCSR_HPE __BIT(5)
+#define PCI_PCIE_SLCSR_AIC __BITS(7, 6)
+#define PCI_PCIE_SLCSR_PIC __BITS(9, 8)
+#define PCI_PCIE_SLCSR_PCC __BIT(10)
+#define PCI_PCIE_SLCSR_EIC __BIT(11)
+#define PCI_PCIE_SLCSR_DLLSCE __BIT(12)
+
#define PCI_PCIE_SLCSR_ABP __BIT(0 + 16)
#define PCI_PCIE_SLCSR_PFD __BIT(1 + 16)
#define PCI_PCIE_SLCSR_MSC __BIT(2 + 16)
@@ -680,15 +749,64 @@ struct pci_msix_table_entry {
#define PCI_PCIE_SLCSR_CC __BIT(4 + 16)
#define PCI_PCIE_SLCSR_MS __BIT(5 + 16)
#define PCI_PCIE_SLCSR_PDS __BIT(6 + 16)
+#define PCI_PCIE_SLCSR_EIS __BIT(7 + 16)
#define PCI_PCIE_SLCSR_LACS __BIT(8 + 16)
-#define PCI_PCIE_RCR 0x1c
-#define PCI_PCIE_RSR 0x20
-#define PCI_PCIE_DCAP2 0x24
-#define PCI_PCIE_DCSR2 0x28
-#define PCI_PCIE_LCAP2 0x2c
-#define PCI_PCIE_LCSR2 0x30
-#define PCI_PCIE_SLCAP2 0x34
-#define PCI_PCIE_SLCSR2 0x38
+#define PCI_PCIE_RCR 0x1c /* Root Control & Capabilities Reg. */
+#define PCI_PCIE_RCR_SERR_CER __BIT(0)
+#define PCI_PCIE_RCR_SERR_NFER __BIT(1)
+#define PCI_PCIE_RCR_SERR_FER __BIT(2)
+#define PCI_PCIE_RCR_PME_IE __BIT(3)
+#define PCI_PCIE_RSR 0x20 /* Root Status Register */
+#define PCI_PCIE_RSR_PME_REQESTER __BITS(15, 0)
+#define PCI_PCIE_RSR_PME_STAT __BIT(16)
+#define PCI_PCIE_RSR_PME_PEND __BIT(17)
+#define PCI_PCIE_DCAP2 0x24 /* Device Capabilities 2 Register */
+#define PCI_PCIE_DCAP2_COMPT_RANGE __BITS(3,0) /* Compl. Timeout Ranges Supp */
+#define PCI_PCIE_DCAP2_COMPT_DIS __BIT(4) /* Compl. Timeout Disable Supp*/
+#define PCI_PCIE_DCAP2_ARI_FWD __BIT(5) /* ARI Forward Supported */
+#define PCI_PCIE_DCAP2_ATOM_ROUT __BIT(6) /* AtomicOp Routing Supported */
+#define PCI_PCIE_DCAP2_32ATOM __BIT(7) /* 32bit AtomicOp Compl. Supp */
+#define PCI_PCIE_DCAP2_64ATOM __BIT(8) /* 64bit AtomicOp Compl. Supp */
+#define PCI_PCIE_DCAP2_128CAS __BIT(9) /* 128bit Cas Completer Supp. */
+#define PCI_PCIE_DCAP2_NO_ROPR_PASS __BIT(10) /* No RO-enabled PR-PR Passng */
+#define PCI_PCIE_DCAP2_LTR_MEC __BIT(11) /* LTR Mechanism Supported */
+#define PCI_PCIE_DCAP2_TPH_COMP __BITS(13, 12) /* TPH Completer Supported */
+#define PCI_PCIE_DCAP2_OBFF __BITS(19, 18) /* OBPF */
+#define PCI_PCIE_DCAP2_EXTFMT_FLD __BIT(20) /* Extended Fmt Field Support */
+#define PCI_PCIE_DCAP2_EETLP_PREF __BIT(21) /* End-End TLP Prefix Support */
+#define PCI_PCIE_DCAP2_MAX_EETLP __BITS(23, 22) /* Max End-End TLP Prefix Sup */
+#define PCI_PCIE_DCSR2 0x28 /* Device Control & Status 2 Reg. */
+#define PCI_PCIE_DCSR2_COMPT_VAL __BITS(3, 0) /* Completion Timeout Value */
+#define PCI_PCIE_DCSR2_COMPT_DIS __BIT(4) /* Completion Timeout Disable */
+#define PCI_PCIE_DCSR2_ARI_FWD __BIT(5) /* ARI Forwarding Enable */
+#define PCI_PCIE_DCSR2_ATOM_REQ __BIT(6) /* AtomicOp Requester Enable */
+#define PCI_PCIE_DCSR2_ATOM_EBLK __BIT(7) /* AtomicOp Egress Blocking */
+#define PCI_PCIE_DCSR2_IDO_REQ __BIT(8) /* IDO Request Enable */
+#define PCI_PCIE_DCSR2_IDO_COMP __BIT(9) /* IDO Completion Enable */
+#define PCI_PCIE_DCSR2_LTR_MEC __BIT(10) /* LTR Mechanism Enable */
+#define PCI_PCIE_DCSR2_OBFF_EN __BITS(14, 13) /* OBPF Enable */
+#define PCI_PCIE_DCSR2_EETLP __BIT(15) /* End-End TLP Prefix Blcking */
+#define PCI_PCIE_LCAP2 0x2c /* Link Capabilities 2 Register */
+#define PCI_PCIE_LCAP2_SUP_LNKSV __BITS(7, 1) /* Supported Link Speeds Vect */
+#define PCI_PCIE_LCAP2_CROSSLNK __BIT(8) /* Crosslink Supported */
+#define PCI_PCIE_LCSR2 0x30 /* Link Control & Status 2 Register */
+#define PCI_PCIE_LCSR2_TGT_LSPEED __BITS(3, 0) /* Target Link Speed */
+#define PCI_PCIE_LCSR2_ENT_COMPL __BIT(4) /* Enter Compliance */
+#define PCI_PCIE_LCSR2_HW_AS_DIS __BIT(5) /* HW Autonomous Speed Disabl */
+#define PCI_PCIE_LCSR2_SEL_DEEMP __BIT(6) /* Selectable De-emphasis */
+#define PCI_PCIE_LCSR2_TX_MARGIN __BITS(9, 7) /* Transmit Margin */
+#define PCI_PCIE_LCSR2_EN_MCOMP __BIT(10) /* Enter Modified Compliance */
+#define PCI_PCIE_LCSR2_COMP_SOS __BIT(11) /* Compliance SOS */
+#define PCI_PCIE_LCSR2_COMP_DEEMP __BITS(15, 12) /* Compliance Present/De-emph */
+#define PCI_PCIE_LCSR2_DEEMP_LVL __BIT(0 + 16) /* Current De-emphasis Level */
+#define PCI_PCIE_LCSR2_EQ_COMPL __BIT(1 + 16) /* Equalization Complete */
+#define PCI_PCIE_LCSR2_EQP1_SUC __BIT(2 + 16) /* Equaliz Phase 1 Successful */
+#define PCI_PCIE_LCSR2_EQP2_SUC __BIT(3 + 16) /* Equaliz Phase 2 Successful */
+#define PCI_PCIE_LCSR2_EQP3_SUC __BIT(4 + 16) /* Equaliz Phase 3 Successful */
+#define PCI_PCIE_LCSR2_LNKEQ_REQ __BIT(5 + 16) /* Link Equalization Request */
+
+#define PCI_PCIE_SLCAP2 0x34 /* Slot Capabilities 2 Register */
+#define PCI_PCIE_SLCSR2 0x38 /* Slot Control & Status 2 Register */
/*
* Interrupt Configuration Register; contains interrupt pin and line.