Module Name: src Committed By: jmcneill Date: Tue Sep 19 20:46:12 UTC 2017
Modified Files: src/sys/arch/arm/nvidia: files.tegra tegra_ahcisata.c tegra_var.h tegra_xusb-fw.mk tegra_xusb.c tegra_xusbpad.c src/sys/arch/evbarm/conf: TEGRA Added Files: src/sys/arch/arm/nvidia: tegra124_xusbpad.c tegra124_xusbpadreg.h tegra_xusbpad.h Removed Files: src/sys/arch/arm/nvidia: tegra_xusbpadreg.h Log Message: The xusbpad driver is tegra 124 specific so split it out into a separate driver. Add (not yet working) tegra 210 support to the xusb driver. To generate a diff of this commit: cvs rdiff -u -r1.41 -r1.42 src/sys/arch/arm/nvidia/files.tegra cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/nvidia/tegra124_xusbpad.c \ src/sys/arch/arm/nvidia/tegra124_xusbpadreg.h \ src/sys/arch/arm/nvidia/tegra_xusbpad.h cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/nvidia/tegra_ahcisata.c cvs rdiff -u -r1.39 -r1.40 src/sys/arch/arm/nvidia/tegra_var.h cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/nvidia/tegra_xusb-fw.mk cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/nvidia/tegra_xusb.c cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/nvidia/tegra_xusbpad.c cvs rdiff -u -r1.2 -r0 src/sys/arch/arm/nvidia/tegra_xusbpadreg.h cvs rdiff -u -r1.27 -r1.28 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.41 src/sys/arch/arm/nvidia/files.tegra:1.42 --- src/sys/arch/arm/nvidia/files.tegra:1.41 Fri Jul 21 01:01:22 2017 +++ src/sys/arch/arm/nvidia/files.tegra Tue Sep 19 20:46:12 2017 @@ -1,4 +1,4 @@ -# $NetBSD: files.tegra,v 1.41 2017/07/21 01:01:22 jmcneill Exp $ +# $NetBSD: files.tegra,v 1.42 2017/09/19 20:46:12 jmcneill Exp $ # # Configuration info for NVIDIA Tegra ARM Peripherals # @@ -77,12 +77,20 @@ device tegraapbdma attach tegraapbdma at fdt with tegra_apbdma file arch/arm/nvidia/tegra_apbdma.c tegra_apbdma -# XUSB PADCTL -device tegraxusbpad -attach tegraxusbpad at fdt with tegra_xusbpad +# XUSB PADCTL (common) file arch/arm/nvidia/tegra_xusbpad.c tegra_xusbpad defflag opt_tegra.h TEGRA_XUSBPAD_DEBUG +# XUSB PADCTL (Tegra124) +device tegra124xusbpad: tegra_xusbpad +attach tegra124xusbpad at fdt with tegra124_xusbpad +file arch/arm/nvidia/tegra124_xusbpad.c tegra124_xusbpad + +# XUSB PADCTL (Tegra210) +device tegra210xusbpad: tegra_xusbpad +attach tegra210xusbpad at fdt with tegra210_xusbpad +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/tegra_ahcisata.c diff -u src/sys/arch/arm/nvidia/tegra_ahcisata.c:1.10 src/sys/arch/arm/nvidia/tegra_ahcisata.c:1.11 --- src/sys/arch/arm/nvidia/tegra_ahcisata.c:1.10 Sun Apr 16 12:28:21 2017 +++ src/sys/arch/arm/nvidia/tegra_ahcisata.c Tue Sep 19 20:46:12 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_ahcisata.c,v 1.10 2017/04/16 12:28:21 jmcneill Exp $ */ +/* $NetBSD: tegra_ahcisata.c,v 1.11 2017/09/19 20:46:12 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tegra_ahcisata.c,v 1.10 2017/04/16 12:28:21 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra_ahcisata.c,v 1.11 2017/09/19 20:46:12 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -42,6 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: tegra_ahcisa #include <arm/nvidia/tegra_var.h> #include <arm/nvidia/tegra_pmcreg.h> #include <arm/nvidia/tegra_ahcisatareg.h> +#include <arm/nvidia/tegra_xusbpad.h> #include <dev/fdt/fdtvar.h> Index: src/sys/arch/arm/nvidia/tegra_var.h diff -u src/sys/arch/arm/nvidia/tegra_var.h:1.39 src/sys/arch/arm/nvidia/tegra_var.h:1.40 --- src/sys/arch/arm/nvidia/tegra_var.h:1.39 Thu Jul 20 01:46:15 2017 +++ src/sys/arch/arm/nvidia/tegra_var.h Tue Sep 19 20:46:12 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: tegra_var.h,v 1.39 2017/07/20 01:46:15 jmcneill Exp $ */ +/* $NetBSD: tegra_var.h,v 1.40 2017/09/19 20:46:12 jmcneill Exp $ */ /*- * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> @@ -78,9 +78,6 @@ uint32_t tegra_fuse_read(u_int); void tegra_timer_delay(u_int); -void tegra_xusbpad_sata_enable(void); -void tegra_xusbpad_xhci_enable(void); - struct videomode; int tegra_dc_port(device_t); int tegra_dc_enable(device_t, device_t, const struct videomode *, Index: src/sys/arch/arm/nvidia/tegra_xusb-fw.mk diff -u src/sys/arch/arm/nvidia/tegra_xusb-fw.mk:1.1 src/sys/arch/arm/nvidia/tegra_xusb-fw.mk:1.2 --- src/sys/arch/arm/nvidia/tegra_xusb-fw.mk:1.1 Mon Sep 26 20:05:03 2016 +++ src/sys/arch/arm/nvidia/tegra_xusb-fw.mk Tue Sep 19 20:46:12 2017 @@ -1,4 +1,4 @@ -# $NetBSD: tegra_xusb-fw.mk,v 1.1 2016/09/26 20:05:03 jakllsch Exp $ +# $NetBSD: tegra_xusb-fw.mk,v 1.2 2017/09/19 20:46:12 jmcneill Exp $ .if defined(TEGRA124_XUSB_BIN_STATIC) MD_OBJS+= tegra124_xusb_bin.o @@ -10,3 +10,14 @@ tegra124_xusb_bin.o: $S/arch/arm/nvidia/ ${OBJCOPY} -I binary -O default -B arm tegra124_xusb.bin \ --rename-section .data=.rodata ${.TARGET} .endif + +.if defined(TEGRA210_XUSB_BIN_STATIC) +MD_OBJS+= tegra210_xusb_bin.o +CPPFLAGS+= -DTEGRA210_XUSB_BIN_STATIC + +tegra210_xusb_bin.o: $S/arch/arm/nvidia/tegra210_xusb.bin + -rm -f ${.OBJDIR}/tegra210_xusb.bin + -ln -s $S/arch/arm/nvidia/tegra210_xusb.bin ${.OBJDIR} + ${OBJCOPY} -I binary -O default -B arm tegra210_xusb.bin \ + --rename-section .data=.rodata ${.TARGET} +.endif 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.7 --- 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 Tue Sep 19 20:46:12 2017 @@ -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.7 2017/09/19 20:46:12 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.6 2017/04/28 09:46:49 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra_xusb.c,v 1.7 2017/09/19 20:46:12 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -41,6 +41,7 @@ __KERNEL_RCSID(0, "$NetBSD: tegra_xusb.c #include <arm/nvidia/tegra_reg.h> #include <arm/nvidia/tegra_var.h> +#include <arm/nvidia/tegra_xusbpad.h> #include <arm/nvidia/tegra_xusbreg.h> #include <dev/pci/pcireg.h> @@ -76,6 +77,24 @@ extern const char _binary_tegra124_xusb_ extern const char _binary_tegra124_xusb_bin_start[]; #endif +#ifdef TEGRA210_XUSB_BIN_STATIC +extern const char _binary_tegra210_xusb_bin_size[]; +extern const char _binary_tegra210_xusb_bin_start[]; +#endif + +enum xusb_type { + XUSB_T124 = 1, + XUSB_T210 +}; + +static const struct of_compat_data compat_data[] = { + { "nvidia,tegra124-xusb", XUSB_T124 }, +#if notyet + { "nvidia,tegra210-xusb", XUSB_T210 }, +#endif + { NULL } +}; + struct fw_dma { bus_dmamap_t map; void * addr; @@ -94,6 +113,7 @@ struct tegra_xusb_softc { void *sc_ih_mbox; struct fw_dma sc_fw_dma; struct clk *sc_clk_ss_src; + enum xusb_type sc_type; }; static uint32_t csb_read_4(struct tegra_xusb_softc * const, bus_size_t); @@ -101,7 +121,9 @@ static void csb_write_4(struct tegra_xus uint32_t); static void tegra_xusb_init(struct tegra_xusb_softc * const); -static int tegra_xusb_load_fw(struct tegra_xusb_softc * const); +static int tegra_xusb_open_fw(struct tegra_xusb_softc * const); +static int tegra_xusb_load_fw(struct tegra_xusb_softc * const, void *, + size_t); static int xusb_mailbox_send(struct tegra_xusb_softc * const, uint32_t); @@ -111,10 +133,9 @@ CFATTACH_DECL_NEW(tegra_xusb, sizeof(str static int tegra_xusb_match(device_t parent, cfdata_t cf, void *aux) { - const char * const compatible[] = { "nvidia,tegra124-xusb", NULL }; struct fdt_attach_args * const faa = aux; - return of_match_compatible(faa->faa_phandle, compatible); + return of_match_compat_data(faa->faa_phandle, compat_data); } #define tegra_xusb_attach_check(sc, cond, fmt, ...) \ @@ -131,6 +152,7 @@ tegra_xusb_attach(device_t parent, devic struct tegra_xusb_softc * const psc = device_private(self); struct xhci_softc * const sc = &psc->sc_xhci; struct fdt_attach_args * const faa = aux; + bool wait_for_root = true; char intrstr[128]; bus_addr_t addr; bus_size_t size; @@ -147,6 +169,7 @@ tegra_xusb_attach(device_t parent, devic sc->sc_bus.ub_hcpriv = sc; sc->sc_bus.ub_dmatag = faa->faa_dmat; psc->sc_phandle = faa->faa_phandle; + psc->sc_type = of_search_compatible(faa->faa_phandle, compat_data)->data; if (fdtbus_get_reg(faa->faa_phandle, 0, &addr, &size) != 0) { aprint_error(": couldn't get registers\n"); @@ -252,22 +275,25 @@ tegra_xusb_attach(device_t parent, devic tegra_xusb_attach_check(sc, psc->sc_clk_ss_src == NULL, "failed to get xusb_ss_src clock"); - rate = clk_get_rate(psc->sc_clk_ss_src); - DPRINTF(sc->sc_dev, "xusb_ss_src rate %u\n", rate); - error = clk_set_rate(psc->sc_clk_ss_src, 2000000); - rate = clk_get_rate(psc->sc_clk_ss_src); - DPRINTF(sc->sc_dev, "xusb_ss_src rate %u error %d\n", rate, error); - tegra_xusb_attach_check(sc, error, "failed to get xusb_ss_src clock rate"); + if (psc->sc_type == XUSB_T124) { + rate = clk_get_rate(psc->sc_clk_ss_src); + DPRINTF(sc->sc_dev, "xusb_ss_src rate %u\n", rate); + error = clk_set_rate(psc->sc_clk_ss_src, 2000000); + rate = clk_get_rate(psc->sc_clk_ss_src); + DPRINTF(sc->sc_dev, "xusb_ss_src rate %u error %d\n", rate, error); + tegra_xusb_attach_check(sc, error, "failed to get xusb_ss_src clock rate"); - rate = clk_get_rate(psc->sc_clk_ss_src); - DPRINTF(sc->sc_dev, "ss_src rate %u\n", rate); - tegra_xusb_attach_check(sc, error, "failed to set xusb_ss_src clock rate"); + rate = clk_get_rate(psc->sc_clk_ss_src); + DPRINTF(sc->sc_dev, "ss_src rate %u\n", rate); + tegra_xusb_attach_check(sc, error, "failed to set xusb_ss_src clock rate"); - error = clk_set_rate(psc->sc_clk_ss_src, 120000000); - rate = clk_get_rate(psc->sc_clk_ss_src); - DPRINTF(sc->sc_dev, "ss_src rate %u error %d\n", rate, error); - tegra_xusb_attach_check(sc, error, "failed to get xusb_ss_src clock rate"); + error = clk_set_rate(psc->sc_clk_ss_src, 120000000); + rate = clk_get_rate(psc->sc_clk_ss_src); + DPRINTF(sc->sc_dev, "ss_src rate %u error %d\n", rate, error); + tegra_xusb_attach_check(sc, error, "failed to get xusb_ss_src clock rate"); + } + rate = clk_get_rate(psc->sc_clk_ss_src); error = clk_enable(psc->sc_clk_ss_src); DPRINTF(sc->sc_dev, "ss_src rate %u error %d\n", rate, error); tegra_xusb_attach_check(sc, error, "failed to enable xusb_ss_src clock"); @@ -299,10 +325,18 @@ tegra_xusb_attach(device_t parent, devic tegra_xusb_init(psc); #if defined(TEGRA124_XUSB_BIN_STATIC) - tegra_xusb_mountroot(sc->sc_dev); -#else - config_mountroot(sc->sc_dev, tegra_xusb_mountroot); + if (psc->sc_type == XUSB_T124) + wait_for_root = false; +#endif +#if defined(TEGRA210_XUSB_BIN_STATIC) + if (psc->sc_type == XUSB_T210) + wait_for_root = false; #endif + + if (wait_for_root) + config_mountroot(sc->sc_dev, tegra_xusb_mountroot); + else + tegra_xusb_mountroot(sc->sc_dev); } static void @@ -323,7 +357,7 @@ tegra_xusb_mountroot(device_t self) val = bus_space_read_4(bst, ipfsh, 0x0); DPRINTF(sc->sc_dev, "%s ipfs 0x0 = 0x%x\n", __func__, val); - if (tegra_xusb_load_fw(psc) != 0) + if (tegra_xusb_open_fw(psc) != 0) return; DPRINTF(sc->sc_dev, "post fw\n"); @@ -569,51 +603,75 @@ fw_dma_free(struct tegra_xusb_softc * co #define FWHEADER__LEN 256 static int -tegra_xusb_load_fw(struct tegra_xusb_softc * const psc) +tegra_xusb_open_fw(struct tegra_xusb_softc * const psc) { struct xhci_softc * const sc = &psc->sc_xhci; -#if !defined(TEGRA124_XUSB_BIN_STATIC) firmware_handle_t fw; -#endif + size_t firmware_size = 0; + void *firmware_image; + const char *fw_path = NULL; + void *fw_static = NULL; int error; - size_t firmware_size; - void * firmware_image; - const uint8_t *header; + switch (psc->sc_type) { + case XUSB_T124: #if defined(TEGRA124_XUSB_BIN_STATIC) - firmware_size = (uintptr_t)&_binary_tegra124_xusb_bin_size; + firmware_size = (uintptr_t)&_binary_tegra124_xusb_bin_size; + fw_static = _binary_tegra124_xusb_bin_start; #else - if ((error = firmware_open("nvidia/tegra124", "xusb.bin", &fw)) != 0) { - aprint_error_dev(sc->sc_dev, - "couldn't load firmware from 'nvidia/tegra124/xusb.bin': %d\n", error); - return error; - } - firmware_size = firmware_get_size(fw); + fw_path = "nvidia/tegra124"; #endif - - error = fw_dma_alloc(psc, firmware_size, PAGE_SIZE, &psc->sc_fw_dma); - if (error != 0) { -#if !defined(TEGRA124_XUSB_BIN_STATIC) - firmware_close(fw); + break; + case XUSB_T210: +#if defined(TEGRA210_XUSB_BIN_STATIC) + firmware_size = (uintptr_t)&_binary_tegra210_xusb_bin_size; + fw_static = _binary_tegra210_xusb_bin_start; +#else + fw_path = "nvidia/tegra210"; #endif - return error; + break; + default: + return EINVAL; + } + + if (fw_path != NULL) { + error = firmware_open(fw_path, "xusb.bin", &fw); + if (error != 0) { + aprint_error_dev(sc->sc_dev, + "couldn't load firmware from %s/xusb.bin: %d\n", + fw_path, error); + return error; + } + firmware_size = firmware_get_size(fw); } + error = fw_dma_alloc(psc, firmware_size, PAGE_SIZE, + &psc->sc_fw_dma); + if (error != 0) + return error; firmware_image = psc->sc_fw_dma.addr; - DPRINTF(sc->sc_dev, "blob %p len %zu\n", firmware_image, - firmware_size); -#if defined(TEGRA124_XUSB_BIN_STATIC) - memcpy(firmware_image, _binary_tegra124_xusb_bin_start, firmware_size); -#else - error = firmware_read(fw, 0, firmware_image, firmware_size); - if (error != 0) { - fw_dma_free(psc, &psc->sc_fw_dma); + if (fw_path != NULL) { + error = firmware_read(fw, 0, firmware_image, firmware_size); + if (error != 0) { + fw_dma_free(psc, &psc->sc_fw_dma); + firmware_close(fw); + return error; + } firmware_close(fw); - return error; + } else { + memcpy(firmware_image, fw_static, firmware_size); } - firmware_close(fw); -#endif + + return tegra_xusb_load_fw(psc, firmware_image, firmware_size); +} + +static int +tegra_xusb_load_fw(struct tegra_xusb_softc * const psc, void *firmware_image, + size_t firmware_size) +{ + struct xhci_softc * const sc = &psc->sc_xhci; + const uint8_t *header; header = firmware_image; Index: src/sys/arch/arm/nvidia/tegra_xusbpad.c diff -u src/sys/arch/arm/nvidia/tegra_xusbpad.c:1.5 src/sys/arch/arm/nvidia/tegra_xusbpad.c:1.6 --- src/sys/arch/arm/nvidia/tegra_xusbpad.c:1.5 Fri Apr 14 00:19:34 2017 +++ src/sys/arch/arm/nvidia/tegra_xusbpad.c Tue Sep 19 20:46:12 2017 @@ -1,7 +1,7 @@ -/* $NetBSD: tegra_xusbpad.c,v 1.5 2017/04/14 00:19:34 jmcneill Exp $ */ +/* $NetBSD: tegra_xusbpad.c,v 1.6 2017/09/19 20:46:12 jmcneill Exp $ */ /*- - * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> + * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,327 +26,48 @@ * SUCH DAMAGE. */ -#include "opt_tegra.h" - #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tegra_xusbpad.c,v 1.5 2017/04/14 00:19:34 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tegra_xusbpad.c,v 1.6 2017/09/19 20:46:12 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> +#include <sys/cpu.h> #include <sys/device.h> -#include <sys/intr.h> -#include <sys/systm.h> -#include <sys/kernel.h> - -#include <arm/nvidia/tegra_reg.h> -#include <arm/nvidia/tegra_xusbpadreg.h> -#include <arm/nvidia/tegra_var.h> #include <dev/fdt/fdtvar.h> -#define TEGRA_FUSE_SKU_CALIB_REG 0xf0 - -static int tegra_xusbpad_match(device_t, cfdata_t, void *); -static void tegra_xusbpad_attach(device_t, device_t, void *); - -struct tegra_xusbpad_softc { - device_t sc_dev; - bus_space_tag_t sc_bst; - bus_space_handle_t sc_bsh; -}; +#include <arm/nvidia/tegra_xusbpad.h> -#ifdef TEGRA_XUSBPAD_DEBUG -static void padregdump(void); -#endif +static const struct tegra_xusbpad_ops *xusbpad_ops = NULL; +static device_t xusbpad_device = NULL; -static struct tegra_xusbpad_softc *xusbpad_softc = NULL; - -CFATTACH_DECL_NEW(tegra_xusbpad, sizeof(struct tegra_xusbpad_softc), - tegra_xusbpad_match, tegra_xusbpad_attach, NULL, NULL); - -static int -tegra_xusbpad_match(device_t parent, cfdata_t cf, void *aux) +void +tegra_xusbpad_register(device_t dev, const struct tegra_xusbpad_ops *ops) { - const char * const compatible[] = - { "nvidia,tegra124-xusb-padctl", NULL }; - struct fdt_attach_args * const faa = aux; + KASSERT(dev != NULL && ops != NULL); + KASSERT(xusbpad_ops == NULL); + KASSERT(xusbpad_device == NULL); - return of_match_compatible(faa->faa_phandle, compatible); -} - -static void -tegra_xusbpad_attach(device_t parent, device_t self, void *aux) -{ - struct tegra_xusbpad_softc * const sc = device_private(self); - struct fdt_attach_args * const faa = aux; - bus_addr_t addr; - bus_size_t size; - int error; - - if (fdtbus_get_reg(faa->faa_phandle, 0, &addr, &size) != 0) { - aprint_error(": couldn't get registers\n"); - return; - } - - sc->sc_dev = self; - sc->sc_bst = faa->faa_bst; - error = bus_space_map(sc->sc_bst, addr, size, 0, &sc->sc_bsh); - if (error) { - aprint_error(": couldn't map %#llx: %d", (uint64_t)addr, error); - return; - } - - KASSERT(xusbpad_softc == NULL); - xusbpad_softc = sc; - - aprint_naive("\n"); - aprint_normal(": XUSB PADCTL\n"); -} - -static void -tegra_xusbpad_get_bs(bus_space_tag_t *pbst, bus_space_handle_t *pbsh) -{ - if (xusbpad_softc) { - *pbst = xusbpad_softc->sc_bst; - *pbsh = xusbpad_softc->sc_bsh; - } else { - *pbst = &armv7_generic_bs_tag; - bus_space_subregion(*pbst, tegra_apb_bsh, - TEGRA_XUSB_PADCTL_OFFSET, TEGRA_XUSB_PADCTL_SIZE, pbsh); - } + xusbpad_ops = ops; + xusbpad_device = dev; } void tegra_xusbpad_sata_enable(void) { - bus_space_tag_t bst; - bus_space_handle_t bsh; - int retry; - - tegra_xusbpad_get_bs(&bst, &bsh); - - tegra_reg_set_clear(bst, bsh, XUSB_PADCTL_USB3_PAD_MUX_REG, - __SHIFTIN(XUSB_PADCTL_USB3_PAD_MUX_SATA_PAD_LANE0_SATA, - XUSB_PADCTL_USB3_PAD_MUX_SATA_PAD_LANE0) | - XUSB_PADCTL_USB3_PAD_MUX_FORCE_SATA_PAD_IDDQ_DISABLE_MASK0, - XUSB_PADCTL_USB3_PAD_MUX_SATA_PAD_LANE0); - - tegra_reg_set_clear(bst, bsh, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_REG, - 0, - XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ | - XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD); - tegra_reg_set_clear(bst, bsh, XUSB_PADCTL_IOPHY_PLL_S0_CTL1_REG, - 0, - XUSB_PADCTL_IOPHY_PLL_S0_CTL1_IDDQ | - XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PWR_OVRD); - tegra_reg_set_clear(bst, bsh, XUSB_PADCTL_IOPHY_PLL_S0_CTL1_REG, - XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE, 0); - tegra_reg_set_clear(bst, bsh, XUSB_PADCTL_IOPHY_PLL_S0_CTL1_REG, - XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST, 0); - - for (retry = 1000; retry > 0; retry--) { - const uint32_t v = bus_space_read_4(bst, bsh, - XUSB_PADCTL_IOPHY_PLL_S0_CTL1_REG); - if (v & XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_LOCKDET) - break; - delay(100); - } - if (retry == 0) { - printf("WARNING: SATA PHY power-on failed\n"); - } -} - -#ifdef TEGRA_XUSBPAD_DEBUG -static void -padregdump(void) -{ - bus_space_tag_t bst; - bus_space_handle_t bsh; - bus_size_t i; - u_int j; - - tegra_xusbpad_get_bs(&bst, &bsh); - - for (i = 0x000; i < 0x160; ) { - printf("0x%03jx:", (uintmax_t)i); - for (j = 0; i < 0x160 && j < 0x10; j += 4, i += 4) { - printf(" %08x", bus_space_read_4(bst, bsh, i)); - } - printf("\n"); + if (xusbpad_ops == NULL || xusbpad_ops->sata_enable == NULL) { + aprint_error("%s: could not enable SATA\n", __func__); + return; } + xusbpad_ops->sata_enable(xusbpad_device); } -#endif 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__); + if (xusbpad_ops == NULL || xusbpad_ops->xhci_enable == NULL) { + aprint_error("%s: could not enable XHCI\n", __func__); return; } - - -#ifdef TEGRA_XUSBPAD_DEBUG - padregdump(void); - printf("SKU CALIB 0x%x\n", skucalib); -#endif - const uint32_t hcl[3] = { - (skucalib >> 0) & 0x3f, - (skucalib >> 15) & 0x3f, - (skucalib >> 15) & 0x3f, - }; - const uint32_t hic = (skucalib >> 13) & 3; - const uint32_t hsl = (skucalib >> 11) & 3; - const uint32_t htra = (skucalib >> 7) & 0xf; - - -#ifdef TEGRA_XUSBPAD_DEBUG - val = bus_space_read_4(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_PAD_MUX_REG); - device_printf(sc->sc_dev, "XUSB_PADCTL_USB2_PAD_MUX_REG is 0x%x\n", val); - val = bus_space_read_4(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_PORT_CAP_REG); - 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); -#endif - - bus_space_write_4(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_PAD_MUX_REG, (0<<0)|(0<<2)|(1<<4)); - bus_space_write_4(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_PORT_CAP_REG, (1<<0)|(1<<4)|(1<<8)); - bus_space_write_4(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_SS_PORT_MAP_REG, (2<<0)|(7<<4)); - - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_BIAS_PAD_CTL0_REG, - __SHIFTIN(hsl, XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL) | - __SHIFTIN(XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_VAL, - XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL), - XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL | - XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL); - - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, - XUSB_PADCTL_USB2_OTG_PAD0_CTL0_REG, - __SHIFTIN(hcl[0], - XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL) | - __SHIFTIN(XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_VAL, - XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW) | - __SHIFTIN(XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_VAL(0), - XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW), - XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL | - XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW | - XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW | - XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD | - XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2 | - XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, - XUSB_PADCTL_USB2_OTG_PAD1_CTL0_REG, - __SHIFTIN(hcl[1], - XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL) | - __SHIFTIN(XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_VAL, - XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW) | - __SHIFTIN(XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_VAL(1), - XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW), - XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL | - XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW | - XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW | - XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD | - XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2 | - XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, - XUSB_PADCTL_USB2_OTG_PAD2_CTL0_REG, - __SHIFTIN(hcl[2], - XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL) | - __SHIFTIN(XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_VAL, - XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW) | - __SHIFTIN(XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_VAL(2), - XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW), - XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL | - XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW | - XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW | - XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD | - XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2 | - XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI); - - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, - XUSB_PADCTL_USB2_OTG_PAD0_CTL1_REG, - __SHIFTIN(htra, - XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ) | - __SHIFTIN(hic, - XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP), - XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ | - XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP | - XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR | - XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_CHRP_FORCE_POWERUP | - XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DISC_FORCE_POWERUP); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, - XUSB_PADCTL_USB2_OTG_PAD1_CTL1_REG, - __SHIFTIN(htra, - XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ) | - __SHIFTIN(hic, - XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP), - XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ | - XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP | - XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR | - XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_CHRP_FORCE_POWERUP | - XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DISC_FORCE_POWERUP); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, - XUSB_PADCTL_USB2_OTG_PAD2_CTL1_REG, - __SHIFTIN(htra, - XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ) | - __SHIFTIN(hic, - XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP), - XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ | - XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP | - XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR | - XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_CHRP_FORCE_POWERUP | - XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DISC_FORCE_POWERUP); - - //tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_BATTERY_CHRG_BIASPAD_REG, 0, 1); /* PD_OTG */ - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD0_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD1_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD2_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD0_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD1_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD2_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD0_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD1_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD2_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD0_CTL1_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD1_CTL1_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD2_CTL1_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_BIAS_PAD_CTL0_REG, 0, XUSB_PADCTL_USB2_BIAS_PAD_CTL0_PD); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_BIAS_PAD_CTL0_REG, 0, XUSB_PADCTL_USB2_BIAS_PAD_CTL0_PD_TRK); - - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_ELPG_PROGRAM_REG, - 0, XUSB_PADCTL_ELPG_PROGRAM_SSP0_ELPG_CLAMP_EN); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_ELPG_PROGRAM_REG, - 0, XUSB_PADCTL_ELPG_PROGRAM_SSP0_ELPG_CLAMP_EN_EARLY); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_ELPG_PROGRAM_REG, - 0, XUSB_PADCTL_ELPG_PROGRAM_SSP0_ELPG_VCORE_DOWN); - - DELAY(200); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_ELPG_PROGRAM_REG, 0, __BIT(26)); - DELAY(200); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_ELPG_PROGRAM_REG, 0, __BIT(25)); - DELAY(200); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_ELPG_PROGRAM_REG, 0, __BIT(24)); - DELAY(200); - - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_OC_DET_REG, 0, __BITS(22,16)); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_OC_DET_REG, __BIT(4), 0); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_OC_DET_REG, __BIT(8), 0); - tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_OC_DET_REG, __BIT(9), 0); - -#ifdef TEGRA_XUSBPAD_DEBUG - val = bus_space_read_4(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_PAD_MUX_REG); - device_printf(sc->sc_dev, "XUSB_PADCTL_USB2_PAD_MUX_REG is 0x%x\n", val); - val = bus_space_read_4(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_PORT_CAP_REG); - 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 + xusbpad_ops->xhci_enable(xusbpad_device); } Index: src/sys/arch/evbarm/conf/TEGRA diff -u src/sys/arch/evbarm/conf/TEGRA:1.27 src/sys/arch/evbarm/conf/TEGRA:1.28 --- src/sys/arch/evbarm/conf/TEGRA:1.27 Fri Sep 8 10:17:18 2017 +++ src/sys/arch/evbarm/conf/TEGRA Tue Sep 19 20:46:12 2017 @@ -1,5 +1,5 @@ # -# $NetBSD: TEGRA,v 1.27 2017/09/08 10:17:18 jmcneill Exp $ +# $NetBSD: TEGRA,v 1.28 2017/09/19 20:46:12 jmcneill Exp $ # # NVIDIA Tegra family SoCs # @@ -93,7 +93,7 @@ gpio* at gpiobus? tegrampio* at fdt? # MPIO # XUSB PADCTL -tegraxusbpad* at fdt? # XUSB PADCTL +tegra124xusbpad* at fdt? # XUSB PADCTL # PCIE tegrapcie0 at fdt? # PCIE Added files: Index: src/sys/arch/arm/nvidia/tegra124_xusbpad.c diff -u /dev/null src/sys/arch/arm/nvidia/tegra124_xusbpad.c:1.1 --- /dev/null Tue Sep 19 20:46:12 2017 +++ src/sys/arch/arm/nvidia/tegra124_xusbpad.c Tue Sep 19 20:46:12 2017 @@ -0,0 +1,343 @@ +/* $NetBSD: tegra124_xusbpad.c,v 1.1 2017/09/19 20:46:12 jmcneill Exp $ */ + +/*- + * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "opt_tegra.h" + +#include <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: tegra124_xusbpad.c,v 1.1 2017/09/19 20:46:12 jmcneill Exp $"); + +#include <sys/param.h> +#include <sys/bus.h> +#include <sys/device.h> +#include <sys/intr.h> +#include <sys/systm.h> +#include <sys/kernel.h> + +#include <arm/nvidia/tegra_reg.h> +#include <arm/nvidia/tegra_xusbpad.h> +#include <arm/nvidia/tegra124_xusbpadreg.h> +#include <arm/nvidia/tegra_var.h> + +#include <dev/fdt/fdtvar.h> + +#define TEGRA_FUSE_SKU_CALIB_REG 0xf0 + +static int tegra124_xusbpad_match(device_t, cfdata_t, void *); +static void tegra124_xusbpad_attach(device_t, device_t, void *); +static void tegra124_xusbpad_sata_enable(device_t); +static void tegra124_xusbpad_xhci_enable(device_t); + +static const struct tegra_xusbpad_ops tegra124_xusbpad_ops = { + .sata_enable = tegra124_xusbpad_sata_enable, + .xhci_enable = tegra124_xusbpad_xhci_enable, +}; + +struct tegra124_xusbpad_softc { + device_t sc_dev; + bus_space_tag_t sc_bst; + bus_space_handle_t sc_bsh; +}; + +#ifdef TEGRA_XUSBPAD_DEBUG +static void padregdump(void); +#endif + +CFATTACH_DECL_NEW(tegra124_xusbpad, sizeof(struct tegra124_xusbpad_softc), + tegra124_xusbpad_match, tegra124_xusbpad_attach, NULL, NULL); + +static int +tegra124_xusbpad_match(device_t parent, cfdata_t cf, void *aux) +{ + const char * const compatible[] = + { "nvidia,tegra124-xusb-padctl", NULL }; + struct fdt_attach_args * const faa = aux; + + return of_match_compatible(faa->faa_phandle, compatible); +} + +static void +tegra124_xusbpad_attach(device_t parent, device_t self, void *aux) +{ + struct tegra124_xusbpad_softc * const sc = device_private(self); + struct fdt_attach_args * const faa = aux; + bus_addr_t addr; + bus_size_t size; + int error; + + if (fdtbus_get_reg(faa->faa_phandle, 0, &addr, &size) != 0) { + aprint_error(": couldn't get registers\n"); + return; + } + + sc->sc_dev = self; + sc->sc_bst = faa->faa_bst; + error = bus_space_map(sc->sc_bst, addr, size, 0, &sc->sc_bsh); + if (error) { + aprint_error(": couldn't map %#llx: %d", (uint64_t)addr, error); + return; + } + + aprint_naive("\n"); + aprint_normal(": XUSB PADCTL\n"); + + tegra_xusbpad_register(self, &tegra124_xusbpad_ops); +} + +static void +tegra124_xusbpad_sata_enable(device_t dev) +{ + struct tegra124_xusbpad_softc * const sc = device_private(dev); + bus_space_tag_t bst = sc->sc_bst; + bus_space_handle_t bsh = sc->sc_bsh; + int retry; + + tegra_reg_set_clear(bst, bsh, XUSB_PADCTL_USB3_PAD_MUX_REG, + __SHIFTIN(XUSB_PADCTL_USB3_PAD_MUX_SATA_PAD_LANE0_SATA, + XUSB_PADCTL_USB3_PAD_MUX_SATA_PAD_LANE0) | + XUSB_PADCTL_USB3_PAD_MUX_FORCE_SATA_PAD_IDDQ_DISABLE_MASK0, + XUSB_PADCTL_USB3_PAD_MUX_SATA_PAD_LANE0); + + tegra_reg_set_clear(bst, bsh, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_REG, + 0, + XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ | + XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD); + tegra_reg_set_clear(bst, bsh, XUSB_PADCTL_IOPHY_PLL_S0_CTL1_REG, + 0, + XUSB_PADCTL_IOPHY_PLL_S0_CTL1_IDDQ | + XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PWR_OVRD); + tegra_reg_set_clear(bst, bsh, XUSB_PADCTL_IOPHY_PLL_S0_CTL1_REG, + XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE, 0); + tegra_reg_set_clear(bst, bsh, XUSB_PADCTL_IOPHY_PLL_S0_CTL1_REG, + XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST, 0); + + for (retry = 1000; retry > 0; retry--) { + const uint32_t v = bus_space_read_4(bst, bsh, + XUSB_PADCTL_IOPHY_PLL_S0_CTL1_REG); + if (v & XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_LOCKDET) + break; + delay(100); + } + if (retry == 0) { + printf("WARNING: SATA PHY power-on failed\n"); + } +} + +#ifdef TEGRA_XUSBPAD_DEBUG +static void +padregdump(void) +{ + bus_space_tag_t bst; + bus_space_handle_t bsh; + bus_size_t i; + u_int j; + + tegra124_xusbpad_get_bs(&bst, &bsh); + + for (i = 0x000; i < 0x160; ) { + printf("0x%03jx:", (uintmax_t)i); + for (j = 0; i < 0x160 && j < 0x10; j += 4, i += 4) { + printf(" %08x", bus_space_read_4(bst, bsh, i)); + } + printf("\n"); + } +} +#endif + +static void +tegra124_xusbpad_xhci_enable(device_t dev) +{ + struct tegra124_xusbpad_softc * const sc = device_private(dev); + 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] = { + (skucalib >> 0) & 0x3f, + (skucalib >> 15) & 0x3f, + (skucalib >> 15) & 0x3f, + }; + const uint32_t hic = (skucalib >> 13) & 3; + const uint32_t hsl = (skucalib >> 11) & 3; + const uint32_t htra = (skucalib >> 7) & 0xf; + + +#ifdef TEGRA_XUSBPAD_DEBUG + val = bus_space_read_4(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_PAD_MUX_REG); + device_printf(sc->sc_dev, "XUSB_PADCTL_USB2_PAD_MUX_REG is 0x%x\n", val); + val = bus_space_read_4(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_PORT_CAP_REG); + 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); +#endif + + bus_space_write_4(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_PAD_MUX_REG, (0<<0)|(0<<2)|(1<<4)); + bus_space_write_4(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_PORT_CAP_REG, (1<<0)|(1<<4)|(1<<8)); + bus_space_write_4(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_SS_PORT_MAP_REG, (2<<0)|(7<<4)); + + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_BIAS_PAD_CTL0_REG, + __SHIFTIN(hsl, XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL) | + __SHIFTIN(XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_VAL, + XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL), + XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL | + XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL); + + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, + XUSB_PADCTL_USB2_OTG_PAD0_CTL0_REG, + __SHIFTIN(hcl[0], + XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL) | + __SHIFTIN(XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_VAL, + XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW) | + __SHIFTIN(XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_VAL(0), + XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW), + XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL | + XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW | + XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW | + XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD | + XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2 | + XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, + XUSB_PADCTL_USB2_OTG_PAD1_CTL0_REG, + __SHIFTIN(hcl[1], + XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL) | + __SHIFTIN(XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_VAL, + XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW) | + __SHIFTIN(XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_VAL(1), + XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW), + XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL | + XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW | + XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW | + XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD | + XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2 | + XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, + XUSB_PADCTL_USB2_OTG_PAD2_CTL0_REG, + __SHIFTIN(hcl[2], + XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL) | + __SHIFTIN(XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_VAL, + XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW) | + __SHIFTIN(XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_VAL(2), + XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW), + XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL | + XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW | + XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW | + XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD | + XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2 | + XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI); + + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, + XUSB_PADCTL_USB2_OTG_PAD0_CTL1_REG, + __SHIFTIN(htra, + XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ) | + __SHIFTIN(hic, + XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP), + XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ | + XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP | + XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR | + XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_CHRP_FORCE_POWERUP | + XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DISC_FORCE_POWERUP); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, + XUSB_PADCTL_USB2_OTG_PAD1_CTL1_REG, + __SHIFTIN(htra, + XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ) | + __SHIFTIN(hic, + XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP), + XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ | + XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP | + XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR | + XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_CHRP_FORCE_POWERUP | + XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DISC_FORCE_POWERUP); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, + XUSB_PADCTL_USB2_OTG_PAD2_CTL1_REG, + __SHIFTIN(htra, + XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ) | + __SHIFTIN(hic, + XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP), + XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ | + XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP | + XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR | + XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_CHRP_FORCE_POWERUP | + XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DISC_FORCE_POWERUP); + + //tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_BATTERY_CHRG_BIASPAD_REG, 0, 1); /* PD_OTG */ + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD0_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD1_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD2_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD0_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD1_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD2_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD0_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD1_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD2_CTL0_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD0_CTL1_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD1_CTL1_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_OTG_PAD2_CTL1_REG, 0, XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_BIAS_PAD_CTL0_REG, 0, XUSB_PADCTL_USB2_BIAS_PAD_CTL0_PD); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_BIAS_PAD_CTL0_REG, 0, XUSB_PADCTL_USB2_BIAS_PAD_CTL0_PD_TRK); + + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_ELPG_PROGRAM_REG, + 0, XUSB_PADCTL_ELPG_PROGRAM_SSP0_ELPG_CLAMP_EN); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_ELPG_PROGRAM_REG, + 0, XUSB_PADCTL_ELPG_PROGRAM_SSP0_ELPG_CLAMP_EN_EARLY); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_ELPG_PROGRAM_REG, + 0, XUSB_PADCTL_ELPG_PROGRAM_SSP0_ELPG_VCORE_DOWN); + + DELAY(200); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_ELPG_PROGRAM_REG, 0, __BIT(26)); + DELAY(200); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_ELPG_PROGRAM_REG, 0, __BIT(25)); + DELAY(200); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_ELPG_PROGRAM_REG, 0, __BIT(24)); + DELAY(200); + + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_OC_DET_REG, 0, __BITS(22,16)); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_OC_DET_REG, __BIT(4), 0); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_OC_DET_REG, __BIT(8), 0); + tegra_reg_set_clear(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_OC_DET_REG, __BIT(9), 0); + +#ifdef TEGRA_XUSBPAD_DEBUG + val = bus_space_read_4(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_PAD_MUX_REG); + device_printf(sc->sc_dev, "XUSB_PADCTL_USB2_PAD_MUX_REG is 0x%x\n", val); + val = bus_space_read_4(sc->sc_bst, sc->sc_bsh, XUSB_PADCTL_USB2_PORT_CAP_REG); + 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 +} Index: src/sys/arch/arm/nvidia/tegra124_xusbpadreg.h diff -u /dev/null src/sys/arch/arm/nvidia/tegra124_xusbpadreg.h:1.1 --- /dev/null Tue Sep 19 20:46:12 2017 +++ src/sys/arch/arm/nvidia/tegra124_xusbpadreg.h Tue Sep 19 20:46:12 2017 @@ -0,0 +1,161 @@ +/* $NetBSD: tegra124_xusbpadreg.h,v 1.1 2017/09/19 20:46:12 jmcneill Exp $ */ + +/*- + * Copyright (c) 2015 Jared D. McNeill <jmcne...@invisible.ca> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _ARM_TEGRA_XUSBPADCTLREG_H +#define _ARM_TEGRA_XUSBPADCTLREG_H + +#define XUSB_PADCTL_BOOT_MEDIA_REG 0x000 +#define XUSB_PADCTL_USB2_PAD_MUX_REG 0x004 +#define XUSB_PADCTL_USB2_PORT_CAP_REG 0x008 +#define XUSB_PADCTL_SNPS_OC_MAP_REG 0x00c +#define XUSB_PADCTL_USB2_OC_MAP_REG 0x010 +#define XUSB_PADCTL_SS_PORT_MAP_REG 0x014 +#define XUSB_PADCTL_OC_DET_REG 0x018 +#define XUSB_PADCTL_ELPG_PROGRAM_REG 0x01c +#define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD0_CTL0_REG 0x020 +#define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD0_CTL1_REG 0x024 +#define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD1_CTL0_REG 0x028 +#define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD1_CTL1_REG 0x02c +#define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD2_CTL0_REG 0x030 +#define XUSB_PADCTL_USB2_BATTERY_CHRG_OTGPAD2_CTL1_REG 0x034 +#define XUSB_PADCTL_USB2_BATTERY_CHRG_BIASPAD_REG 0x038 +#define XUSB_PADCTL_USB2_BATTERY_CHRG_TDCD_DBNC_TIMER_REG 0x03c +#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_REG 0x040 +#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_REG 0x044 +#define XUSB_PADCTL_IOPHY_PLL_P0_CTL3_REG 0x048 +#define XUSB_PADCTL_IOPHY_PLL_P0_CTL4_REG 0x04c +#define XUSB_PADCTL_IOPHY_USB3_PAD0_CTL1_REG 0x050 +#define XUSB_PADCTL_IOPHY_USB3_PAD1_CTL1_REG 0x054 +#define XUSB_PADCTL_IOPHY_USB3_PAD0_CTL2_REG 0x058 +#define XUSB_PADCTL_IOPHY_USB3_PAD1_CTL2_REG 0x05c +#define XUSB_PADCTL_IOPHY_USB3_PAD0_CTL3_REG 0x060 +#define XUSB_PADCTL_IOPHY_USB3_PAD1_CTL3_REG 0x064 +#define XUSB_PADCTL_IOPHY_USB3_PAD0_CTL4_REG 0x068 +#define XUSB_PADCTL_IOPHY_USB3_PAD1_CTL4_REG 0x06c +#define XUSB_PADCTL_IOPHY_MISC_PAD_P0_CTL1_REG 0x070 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P1_CTL1_REG 0x074 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P0_CTL2_REG 0x078 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P1_CTL2_REG 0x07c +#define XUSB_PADCTL_IOPHY_MISC_PAD_P0_CTL3_REG 0x080 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P1_CTL3_REG 0x084 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P0_CTL4_REG 0x088 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P1_CTL4_REG 0x08c +#define XUSB_PADCTL_IOPHY_MISC_PAD_P0_CTL5_REG 0x090 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P1_CTL5_REG 0x094 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P0_CTL6_REG 0x098 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P1_CTL6_REG 0x09c +#define XUSB_PADCTL_USB2_OTG_PAD0_CTL0_REG 0x0a0 +#define XUSB_PADCTL_USB2_OTG_PAD1_CTL0_REG 0x0a4 +#define XUSB_PADCTL_USB2_OTG_PAD2_CTL0_REG 0x0a8 +#define XUSB_PADCTL_USB2_OTG_PAD0_CTL1_REG 0x0ac +#define XUSB_PADCTL_USB2_OTG_PAD1_CTL1_REG 0x0b0 +#define XUSB_PADCTL_USB2_OTG_PAD2_CTL1_REG 0x0b4 +#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_REG 0x0b8 +#define XUSB_PADCTL_USB2_BIAS_PAD_CTL1_REG 0x0bc +#define XUSB_PADCTL_HSIC_PAD0_CTL0_REG 0x0c0 +#define XUSB_PADCTL_HSIC_PAD1_CTL0_REG 0x0c4 +#define XUSB_PADCTL_HSIC_PAD0_CTL1_REG 0x0c8 +#define XUSB_PADCTL_HSIC_PAD1_CTL1_REG 0x0cc +#define XUSB_PADCTL_HSIC_PAD0_CTL2_REG 0x0d0 +#define XUSB_PADCTL_HSIC_PAD1_CTL2_REG 0x0d4 +#define XUSB_PADCTL_ULPI_LINK_TRIM_CONTROL_REG 0x0d8 +#define XUSB_PADCTL_ULPI_NULL_CLK_TRIM_CONTROL_REG 0x0dc +#define XUSB_PADCTL_HSIC_STRB_TRIM_CONTROL_REG 0x0e0 +#define XUSB_PADCTL_WAKE_CTRL_REG 0x0e4 +#define XUSB_PADCTL_PM_SPARE_REG 0x0e8 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P2_CTL1_REG 0x0ec +#define XUSB_PADCTL_IOPHY_MISC_PAD_P3_CTL1_REG 0x0f0 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P4_CTL1_REG 0x0f4 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P2_CTL2_REG 0x0f8 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P3_CTL2_REG 0x0fc +#define XUSB_PADCTL_IOPHY_MISC_PAD_P4_CTL2_REG 0x100 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P2_CTL3_REG 0x104 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P3_CTL3_REG 0x108 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P4_CTL3_REG 0x10c +#define XUSB_PADCTL_IOPHY_MISC_PAD_P2_CTL4_REG 0x110 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P3_CTL4_REG 0x114 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P4_CTL4_REG 0x118 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P2_CTL5_REG 0x11c +#define XUSB_PADCTL_IOPHY_MISC_PAD_P3_CTL5_REG 0x120 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P4_CTL5_REG 0x124 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P2_CTL6_REG 0x128 +#define XUSB_PADCTL_IOPHY_MISC_PAD_P3_CTL6_REG 0x12c +#define XUSB_PADCTL_IOPHY_MISC_PAD_P4_CTL6_REG 0x130 +#define XUSB_PADCTL_USB3_PAD_MUX_REG 0x134 +#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_REG 0x138 +#define XUSB_PADCTL_IOPHY_PLL_S0_CTL2_REG 0x13c +#define XUSB_PADCTL_IOPHY_PLL_S0_CTL3_REG 0x140 +#define XUSB_PADCTL_IOPHY_PLL_S0_CTL4_REG 0x144 +#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_REG 0x148 +#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL2_REG 0x14c +#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL3_REG 0x150 +#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL4_REG 0x154 +#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL5_REG 0x158 +#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL6_REG 0x15c + +#define XUSB_PADCTL_ELPG_PROGRAM_SSP0_ELPG_VCORE_DOWN __BIT(18) +#define XUSB_PADCTL_ELPG_PROGRAM_SSP0_ELPG_CLAMP_EN_EARLY __BIT(17) +#define XUSB_PADCTL_ELPG_PROGRAM_SSP0_ELPG_CLAMP_EN __BIT(16) + +#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD_ZI __BIT(21) +#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD2 __BIT(20) +#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_PD __BIT(19) +#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW __BITS(15,14) +#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_LS_RSLEW_VAL(pad) ((pad >= 1) ? 0x0 : 0x3) +#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW __BITS(11,6) +#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_SLEW_VAL 0x0e +#define XUSB_PADCTL_USB2_OTG_PAD_CTL0_HS_CURR_LEVEL __BITS(5,0) + +#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_HS_IREF_CAP __BITS(10,9) +#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_TERM_RANGE_ADJ __BITS(6,3) +#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DR __BIT(2) +#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_DISC_FORCE_POWERUP __BIT(1) +#define XUSB_PADCTL_USB2_OTG_PAD_CTL1_PD_CHRP_FORCE_POWERUP __BIT(0) + +#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_PD_TRK __BIT(13) +#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_PD __BIT(12) +#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL __BITS(4,2) +#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_DISCON_LEVEL_VAL 0x5 +#define XUSB_PADCTL_USB2_BIAS_PAD_CTL0_HS_SQUELCH_LEVEL __BITS(1,0) + +#define XUSB_PADCTL_USB3_PAD_MUX_SATA_PAD_LANE0 __BITS(27,26) +#define XUSB_PADCTL_USB3_PAD_MUX_SATA_PAD_LANE0_PCIE 0 +#define XUSB_PADCTL_USB3_PAD_MUX_SATA_PAD_LANE0_USB3_SS 1 +#define XUSB_PADCTL_USB3_PAD_MUX_SATA_PAD_LANE0_SATA 2 +#define XUSB_PADCTL_USB3_PAD_MUX_FORCE_SATA_PAD_IDDQ_DISABLE_MASK0 __BIT(6) + +#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_LOCKDET __BIT(27) +#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE __BIT(24) +#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PWR_OVRD __BIT(3) +#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST __BIT(1) +#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_IDDQ __BIT(0) + +#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD __BIT(1) +#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ __BIT(0) + +#endif /* _ARM_TEGRA_XUSBPADCTLREG_H */ Index: src/sys/arch/arm/nvidia/tegra_xusbpad.h diff -u /dev/null src/sys/arch/arm/nvidia/tegra_xusbpad.h:1.1 --- /dev/null Tue Sep 19 20:46:12 2017 +++ src/sys/arch/arm/nvidia/tegra_xusbpad.h Tue Sep 19 20:46:12 2017 @@ -0,0 +1,42 @@ +/* $NetBSD: tegra_xusbpad.h,v 1.1 2017/09/19 20:46:12 jmcneill Exp $ */ + +/*- + * Copyright (c) 2017 Jared McNeill <jmcne...@invisible.ca> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _ARM_TEGRA_XUSBPAD_H +#define _ARM_TEGRA_XUSBPAD_H + +struct tegra_xusbpad_ops { + void (*sata_enable)(device_t); + void (*xhci_enable)(device_t); +}; + +void tegra_xusbpad_register(device_t, const struct tegra_xusbpad_ops *); + +void tegra_xusbpad_sata_enable(void); +void tegra_xusbpad_xhci_enable(void); + +#endif /* _ARM_TEGRA_XUSBPAD_H */