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