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 <[email protected]>
@@ -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 <[email protected]>
@@ -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
}