Module Name: src Committed By: msaitoh Date: Wed Apr 17 06:31:15 UTC 2013
Modified Files: src/sys/dev/pci: pci_subr.c pcireg.h Log Message: - Add slot related registers - Add root port related registers - Fix the definition of PCI_PCIE_SLCAP_PSN - Cleanup To generate a diff of this commit: cvs rdiff -u -r1.100 -r1.101 src/sys/dev/pci/pci_subr.c cvs rdiff -u -r1.81 -r1.82 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/sys/dev/pci/pci_subr.c diff -u src/sys/dev/pci/pci_subr.c:1.100 src/sys/dev/pci/pci_subr.c:1.101 --- src/sys/dev/pci/pci_subr.c:1.100 Wed Apr 17 04:36:27 2013 +++ src/sys/dev/pci/pci_subr.c Wed Apr 17 06:31:15 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: pci_subr.c,v 1.100 2013/04/17 04:36:27 msaitoh Exp $ */ +/* $NetBSD: pci_subr.c,v 1.101 2013/04/17 06:31:15 msaitoh 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.100 2013/04/17 04:36:27 msaitoh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pci_subr.c,v 1.101 2013/04/17 06:31:15 msaitoh Exp $"); #ifdef _KERNEL_OPT #include "opt_pci.h" @@ -859,18 +859,20 @@ pci_print_pcie_L1_latency(uint32_t val) static void pci_conf_print_pcie_cap(const pcireg_t *regs, int capoff) { - pcireg_t val; + pcireg_t reg; /* for each register */ + pcireg_t val; /* for each bitfield */ bool check_slot = false; + bool check_rootport = false; static const char * const linkspeeds[] = {"2.5", "5.0", "8.0"}; printf("\n PCI Express Capabilities Register\n"); /* Capability Register */ - printf(" Capability register: %04x\n", - regs[o2i(capoff)] >> 16); + reg = regs[o2i(capoff)]; + printf(" Capability register: %04x\n", reg >> 16); printf(" Capability version: %x\n", - (unsigned int)((regs[o2i(capoff)] & 0x000f0000) >> 16)); + (unsigned int)((reg & 0x000f0000) >> 16)); printf(" Device type: "); - switch ((regs[o2i(capoff)] & 0x00f00000) >> 20) { + switch ((reg & 0x00f00000) >> 20) { case 0x0: printf("PCI Express Endpoint device\n"); break; @@ -880,6 +882,7 @@ pci_conf_print_pcie_cap(const pcireg_t * case 0x4: printf("Root Port of PCI Express Root Complex\n"); check_slot = true; + check_rootport = true; /* XXX right? */ break; case 0x5: printf("Upstream Port of PCI Express Switch\n"); @@ -887,6 +890,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; /* XXX right? */ break; case 0x7: printf("PCI Express to PCI/PCI-X Bridge\n"); @@ -896,6 +900,7 @@ pci_conf_print_pcie_cap(const pcireg_t * break; case 0x9: printf("Root Complex Integrated Endpoint\n"); + check_rootport = true; /* XXX right? */ break; case 0xa: printf("Root Complex Event Collector\n"); @@ -904,20 +909,18 @@ pci_conf_print_pcie_cap(const pcireg_t * printf("unknown\n"); break; } - if (check_slot && (regs[o2i(capoff)] & 0x01000000) != 0) + if (check_slot && (reg & PCI_PCIE_XCAP_SI) != 0) printf(" Slot implemented\n"); printf(" Interrupt Message Number: %x\n", - (unsigned int)((regs[o2i(capoff)] & PCI_PCIE_XCAP_IRQ) >> 27)); + (unsigned int)((reg & PCI_PCIE_XCAP_IRQ) >> 27)); /* Device Capability Register */ - printf(" Device Capabilities Register: 0x%08x\n", - regs[o2i(capoff + PCI_PCIE_DCAP)]); + 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)(regs[o2i(capoff + PCI_PCIE_DCAP)] - & PCI_PCIE_DCAP_MAX_PAYLOAD) * 256); + (unsigned int)(reg & PCI_PCIE_DCAP_MAX_PAYLOAD) * 256); printf(" Phantom Functions Supported: "); - switch ((regs[o2i(capoff + PCI_PCIE_DCAP)] - & PCI_PCIE_DCAP_PHANTOM_FUNCS) >> 3) { + switch ((reg & PCI_PCIE_DCAP_PHANTOM_FUNCS) >> 3) { case 0x0: printf("not available\n"); break; @@ -932,112 +935,82 @@ pci_conf_print_pcie_cap(const pcireg_t * break; } printf(" Extended Tag Field Supported: %dbit\n", - (regs[o2i(capoff + PCI_PCIE_DCAP)] & PCI_PCIE_DCAP_EXT_TAG_FIELD) - == 0 ? 5 : 8); + (reg & PCI_PCIE_DCAP_EXT_TAG_FIELD) == 0 ? 5 : 8); printf(" Endpoint L0 Acceptable Latency: "); - pci_print_pcie_L0s_latency((regs[o2i(capoff + PCI_PCIE_DCAP)] - & PCI_PCIE_DCAP_L0S_LATENCY) >> 6); + pci_print_pcie_L0s_latency((reg & PCI_PCIE_DCAP_L0S_LATENCY) >> 6); printf(" Endpoint L1 Acceptable Latency: "); - pci_print_pcie_L1_latency((regs[o2i(capoff + PCI_PCIE_DCAP)] - & PCI_PCIE_DCAP_L1_LATENCY) >> 9); + pci_print_pcie_L1_latency((reg & PCI_PCIE_DCAP_L1_LATENCY) >> 9); printf(" Attention Button Present: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCAP)] - & PCI_PCIE_DCAP_ATTN_BUTTON) != 0 ? "yes" : "no"); + (reg & PCI_PCIE_DCAP_ATTN_BUTTON) != 0 ? "yes" : "no"); printf(" Attention Indicator Present: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCAP)] - & PCI_PCIE_DCAP_ATTN_IND) != 0 ? "yes" : "no"); + (reg & PCI_PCIE_DCAP_ATTN_IND) != 0 ? "yes" : "no"); printf(" Power Indicator Present: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCAP)] - & PCI_PCIE_DCAP_PWR_IND) != 0 ? "yes" : "no"); + (reg & PCI_PCIE_DCAP_PWR_IND) != 0 ? "yes" : "no"); printf(" Role-Based Error Report: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCAP)] - & PCI_PCIE_DCAP_ROLE_ERR_RPT) != 0 ? "yes" : "no"); + (reg & PCI_PCIE_DCAP_ROLE_ERR_RPT) != 0 ? "yes" : "no"); printf(" Captured Slot Power Limit Value: %d\n", - (unsigned int)(regs[o2i(capoff + PCI_PCIE_DCAP)] - & PCI_PCIE_DCAP_SLOT_PWR_LIM_VAL) >> 18); + (unsigned int)(reg & PCI_PCIE_DCAP_SLOT_PWR_LIM_VAL) >> 18); printf(" Captured Slot Power Limit Scale: %d\n", - (unsigned int)(regs[o2i(capoff + PCI_PCIE_DCAP)] - & PCI_PCIE_DCAP_SLOT_PWR_LIM_SCALE) >> 26); + (unsigned int)(reg & PCI_PCIE_DCAP_SLOT_PWR_LIM_SCALE) >> 26); printf(" Function-Level Reset Capability: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCAP)] - & PCI_PCIE_DCAP_FLR) != 0 ? "yes" : "no"); + (reg & PCI_PCIE_DCAP_FLR) != 0 ? "yes" : "no"); /* Device Control Register */ - printf(" Device Control Register: 0x%04x\n", - regs[o2i(capoff + PCI_PCIE_DCSR)] & 0xffff); + reg = regs[o2i(capoff + PCI_PCIE_DCSR)]; + printf(" Device Control Register: 0x%04x\n", reg & 0xffff); printf(" Correctable Error Reporting Enable: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCSR)] - & PCI_PCIE_DCSR_ENA_COR_ERR) != 0 ? "on" : "off"); + (reg & PCI_PCIE_DCSR_ENA_COR_ERR) != 0 ? "on" : "off"); printf(" Non Fatal Error Reporting Enable: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCSR)] - & PCI_PCIE_DCSR_ENA_NFER) != 0 ? "on" : "off"); + (reg & PCI_PCIE_DCSR_ENA_NFER) != 0 ? "on" : "off"); printf(" Fatal Error Reporting Enable: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCSR)] - & PCI_PCIE_DCSR_ENA_FER) != 0 ? "on" : "off"); + (reg & PCI_PCIE_DCSR_ENA_FER) != 0 ? "on" : "off"); printf(" Unsupported Request Reporting Enable: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCSR)] - & PCI_PCIE_DCSR_ENA_URR) != 0 ? "on" : "off"); + (reg & PCI_PCIE_DCSR_ENA_URR) != 0 ? "on" : "off"); printf(" Enable Relaxed Ordering: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCSR)] - & PCI_PCIE_DCSR_ENA_RELAX_ORD) != 0 ? "on" : "off"); + (reg & PCI_PCIE_DCSR_ENA_RELAX_ORD) != 0 ? "on" : "off"); printf(" Max Payload Size: %d byte\n", - 128 << (((unsigned int)(regs[o2i(capoff + PCI_PCIE_DCSR)] - & PCI_PCIE_DCSR_MAX_PAYLOAD) >> 5))); + 128 << (((unsigned int)(reg & PCI_PCIE_DCSR_MAX_PAYLOAD) >> 5))); printf(" Extended Tag Field Enable: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCSR)] - & PCI_PCIE_DCSR_EXT_TAG_FIELD) != 0 ? "on" : "off"); + (reg & PCI_PCIE_DCSR_EXT_TAG_FIELD) != 0 ? "on" : "off"); printf(" Phantom Functions Enable: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCSR)] - & PCI_PCIE_DCSR_PHANTOM_FUNCS) != 0 ? "on" : "off"); + (reg & PCI_PCIE_DCSR_PHANTOM_FUNCS) != 0 ? "on" : "off"); printf(" Aux Power PM Enable: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCSR)] - & PCI_PCIE_DCSR_AUX_POWER_PM) != 0 ? "on" : "off"); + (reg & PCI_PCIE_DCSR_AUX_POWER_PM) != 0 ? "on" : "off"); printf(" Enable No Snoop: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCSR)] - & PCI_PCIE_DCSR_ENA_NO_SNOOP) != 0 ? "on" : "off"); + (reg & PCI_PCIE_DCSR_ENA_NO_SNOOP) != 0 ? "on" : "off"); printf(" Max Read Request Size: %d byte\n", - 128 << ((unsigned int)(regs[o2i(capoff + PCI_PCIE_DCSR)] - & PCI_PCIE_DCSR_MAX_READ_REQ) >> 12)); + 128 << ((unsigned int)(reg & PCI_PCIE_DCSR_MAX_READ_REQ) >> 12)); /* Device Status Register */ - printf(" Device Status Register: 0x%04x\n", - regs[o2i(capoff + PCI_PCIE_DCSR)] >> 16); + reg = regs[o2i(capoff + PCI_PCIE_DCSR)]; + printf(" Device Status Register: 0x%04x\n", reg >> 16); printf(" Correctable Error Detected: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCSR)] - & PCI_PCIE_DCSR_CED) != 0 ? "on" : "off"); + (reg & PCI_PCIE_DCSR_CED) != 0 ? "on" : "off"); printf(" Non Fatal Error Detected: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCSR)] - & PCI_PCIE_DCSR_NFED) != 0 ? "on" : "off"); + (reg & PCI_PCIE_DCSR_NFED) != 0 ? "on" : "off"); printf(" Fatal Error Detected: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCSR)] - & PCI_PCIE_DCSR_FED) != 0 ? "on" : "off"); + (reg & PCI_PCIE_DCSR_FED) != 0 ? "on" : "off"); printf(" Unsupported Request Detected: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCSR)] - & PCI_PCIE_DCSR_URD) != 0 ? "on" : "off"); + (reg & PCI_PCIE_DCSR_URD) != 0 ? "on" : "off"); printf(" Aux Power Detected: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCSR)] - & PCI_PCIE_DCSR_AUX_PWR) != 0 ? "on" : "off"); + (reg & PCI_PCIE_DCSR_AUX_PWR) != 0 ? "on" : "off"); printf(" Transaction Pending: %s\n", - (regs[o2i(capoff + PCI_PCIE_DCSR)] - & PCI_PCIE_DCSR_TRANSACTION_PND) != 0 ? "on" : "off"); + (reg & PCI_PCIE_DCSR_TRANSACTION_PND) != 0 ? "on" : "off"); /* Link Capability Register */ - printf(" Link Capabilities Register: 0x%08x\n", - regs[o2i(capoff + PCI_PCIE_LCAP)]); + reg = regs[o2i(capoff + PCI_PCIE_LCAP)]; + printf(" Link Capabilities Register: 0x%08x\n", reg); printf(" Maximum Link Speed: "); - if ((regs[o2i(capoff + PCI_PCIE_LCAP)] & 0x000f) < 1 || - (regs[o2i(capoff + PCI_PCIE_LCAP)] & 0x000f) > 3) { - printf("unknown %u value\n", - (regs[o2i(capoff + PCI_PCIE_LCAP)] & 0x000f)); + val = reg & PCI_PCIE_LCAP_MAX_SPEED; + if (val < 1 || val > 3) { + printf("unknown %u value\n", val); } else { - printf("%sGb/s\n", - linkspeeds[(regs[o2i(capoff + PCI_PCIE_LCAP)] & 0x000f) - - 1]); + printf("%sGb/s\n", linkspeeds[val - 1]); } printf(" Maximum Link Width: x%u lanes\n", - (regs[o2i(capoff + PCI_PCIE_LCAP)] & 0x03f0) >> 4); + (unsigned int)(reg & PCI_PCIE_LCAP_MAX_WIDTH) >> 4); printf(" Active State PM Support: "); - val = (regs[o2i(capoff + PCI_PCIE_LCAP)] & PCI_PCIE_LCAP_ASPM) >> 10; + val = (reg & PCI_PCIE_LCAP_ASPM) >> 10; switch (val) { case 0x1: printf("L0s Entry supported\n"); @@ -1050,20 +1023,16 @@ pci_conf_print_pcie_cap(const pcireg_t * break; } printf(" L0 Exit Latency: "); - pci_print_pcie_L0s_latency((regs[o2i(capoff + PCI_PCIE_LCAP)] - & PCI_PCIE_LCAP_L0S_EXIT) >> 12); + pci_print_pcie_L0s_latency((reg & PCI_PCIE_LCAP_L0S_EXIT) >> 12); printf(" L1 Exit Latency: "); - pci_print_pcie_L1_latency((regs[o2i(capoff + PCI_PCIE_LCAP)] - & PCI_PCIE_LCAP_L1_EXIT) >> 15); - printf(" Port Number: %u\n", - regs[o2i(capoff + PCI_PCIE_LCAP)] >> 24); + pci_print_pcie_L1_latency((reg & PCI_PCIE_LCAP_L1_EXIT) >> 15); + printf(" Port Number: %u\n", reg >> 24); /* Link Control Register */ - printf(" Link Control Register: 0x%04x\n", - regs[o2i(capoff + PCI_PCIE_LCSR)] & 0xffff); + reg = regs[o2i(capoff + PCI_PCIE_LCSR)]; + printf(" Link Control Register: 0x%04x\n", reg & 0xffff); printf(" Active State PM Control: "); - val = regs[o2i(capoff + PCI_PCIE_LCSR)] - & (PCI_PCIE_LCSR_ASPM_L1 | PCI_PCIE_LCSR_ASPM_L0S); + val = reg & (PCI_PCIE_LCSR_ASPM_L1 | PCI_PCIE_LCSR_ASPM_L0S); switch (val) { case 0: printf("disabled\n"); @@ -1079,84 +1048,99 @@ pci_conf_print_pcie_cap(const pcireg_t * break; } printf(" Read Completion Boundary Control: %dbyte\n", - (regs[o2i(capoff + PCI_PCIE_LCSR)] - & PCI_PCIE_LCSR_RCB) != 0 ? 128 : 64); + (reg & PCI_PCIE_LCSR_RCB) != 0 ? 128 : 64); printf(" Link Disable: %s\n", - (regs[o2i(capoff + PCI_PCIE_LCSR)] - & PCI_PCIE_LCSR_LINK_DIS) != 0 ? "on" : "off"); + (reg & PCI_PCIE_LCSR_LINK_DIS) != 0 ? "on" : "off"); printf(" Retrain Link: %s\n", - (regs[o2i(capoff + PCI_PCIE_LCSR)] - & PCI_PCIE_LCSR_RETRAIN) != 0 ? "on" : "off"); + (reg & PCI_PCIE_LCSR_RETRAIN) != 0 ? "on" : "off"); printf(" Common Clock Configuration: %s\n", - (regs[o2i(capoff + PCI_PCIE_LCSR)] - & PCI_PCIE_LCSR_COMCLKCFG) != 0 ? "on" : "off"); + (reg & PCI_PCIE_LCSR_COMCLKCFG) != 0 ? "on" : "off"); printf(" Extended Synch: %s\n", - (regs[o2i(capoff + PCI_PCIE_LCSR)] - & PCI_PCIE_LCSR_EXTNDSYNC) != 0 ? "on" : "off"); + (reg & PCI_PCIE_LCSR_EXTNDSYNC) != 0 ? "on" : "off"); printf(" Enable Clock Power Management: %s\n", - (regs[o2i(capoff + PCI_PCIE_LCSR)] - & PCI_PCIE_LCSR_ENCLKPM) != 0 ? "on" : "off"); + (reg & PCI_PCIE_LCSR_ENCLKPM) != 0 ? "on" : "off"); printf(" Hardware Autonomous Width Disable: %s\n", - (regs[o2i(capoff + PCI_PCIE_LCSR)] - & PCI_PCIE_LCSR_HAWD) != 0 ? "on" : "off"); + (reg & PCI_PCIE_LCSR_HAWD) != 0 ? "on" : "off"); printf(" Link Bandwidth Management Interrupt Enable: %s\n", - (regs[o2i(capoff + PCI_PCIE_LCSR)] - & PCI_PCIE_LCSR_LBMIE) != 0 ? "on" : "off"); + (reg & PCI_PCIE_LCSR_LBMIE) != 0 ? "on" : "off"); printf(" Link Autonomous Bandwidth Interrupt Enable: %s\n", - (regs[o2i(capoff + PCI_PCIE_LCSR)] - & PCI_PCIE_LCSR_LABIE) != 0 ? "on" : "off"); + (reg & PCI_PCIE_LCSR_LABIE) != 0 ? "on" : "off"); /* Link Status Register */ - printf(" Link Status Register: 0x%04x\n", - regs[o2i(capoff + PCI_PCIE_LCSR)] >> 16); + reg = regs[o2i(capoff + PCI_PCIE_LCSR)]; + printf(" Link Status Register: 0x%04x\n", reg >> 16); printf(" Negotiated Link Speed: "); - if (((regs[o2i(capoff + PCI_PCIE_LCSR)] >> 16) & 0x000f) < 1 || - ((regs[o2i(capoff + PCI_PCIE_LCSR)] >> 16) & 0x000f) > 3) { - printf("unknown %u value\n", - (regs[o2i(capoff + PCI_PCIE_LCSR)] >> 16) & 0x000f); + if (((reg >> 16) & 0x000f) < 1 || + ((reg >> 16) & 0x000f) > 3) { + printf("unknown %u value\n", + (unsigned int)(reg & PCI_PCIE_LCSR_LINKSPEED) >> 16); } else { printf("%sGb/s\n", - linkspeeds[((regs[o2i(capoff + PCI_PCIE_LCSR)] >> 16) - & 0x000f) - 1]); + linkspeeds[((reg & PCI_PCIE_LCSR_LINKSPEED) >> 16) - 1]); } printf(" Negotiated Link Width: x%u lanes\n", - (regs[o2i(capoff + PCI_PCIE_LCSR)] >> 20) & 0x003f); + (reg >> 20) & 0x003f); printf(" Training Error: %s\n", - (regs[o2i(capoff + PCI_PCIE_LCSR)] - & PCI_PCIE_LCSR_LINKTRAIN_ERR) != 0 ? "on" : "off"); + (reg & PCI_PCIE_LCSR_LINKTRAIN_ERR) != 0 ? "on" : "off"); printf(" Link Training: %s\n", - (regs[o2i(capoff + PCI_PCIE_LCSR)] - & PCI_PCIE_LCSR_LINKTRAIN) != 0 ? "on" : "off"); + (reg & PCI_PCIE_LCSR_LINKTRAIN) != 0 ? "on" : "off"); printf(" Slot Clock Configuration: %s\n", - (regs[o2i(capoff + PCI_PCIE_LCSR)] - & PCI_PCIE_LCSR_SLOTCLKCFG) != 0 ? "on" : "off"); + (reg & PCI_PCIE_LCSR_SLOTCLKCFG) != 0 ? "on" : "off"); printf(" Data Link Layer Link Active: %s\n", - (regs[o2i(capoff + PCI_PCIE_LCSR)] - & PCI_PCIE_LCSR_DLACTIVE) != 0 ? "on" : "off"); + (reg & PCI_PCIE_LCSR_DLACTIVE) != 0 ? "on" : "off"); printf(" Link Bandwidth Management Status: %s\n", - (regs[o2i(capoff + PCI_PCIE_LCSR)] - & PCI_PCIE_LCSR_LINK_BW_MGMT) != 0 ? "on" : "off"); + (reg & PCI_PCIE_LCSR_LINK_BW_MGMT) != 0 ? "on" : "off"); printf(" Link Autonomous Bandwidth Status: %s\n", - (regs[o2i(capoff + PCI_PCIE_LCSR)] - & PCI_PCIE_LCSR_LINK_AUTO_BW) != 0 ? "on" : "off"); + (reg & PCI_PCIE_LCSR_LINK_AUTO_BW) != 0 ? "on" : "off"); - /* Slot Control Register */ - if ((regs[o2i(capoff + PCI_PCIE_SLCSR)] & 0x07ff) != 0) { - printf(" Slot Control Register:\n"); - if ((regs[o2i(capoff + PCI_PCIE_SLCSR)] & 0x0001) != 0) + /* XXX Is this check right? */ + if ((check_slot == true) + && ((regs[o2i(capoff + 0x18)] & 0x07ff) != 0)) { + /* 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 + PCI_PCIE_SLCSR)] & 0x0002) != 0) + if ((reg & PCI_PCIE_SLCSR_PFE) != 0) printf(" Power Fault Detected Enabled\n"); - if ((regs[o2i(capoff + PCI_PCIE_SLCSR)] & 0x0004) != 0) + if ((reg & PCI_PCIE_SLCSR_MSE) != 0) printf(" MRL Sensor Changed Enabled\n"); - if ((regs[o2i(capoff + PCI_PCIE_SLCSR)] & 0x0008) != 0) - printf(" Presense Detected Changed Enabled\n"); - if ((regs[o2i(capoff + PCI_PCIE_SLCSR)] & 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 + PCI_PCIE_SLCSR)] & 0x0020) != 0) + if ((reg & PCI_PCIE_SLCSR_HPE) != 0) printf(" Hot-Plug Interrupt Enabled\n"); printf(" Attention Indicator Control: "); - switch ((regs[o2i(capoff + PCI_PCIE_SLCSR)] & 0x00c0) >> 6) { + switch ((reg & PCI_PCIE_SLCSR_AIC) >> 6) { case 0x0: printf("reserved\n"); break; @@ -1171,7 +1155,7 @@ pci_conf_print_pcie_cap(const pcireg_t * break; } printf(" Power Indicator Control: "); - switch ((regs[o2i(capoff + PCI_PCIE_SLCSR)] & 0x0300) >> 8) { + switch ((reg & PCI_PCIE_SLCSR_PIC) >> 8) { case 0x0: printf("reserved\n"); break; @@ -1186,10 +1170,64 @@ pci_conf_print_pcie_cap(const pcireg_t * break; } printf(" Power Controller Control: "); - if ((regs[o2i(capoff + PCI_PCIE_SLCSR)] & 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"); + } + + /* XXX Is this check right? */ + 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_REQESTER)); + if ((reg & PCI_PCIE_RSR_PMESTAT) != 0) + printf(" PME was asserted\n"); + if ((reg & PCI_PCIE_RSR_PMEPEND) != 0) + printf(" another PME is pending\n"); } } Index: src/sys/dev/pci/pcireg.h diff -u src/sys/dev/pci/pcireg.h:1.81 src/sys/dev/pci/pcireg.h:1.82 --- src/sys/dev/pci/pcireg.h:1.81 Wed Apr 17 04:36:27 2013 +++ src/sys/dev/pci/pcireg.h Wed Apr 17 06:31:15 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: pcireg.h,v 1.81 2013/04/17 04:36:27 msaitoh Exp $ */ +/* $NetBSD: pcireg.h,v 1.82 2013/04/17 06:31:15 msaitoh Exp $ */ /* * Copyright (c) 1995, 1996, 1999, 2000 @@ -728,7 +728,7 @@ struct pci_msix_table_entry { #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 __BIT(31, 19) +#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) @@ -752,7 +752,14 @@ struct pci_msix_table_entry { #define PCI_PCIE_SLCSR_EIS __BIT(7 + 16) #define PCI_PCIE_SLCSR_LACS __BIT(8 + 16) #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_REQESTER __BITS(15, 0) +#define PCI_PCIE_RSR_PMESTAT __BIT(16) +#define PCI_PCIE_RSR_PMEPEND __BIT(17) #define PCI_PCIE_DCAP2 0x24 /* Device Capabilities 2 Register */ #define PCI_PCIE_DCSR2 0x28 /* Device Control & Status 2 Reg. */ #define PCI_PCIE_LCAP2 0x2c /* Link Capabilities 2 Register */