Module Name:    src
Committed By:   martin
Date:           Sat Nov 16 16:30:10 UTC 2019

Modified Files:
        src/sys/arch/arm/nvidia [netbsd-8]: tegra_xusb.c
        src/sys/dev/pci [netbsd-8]: xhci_pci.c
        src/sys/dev/usb [netbsd-8]: usb.c usbdivar.h xhci.c xhcireg.h

Log Message:
Pull up the following revisions, requested by msaitoh in ticket #1443:

        sys/arch/arm/nvidia/tegra_xusb.c        1.13-1.14 via patch
        sys/dev/pci/xhci_pci.c                  1.13
        sys/dev/usb/usb.c                       1.169
        sys/dev/usb/usbdivar.h                  1.116
        sys/dev/usb/xhci.c                      1.93, 1.95, 1.97
        sys/dev/usb/xhcireg.h                   1.11-1.12

Detect USB 3.1


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.6.2.1 src/sys/arch/arm/nvidia/tegra_xusb.c
cvs rdiff -u -r1.8.6.2 -r1.8.6.3 src/sys/dev/pci/xhci_pci.c
cvs rdiff -u -r1.165.6.4 -r1.165.6.5 src/sys/dev/usb/usb.c
cvs rdiff -u -r1.114.6.1 -r1.114.6.2 src/sys/dev/usb/usbdivar.h
cvs rdiff -u -r1.72.2.11 -r1.72.2.12 src/sys/dev/usb/xhci.c
cvs rdiff -u -r1.9.6.1 -r1.9.6.2 src/sys/dev/usb/xhcireg.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/arch/arm/nvidia/tegra_xusb.c
diff -u src/sys/arch/arm/nvidia/tegra_xusb.c:1.6 src/sys/arch/arm/nvidia/tegra_xusb.c:1.6.2.1
--- src/sys/arch/arm/nvidia/tegra_xusb.c:1.6	Fri Apr 28 09:46:49 2017
+++ src/sys/arch/arm/nvidia/tegra_xusb.c	Sat Nov 16 16:30:09 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_xusb.c,v 1.6 2017/04/28 09:46:49 jmcneill Exp $ */
+/* $NetBSD: tegra_xusb.c,v 1.6.2.1 2019/11/16 16:30:09 martin Exp $ */
 
 /*
  * Copyright (c) 2016 Jonathan A. Kollasch
@@ -30,7 +30,7 @@
 #include "opt_tegra.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra_xusb.c,v 1.6 2017/04/28 09:46:49 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_xusb.c,v 1.6.2.1 2019/11/16 16:30:09 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -355,6 +355,29 @@ tegra_xusb_mountroot(device_t self)
 	DPRINTF(sc->sc_dev, "XUSB_FALC_CPUCTL 0x%x\n", val);
 
 
+	val = bus_space_read_4(bst, psc->sc_bsh_fpci, PCI_USBREV)
+	    & PCI_USBREV_MASK;
+	switch (val) {
+	case PCI_USBREV_3_0:
+		sc->sc_bus.ub_revision = USBREV_3_0;
+		break;
+	case PCI_USBREV_3_1:
+		sc->sc_bus.ub_revision = USBREV_3_1;
+		break;
+	default:
+		if (val < PCI_USBREV_3_0) {
+			aprint_error_dev(self, "Unknown revision (%02x)\n",
+			    val);
+			sc->sc_bus.ub_revision = USBREV_UNKNOWN;
+		} else {
+			/* Default to the latest revision */
+			aprint_normal_dev(self,
+			    "Unknown revision (%02x). Set to 3.1.\n", val);
+			sc->sc_bus.ub_revision = USBREV_3_1;
+		}
+		break;
+	}
+
 	error = xhci_init(sc);
 	if (error) {
 		aprint_error_dev(self, "init failed, error=%d\n", error);

Index: src/sys/dev/pci/xhci_pci.c
diff -u src/sys/dev/pci/xhci_pci.c:1.8.6.2 src/sys/dev/pci/xhci_pci.c:1.8.6.3
--- src/sys/dev/pci/xhci_pci.c:1.8.6.2	Sun Jan 27 18:35:19 2019
+++ src/sys/dev/pci/xhci_pci.c	Sat Nov 16 16:30:09 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: xhci_pci.c,v 1.8.6.2 2019/01/27 18:35:19 martin Exp $	*/
+/*	$NetBSD: xhci_pci.c,v 1.8.6.3 2019/11/16 16:30:09 martin Exp $	*/
 /*	OpenBSD: xhci_pci.c,v 1.4 2014/07/12 17:38:51 yuo Exp	*/
 
 /*
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xhci_pci.c,v 1.8.6.2 2019/01/27 18:35:19 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xhci_pci.c,v 1.8.6.3 2019/11/16 16:30:09 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -120,7 +120,7 @@ xhci_pci_attach(device_t parent, device_
 	const pci_chipset_tag_t pc = pa->pa_pc;
 	const pcitag_t tag = pa->pa_tag;
 	char const *intrstr;
-	pcireg_t csr, memtype;
+	pcireg_t csr, memtype, usbrev;
 	int err;
 	uint32_t hccparams;
 	char intrbuf[PCI_INTRSTR_LEN];
@@ -200,6 +200,28 @@ xhci_pci_attach(device_t parent, device_
 	pci_findvendor(sc->sc_vendor, sizeof(sc->sc_vendor),
 	    sc->sc_id_vendor);
 
+	usbrev = pci_conf_read(pc, tag, PCI_USBREV) & PCI_USBREV_MASK;
+	switch (usbrev) {
+	case PCI_USBREV_3_0:
+		sc->sc_bus.ub_revision = USBREV_3_0;
+		break;
+	case PCI_USBREV_3_1:
+		sc->sc_bus.ub_revision = USBREV_3_1;
+		break;
+	default:
+		if (usbrev < PCI_USBREV_3_0) {
+			aprint_error_dev(self, "Unknown revision (%02x)\n",
+			    usbrev);
+			sc->sc_bus.ub_revision = USBREV_UNKNOWN;
+		} else {
+			/* Default to the latest revision */
+			aprint_normal_dev(self,
+			    "Unknown revision (%02x). Set to 3.1.\n", usbrev);
+			sc->sc_bus.ub_revision = USBREV_3_1;
+		}
+		break;
+	}
+
 	/* Intel chipset requires SuperSpeed enable and USB2 port routing */
 	switch (PCI_VENDOR(pa->pa_id)) {
 	case PCI_VENDOR_INTEL:

Index: src/sys/dev/usb/usb.c
diff -u src/sys/dev/usb/usb.c:1.165.6.4 src/sys/dev/usb/usb.c:1.165.6.5
--- src/sys/dev/usb/usb.c:1.165.6.4	Thu Sep 27 14:52:26 2018
+++ src/sys/dev/usb/usb.c	Sat Nov 16 16:30:09 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: usb.c,v 1.165.6.4 2018/09/27 14:52:26 martin Exp $	*/
+/*	$NetBSD: usb.c,v 1.165.6.5 2019/11/16 16:30:09 martin Exp $	*/
 
 /*
  * Copyright (c) 1998, 2002, 2008, 2012 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: usb.c,v 1.165.6.4 2018/09/27 14:52:26 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: usb.c,v 1.165.6.5 2019/11/16 16:30:09 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -251,6 +251,7 @@ usb_attach(device_t parent, device_t sel
 	case USBREV_1_1:
 	case USBREV_2_0:
 	case USBREV_3_0:
+	case USBREV_3_1:
 		break;
 	default:
 		aprint_error(", not supported\n");
@@ -344,6 +345,9 @@ usb_doattach(device_t self)
 	case USBREV_3_0:
 		speed = USB_SPEED_SUPER;
 		break;
+	case USBREV_3_1:
+		speed = USB_SPEED_SUPER_PLUS;
+		break;
 	default:
 		panic("usb_doattach");
 	}

Index: src/sys/dev/usb/usbdivar.h
diff -u src/sys/dev/usb/usbdivar.h:1.114.6.1 src/sys/dev/usb/usbdivar.h:1.114.6.2
--- src/sys/dev/usb/usbdivar.h:1.114.6.1	Sat Aug 25 11:29:52 2018
+++ src/sys/dev/usb/usbdivar.h	Sat Nov 16 16:30:09 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: usbdivar.h,v 1.114.6.1 2018/08/25 11:29:52 martin Exp $	*/
+/*	$NetBSD: usbdivar.h,v 1.114.6.2 2019/11/16 16:30:09 martin Exp $	*/
 
 /*
  * Copyright (c) 1998, 2012 The NetBSD Foundation, Inc.
@@ -153,7 +153,8 @@ struct usbd_bus {
 #define USBREV_1_1	3
 #define USBREV_2_0	4
 #define USBREV_3_0	5
-#define USBREV_STR { "unknown", "pre 1.0", "1.0", "1.1", "2.0", "3.0" }
+#define USBREV_3_1	6
+#define USBREV_STR { "unknown", "pre 1.0", "1.0", "1.1", "2.0", "3.0", "3.1" }
 
 	const struct usbd_bus_methods
 			       *ub_methods;

Index: src/sys/dev/usb/xhci.c
diff -u src/sys/dev/usb/xhci.c:1.72.2.11 src/sys/dev/usb/xhci.c:1.72.2.12
--- src/sys/dev/usb/xhci.c:1.72.2.11	Tue Sep 17 18:53:52 2019
+++ src/sys/dev/usb/xhci.c	Sat Nov 16 16:30:09 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: xhci.c,v 1.72.2.11 2019/09/17 18:53:52 martin Exp $	*/
+/*	$NetBSD: xhci.c,v 1.72.2.12 2019/11/16 16:30:09 martin Exp $	*/
 
 /*
  * Copyright (c) 2013 Jonathan A. Kollasch
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.72.2.11 2019/09/17 18:53:52 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xhci.c,v 1.72.2.12 2019/11/16 16:30:09 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -900,11 +900,23 @@ xhci_ecp(struct xhci_softc *sc, uint32_t
 	"b\0AC64\0"						\
 	"\0"
 
+#define XHCI_HCC2_BITS	\
+	"\177\020"	/* New bitmask */			\
+	"b\7ETC_TSC\0"						\
+	"b\6ETC\0"						\
+	"b\5CIC\0"						\
+	"b\4LEC\0"						\
+	"b\3CTC\0"						\
+	"b\2FSC\0"						\
+	"b\1CMC\0"						\
+	"b\0U3C\0"						\
+	"\0"
+
 int
 xhci_init(struct xhci_softc *sc)
 {
 	bus_size_t bsz;
-	uint32_t cap, hcs1, hcs2, hcs3, hcc, dboff, rtsoff;
+	uint32_t cap, hcs1, hcs2, hcs3, hcc, dboff, rtsoff, hcc2;
 	uint32_t pagesize, config;
 	int i = 0;
 	uint16_t hciversion;
@@ -915,7 +927,6 @@ xhci_init(struct xhci_softc *sc)
 	/* Set up the bus struct for the usb 3 and usb 2 buses */
 	sc->sc_bus.ub_methods = &xhci_bus_methods;
 	sc->sc_bus.ub_pipesize = sizeof(struct xhci_pipe);
-	sc->sc_bus.ub_revision = USBREV_3_0;
 	sc->sc_bus.ub_usedma = true;
 	sc->sc_bus.ub_hcpriv = sc;
 
@@ -931,7 +942,7 @@ xhci_init(struct xhci_softc *sc)
 	hciversion = XHCI_CAP_HCIVERSION(cap);
 
 	if (hciversion < XHCI_HCIVERSION_0_96 ||
-	    hciversion > XHCI_HCIVERSION_1_0) {
+	    hciversion >= 0x0200) {
 		aprint_normal_dev(sc->sc_dev,
 		    "xHCI version %x.%x not known to be supported\n",
 		    (hciversion >> 8) & 0xff, (hciversion >> 0) & 0xff);
@@ -966,6 +977,11 @@ xhci_init(struct xhci_softc *sc)
 		snprintb(sbuf, sizeof(sbuf), XHCI_HCCV1_x_BITS, hcc);
 	aprint_debug_dev(sc->sc_dev, "hcc=%s\n", sbuf);
 	aprint_debug_dev(sc->sc_dev, "xECP %x\n", XHCI_HCC_XECP(hcc) * 4);
+	if (hciversion >= XHCI_HCIVERSION_1_1) {
+		hcc2 = xhci_cap_read_4(sc, XHCI_HCCPARAMS2);
+		snprintb(sbuf, sizeof(sbuf), XHCI_HCC2_BITS, hcc2);
+		aprint_debug_dev(sc->sc_dev, "hcc2=%s\n", sbuf);
+	}
 
 	/* default all ports to bus 0, i.e. usb 3 */
 	sc->sc_ctlrportbus = kmem_zalloc(

Index: src/sys/dev/usb/xhcireg.h
diff -u src/sys/dev/usb/xhcireg.h:1.9.6.1 src/sys/dev/usb/xhcireg.h:1.9.6.2
--- src/sys/dev/usb/xhcireg.h:1.9.6.1	Sat May  5 15:05:39 2018
+++ src/sys/dev/usb/xhcireg.h	Sat Nov 16 16:30:09 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: xhcireg.h,v 1.9.6.1 2018/05/05 15:05:39 martin Exp $ */
+/* $NetBSD: xhcireg.h,v 1.9.6.2 2019/11/16 16:30:09 martin Exp $ */
 
 /*-
  * Copyright (c) 2010 Hans Petter Selasky. All rights reserved.
@@ -35,6 +35,7 @@
 #define	PCI_USBREV		0x60	/* RO USB protocol revision */
 #define	 PCI_USBREV_MASK	0xFF
 #define	 PCI_USBREV_3_0		0x30	/* USB 3.0 */
+#define	 PCI_USBREV_3_1		0x31	/* USB 3.1 */
 
 #define	PCI_XHCI_FLADJ		0x61	/* RW frame length adjust */
 
@@ -50,6 +51,7 @@
 #define	 XHCI_HCIVERSION_0_9	0x0090	/* xHCI version 0.9 */
 #define	 XHCI_HCIVERSION_0_96	0x0096	/* xHCI version 0.96 */
 #define	 XHCI_HCIVERSION_1_0	0x0100	/* xHCI version 1.0 */
+#define	 XHCI_HCIVERSION_1_1	0x0110	/* xHCI version 1.1 */
 
 #define	XHCI_HCSPARAMS1		0x04	/* RO structual parameters 1 */
 #define	 XHCI_HCS1_MAXSLOTS(x)	((x) & 0xFF)
@@ -88,6 +90,15 @@
 
 #define	 XHCI_DBOFF		0x14	/* RO doorbell offset */
 #define	 XHCI_RTSOFF		0x18	/* RO runtime register space offset */
+#define XHCI_HCCPARAMS2	0x1c	/* RO capability parameters 2 */
+#define	 XHCI_HCC2_U3C(x)	(((x) >> 0) & 0x1)	/* U3 Entry capable */
+#define	 XHCI_HCC2_CMC(x)	(((x) >> 1) & 0x1)	/* CEC MaxExLatTooLg */
+#define	 XHCI_HCC2_FSC(x)	(((x) >> 2) & 0x1)	/* Foce Save Context */
+#define	 XHCI_HCC2_CTC(x)	(((x) >> 3) & 0x1)	/* Compliance Transc */
+#define	 XHCI_HCC2_LEC(x)	(((x) >> 4) & 0x1)	/* Large ESIT Paylod */
+#define	 XHCI_HCC2_CIC(x)	(((x) >> 5) & 0x1)	/* Configuration Inf */
+#define	 XHCI_HCC2_ETC(x)	(((x) >> 6) & 0x1)	/* Extended TBC */
+#define	 XHCI_HCC2_ETC_TSC(x)	(((x) >> 7) & 0x1)	/* ExtTBC TRB Status */
 
 /* XHCI operational registers.  Offset given by XHCI_CAPLENGTH register */
 #define	XHCI_USBCMD		0x00	/* XHCI command */

Reply via email to