Module Name: src Committed By: matt Date: Sat Oct 20 05:57:34 UTC 2012
Modified Files: src/sys/dev/pci: ppb.c Log Message: Print out negotiated link width and speed for PCIe (merged from matt-nb5-mips64). To generate a diff of this commit: cvs rdiff -u -r1.49 -r1.50 src/sys/dev/pci/ppb.c 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/ppb.c diff -u src/sys/dev/pci/ppb.c:1.49 src/sys/dev/pci/ppb.c:1.50 --- src/sys/dev/pci/ppb.c:1.49 Sun Jan 29 11:31:38 2012 +++ src/sys/dev/pci/ppb.c Sat Oct 20 05:57:34 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: ppb.c,v 1.49 2012/01/29 11:31:38 drochner Exp $ */ +/* $NetBSD: ppb.c,v 1.50 2012/10/20 05:57:34 matt Exp $ */ /* * Copyright (c) 1996, 1998 Christopher G. Demetriou. All rights reserved. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ppb.c,v 1.49 2012/01/29 11:31:38 drochner Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ppb.c,v 1.50 2012/10/20 05:57:34 matt Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -55,6 +55,10 @@ struct ppb_softc { pcireg_t sc_pciconfext[48]; }; +static const char pcie_linkspeed_strings[4][5] = { + "1.25", "2.5", "5.0", "8.0", +}; + static bool ppb_resume(device_t, const pmf_qual_t *); static bool ppb_suspend(device_t, const pmf_qual_t *); @@ -83,6 +87,13 @@ ppbmatch(device_t parent, cfdata_t match } #endif +#ifdef _MIPS_PADDR_T_64BIT + /* The LDT HB acts just like a PPB. */ + if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_SIBYTE + && PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_SIBYTE_BCM1250_LDTHB) + return 1; +#endif + return 0; } @@ -139,7 +150,42 @@ ppb_fix_pcie(device_t self) __SHIFTOUT(reg, PCI_PCIE_XCAP_TYPE_MASK)); break; } - aprint_normal(">\n"); + + switch (reg & PCI_PCIE_XCAP_TYPE_MASK) { + case PCI_PCIE_XCAP_TYPE_ROOT: + case PCI_PCIE_XCAP_TYPE_DOWN: + case PCI_PCIE_XCAP_TYPE_PCI2PCIE: + reg = pci_conf_read(sc->sc_pc, sc->sc_tag, off + 0x0c); + u_int mlw = (reg >> 4) & 0x1f; + u_int mls = (reg >> 0) & 0x0f; + if (mls < __arraycount(pcie_linkspeed_strings)) { + aprint_normal("> x%d @ %sGb/s\n", + mlw, pcie_linkspeed_strings[mls]); + } else { + aprint_normal("> x%d @ %d.%dGb/s\n", + mlw, (mls * 25) / 10, (mls * 25) % 10); + } + + reg = pci_conf_read(sc->sc_pc, sc->sc_tag, off + 0x10); + if (reg & __BIT(29)) { /* DLLA */ + u_int lw = (reg >> 20) & 0x1f; + u_int ls = (reg >> 16) & 0x0f; + if (lw != mlw || ls != mls) { + if (ls < __arraycount(pcie_linkspeed_strings)) { + aprint_normal("> x%d @ %sGb/s\n", + lw, pcie_linkspeed_strings[ls]); + } else { + aprint_normal_dev(self, + "link is x%d @ %d.%dGb/s\n", + lw, (ls * 25) / 10, (ls * 25) % 10); + } + } + } + break; + default: + aprint_normal(">\n"); + break; + } reg = pci_conf_read(sc->sc_pc, sc->sc_tag, off + PCI_PCIE_SLCSR); if (reg & PCI_PCIE_SLCSR_NOTIFY_MASK) {