Module Name: src Committed By: jmcneill Date: Fri Apr 14 00:19:34 UTC 2017
Modified Files: src/sys/arch/arm/nvidia: tegra_var.h tegra_xusb.c tegra_xusbpad.c Log Message: Only route USB ports to XHCI controller after the firmware is loaded successfully. This gives us working USB (via USB2 controllers) until the tegra-firmware package is installed. To generate a diff of this commit: cvs rdiff -u -r1.30 -r1.31 src/sys/arch/arm/nvidia/tegra_var.h cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/nvidia/tegra_xusb.c cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/nvidia/tegra_xusbpad.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/arch/arm/nvidia/tegra_var.h diff -u src/sys/arch/arm/nvidia/tegra_var.h:1.30 src/sys/arch/arm/nvidia/tegra_var.h:1.31 --- src/sys/arch/arm/nvidia/tegra_var.h:1.30 Sat Mar 26 08:42:07 2016 +++ src/sys/arch/arm/nvidia/tegra_var.h Fri Apr 14 00:19:34 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_var.h,v 1.30 2016/03/26 08:42:07 skrll Exp $ */ +/* $NetBSD: tegra_var.h,v 1.31 2017/04/14 00:19:34 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -90,6 +90,7 @@ psize_t tegra_mc_memsize(void); uint32_t tegra_fuse_read(u_int); void tegra_xusbpad_sata_enable(void); +void tegra_xusbpad_xhci_enable(void); struct videomode; int tegra_dc_port(device_t); Index: src/sys/arch/arm/nvidia/tegra_xusb.c diff -u src/sys/arch/arm/nvidia/tegra_xusb.c:1.3 src/sys/arch/arm/nvidia/tegra_xusb.c:1.4 --- src/sys/arch/arm/nvidia/tegra_xusb.c:1.3 Mon Feb 27 12:38:00 2017 +++ src/sys/arch/arm/nvidia/tegra_xusb.c Fri Apr 14 00:19:34 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_xusb.c,v 1.3 2017/02/27 12:38:00 skrll Exp $ */ +/* $NetBSD: tegra_xusb.c,v 1.4 2017/04/14 00:19:34 jmcneill 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.3 2017/02/27 12:38:00 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra_xusb.c,v 1.4 2017/04/14 00:19:34 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -93,7 +93,7 @@ static void csb_write_4(struct tegra_xus uint32_t); static void tegra_xusb_init(struct tegra_xusb_softc * const); -static void tegra_xusb_load_fw(struct tegra_xusb_softc * const); +static int tegra_xusb_load_fw(struct tegra_xusb_softc * const); static int xusb_mailbox_send(struct tegra_xusb_softc * const, uint32_t); @@ -337,9 +337,12 @@ tegra_xusb_mountroot(device_t self) val = bus_space_read_4(bst, ipfsh, 0x0); device_printf(sc->sc_dev, "%s ipfs 0x0 = 0x%x\n", __func__, val); - tegra_xusb_load_fw(psc); + if (tegra_xusb_load_fw(psc) != 0) + return; device_printf(sc->sc_dev, "post fw\n"); + tegra_xusbpad_xhci_enable(); + clk = fdtbus_clock_get(psc->sc_phandle, "xusb_falcon_src"); rate = clk_get_rate(clk); error = clk_enable(clk); @@ -579,7 +582,7 @@ fw_dma_free(struct tegra_xusb_softc * co #define FWHEADER_FWIMG_LEN 100 #define FWHEADER__LEN 256 -static void +static int tegra_xusb_load_fw(struct tegra_xusb_softc * const psc) { struct xhci_softc * const sc = &psc->sc_xhci; @@ -596,8 +599,8 @@ tegra_xusb_load_fw(struct tegra_xusb_sof #else if ((error = firmware_open("nvidia/tegra124", "xusb.bin", &fw)) != 0) { aprint_error_dev(sc->sc_dev, - "could not open firmware file %s: %d\n", "xusb.bin", error); - return; + "couldn't load firmware from 'nvidia/tegra124/xusb.bin': %d\n", error); + return error; } firmware_size = firmware_get_size(fw); #endif @@ -607,7 +610,7 @@ tegra_xusb_load_fw(struct tegra_xusb_sof #if !defined(TEGRA124_XUSB_BIN_STATIC) firmware_close(fw); #endif - return; + return error; } firmware_image = psc->sc_fw_dma.addr; @@ -621,7 +624,7 @@ tegra_xusb_load_fw(struct tegra_xusb_sof if (error != 0) { fw_dma_free(psc, &psc->sc_fw_dma); firmware_close(fw); - return; + return error; } firmware_close(fw); #endif @@ -733,6 +736,8 @@ tegra_xusb_load_fw(struct tegra_xusb_sof XUSB_CSB_FALCON_CPUCTL_STARTCPU); device_printf(sc->sc_dev, "XUSB_FALC_CPUCTL 0x%x\n", csb_read_4(psc, XUSB_CSB_FALCON_CPUCTL_REG)); + + return 0; } static uint32_t Index: src/sys/arch/arm/nvidia/tegra_xusbpad.c diff -u src/sys/arch/arm/nvidia/tegra_xusbpad.c:1.4 src/sys/arch/arm/nvidia/tegra_xusbpad.c:1.5 --- src/sys/arch/arm/nvidia/tegra_xusbpad.c:1.4 Tue Apr 11 11:32:51 2017 +++ src/sys/arch/arm/nvidia/tegra_xusbpad.c Fri Apr 14 00:19:34 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_xusbpad.c,v 1.4 2017/04/11 11:32:51 jmcneill Exp $ */ +/* $NetBSD: tegra_xusbpad.c,v 1.5 2017/04/14 00:19:34 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -29,7 +29,7 @@ #include "opt_tegra.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tegra_xusbpad.c,v 1.4 2017/04/11 11:32:51 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra_xusbpad.c,v 1.5 2017/04/14 00:19:34 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -59,8 +59,6 @@ struct tegra_xusbpad_softc { static void padregdump(void); #endif -static void tegra_xusbpad_setup(struct tegra_xusbpad_softc * const); - static struct tegra_xusbpad_softc *xusbpad_softc = NULL; CFATTACH_DECL_NEW(tegra_xusbpad, sizeof(struct tegra_xusbpad_softc), @@ -103,16 +101,6 @@ tegra_xusbpad_attach(device_t parent, de aprint_naive("\n"); aprint_normal(": XUSB PADCTL\n"); - -#ifdef TEGRA_XUSBPAD_DEBUG - padregdump(); -#endif - - tegra_xusbpad_setup(sc); - -#ifdef TEGRA_XUSBPAD_DEBUG - padregdump(); -#endif } static void @@ -189,15 +177,23 @@ padregdump(void) } #endif -static void -tegra_xusbpad_setup(struct tegra_xusbpad_softc * const sc) +void +tegra_xusbpad_xhci_enable(void) { + struct tegra_xusbpad_softc * const sc = xusbpad_softc; const uint32_t skucalib = tegra_fuse_read(TEGRA_FUSE_SKU_CALIB_REG); #ifdef TEGRA_XUSBPAD_DEBUG uint32_t val; #endif + if (sc == NULL) { + aprint_error("%s: xusbpad driver not loaded\n", __func__); + return; + } + + #ifdef TEGRA_XUSBPAD_DEBUG + padregdump(void); printf("SKU CALIB 0x%x\n", skucalib); #endif const uint32_t hcl[3] = { @@ -350,5 +346,7 @@ tegra_xusbpad_setup(struct tegra_xusbpad device_printf(sc->sc_dev, "XUSB_PADCTL_USB2_PORT_CAP_REG is 0x%x\n", val); val = bus_space_read_4(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_SS_PORT_MAP_REG); device_printf(sc->sc_dev, "XUSB_PADCTL_SS_PORT_MAP_REG is 0x%x\n", val); + + padregdump(); #endif }