Module Name: src
Committed By: jmcneill
Date: Tue Sep 26 16:12:45 UTC 2017
Modified Files:
src/sys/arch/arm/nvidia: files.tegra tegra210_car.c tegra210_xusbpad.c
tegra_pcie.c tegra_pciereg.h tegra_xusb.c
src/sys/arch/evbarm/conf: TEGRA
Log Message:
More PCIe / XUSBPAD initialization goo for Tegra210.
To generate a diff of this commit:
cvs rdiff -u -r1.44 -r1.45 src/sys/arch/arm/nvidia/files.tegra
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/arm/nvidia/tegra210_car.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/nvidia/tegra210_xusbpad.c
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/arm/nvidia/tegra_pcie.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/nvidia/tegra_pciereg.h
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/arm/nvidia/tegra_xusb.c
cvs rdiff -u -r1.32 -r1.33 src/sys/arch/evbarm/conf/TEGRA
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/files.tegra
diff -u src/sys/arch/arm/nvidia/files.tegra:1.44 src/sys/arch/arm/nvidia/files.tegra:1.45
--- src/sys/arch/arm/nvidia/files.tegra:1.44 Fri Sep 22 14:36:22 2017
+++ src/sys/arch/arm/nvidia/files.tegra Tue Sep 26 16:12:45 2017
@@ -1,4 +1,4 @@
-# $NetBSD: files.tegra,v 1.44 2017/09/22 14:36:22 jmcneill Exp $
+# $NetBSD: files.tegra,v 1.45 2017/09/26 16:12:45 jmcneill Exp $
#
# Configuration info for NVIDIA Tegra ARM Peripherals
#
@@ -88,10 +88,13 @@ attach tegra124xpad at fdt with tegra124
file arch/arm/nvidia/tegra124_xusbpad.c tegra124_xusbpad
# XUSB PADCTL (Tegra210)
-device tegra210xpad: tegra_xusbpad
+device tegra210xpad { }: tegra_xusbpad
+device tegra210xphy: tegra210xpad
attach tegra210xpad at fdt with tegra210_xusbpad
+attach tegra210xphy at tegra210xpad
file arch/arm/nvidia/tegra210_xusbpad.c tegra210_xusbpad
+
# UART
attach com at fdt with tegra_com
file arch/arm/nvidia/tegra_com.c tegra_com needs-flag
Index: src/sys/arch/arm/nvidia/tegra210_car.c
diff -u src/sys/arch/arm/nvidia/tegra210_car.c:1.13 src/sys/arch/arm/nvidia/tegra210_car.c:1.14
--- src/sys/arch/arm/nvidia/tegra210_car.c:1.13 Mon Sep 25 08:55:07 2017
+++ src/sys/arch/arm/nvidia/tegra210_car.c Tue Sep 26 16:12:45 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra210_car.c,v 1.13 2017/09/25 08:55:07 jmcneill Exp $ */
+/* $NetBSD: tegra210_car.c,v 1.14 2017/09/26 16:12:45 jmcneill Exp $ */
/*-
* Copyright (c) 2015-2017 Jared McNeill <[email protected]>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra210_car.c,v 1.13 2017/09/25 08:55:07 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra210_car.c,v 1.14 2017/09/26 16:12:45 jmcneill Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -609,6 +609,9 @@ struct tegra210_init_parent {
{ "XUSB_FS_SRC", "PLL_U_48M", 48000000, 0 },
{ "PLL_U_OUT1", NULL, 48000000, 1 },
{ "PLL_U_OUT2", NULL, 60000000, 1 },
+ { "CML0", NULL, 0, 1 },
+ { "AFI", NULL, 0, 1 },
+ { "PCIE", NULL, 0, 1 },
};
struct tegra210_car_rst {
@@ -817,9 +820,15 @@ tegra210_car_utmip_init(struct tegra210_
tegra_reg_set_clear(bst, bsh, CAR_UTMIP_PLL_CFG1_REG,
0x3, CAR_UTMIP_PLL_CFG1_XTAL_FREQ_COUNT);
+ bus_space_write_4(bst, bsh, CAR_CLK_ENB_U_SET_REG, CAR_DEV_U_AFI);
+ bus_space_write_4(bst, bsh, CAR_CLK_ENB_U_SET_REG, CAR_DEV_U_PCIE);
+
bus_space_write_4(bst, bsh, CAR_RST_DEV_L_CLR_REG, CAR_DEV_L_USBD);
bus_space_write_4(bst, bsh, CAR_RST_DEV_H_CLR_REG, CAR_DEV_H_USB2);
bus_space_write_4(bst, bsh, CAR_RST_DEV_W_CLR_REG, CAR_DEV_W_XUSB);
+ bus_space_write_4(bst, bsh, CAR_RST_DEV_U_CLR_REG, CAR_DEV_U_AFI);
+ bus_space_write_4(bst, bsh, CAR_RST_DEV_U_CLR_REG, CAR_DEV_U_PCIE);
+ bus_space_write_4(bst, bsh, CAR_RST_DEV_U_CLR_REG, CAR_DEV_U_PCIEXCLK);
bus_space_write_4(bst, bsh, CAR_RST_DEV_Y_CLR_REG, CAR_DEV_Y_PEX_USB_UPHY);
bus_space_write_4(bst, bsh, CAR_RST_DEV_Y_CLR_REG, CAR_DEV_Y_SATA_USB_UPHY);
Index: src/sys/arch/arm/nvidia/tegra210_xusbpad.c
diff -u src/sys/arch/arm/nvidia/tegra210_xusbpad.c:1.7 src/sys/arch/arm/nvidia/tegra210_xusbpad.c:1.8
--- src/sys/arch/arm/nvidia/tegra210_xusbpad.c:1.7 Mon Sep 25 00:03:34 2017
+++ src/sys/arch/arm/nvidia/tegra210_xusbpad.c Tue Sep 26 16:12:45 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra210_xusbpad.c,v 1.7 2017/09/25 00:03:34 jmcneill Exp $ */
+/* $NetBSD: tegra210_xusbpad.c,v 1.8 2017/09/26 16:12:45 jmcneill Exp $ */
/*-
* Copyright (c) 2017 Jared McNeill <[email protected]>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra210_xusbpad.c,v 1.7 2017/09/25 00:03:34 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra210_xusbpad.c,v 1.8 2017/09/26 16:12:45 jmcneill Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -158,6 +158,17 @@ struct tegra210_xusbpad_softc {
bool sc_enabled;
};
+struct tegra210_xusbpad_phy_softc {
+ device_t sc_dev;
+ int sc_phandle;
+ struct tegra210_xusbpad_softc *sc_xusbpad;
+};
+
+struct tegra210_xusbpad_phy_attach_args {
+ struct tegra210_xusbpad_softc *paa_xusbpad;
+ int paa_phandle;
+};
+
#define RD4(sc, reg) \
bus_space_read_4((sc)->sc_bst, (sc)->sc_bsh, (reg))
#define WR4(sc, reg, val) \
@@ -550,16 +561,18 @@ tegra210_xusbpad_configure_pads(struct t
}
}
- /* Configure lanes */
+ /* Attach PHYs */
phandle = of_find_firstchild_byname(phandle, "lanes");
if (phandle == -1) {
aprint_error_dev(sc->sc_dev, "no 'pads/%s/lanes' node\n", name);
return;
}
for (child = OF_child(phandle); child; child = OF_peer(child)) {
- if (!fdtbus_status_okay(child))
- continue;
- tegra210_xusbpad_configure_lane(sc, child);
+ struct tegra210_xusbpad_phy_attach_args paa = {
+ .paa_xusbpad = sc,
+ .paa_phandle = child
+ };
+ config_found(sc->sc_dev, &paa, NULL);
}
}
@@ -813,5 +826,70 @@ tegra210_xusbpad_attach(device_t parent,
tegra210_xusbpad_configure_ports(sc);
}
+static void *
+tegra210_xusbpad_phy_acquire(device_t dev, const void *data, size_t len)
+{
+ struct tegra210_xusbpad_phy_softc * const sc = device_private(dev);
+
+ if (len != 0)
+ return NULL;
+
+ return sc;
+}
+
+static void
+tegra210_xusbpad_phy_release(device_t dev, void *priv)
+{
+};
+
+static int
+tegra210_xusbpad_phy_enable(device_t dev, void *priv, bool enable)
+{
+ struct tegra210_xusbpad_phy_softc * const sc = device_private(dev);
+
+ if (enable == false)
+ return ENXIO; /* not implemented */
+
+ tegra210_xusbpad_configure_lane(sc->sc_xusbpad, sc->sc_phandle);
+
+ return 0;
+}
+
+static const struct fdtbus_phy_controller_func tegra210_xusbpad_phy_funcs = {
+ .acquire = tegra210_xusbpad_phy_acquire,
+ .release = tegra210_xusbpad_phy_release,
+ .enable = tegra210_xusbpad_phy_enable,
+};
+
CFATTACH_DECL_NEW(tegra210_xusbpad, sizeof(struct tegra210_xusbpad_softc),
tegra210_xusbpad_match, tegra210_xusbpad_attach, NULL, NULL);
+
+static int
+tegra210_xusbpad_phy_match(device_t parent, cfdata_t cf, void *aux)
+{
+ struct tegra210_xusbpad_phy_attach_args * const paa = aux;
+
+ if (!fdtbus_status_okay(paa->paa_phandle))
+ return 0;
+
+ return 1;
+}
+
+static void
+tegra210_xusbpad_phy_attach(device_t parent, device_t self, void *aux)
+{
+ struct tegra210_xusbpad_phy_softc * const sc = device_private(self);
+ struct tegra210_xusbpad_phy_attach_args * const paa = aux;
+
+ sc->sc_dev = self;
+ sc->sc_phandle = paa->paa_phandle;
+ sc->sc_xusbpad = paa->paa_xusbpad;
+
+ aprint_naive("\n");
+ aprint_normal(": %s\n", fdtbus_get_string(sc->sc_phandle, "name"));
+
+ fdtbus_register_phy_controller(self, sc->sc_phandle, &tegra210_xusbpad_phy_funcs);
+}
+
+CFATTACH_DECL_NEW(tegra210xphy, sizeof(struct tegra210_xusbpad_phy_softc),
+ tegra210_xusbpad_phy_match, tegra210_xusbpad_phy_attach, NULL, NULL);
Index: src/sys/arch/arm/nvidia/tegra_pcie.c
diff -u src/sys/arch/arm/nvidia/tegra_pcie.c:1.20 src/sys/arch/arm/nvidia/tegra_pcie.c:1.21
--- src/sys/arch/arm/nvidia/tegra_pcie.c:1.20 Mon Sep 25 08:55:27 2017
+++ src/sys/arch/arm/nvidia/tegra_pcie.c Tue Sep 26 16:12:45 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_pcie.c,v 1.20 2017/09/25 08:55:27 jmcneill Exp $ */
+/* $NetBSD: tegra_pcie.c,v 1.21 2017/09/26 16:12:45 jmcneill Exp $ */
/*-
* Copyright (c) 2015 Jared D. McNeill <[email protected]>
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tegra_pcie.c,v 1.20 2017/09/25 08:55:27 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_pcie.c,v 1.21 2017/09/26 16:12:45 jmcneill Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -48,6 +48,7 @@ __KERNEL_RCSID(0, "$NetBSD: tegra_pcie.c
#include <arm/nvidia/tegra_reg.h>
#include <arm/nvidia/tegra_pciereg.h>
+#include <arm/nvidia/tegra_pmcreg.h>
#include <arm/nvidia/tegra_var.h>
#include <dev/fdt/fdtvar.h>
@@ -74,6 +75,7 @@ struct tegra_pcie_softc {
bus_dma_tag_t sc_dmat;
bus_space_tag_t sc_bst;
bus_space_handle_t sc_bsh_afi;
+ bus_space_handle_t sc_bsh_pads;
bus_space_handle_t sc_bsh_rpconf;
int sc_phandle;
@@ -92,6 +94,7 @@ struct tegra_pcie_softc {
static int tegra_pcie_intr(void *);
static void tegra_pcie_init(pci_chipset_tag_t, void *);
static void tegra_pcie_enable(struct tegra_pcie_softc *);
+static void tegra_pcie_enable_ports(struct tegra_pcie_softc *);
static void tegra_pcie_enable_clocks(struct tegra_pcie_softc *);
static void tegra_pcie_setup(struct tegra_pcie_softc * const);
static void tegra_pcie_conf_frag_map(struct tegra_pcie_softc * const,
@@ -143,15 +146,19 @@ tegra_pcie_attach(device_t parent, devic
struct fdt_attach_args * const faa = aux;
struct extent *ioext, *memext, *pmemext;
struct pcibus_attach_args pba;
- bus_addr_t afi_addr, cs_addr;
- bus_size_t afi_size, cs_size;
+ bus_addr_t afi_addr, cs_addr, pads_addr;
+ bus_size_t afi_size, cs_size, pads_size;
char intrstr[128];
int error;
- if (fdtbus_get_reg(faa->faa_phandle, 1, &afi_addr, &afi_size) != 0) {
+ if (fdtbus_get_reg_byname(faa->faa_phandle, "afi", &afi_addr, &afi_size) != 0) {
aprint_error(": couldn't get afi registers\n");
return;
}
+ if (fdtbus_get_reg_byname(faa->faa_phandle, "pads", &pads_addr, &pads_size) != 0) {
+ aprint_error(": couldn't get pads registers\n");
+ return;
+ }
#if notyet
if (fdtbus_get_reg(faa->faa_phandle, 2, &cs_addr, &cs_size) != 0) {
aprint_error(": couldn't get cs registers\n");
@@ -172,6 +179,12 @@ tegra_pcie_attach(device_t parent, devic
aprint_error(": couldn't map afi registers: %d\n", error);
return;
}
+ error = bus_space_map(sc->sc_bst, pads_addr, pads_size, 0,
+ &sc->sc_bsh_pads);
+ if (error) {
+ aprint_error(": couldn't map afi registers: %d\n", error);
+ return;
+ }
error = bus_space_map(sc->sc_bst, cs_addr, cs_size, 0,
&sc->sc_bsh_rpconf);
if (error) {
@@ -187,6 +200,9 @@ tegra_pcie_attach(device_t parent, devic
aprint_naive("\n");
aprint_normal(": PCIE\n");
+ tegra_pmc_power(PMC_PARTID_PCX, true);
+ tegra_pmc_remove_clamping(PMC_PARTID_PCX);
+
tegra_pcie_enable_clocks(sc);
if (!fdtbus_intr_str(faa->faa_phandle, 0, intrstr, sizeof(intrstr))) {
@@ -232,6 +248,8 @@ tegra_pcie_attach(device_t parent, devic
tegra_pcie_enable(sc);
+ tegra_pcie_enable_ports(sc);
+
memset(&pba, 0, sizeof(pba));
pba.pba_flags = PCI_FLAGS_MRL_OKAY |
PCI_FLAGS_MRM_OKAY |
@@ -338,10 +356,108 @@ tegra_pcie_enable_clocks(struct tegra_pc
}
static void
+tegra_pcie_reset_port(struct tegra_pcie_softc * const sc, int index)
+{
+ uint32_t val;
+
+ val = bus_space_read_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PEXn_CTRL_REG(index));
+ val &= ~AFI_PEXn_CTRL_RST_L;
+ bus_space_write_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PEXn_CTRL_REG(index), val);
+
+ delay(2000);
+
+ val = bus_space_read_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PEXn_CTRL_REG(index));
+ val |= AFI_PEXn_CTRL_RST_L;
+ bus_space_write_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PEXn_CTRL_REG(index), val);
+}
+
+static void
+tegra_pcie_enable_ports(struct tegra_pcie_softc * const sc)
+{
+ const u_int *data;
+ int child, len;
+ uint32_t val;
+
+ for (child = OF_child(sc->sc_phandle); child; child = OF_peer(child)) {
+ if (!fdtbus_status_okay(child))
+ continue;
+ data = fdtbus_get_prop(child, "reg", &len);
+ if (data == NULL || len < 4)
+ continue;
+ const u_int index = ((be32toh(data[0]) >> 11) & 0x1f) - 1;
+
+ val = bus_space_read_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PEXn_CTRL_REG(index));
+ val |= AFI_PEXn_CTRL_CLKREQ_EN;
+ val |= AFI_PEXn_CTRL_REFCLK_EN;
+ val |= AFI_PEXn_CTRL_REFCLK_OVERRIDE_EN;
+ bus_space_write_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PEXn_CTRL_REG(index), val);
+
+ tegra_pcie_reset_port(sc, index);
+ }
+}
+
+static void
tegra_pcie_setup(struct tegra_pcie_softc * const sc)
{
+ uint32_t val, cfg, lanes;
+ int child, len;
+ const u_int *data;
size_t i;
+ /* Enable PLLE control */
+ val = bus_space_read_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PLLE_CONTROL_REG);
+ val &= ~AFI_PLLE_CONTROL_BYPASS_PADS2PLLE_CONTROL;
+ val |= AFI_PLLE_CONTROL_PADS2PLLE_CONTROL_EN;
+ bus_space_write_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PLLE_CONTROL_REG, val);
+
+ /* Disable PEX clock bias pad power down */
+ bus_space_write_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PEXBIAS_CTRL_REG, 0);
+
+ /* Configure PCIE mode and enable ports */
+ cfg = bus_space_read_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PCIE_CONFIG_REG);
+ cfg |= AFI_PCIE_CONFIG_PCIECn_DISABLE_DEVICE(0);
+ cfg |= AFI_PCIE_CONFIG_PCIECn_DISABLE_DEVICE(1);
+ cfg &= ~AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG;
+
+ lanes = 0;
+ for (child = OF_child(sc->sc_phandle); child; child = OF_peer(child)) {
+ if (!fdtbus_status_okay(child))
+ continue;
+ data = fdtbus_get_prop(child, "reg", &len);
+ if (data == NULL || len < 4)
+ continue;
+ const u_int index = ((be32toh(data[0]) >> 11) & 0x1f) - 1;
+ if (of_getprop_uint32(child, "nvidia,num-lanes", &val) != 0)
+ continue;
+ lanes |= (val << (index << 3));
+ cfg &= ~AFI_PCIE_CONFIG_PCIECn_DISABLE_DEVICE(index);
+ }
+
+ switch (lanes) {
+ case 0x0104:
+ aprint_normal_dev(sc->sc_dev, "lane config: x4 x1\n");
+ cfg |= __SHIFTIN(AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_4_1,
+ AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG);
+ break;
+ case 0x0102:
+ aprint_normal_dev(sc->sc_dev, "lane config: x2 x1\n");
+ cfg |= __SHIFTIN(AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_2_1,
+ AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG);
+ break;
+ }
+
+ bus_space_write_4(sc->sc_bst, sc->sc_bsh_afi, AFI_PCIE_CONFIG_REG, cfg);
+
+ /* Configure refclk pad */
+ const char * const tegra124_compat[] = { "nvidia,tegra124-pcie", NULL };
+ if (of_match_compatible(sc->sc_phandle, tegra124_compat))
+ bus_space_write_4(sc->sc_bst, sc->sc_bsh_pads, PADS_REFCLK_CFG0_REG,
+ 0x44ac44ac);
+ const char * const tegra210_compat[] = { "nvidia,tegra210-pcie", NULL };
+ if (of_match_compatible(sc->sc_phandle, tegra210_compat))
+ bus_space_write_4(sc->sc_bst, sc->sc_bsh_pads, PADS_REFCLK_CFG0_REG,
+ 0x90b890b8);
+
/*
* Map PCI address spaces into ARM address space via
* HyperTransport-like "FPCI".
Index: src/sys/arch/arm/nvidia/tegra_pciereg.h
diff -u src/sys/arch/arm/nvidia/tegra_pciereg.h:1.3 src/sys/arch/arm/nvidia/tegra_pciereg.h:1.4
--- src/sys/arch/arm/nvidia/tegra_pciereg.h:1.3 Sat Nov 14 01:38:58 2015
+++ src/sys/arch/arm/nvidia/tegra_pciereg.h Tue Sep 26 16:12:45 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_pciereg.h,v 1.3 2015/11/14 01:38:58 jakllsch Exp $ */
+/* $NetBSD: tegra_pciereg.h,v 1.4 2017/09/26 16:12:45 jmcneill Exp $ */
/*-
* Copyright (c) 2015 Jared D. McNeill <[email protected]>
@@ -29,6 +29,9 @@
#ifndef _ARM_TEGRA_PCIEREG_H
#define _ARM_TEGRA_PCIEREG_H
+/* PADS */
+#define PADS_REFCLK_CFG0_REG 0xc8
+
/* AFI */
#define AFI_AXI_NBAR 9
@@ -52,6 +55,11 @@
#define AFI_INTR_SIGNATURE_REG 0xbc
#define AFI_SM_INTR_ENABLE_REG 0xc4
#define AFI_AFI_INTR_ENABLE_REG 0xc8
+#define AFI_PCIE_CONFIG_REG 0xf8
+#define AFI_PEXn_CTRL_REG(n) (0x110 + (n) * 8)
+#define AFI_PEXn_STATUS_REG(n) (0x114 + (n) * 8)
+#define AFI_PLLE_CONTROL_REG 0x160
+#define AFI_PEXBIAS_CTRL_REG 0x168
#define AFI_MSG_REG 0x190
#define AFI_INTR_MASK_MSI __BIT(8)
@@ -60,6 +68,21 @@
#define AFI_INTR_CODE_INT_CODE __BITS(4,0)
#define AFI_INTR_CODE_SM_MSG 6
+#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG __BITS(23,20)
+#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_2_1 0
+#define AFI_PCIE_CONFIG_SM2TMS0_XBAR_CONFIG_4_1 1
+#define AFI_PCIE_CONFIG_PCIECn_DISABLE_DEVICE(n) __BIT(1 + (n))
+
+#define AFI_PEXn_CTRL_REFCLK_OVERRIDE_EN __BIT(4)
+#define AFI_PEXn_CTRL_REFCLK_EN __BIT(3)
+#define AFI_PEXn_CTRL_CLKREQ_EN __BIT(1)
+#define AFI_PEXn_CTRL_RST_L __BIT(0)
+
+#define AFI_PLLE_CONTROL_BYPASS_PADS2PLLE_CONTROL __BIT(9)
+#define AFI_PLLE_CONTROL_PADS2PLLE_CONTROL_EN __BIT(1)
+
+#define AFI_PEXBIAS_CTRL_PWRD __BIT(0)
+
#define AFI_MSG_INT1 __BITS(27,24)
#define AFI_MSG_PM_PME1 __BIT(20)
#define AFI_MSG_INT0 __BITS(11,8)
Index: src/sys/arch/arm/nvidia/tegra_xusb.c
diff -u src/sys/arch/arm/nvidia/tegra_xusb.c:1.11 src/sys/arch/arm/nvidia/tegra_xusb.c:1.12
--- src/sys/arch/arm/nvidia/tegra_xusb.c:1.11 Mon Sep 25 00:03:34 2017
+++ src/sys/arch/arm/nvidia/tegra_xusb.c Tue Sep 26 16:12:45 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: tegra_xusb.c,v 1.11 2017/09/25 00:03:34 jmcneill Exp $ */
+/* $NetBSD: tegra_xusb.c,v 1.12 2017/09/26 16:12:45 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.11 2017/09/25 00:03:34 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tegra_xusb.c,v 1.12 2017/09/26 16:12:45 jmcneill Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -159,9 +159,10 @@ tegra_xusb_attach(device_t parent, devic
bus_addr_t addr;
bus_size_t size;
struct fdtbus_reset *rst;
+ struct fdtbus_phy *phy;
struct clk *clk;
uint32_t rate;
- int error;
+ int error, n;
aprint_naive("\n");
aprint_normal(": XUSB\n");
@@ -244,10 +245,17 @@ tegra_xusb_attach(device_t parent, devic
}
aprint_normal_dev(self, "interrupting on %s\n", intrstr);
+ /* Enable PHYs */
+ for (n = 0; (phy = fdtbus_phy_get_index(faa->faa_phandle, n)) != NULL; n++)
+ if (fdtbus_phy_enable(phy, true) != 0)
+ aprint_error_dev(self, "failed to enable PHY #%d\n", n);
+
/* Enable XUSB power rails */
tegra_pmc_power(PMC_PARTID_XUSBC, true); /* Host/USB2.0 */
+ tegra_pmc_remove_clamping(PMC_PARTID_XUSBC);
tegra_pmc_power(PMC_PARTID_XUSBA, true); /* SuperSpeed */
+ tegra_pmc_remove_clamping(PMC_PARTID_XUSBA);
/* Enable XUSB clocks */
Index: src/sys/arch/evbarm/conf/TEGRA
diff -u src/sys/arch/evbarm/conf/TEGRA:1.32 src/sys/arch/evbarm/conf/TEGRA:1.33
--- src/sys/arch/evbarm/conf/TEGRA:1.32 Sat Sep 23 23:54:54 2017
+++ src/sys/arch/evbarm/conf/TEGRA Tue Sep 26 16:12:45 2017
@@ -1,5 +1,5 @@
#
-# $NetBSD: TEGRA,v 1.32 2017/09/23 23:54:54 jmcneill Exp $
+# $NetBSD: TEGRA,v 1.33 2017/09/26 16:12:45 jmcneill Exp $
#
# NVIDIA Tegra family SoCs
#
@@ -96,6 +96,7 @@ tegrapinmux* at fdt? # MPIO
# XUSB PADCTL
tegra124xpad* at fdt? # XUSB PADCTL (T124)
tegra210xpad* at fdt? # XUSB PADCTL (T210)
+tegra210xphy* at tegra210xpad?
# PCIE
tegrapcie0 at fdt? # PCIE