xref: /freebsd/sys/arm/nvidia/tegra_xhci.c (revision 2008043f386721d58158e37e0d7e50df8095942d)
1 /*-
2  * Copyright (c) 2016 Michal Meloun <mmel@FreeBSD.org>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26 
27 #include <sys/cdefs.h>
28 /*
29  * XHCI driver for Tegra SoCs.
30  */
31 #include "opt_bus.h"
32 #include "opt_platform.h"
33 
34 #include <sys/param.h>
35 #include <sys/bus.h>
36 #include <sys/clock.h>
37 #include <sys/condvar.h>
38 #include <sys/firmware.h>
39 #include <sys/kernel.h>
40 #include <sys/lock.h>
41 #include <sys/malloc.h>
42 #include <sys/module.h>
43 #include <sys/mutex.h>
44 #include <sys/rman.h>
45 #include <sys/systm.h>
46 
47 #include <vm/vm.h>
48 #include <vm/vm_extern.h>
49 #include <vm/vm_kern.h>
50 #include <vm/pmap.h>
51 
52 #include <machine/bus.h>
53 #include <machine/resource.h>
54 
55 #include <dev/extres/clk/clk.h>
56 #include <dev/extres/hwreset/hwreset.h>
57 #include <dev/extres/phy/phy.h>
58 #include <dev/extres/regulator/regulator.h>
59 #include <dev/ofw/ofw_bus.h>
60 #include <dev/ofw/ofw_bus_subr.h>
61 #include <dev/usb/usb.h>
62 #include <dev/usb/usbdi.h>
63 #include <dev/usb/usb_busdma.h>
64 #include <dev/usb/usb_process.h>
65 #include <dev/usb/usb_controller.h>
66 #include <dev/usb/usb_bus.h>
67 #include <dev/usb/controller/xhci.h>
68 #include <dev/usb/controller/xhcireg.h>
69 
70 #include <arm/nvidia/tegra_pmc.h>
71 
72 #include "usbdevs.h"
73 
74 /* FPCI address space */
75 #define	T_XUSB_CFG_0				0x000
76 #define	T_XUSB_CFG_1				0x004
77 #define	 CFG_1_BUS_MASTER				(1 << 2)
78 #define	 CFG_1_MEMORY_SPACE				(1 << 1)
79 #define	 CFG_1_IO_SPACE					(1 << 0)
80 
81 #define	T_XUSB_CFG_2				0x008
82 #define	T_XUSB_CFG_3				0x00C
83 #define	T_XUSB_CFG_4				0x010
84 #define	 CFG_4_BASE_ADDRESS(x)				(((x) & 0x1FFFF) << 15)
85 
86 #define	T_XUSB_CFG_5				0x014
87 #define	T_XUSB_CFG_ARU_MAILBOX_CMD		0x0E4
88 #define  ARU_MAILBOX_CMD_INT_EN				(1U << 31)
89 #define  ARU_MAILBOX_CMD_DEST_XHCI			(1  << 30)
90 #define  ARU_MAILBOX_CMD_DEST_SMI			(1  << 29)
91 #define  ARU_MAILBOX_CMD_DEST_PME			(1  << 28)
92 #define  ARU_MAILBOX_CMD_DEST_FALC			(1  << 27)
93 
94 #define	T_XUSB_CFG_ARU_MAILBOX_DATA_IN		0x0E8
95 #define	 ARU_MAILBOX_DATA_IN_DATA(x)			(((x) & 0xFFFFFF) <<  0)
96 #define	 ARU_MAILBOX_DATA_IN_TYPE(x)			(((x) & 0x0000FF) << 24)
97 
98 #define	T_XUSB_CFG_ARU_MAILBOX_DATA_OUT		0x0EC
99 #define	 ARU_MAILBOX_DATA_OUT_DATA(x)			(((x) >>  0) & 0xFFFFFF)
100 #define	 ARU_MAILBOX_DATA_OUT_TYPE(x)			(((x) >> 24) & 0x0000FF)
101 
102 #define	T_XUSB_CFG_ARU_MAILBOX_OWNER		0x0F0
103 #define	 ARU_MAILBOX_OWNER_SW				2
104 #define	 ARU_MAILBOX_OWNER_FW				1
105 #define	 ARU_MAILBOX_OWNER_NONE				0
106 
107 #define	XUSB_CFG_ARU_C11_CSBRANGE		0x41C	/* ! UNDOCUMENTED ! */
108 #define	 ARU_C11_CSBRANGE_PAGE(x)			((x) >> 9)
109 #define	 ARU_C11_CSBRANGE_ADDR(x)			(0x800 + ((x) & 0x1FF))
110 #define	XUSB_CFG_ARU_SMI_INTR			0x428	/* ! UNDOCUMENTED ! */
111 #define  ARU_SMI_INTR_EN				(1 << 3)
112 #define  ARU_SMI_INTR_FW_HANG				(1 << 1)
113 #define	XUSB_CFG_ARU_RST			0x42C	/* ! UNDOCUMENTED ! */
114 #define	 ARU_RST_RESET					(1 << 0)
115 
116 #define	XUSB_HOST_CONFIGURATION			0x180
117 #define	 CONFIGURATION_CLKEN_OVERRIDE			(1U<< 31)
118 #define	 CONFIGURATION_PW_NO_DEVSEL_ERR_CYA		(1 << 19)
119 #define	 CONFIGURATION_INITIATOR_READ_IDLE		(1 << 18)
120 #define	 CONFIGURATION_INITIATOR_WRITE_IDLE		(1 << 17)
121 #define	 CONFIGURATION_WDATA_LEAD_CYA			(1 << 15)
122 #define	 CONFIGURATION_WR_INTRLV_CYA			(1 << 14)
123 #define	 CONFIGURATION_TARGET_READ_IDLE			(1 << 11)
124 #define	 CONFIGURATION_TARGET_WRITE_IDLE		(1 << 10)
125 #define	 CONFIGURATION_MSI_VEC_EMPTY			(1 <<  9)
126 #define	 CONFIGURATION_UFPCI_MSIAW			(1 <<  7)
127 #define	 CONFIGURATION_UFPCI_PWPASSPW			(1 <<  6)
128 #define	 CONFIGURATION_UFPCI_PASSPW			(1 <<  5)
129 #define	 CONFIGURATION_UFPCI_PWPASSNPW			(1 <<  4)
130 #define	 CONFIGURATION_DFPCI_PWPASSNPW			(1 <<  3)
131 #define	 CONFIGURATION_DFPCI_RSPPASSPW			(1 <<  2)
132 #define	 CONFIGURATION_DFPCI_PASSPW			(1 <<  1)
133 #define	 CONFIGURATION_EN_FPCI				(1 <<  0)
134 
135 /* IPFS address space */
136 #define	XUSB_HOST_FPCI_ERROR_MASKS		0x184
137 #define	 FPCI_ERROR_MASTER_ABORT			(1 <<  2)
138 #define	 FPCI_ERRORI_DATA_ERROR				(1 <<  1)
139 #define	 FPCI_ERROR_TARGET_ABORT			(1 <<  0)
140 
141 #define	XUSB_HOST_INTR_MASK			0x188
142 #define	 INTR_IP_INT_MASK				(1 << 16)
143 #define	 INTR_MSI_MASK					(1 <<  8)
144 #define	 INTR_INT_MASK					(1 <<  0)
145 
146 #define	XUSB_HOST_CLKGATE_HYSTERESIS		0x1BC
147 
148  /* CSB Falcon CPU */
149 #define	XUSB_FALCON_CPUCTL			0x100
150 #define	 CPUCTL_STOPPED					(1 << 5)
151 #define	 CPUCTL_HALTED					(1 << 4)
152 #define	 CPUCTL_HRESET					(1 << 3)
153 #define	 CPUCTL_SRESET					(1 << 2)
154 #define	 CPUCTL_STARTCPU				(1 << 1)
155 #define	 CPUCTL_IINVAL					(1 << 0)
156 
157 #define	XUSB_FALCON_BOOTVEC			0x104
158 #define	XUSB_FALCON_DMACTL			0x10C
159 #define	XUSB_FALCON_IMFILLRNG1			0x154
160 #define	 IMFILLRNG1_TAG_HI(x)				(((x) & 0xFFF) << 16)
161 #define	 IMFILLRNG1_TAG_LO(x)				(((x) & 0xFFF) <<  0)
162 #define	XUSB_FALCON_IMFILLCTL			0x158
163 
164 /* CSB mempool */
165 #define	XUSB_CSB_MEMPOOL_APMAP			0x10181C
166 #define	 APMAP_BOOTPATH					(1U << 31)
167 
168 #define	XUSB_CSB_MEMPOOL_ILOAD_ATTR		0x101A00
169 #define	XUSB_CSB_MEMPOOL_ILOAD_BASE_LO		0x101A04
170 #define	XUSB_CSB_MEMPOOL_ILOAD_BASE_HI		0x101A08
171 #define	XUSB_CSB_MEMPOOL_L2IMEMOP_SIZE		0x101A10
172 #define	 L2IMEMOP_SIZE_OFFSET(x)			(((x) & 0x3FF) <<  8)
173 #define	 L2IMEMOP_SIZE_SIZE(x)				(((x) & 0x0FF) << 24)
174 
175 #define	XUSB_CSB_MEMPOOL_L2IMEMOP_TRIG		0x101A14
176 #define	 L2IMEMOP_INVALIDATE_ALL			(0x40 << 24)
177 #define	 L2IMEMOP_LOAD_LOCKED_RESULT			(0x11 << 24)
178 
179 #define	XUSB_CSB_MEMPOOL_L2IMEMOP_RESULT        0x101A18
180 #define	 L2IMEMOP_RESULT_VLD       (1U << 31)
181 
182 #define XUSB_CSB_IMEM_BLOCK_SIZE	256
183 
184 #define	TEGRA_XHCI_SS_HIGH_SPEED	120000000
185 #define	TEGRA_XHCI_SS_LOW_SPEED		 12000000
186 
187 /* MBOX commands. */
188 #define	MBOX_CMD_MSG_ENABLED			 1
189 #define	MBOX_CMD_INC_FALC_CLOCK			 2
190 #define	MBOX_CMD_DEC_FALC_CLOCK			 3
191 #define	MBOX_CMD_INC_SSPI_CLOCK			 4
192 #define	MBOX_CMD_DEC_SSPI_CLOCK			 5
193 #define	MBOX_CMD_SET_BW				 6
194 #define	MBOX_CMD_SET_SS_PWR_GATING		 7
195 #define	MBOX_CMD_SET_SS_PWR_UNGATING		 8
196 #define	MBOX_CMD_SAVE_DFE_CTLE_CTX		 9
197 #define	MBOX_CMD_AIRPLANE_MODE_ENABLED		10
198 #define	MBOX_CMD_AIRPLANE_MODE_DISABLED		11
199 #define	MBOX_CMD_START_HSIC_IDLE		12
200 #define	MBOX_CMD_STOP_HSIC_IDLE			13
201 #define	MBOX_CMD_DBC_WAKE_STACK			14
202 #define	MBOX_CMD_HSIC_PRETEND_CONNECT		15
203 #define	MBOX_CMD_RESET_SSPI			16
204 #define	MBOX_CMD_DISABLE_SS_LFPS_DETECTION	17
205 #define	MBOX_CMD_ENABLE_SS_LFPS_DETECTION	18
206 
207 /* MBOX responses. */
208 #define	MBOX_CMD_ACK				(0x80 + 0)
209 #define	MBOX_CMD_NAK				(0x80 + 1)
210 
211 #define	IPFS_WR4(_sc, _r, _v)	bus_write_4((_sc)->mem_res_ipfs, (_r), (_v))
212 #define	IPFS_RD4(_sc, _r)	bus_read_4((_sc)->mem_res_ipfs, (_r))
213 #define	FPCI_WR4(_sc, _r, _v)	bus_write_4((_sc)->mem_res_fpci, (_r), (_v))
214 #define	FPCI_RD4(_sc, _r)	bus_read_4((_sc)->mem_res_fpci, (_r))
215 
216 #define	LOCK(_sc)		mtx_lock(&(_sc)->mtx)
217 #define	UNLOCK(_sc)		mtx_unlock(&(_sc)->mtx)
218 #define	SLEEP(_sc, timeout)						\
219     mtx_sleep(sc, &sc->mtx, 0, "tegra_xhci", timeout);
220 #define	LOCK_INIT(_sc)							\
221     mtx_init(&_sc->mtx, device_get_nameunit(_sc->dev), "tegra_xhci", MTX_DEF)
222 #define	LOCK_DESTROY(_sc)	mtx_destroy(&_sc->mtx)
223 #define	ASSERT_LOCKED(_sc)	mtx_assert(&_sc->mtx, MA_OWNED)
224 #define	ASSERT_UNLOCKED(_sc)	mtx_assert(&_sc->mtx, MA_NOTOWNED)
225 
226 struct tegra_xusb_fw_hdr {
227 	uint32_t	boot_loadaddr_in_imem;
228 	uint32_t	boot_codedfi_offset;
229 	uint32_t	boot_codetag;
230 	uint32_t	boot_codesize;
231 
232 	uint32_t	phys_memaddr;
233 	uint16_t	reqphys_memsize;
234 	uint16_t	alloc_phys_memsize;
235 
236 	uint32_t	rodata_img_offset;
237 	uint32_t	rodata_section_start;
238 	uint32_t	rodata_section_end;
239 	uint32_t	main_fnaddr;
240 
241 	uint32_t	fwimg_cksum;
242 	uint32_t	fwimg_created_time;
243 
244 	uint32_t	imem_resident_start;
245 	uint32_t	imem_resident_end;
246 	uint32_t	idirect_start;
247 	uint32_t	idirect_end;
248 	uint32_t	l2_imem_start;
249 	uint32_t	l2_imem_end;
250 	uint32_t	version_id;
251 	uint8_t		init_ddirect;
252 	uint8_t		reserved[3];
253 	uint32_t	phys_addr_log_buffer;
254 	uint32_t	total_log_entries;
255 	uint32_t	dequeue_ptr;
256 	uint32_t	dummy[2];
257 	uint32_t	fwimg_len;
258 	uint8_t		magic[8];
259 	uint32_t	ss_low_power_entry_timeout;
260 	uint8_t		num_hsic_port;
261 	uint8_t		ss_portmap;
262 	uint8_t		build;
263 	uint8_t		padding[137]; /* Pad to 256 bytes */
264 };
265 
266 struct xhci_soc;
267 struct tegra_xhci_softc {
268 	struct xhci_softc 	xhci_softc;
269 	device_t		dev;
270 	struct xhci_soc		*soc;
271 	struct mtx		mtx;
272 	struct resource		*mem_res_fpci;
273 	struct resource		*mem_res_ipfs;
274 	struct resource		*irq_res_mbox;
275 	void			*irq_hdl_mbox;
276 
277 	clk_t			clk_xusb_host;
278 	clk_t			clk_xusb_gate;
279 	clk_t			clk_xusb_falcon_src;
280 	clk_t			clk_xusb_ss;
281 	clk_t			clk_xusb_hs_src;
282 	clk_t			clk_xusb_fs_src;
283 	hwreset_t		hwreset_xusb_host;
284 	hwreset_t		hwreset_xusb_ss;
285 	regulator_t		regulators[16];		/* Safe maximum */
286 	phy_t 			phys[8];		/* Safe maximum */
287 
288 	struct intr_config_hook	irq_hook;
289 	bool			xhci_inited;
290 	void			*fw_vaddr;
291 	vm_size_t		fw_size;
292 };
293 
294 struct xhci_soc {
295 	char		*fw_name;
296 	char 		**regulator_names;
297 	char 		**phy_names;
298 };
299 
300 /* Tegra 124 config */
301 static char *tegra124_reg_names[] = {
302 	"avddio-pex-supply",
303 	"dvddio-pex-supply",
304 	"avdd-usb-supply",
305 	"avdd-pll-utmip-supply",
306 	"avdd-pll-erefe-supply",
307 	"avdd-usb-ss-pll-supply",
308 	"hvdd-usb-ss-supply",
309 	"hvdd-usb-ss-pll-e-supply",
310 	NULL
311 };
312 
313 static char *tegra124_phy_names[] = {
314 	"usb2-0",
315 	"usb2-1",
316 	"usb2-2",
317 	"usb3-0",
318 	NULL
319 };
320 
321 static struct xhci_soc tegra124_soc =
322 {
323 	.fw_name = "tegra124_xusb_fw",
324 	.regulator_names = tegra124_reg_names,
325 	.phy_names = tegra124_phy_names,
326 };
327 
328 /* Tegra 210 config */
329 static char *tegra210_reg_names[] = {
330 	"dvddio-pex-supply",
331 	"hvddio-pex-supply",
332 	"avdd-usb-supply",
333 	"avdd-pll-utmip-supply",
334 	"avdd-pll-uerefe-supply",
335 	"dvdd-usb-ss-pll-supply",
336 	"hvdd-usb-ss-pll-e-supply",
337 	NULL
338 };
339 
340 static char *tegra210_phy_names[] = {
341 	"usb2-0",
342 	"usb2-1",
343 	"usb2-2",
344 	"usb2-3",
345 	"usb3-0",
346 	"usb3-1",
347 	NULL
348 };
349 
350 static struct xhci_soc tegra210_soc =
351 {
352 	.fw_name = "tegra210_xusb_fw",
353 	.regulator_names = tegra210_reg_names,
354 	.phy_names = tegra210_phy_names,
355 };
356 
357 /* Compatible devices. */
358 static struct ofw_compat_data compat_data[] = {
359 	{"nvidia,tegra124-xusb", (uintptr_t)&tegra124_soc},
360 	{"nvidia,tegra210-xusb", (uintptr_t)&tegra210_soc},
361 	{NULL,		 	 0}
362 };
363 
364 
365 static uint32_t
366 CSB_RD4(struct tegra_xhci_softc *sc, uint32_t addr)
367 {
368 
369 	FPCI_WR4(sc, XUSB_CFG_ARU_C11_CSBRANGE, ARU_C11_CSBRANGE_PAGE(addr));
370 	return (FPCI_RD4(sc, ARU_C11_CSBRANGE_ADDR(addr)));
371 }
372 
373 static void
374 CSB_WR4(struct tegra_xhci_softc *sc, uint32_t addr, uint32_t val)
375 {
376 
377 	FPCI_WR4(sc, XUSB_CFG_ARU_C11_CSBRANGE, ARU_C11_CSBRANGE_PAGE(addr));
378 	FPCI_WR4(sc, ARU_C11_CSBRANGE_ADDR(addr), val);
379 }
380 
381 static int
382 get_fdt_resources(struct tegra_xhci_softc *sc, phandle_t node)
383 {
384 	int i, rv;
385 
386 	/* Regulators. */
387 	for (i = 0; sc->soc->regulator_names[i] != NULL; i++) {
388 		if (i >= nitems(sc->regulators)) {
389 			device_printf(sc->dev,
390 			    "Too many regulators present in DT.\n");
391 			return (EOVERFLOW);
392 		}
393 		rv = regulator_get_by_ofw_property(sc->dev, 0,
394 		    sc->soc->regulator_names[i], sc->regulators + i);
395 		if (rv != 0) {
396 			device_printf(sc->dev,
397 			    "Cannot get '%s' regulator\n",
398 			    sc->soc->regulator_names[i]);
399 			return (ENXIO);
400 		}
401 	}
402 
403 	rv = hwreset_get_by_ofw_name(sc->dev, 0, "xusb_host",
404 	    &sc->hwreset_xusb_host);
405 	if (rv != 0) {
406 		device_printf(sc->dev, "Cannot get 'xusb_host' reset\n");
407 		return (ENXIO);
408 	}
409 	rv = hwreset_get_by_ofw_name(sc->dev, 0, "xusb_ss",
410 	    &sc->hwreset_xusb_ss);
411 	if (rv != 0) {
412 		device_printf(sc->dev, "Cannot get 'xusb_ss' reset\n");
413 		return (ENXIO);
414 	}
415 
416 	/* Phys. */
417 	for (i = 0; sc->soc->phy_names[i] != NULL; i++) {
418 		if (i >= nitems(sc->phys)) {
419 			device_printf(sc->dev,
420 			    "Too many phys present in DT.\n");
421 			return (EOVERFLOW);
422 		}
423 		rv = phy_get_by_ofw_name(sc->dev, 0, sc->soc->phy_names[i],
424 		    sc->phys + i);
425 		if (rv != 0 && rv != ENOENT) {
426 			device_printf(sc->dev, "Cannot get '%s' phy.\n",
427 			    sc->soc->phy_names[i]);
428 			return (ENXIO);
429 		}
430 	}
431 
432 	rv = clk_get_by_ofw_name(sc->dev, 0, "xusb_host",
433 	    &sc->clk_xusb_host);
434 	if (rv != 0) {
435 		device_printf(sc->dev, "Cannot get 'xusb_host' clock\n");
436 		return (ENXIO);
437 	}
438 	rv = clk_get_by_ofw_name(sc->dev, 0, "xusb_falcon_src",
439 	    &sc->clk_xusb_falcon_src);
440 	if (rv != 0) {
441 		device_printf(sc->dev, "Cannot get 'xusb_falcon_src' clock\n");
442 		return (ENXIO);
443 	}
444 	rv = clk_get_by_ofw_name(sc->dev, 0, "xusb_ss",
445 	    &sc->clk_xusb_ss);
446 	if (rv != 0) {
447 		device_printf(sc->dev, "Cannot get 'xusb_ss' clock\n");
448 		return (ENXIO);
449 	}
450 	rv = clk_get_by_ofw_name(sc->dev, 0, "xusb_hs_src",
451 	    &sc->clk_xusb_hs_src);
452 	if (rv != 0) {
453 		device_printf(sc->dev, "Cannot get 'xusb_hs_src' clock\n");
454 		return (ENXIO);
455 	}
456 	rv = clk_get_by_ofw_name(sc->dev, 0, "xusb_fs_src",
457 	    &sc->clk_xusb_fs_src);
458 	if (rv != 0) {
459 		device_printf(sc->dev, "Cannot get 'xusb_fs_src' clock\n");
460 		return (ENXIO);
461 	}
462 	/* Clock xusb_gate is missing in mainstream DT */
463 	rv = clk_get_by_name(sc->dev, "xusb_gate", &sc->clk_xusb_gate);
464 	if (rv != 0) {
465 		device_printf(sc->dev, "Cannot get 'xusb_gate' clock\n");
466 		return (ENXIO);
467 	}
468 	return (0);
469 }
470 
471 static int
472 enable_fdt_resources(struct tegra_xhci_softc *sc)
473 {
474 	int i, rv;
475 
476 	rv = hwreset_assert(sc->hwreset_xusb_host);
477 	if (rv != 0) {
478 		device_printf(sc->dev, "Cannot reset 'xusb_host' reset\n");
479 		return (rv);
480 	}
481 	rv = hwreset_assert(sc->hwreset_xusb_ss);
482 	if (rv != 0) {
483 		device_printf(sc->dev, "Cannot reset 'xusb_ss' reset\n");
484 		return (rv);
485 	}
486 
487 	/* Regulators. */
488 	for (i = 0; i < nitems(sc->regulators); i++) {
489 		if (sc->regulators[i] == NULL)
490 			continue;
491 		rv = regulator_enable(sc->regulators[i]);
492 		if (rv != 0) {
493 			device_printf(sc->dev,
494 			    "Cannot enable '%s' regulator\n",
495 			    sc->soc->regulator_names[i]);
496 			return (rv);
497 		}
498 	}
499 
500 	/* Power off XUSB host and XUSB SS domains. */
501 	rv = tegra_powergate_power_off(TEGRA_POWERGATE_XUSBA);
502 	if (rv != 0) {
503 		device_printf(sc->dev, "Cannot powerdown  'xusba' domain\n");
504 		return (rv);
505 	}
506 	rv = tegra_powergate_power_off(TEGRA_POWERGATE_XUSBC);
507 	if (rv != 0) {
508 		device_printf(sc->dev, "Cannot powerdown  'xusbc' domain\n");
509 		return (rv);
510 	}
511 
512 	/* Setup XUSB ss_src clock first */
513 	clk_set_freq(sc->clk_xusb_ss, TEGRA_XHCI_SS_HIGH_SPEED, 0);
514 	if (rv != 0)
515 		return (rv);
516 
517 	/* The XUSB gate clock must be enabled before XUSBA can be powered. */
518 	rv = clk_enable(sc->clk_xusb_gate);
519 	if (rv != 0) {
520 		device_printf(sc->dev,
521 		    "Cannot enable 'xusb_gate' clock\n");
522 		return (rv);
523 	}
524 
525 	/* Power on XUSB host and XUSB SS domains. */
526 	rv = tegra_powergate_sequence_power_up(TEGRA_POWERGATE_XUSBC,
527 	    sc->clk_xusb_host, sc->hwreset_xusb_host);
528 	if (rv != 0) {
529 		device_printf(sc->dev, "Cannot powerup 'xusbc' domain\n");
530 		return (rv);
531 	}
532 	rv = tegra_powergate_sequence_power_up(TEGRA_POWERGATE_XUSBA,
533 	    sc->clk_xusb_ss, sc->hwreset_xusb_ss);
534 	if (rv != 0) {
535 		device_printf(sc->dev, "Cannot powerup 'xusba' domain\n");
536 		return (rv);
537 	}
538 
539 	/* Enable rest of clocks */
540 	rv = clk_enable(sc->clk_xusb_falcon_src);
541 	if (rv != 0) {
542 		device_printf(sc->dev,
543 		    "Cannot enable 'xusb_falcon_src' clock\n");
544 		return (rv);
545 	}
546 	rv = clk_enable(sc->clk_xusb_fs_src);
547 	if (rv != 0) {
548 		device_printf(sc->dev,
549 		    "Cannot enable 'xusb_fs_src' clock\n");
550 		return (rv);
551 	}
552 	rv = clk_enable(sc->clk_xusb_hs_src);
553 	if (rv != 0) {
554 		device_printf(sc->dev,
555 		    "Cannot enable 'xusb_hs_src' clock\n");
556 		return (rv);
557 	}
558 
559 	/* Phys. */
560 	for (i = 0; i < nitems(sc->phys); i++) {
561 		if (sc->phys[i] == NULL)
562 			continue;
563 		rv = phy_enable(sc->phys[i]);
564 		if (rv != 0) {
565 			device_printf(sc->dev, "Cannot enable '%s' phy\n",
566 			    sc->soc->phy_names[i]);
567 			return (rv);
568 		}
569 	}
570 
571 	return (0);
572 }
573 
574 /* Respond by ACK/NAK back to FW */
575 static void
576 mbox_send_ack(struct tegra_xhci_softc *sc, uint32_t cmd, uint32_t data)
577 {
578 	uint32_t reg;
579 
580 	reg = ARU_MAILBOX_DATA_IN_TYPE(cmd) | ARU_MAILBOX_DATA_IN_DATA(data);
581 	FPCI_WR4(sc, T_XUSB_CFG_ARU_MAILBOX_DATA_IN, reg);
582 
583 	reg = FPCI_RD4(sc, T_XUSB_CFG_ARU_MAILBOX_CMD);
584 	reg |= ARU_MAILBOX_CMD_DEST_FALC | ARU_MAILBOX_CMD_INT_EN;
585 	FPCI_WR4(sc, T_XUSB_CFG_ARU_MAILBOX_CMD, reg);
586 }
587 
588 /* Sent command to FW */
589 static int
590 mbox_send_cmd(struct tegra_xhci_softc *sc, uint32_t cmd, uint32_t data)
591 {
592 	uint32_t reg;
593 	int i;
594 
595 	reg = FPCI_RD4(sc, T_XUSB_CFG_ARU_MAILBOX_OWNER);
596 	if (reg != ARU_MAILBOX_OWNER_NONE) {
597 		device_printf(sc->dev,
598 		    "CPU mailbox is busy: 0x%08X\n", reg);
599 		return (EBUSY);
600 	}
601 	/* XXX Is this right? Retry loop? Wait before send? */
602 	FPCI_WR4(sc, T_XUSB_CFG_ARU_MAILBOX_OWNER, ARU_MAILBOX_OWNER_SW);
603 	reg = FPCI_RD4(sc, T_XUSB_CFG_ARU_MAILBOX_OWNER);
604 	if (reg != ARU_MAILBOX_OWNER_SW) {
605 		device_printf(sc->dev,
606 		    "Cannot acquire CPU mailbox: 0x%08X\n", reg);
607 		return (EBUSY);
608 	}
609 	reg = ARU_MAILBOX_DATA_IN_TYPE(cmd) | ARU_MAILBOX_DATA_IN_DATA(data);
610 	FPCI_WR4(sc, T_XUSB_CFG_ARU_MAILBOX_DATA_IN, reg);
611 
612 	reg = FPCI_RD4(sc, T_XUSB_CFG_ARU_MAILBOX_CMD);
613 	reg |= ARU_MAILBOX_CMD_DEST_FALC | ARU_MAILBOX_CMD_INT_EN;
614 	FPCI_WR4(sc, T_XUSB_CFG_ARU_MAILBOX_CMD, reg);
615 
616 	for (i = 250; i > 0; i--) {
617 		reg = FPCI_RD4(sc, T_XUSB_CFG_ARU_MAILBOX_OWNER);
618 		if (reg == ARU_MAILBOX_OWNER_NONE)
619 			break;
620 		DELAY(100);
621 	}
622 	if (i <= 0) {
623 		device_printf(sc->dev,
624 		    "Command response timeout: 0x%08X\n", reg);
625 		return (ETIMEDOUT);
626 	}
627 
628 	return(0);
629 }
630 
631 static void
632 process_msg(struct tegra_xhci_softc *sc, uint32_t req_cmd, uint32_t req_data,
633     uint32_t *resp_cmd, uint32_t *resp_data)
634 {
635 	uint64_t freq;
636 	int rv;
637 
638 	/* In most cases, data are echoed back. */
639 	*resp_data = req_data;
640 	switch (req_cmd) {
641 	case MBOX_CMD_INC_FALC_CLOCK:
642 	case MBOX_CMD_DEC_FALC_CLOCK:
643 		rv = clk_set_freq(sc->clk_xusb_falcon_src, req_data * 1000ULL,
644 		    0);
645 		if (rv == 0) {
646 			rv = clk_get_freq(sc->clk_xusb_falcon_src, &freq);
647 			*resp_data = (uint32_t)(freq / 1000);
648 		}
649 		*resp_cmd = rv == 0 ? MBOX_CMD_ACK: MBOX_CMD_NAK;
650 		break;
651 
652 	case MBOX_CMD_INC_SSPI_CLOCK:
653 	case MBOX_CMD_DEC_SSPI_CLOCK:
654 		rv = clk_set_freq(sc->clk_xusb_ss, req_data * 1000ULL,
655 		    0);
656 		if (rv == 0) {
657 			rv = clk_get_freq(sc->clk_xusb_ss, &freq);
658 			*resp_data = (uint32_t)(freq / 1000);
659 		}
660 		*resp_cmd = rv == 0 ? MBOX_CMD_ACK: MBOX_CMD_NAK;
661 		break;
662 
663 	case MBOX_CMD_SET_BW:
664 		/* No respense is expected. */
665 		*resp_cmd = 0;
666 		break;
667 
668 	case MBOX_CMD_SET_SS_PWR_GATING:
669 	case MBOX_CMD_SET_SS_PWR_UNGATING:
670 		*resp_cmd = MBOX_CMD_NAK;
671 		break;
672 
673 	case MBOX_CMD_SAVE_DFE_CTLE_CTX:
674 		/* Not implemented yet. */
675 		*resp_cmd = MBOX_CMD_ACK;
676 		break;
677 
678 	case MBOX_CMD_START_HSIC_IDLE:
679 	case MBOX_CMD_STOP_HSIC_IDLE:
680 		/* Not implemented yet. */
681 		*resp_cmd = MBOX_CMD_NAK;
682 		break;
683 
684 	case MBOX_CMD_DISABLE_SS_LFPS_DETECTION:
685 	case MBOX_CMD_ENABLE_SS_LFPS_DETECTION:
686 		/* Not implemented yet. */
687 		*resp_cmd = MBOX_CMD_NAK;
688 		break;
689 
690 	case MBOX_CMD_AIRPLANE_MODE_ENABLED:
691 	case MBOX_CMD_AIRPLANE_MODE_DISABLED:
692 	case MBOX_CMD_DBC_WAKE_STACK:
693 	case MBOX_CMD_HSIC_PRETEND_CONNECT:
694 	case MBOX_CMD_RESET_SSPI:
695 		device_printf(sc->dev,
696 		    "Received unused/unexpected command: %u\n", req_cmd);
697 		*resp_cmd = 0;
698 		break;
699 
700 	default:
701 		device_printf(sc->dev,
702 		    "Received unknown command: %u\n", req_cmd);
703 	}
704 }
705 
706 static void
707 intr_mbox(void *arg)
708 {
709 	struct tegra_xhci_softc *sc;
710 	uint32_t reg, msg, resp_cmd, resp_data;
711 
712 	sc = (struct tegra_xhci_softc *)arg;
713 
714 	/* Clear interrupt first */
715 	reg = FPCI_RD4(sc, XUSB_CFG_ARU_SMI_INTR);
716 	FPCI_WR4(sc, XUSB_CFG_ARU_SMI_INTR, reg);
717 	if (reg & ARU_SMI_INTR_FW_HANG) {
718 		device_printf(sc->dev,
719 		    "XUSB CPU firmware hang!!! CPUCTL: 0x%08X\n",
720 		    CSB_RD4(sc, XUSB_FALCON_CPUCTL));
721 	}
722 
723 	msg = FPCI_RD4(sc, T_XUSB_CFG_ARU_MAILBOX_DATA_OUT);
724 	resp_cmd = 0;
725 	process_msg(sc, ARU_MAILBOX_DATA_OUT_TYPE(msg),
726 	   ARU_MAILBOX_DATA_OUT_DATA(msg), &resp_cmd, &resp_data);
727 	if (resp_cmd != 0)
728 		mbox_send_ack(sc, resp_cmd, resp_data);
729 	else
730 		FPCI_WR4(sc, T_XUSB_CFG_ARU_MAILBOX_OWNER,
731 		    ARU_MAILBOX_OWNER_NONE);
732 
733 	reg = FPCI_RD4(sc, T_XUSB_CFG_ARU_MAILBOX_CMD);
734 	reg &= ~ARU_MAILBOX_CMD_DEST_SMI;
735 	FPCI_WR4(sc, T_XUSB_CFG_ARU_MAILBOX_CMD, reg);
736 
737 }
738 
739 static int
740 load_fw(struct tegra_xhci_softc *sc)
741 {
742 	const struct firmware *fw;
743 	const struct tegra_xusb_fw_hdr *fw_hdr;
744 	vm_paddr_t fw_paddr, fw_base;
745 	void *fw_vaddr;
746 	vm_size_t fw_size;
747 	uint32_t code_tags, code_size;
748 	struct clocktime fw_clock;
749 	struct timespec	fw_timespec;
750 	int i;
751 
752 	/* Reset ARU */
753 	FPCI_WR4(sc, XUSB_CFG_ARU_RST, ARU_RST_RESET);
754 	DELAY(3000);
755 
756 	/* Check if FALCON already runs */
757 	if (CSB_RD4(sc, XUSB_CSB_MEMPOOL_ILOAD_BASE_LO) != 0) {
758 		device_printf(sc->dev,
759 		    "XUSB CPU is already loaded, CPUCTL: 0x%08X\n",
760 			 CSB_RD4(sc, XUSB_FALCON_CPUCTL));
761 		return (0);
762 	}
763 
764 	fw = firmware_get(sc->soc->fw_name);
765 	if (fw == NULL) {
766 		device_printf(sc->dev, "Cannot read xusb firmware\n");
767 		return (ENOENT);
768 	}
769 
770 	/* Allocate uncached memory and copy firmware into. */
771 	fw_hdr = (const struct tegra_xusb_fw_hdr *)fw->data;
772 	fw_size = fw_hdr->fwimg_len;
773 
774 	fw_vaddr = kmem_alloc_contig(fw_size, M_WAITOK, 0, -1UL, PAGE_SIZE, 0,
775 	    VM_MEMATTR_UNCACHEABLE);
776 	fw_paddr = vtophys((uintptr_t)fw_vaddr);
777 	fw_hdr = (const struct tegra_xusb_fw_hdr *)fw_vaddr;
778 	memcpy(fw_vaddr, fw->data, fw_size);
779 
780 	firmware_put(fw, FIRMWARE_UNLOAD);
781 	sc->fw_vaddr = fw_vaddr;
782 	sc->fw_size = fw_size;
783 
784 	/* Setup firmware physical address and size. */
785 	fw_base = fw_paddr + sizeof(*fw_hdr);
786 	CSB_WR4(sc, XUSB_CSB_MEMPOOL_ILOAD_ATTR, fw_size);
787 	CSB_WR4(sc, XUSB_CSB_MEMPOOL_ILOAD_BASE_LO, fw_base & 0xFFFFFFFF);
788 	CSB_WR4(sc, XUSB_CSB_MEMPOOL_ILOAD_BASE_HI, (uint64_t)fw_base >> 32);
789 	CSB_WR4(sc, XUSB_CSB_MEMPOOL_APMAP, APMAP_BOOTPATH);
790 
791 	/* Invalidate full L2IMEM context. */
792 	CSB_WR4(sc, XUSB_CSB_MEMPOOL_L2IMEMOP_TRIG,
793 	    L2IMEMOP_INVALIDATE_ALL);
794 
795 	/* Program load of L2IMEM by boot code. */
796 	code_tags = howmany(fw_hdr->boot_codetag, XUSB_CSB_IMEM_BLOCK_SIZE);
797 	code_size = howmany(fw_hdr->boot_codesize, XUSB_CSB_IMEM_BLOCK_SIZE);
798 	CSB_WR4(sc, XUSB_CSB_MEMPOOL_L2IMEMOP_SIZE,
799 	    L2IMEMOP_SIZE_OFFSET(code_tags) |
800 	    L2IMEMOP_SIZE_SIZE(code_size));
801 
802 	/* Execute L2IMEM boot code fetch. */
803 	CSB_WR4(sc, XUSB_CSB_MEMPOOL_L2IMEMOP_TRIG,
804 	    L2IMEMOP_LOAD_LOCKED_RESULT);
805 
806 	/* Program FALCON auto-fill range and block count */
807 	CSB_WR4(sc, XUSB_FALCON_IMFILLCTL, code_size);
808 	CSB_WR4(sc, XUSB_FALCON_IMFILLRNG1,
809 	    IMFILLRNG1_TAG_LO(code_tags) |
810 	    IMFILLRNG1_TAG_HI(code_tags + code_size));
811 
812 	CSB_WR4(sc, XUSB_FALCON_DMACTL, 0);
813 	/* Wait for CPU */
814 	for (i = 500; i > 0; i--) {
815 		if (CSB_RD4(sc, XUSB_CSB_MEMPOOL_L2IMEMOP_RESULT) &
816 		     L2IMEMOP_RESULT_VLD)
817 			break;
818 		DELAY(100);
819 	}
820 	if (i <= 0) {
821 		device_printf(sc->dev, "Timedout while wating for DMA, "
822 		    "state: 0x%08X\n",
823 		    CSB_RD4(sc, XUSB_CSB_MEMPOOL_L2IMEMOP_RESULT));
824 		return (ETIMEDOUT);
825 	}
826 
827 	/* Boot FALCON cpu */
828 	CSB_WR4(sc, XUSB_FALCON_BOOTVEC, fw_hdr->boot_codetag);
829 	CSB_WR4(sc, XUSB_FALCON_CPUCTL, CPUCTL_STARTCPU);
830 
831 	/* Wait for CPU */
832 	for (i = 50; i > 0; i--) {
833 		if (CSB_RD4(sc, XUSB_FALCON_CPUCTL) == CPUCTL_STOPPED)
834 			break;
835 		DELAY(100);
836 	}
837 	if (i <= 0) {
838 		device_printf(sc->dev, "Timedout while wating for FALCON cpu, "
839 		    "state: 0x%08X\n", CSB_RD4(sc, XUSB_FALCON_CPUCTL));
840 		return (ETIMEDOUT);
841 	}
842 
843 	fw_timespec.tv_sec = fw_hdr->fwimg_created_time;
844 	fw_timespec.tv_nsec = 0;
845 	clock_ts_to_ct(&fw_timespec, &fw_clock);
846 	device_printf(sc->dev,
847 	    " Falcon firmware version: %02X.%02X.%04X,"
848 	    " (%d/%d/%d %d:%02d:%02d UTC)\n",
849 	    (fw_hdr->version_id >> 24) & 0xFF,(fw_hdr->version_id >> 15) & 0xFF,
850 	    fw_hdr->version_id & 0xFFFF,
851 	    fw_clock.day, fw_clock.mon, fw_clock.year,
852 	    fw_clock.hour, fw_clock.min, fw_clock.sec);
853 
854 	return (0);
855 }
856 
857 static int
858 init_hw(struct tegra_xhci_softc *sc)
859 {
860 	int rv;
861 	uint32_t reg;
862 	rman_res_t base_addr;
863 
864 	base_addr = rman_get_start(sc->xhci_softc.sc_io_res);
865 
866 	/* Enable FPCI access */
867 	reg = IPFS_RD4(sc, XUSB_HOST_CONFIGURATION);
868 	reg |= CONFIGURATION_EN_FPCI;
869 	IPFS_WR4(sc, XUSB_HOST_CONFIGURATION, reg);
870 	IPFS_RD4(sc, XUSB_HOST_CONFIGURATION);
871 
872 	/* Program bar for XHCI base address */
873 	reg = FPCI_RD4(sc, T_XUSB_CFG_4);
874 	reg &= ~CFG_4_BASE_ADDRESS(~0);
875 	reg |= CFG_4_BASE_ADDRESS((uint32_t)base_addr >> 15);
876 	FPCI_WR4(sc, T_XUSB_CFG_4, reg);
877 	FPCI_WR4(sc, T_XUSB_CFG_5, (uint32_t)((uint64_t)(base_addr) >> 32));
878 
879 	/* Enable bus master */
880 	reg = FPCI_RD4(sc, T_XUSB_CFG_1);
881 	reg |= CFG_1_IO_SPACE;
882 	reg |= CFG_1_MEMORY_SPACE;
883 	reg |= CFG_1_BUS_MASTER;
884 	FPCI_WR4(sc, T_XUSB_CFG_1, reg);
885 
886 	/* Enable Interrupts */
887 	reg = IPFS_RD4(sc, XUSB_HOST_INTR_MASK);
888 	reg |= INTR_IP_INT_MASK;
889 	IPFS_WR4(sc, XUSB_HOST_INTR_MASK, reg);
890 
891 	/* Set hysteresis */
892 	IPFS_WR4(sc, XUSB_HOST_CLKGATE_HYSTERESIS, 128);
893 
894 	rv = load_fw(sc);
895 	if (rv != 0)
896 		return rv;
897 	return (0);
898 }
899 
900 static int
901 tegra_xhci_probe(device_t dev)
902 {
903 
904 	if (!ofw_bus_status_okay(dev))
905 		return (ENXIO);
906 
907 	if (ofw_bus_search_compatible(dev, compat_data)->ocd_data != 0) {
908 		device_set_desc(dev, "Nvidia Tegra XHCI controller");
909 		return (BUS_PROBE_DEFAULT);
910 	}
911 	return (ENXIO);
912 }
913 
914 static int
915 tegra_xhci_detach(device_t dev)
916 {
917 	struct tegra_xhci_softc *sc;
918 	struct xhci_softc *xsc;
919 
920 	sc = device_get_softc(dev);
921 	xsc = &sc->xhci_softc;
922 
923 	/* during module unload there are lots of children leftover */
924 	device_delete_children(dev);
925 	if (sc->xhci_inited) {
926 		usb_callout_drain(&xsc->sc_callout);
927 		xhci_halt_controller(xsc);
928 	}
929 
930 	if (xsc->sc_irq_res && xsc->sc_intr_hdl) {
931 		bus_teardown_intr(dev, xsc->sc_irq_res, xsc->sc_intr_hdl);
932 		xsc->sc_intr_hdl = NULL;
933 	}
934 	if (xsc->sc_irq_res) {
935 		bus_release_resource(dev, SYS_RES_IRQ,
936 		    rman_get_rid(xsc->sc_irq_res), xsc->sc_irq_res);
937 		xsc->sc_irq_res = NULL;
938 	}
939 	if (xsc->sc_io_res != NULL) {
940 		bus_release_resource(dev, SYS_RES_MEMORY,
941 		    rman_get_rid(xsc->sc_io_res), xsc->sc_io_res);
942 		xsc->sc_io_res = NULL;
943 	}
944 	if (sc->xhci_inited)
945 		xhci_uninit(xsc);
946 	if (sc->irq_hdl_mbox != NULL)
947 		bus_teardown_intr(dev, sc->irq_res_mbox, sc->irq_hdl_mbox);
948 	if (sc->fw_vaddr != NULL)
949 		kmem_free(sc->fw_vaddr, sc->fw_size);
950 	LOCK_DESTROY(sc);
951 	return (0);
952 }
953 
954 static int
955 tegra_xhci_attach(device_t dev)
956 {
957 	struct tegra_xhci_softc *sc;
958 	struct xhci_softc *xsc;
959 	int rv, rid;
960 	phandle_t node;
961 
962 	sc = device_get_softc(dev);
963 	sc->dev = dev;
964 	sc->soc = (struct xhci_soc *)ofw_bus_search_compatible(dev,
965 	    compat_data)->ocd_data;
966 	node = ofw_bus_get_node(dev);
967 	xsc = &sc->xhci_softc;
968 	LOCK_INIT(sc);
969 
970 	rv = get_fdt_resources(sc, node);
971 	if (rv != 0) {
972 		rv = ENXIO;
973 		goto error;
974 	}
975 	rv = enable_fdt_resources(sc);
976 	if (rv != 0) {
977 		rv = ENXIO;
978 		goto error;
979 	}
980 
981 	/* Allocate resources. */
982 	rid = 0;
983 	xsc->sc_io_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
984 	    RF_ACTIVE);
985 	if (xsc->sc_io_res == NULL) {
986 		device_printf(dev,
987 		    "Could not allocate HCD memory resources\n");
988 		rv = ENXIO;
989 		goto error;
990 	}
991 	rid = 1;
992 	sc->mem_res_fpci = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
993 	    RF_ACTIVE);
994 	if (sc->mem_res_fpci == NULL) {
995 		device_printf(dev,
996 		    "Could not allocate FPCI memory resources\n");
997 		rv = ENXIO;
998 		goto error;
999 	}
1000 	rid = 2;
1001 	sc->mem_res_ipfs = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
1002 	    RF_ACTIVE);
1003 	if (sc->mem_res_ipfs == NULL) {
1004 		device_printf(dev,
1005 		    "Could not allocate IPFS memory resources\n");
1006 		rv = ENXIO;
1007 		goto error;
1008 	}
1009 
1010 	rid = 0;
1011 	xsc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
1012 	    RF_ACTIVE);
1013 	if (xsc->sc_irq_res == NULL) {
1014 		device_printf(dev, "Could not allocate HCD IRQ resources\n");
1015 		rv = ENXIO;
1016 		goto error;
1017 	}
1018 	rid = 1;
1019 	sc->irq_res_mbox = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
1020 	    RF_ACTIVE);
1021 	if (sc->irq_res_mbox == NULL) {
1022 		device_printf(dev, "Could not allocate MBOX IRQ resources\n");
1023 		rv = ENXIO;
1024 		goto error;
1025 	}
1026 
1027 	rv = init_hw(sc);
1028 	if (rv != 0) {
1029 		device_printf(dev, "Could not initialize  XUSB hardware\n");
1030 		goto error;
1031 	}
1032 
1033 	/* Wakeup and enable firmaware */
1034 	rv = mbox_send_cmd(sc, MBOX_CMD_MSG_ENABLED, 0);
1035 	if (rv != 0) {
1036 		device_printf(sc->dev, "Could not enable XUSB firmware\n");
1037 		goto error;
1038 	}
1039 
1040 	/* Fill data for XHCI driver. */
1041 	xsc->sc_bus.parent = dev;
1042 	xsc->sc_bus.devices = xsc->sc_devices;
1043 	xsc->sc_bus.devices_max = XHCI_MAX_DEVICES;
1044 
1045 	xsc->sc_io_tag = rman_get_bustag(xsc->sc_io_res);
1046 	xsc->sc_io_hdl = rman_get_bushandle(xsc->sc_io_res);
1047 	xsc->sc_io_size = rman_get_size(xsc->sc_io_res);
1048 	strlcpy(xsc->sc_vendor, "Nvidia", sizeof(xsc->sc_vendor));
1049 
1050 	/* Add USB bus device. */
1051 	xsc->sc_bus.bdev = device_add_child(sc->dev, "usbus", -1);
1052 	if (xsc->sc_bus.bdev == NULL) {
1053 		device_printf(sc->dev, "Could not add USB device\n");
1054 		rv = ENXIO;
1055 		goto error;
1056 	}
1057 	device_set_ivars(xsc->sc_bus.bdev, &xsc->sc_bus);
1058 	device_set_desc(xsc->sc_bus.bdev, "Nvidia USB 3.0 controller");
1059 
1060 	rv = xhci_init(xsc, sc->dev, 1);
1061 	if (rv != 0) {
1062 		device_printf(sc->dev, "USB init failed: %d\n", rv);
1063 		goto error;
1064 	}
1065 	sc->xhci_inited = true;
1066 	rv = xhci_start_controller(xsc);
1067 	if (rv != 0) {
1068 		device_printf(sc->dev,
1069 		    "Could not start XHCI controller: %d\n", rv);
1070 		goto error;
1071 	}
1072 
1073 	rv = bus_setup_intr(dev, sc->irq_res_mbox, INTR_TYPE_MISC | INTR_MPSAFE,
1074 	    NULL, intr_mbox, sc, &sc->irq_hdl_mbox);
1075 	if (rv != 0) {
1076 		device_printf(dev, "Could not setup error IRQ: %d\n",rv);
1077 		xsc->sc_intr_hdl = NULL;
1078 		goto error;
1079 	}
1080 
1081 	rv = bus_setup_intr(dev, xsc->sc_irq_res, INTR_TYPE_BIO | INTR_MPSAFE,
1082 	    NULL, (driver_intr_t *)xhci_interrupt, xsc, &xsc->sc_intr_hdl);
1083 	if (rv != 0) {
1084 		device_printf(dev, "Could not setup error IRQ: %d\n",rv);
1085 		xsc->sc_intr_hdl = NULL;
1086 		goto error;
1087 	}
1088 
1089 	/* Probe the bus. */
1090 	rv = device_probe_and_attach(xsc->sc_bus.bdev);
1091 	if (rv != 0) {
1092 		device_printf(sc->dev, "Could not initialize USB: %d\n", rv);
1093 		goto error;
1094 	}
1095 
1096 	return (0);
1097 
1098 error:
1099 panic("XXXXX");
1100 	tegra_xhci_detach(dev);
1101 	return (rv);
1102 }
1103 
1104 static device_method_t xhci_methods[] = {
1105 	/* Device interface */
1106 	DEVMETHOD(device_probe, tegra_xhci_probe),
1107 	DEVMETHOD(device_attach, tegra_xhci_attach),
1108 	DEVMETHOD(device_detach, tegra_xhci_detach),
1109 	DEVMETHOD(device_suspend, bus_generic_suspend),
1110 	DEVMETHOD(device_resume, bus_generic_resume),
1111 	DEVMETHOD(device_shutdown, bus_generic_shutdown),
1112 
1113 	/* Bus interface */
1114 	DEVMETHOD(bus_print_child, bus_generic_print_child),
1115 
1116 	DEVMETHOD_END
1117 };
1118 
1119 static DEFINE_CLASS_0(xhci, xhci_driver, xhci_methods,
1120     sizeof(struct tegra_xhci_softc));
1121 DRIVER_MODULE(tegra_xhci, simplebus, xhci_driver, NULL, NULL);
1122 MODULE_DEPEND(tegra_xhci, usb, 1, 1, 1);
1123