xref: /illumos-gate/usr/src/uts/common/sys/usb/hcd/xhci/xhci.h (revision ec82ef79)
1993e3fafSRobert Mustacchi /*
2993e3fafSRobert Mustacchi  * This file and its contents are supplied under the terms of the
3993e3fafSRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4993e3fafSRobert Mustacchi  * You may only use this file in accordance with the terms of version
5993e3fafSRobert Mustacchi  * 1.0 of the CDDL.
6993e3fafSRobert Mustacchi  *
7993e3fafSRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8993e3fafSRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9993e3fafSRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10993e3fafSRobert Mustacchi  */
11993e3fafSRobert Mustacchi 
12993e3fafSRobert Mustacchi /*
132aba3acdSRobert Mustacchi  * Copyright (c) 2018, Joyent, Inc.
14*ec82ef79SMatthias Scheler  * Copyright (c) 2019 by Western Digital Corporation
15993e3fafSRobert Mustacchi  */
16993e3fafSRobert Mustacchi 
17993e3fafSRobert Mustacchi #ifndef _SYS_USB_XHCI_XHCI_H
18993e3fafSRobert Mustacchi #define	_SYS_USB_XHCI_XHCI_H
19993e3fafSRobert Mustacchi 
20993e3fafSRobert Mustacchi /*
21993e3fafSRobert Mustacchi  * Extensible Host Controller Interface (xHCI) USB Driver
22993e3fafSRobert Mustacchi  */
23993e3fafSRobert Mustacchi 
24993e3fafSRobert Mustacchi #include <sys/conf.h>
25993e3fafSRobert Mustacchi #include <sys/ddi.h>
26993e3fafSRobert Mustacchi #include <sys/sunddi.h>
27993e3fafSRobert Mustacchi #include <sys/taskq_impl.h>
28993e3fafSRobert Mustacchi #include <sys/sysmacros.h>
29993e3fafSRobert Mustacchi #include <sys/usb/hcd/xhci/xhcireg.h>
30993e3fafSRobert Mustacchi 
31993e3fafSRobert Mustacchi #include <sys/usb/usba.h>
32993e3fafSRobert Mustacchi #include <sys/usb/usba/hcdi.h>
33993e3fafSRobert Mustacchi #include <sys/usb/hubd/hub.h>
34993e3fafSRobert Mustacchi #include <sys/usb/usba/hubdi.h>
35993e3fafSRobert Mustacchi #include <sys/usb/hubd/hubdvar.h>
36993e3fafSRobert Mustacchi 
37993e3fafSRobert Mustacchi 
38993e3fafSRobert Mustacchi #ifdef __cplusplus
39993e3fafSRobert Mustacchi extern "C" {
40993e3fafSRobert Mustacchi #endif
41993e3fafSRobert Mustacchi 
42993e3fafSRobert Mustacchi /*
43993e3fafSRobert Mustacchi  * The base segment for DMA attributes was determined to be 4k based on xHCI 1.1
44993e3fafSRobert Mustacchi  * / table 54: Data Structure Max Size, Boundary, and Alignment Requirement
45993e3fafSRobert Mustacchi  * Summary.  This indicates that the required alignment for most things is
46993e3fafSRobert Mustacchi  * PAGESIZE, which in our current implementation is required to be 4K. We
47993e3fafSRobert Mustacchi  * provide the ring segment value below for the things which need 64K alignment
48993e3fafSRobert Mustacchi  *
49993e3fafSRobert Mustacchi  * Similarly, in the same table, the maximum required alignment is 64 bytes,
50993e3fafSRobert Mustacchi  * hence we use that for everything.
51993e3fafSRobert Mustacchi  *
52993e3fafSRobert Mustacchi  * Next is the scatter/gather lengths. For most of the data structures, we only
53993e3fafSRobert Mustacchi  * want to have a single SGL entry, e.g. just a simple flat mapping. For many of
54993e3fafSRobert Mustacchi  * our transfers, we use the same logic to simplify the implementation of the
55993e3fafSRobert Mustacchi  * driver. However, for bulk transfers, which are the largest by far, we want to
56993e3fafSRobert Mustacchi  * be able to leverage SGLs to give us more DMA flexibility.
57993e3fafSRobert Mustacchi  *
58993e3fafSRobert Mustacchi  * We can transfer up to 64K in one transfer request block (TRB) which
59993e3fafSRobert Mustacchi  * corresponds to a single SGL entry. Each ring we create is a single page in
602aba3acdSRobert Mustacchi  * size and will support at most 256 TRBs. To try and give the operating system
612aba3acdSRobert Mustacchi  * flexibility when allocating DMA transfers, we've opted to allow up to 63
622aba3acdSRobert Mustacchi  * SGLs. Because there isn't a good way to support DMA windows with the xHCI
632aba3acdSRobert Mustacchi  * controller design, if this number is too small then DMA allocations and
642aba3acdSRobert Mustacchi  * binding might fail. If the DMA binding fails, the transfer will fail.
652aba3acdSRobert Mustacchi  *
662aba3acdSRobert Mustacchi  * The reason that we use 63 SGLs and not the expected 64 is that we always need
672aba3acdSRobert Mustacchi  * to allocate an additional TRB for the event data. This leaves us with a
682aba3acdSRobert Mustacchi  * nicely divisible number of entries.
692aba3acdSRobert Mustacchi  *
702aba3acdSRobert Mustacchi  * The final piece of this is the maximum sized transfer that the driver
712aba3acdSRobert Mustacchi  * advertises to the broader framework. This is currently sized at 512 KiB. For
722aba3acdSRobert Mustacchi  * reference the ehci driver sized this value at 640 KiB. It's important to
732aba3acdSRobert Mustacchi  * understand that this isn't reflected in the DMA attribute limitation, because
742aba3acdSRobert Mustacchi  * it's not an attribute of the hardware. Experimentally, this has proven to be
752aba3acdSRobert Mustacchi  * sufficient for most of the drivers that we support today. When considering
762aba3acdSRobert Mustacchi  * increasing this number, please note the impact that might have on the
772aba3acdSRobert Mustacchi  * required number of DMA SGL entries required to satisfy the allocation.
782aba3acdSRobert Mustacchi  *
792aba3acdSRobert Mustacchi  * The value of 512 KiB was originally based on the number of SGLs we supported
802aba3acdSRobert Mustacchi  * multiplied by the maximum transfer size. The original number of
812aba3acdSRobert Mustacchi  * XHCI_TRANSFER_DMA_SGL was 8. The 512 KiB value was based upon taking the
822aba3acdSRobert Mustacchi  * number of SGLs and assuming that each TRB used its maximum transfer size of
832aba3acdSRobert Mustacchi  * 64 KiB.
84993e3fafSRobert Mustacchi  */
852aba3acdSRobert Mustacchi #define	XHCI_TRB_MAX_TRANSFER	65536	/* 64 KiB */
86993e3fafSRobert Mustacchi #define	XHCI_DMA_ALIGN		64
87993e3fafSRobert Mustacchi #define	XHCI_DEF_DMA_SGL	1
882aba3acdSRobert Mustacchi #define	XHCI_TRANSFER_DMA_SGL	63
892aba3acdSRobert Mustacchi #define	XHCI_MAX_TRANSFER	524288	/* 512 KiB */
90993e3fafSRobert Mustacchi 
91993e3fafSRobert Mustacchi /*
92993e3fafSRobert Mustacchi  * Properties and values for rerouting ehci ports to xhci.
93993e3fafSRobert Mustacchi  */
94993e3fafSRobert Mustacchi #define	XHCI_PROP_REROUTE_DISABLE	0
95993e3fafSRobert Mustacchi #define	XHCI_PROP_REROUTE_DEFAULT	1
96993e3fafSRobert Mustacchi 
97993e3fafSRobert Mustacchi /*
98993e3fafSRobert Mustacchi  * This number is a bit made up. Truthfully, the API here isn't the most useful
99993e3fafSRobert Mustacchi  * for what we need to define as it should really be based on the endpoint that
100993e3fafSRobert Mustacchi  * we're interested in rather than the device as a whole.
101993e3fafSRobert Mustacchi  *
102993e3fafSRobert Mustacchi  * We're basically being asked how many TRBs we're willing to schedule in one
103993e3fafSRobert Mustacchi  * go. There's no great way to come up with this number, so we basically are
104993e3fafSRobert Mustacchi  * making up something such that we use up a good portion of a ring, but not too
105993e3fafSRobert Mustacchi  * much of it.
106993e3fafSRobert Mustacchi  */
107993e3fafSRobert Mustacchi #define	XHCI_ISOC_MAX_TRB	64
108993e3fafSRobert Mustacchi 
109993e3fafSRobert Mustacchi #ifdef	DEBUG
110993e3fafSRobert Mustacchi #define	XHCI_DMA_SYNC(dma, flag)	VERIFY0(ddi_dma_sync( \
111993e3fafSRobert Mustacchi 					    (dma).xdb_dma_handle, 0, 0, \
112993e3fafSRobert Mustacchi 					    (flag)))
113993e3fafSRobert Mustacchi #else
114993e3fafSRobert Mustacchi #define	XHCI_DMA_SYNC(dma, flag)	((void) ddi_dma_sync( \
115993e3fafSRobert Mustacchi 					    (dma).xdb_dma_handle, 0, 0, \
116993e3fafSRobert Mustacchi 					    (flag)))
117993e3fafSRobert Mustacchi #endif
118993e3fafSRobert Mustacchi 
1192aba3acdSRobert Mustacchi /*
1202aba3acdSRobert Mustacchi  * TRBs need to indicate the number of remaining USB packets in the overall
1212aba3acdSRobert Mustacchi  * transfer. This is a 5-bit value, which means that the maximum value we can
1222aba3acdSRobert Mustacchi  * store in that TRD field is 31.
1232aba3acdSRobert Mustacchi  */
1242aba3acdSRobert Mustacchi #define	XHCI_MAX_TDSIZE		31
1252aba3acdSRobert Mustacchi 
126993e3fafSRobert Mustacchi /*
127993e3fafSRobert Mustacchi  * This defines a time in 2-ms ticks that is required to wait for the controller
128993e3fafSRobert Mustacchi  * to be ready to go. Section 5.4.8 of the XHCI specification in the description
129993e3fafSRobert Mustacchi  * of the PORTSC register indicates that the upper bound is 20 ms. Therefore the
130993e3fafSRobert Mustacchi  * number of ticks is 10.
131993e3fafSRobert Mustacchi  */
132993e3fafSRobert Mustacchi #define	XHCI_POWER_GOOD	10
133993e3fafSRobert Mustacchi 
134993e3fafSRobert Mustacchi /*
135993e3fafSRobert Mustacchi  * Definitions to determine the default number of interrupts. Note that we only
136993e3fafSRobert Mustacchi  * bother with a single interrupt at this time, though we've arranged the driver
137993e3fafSRobert Mustacchi  * to make it possible to request more if, for some unlikely reason, it becomes
138993e3fafSRobert Mustacchi  * necessary.
139993e3fafSRobert Mustacchi  */
140993e3fafSRobert Mustacchi #define	XHCI_NINTR	1
141993e3fafSRobert Mustacchi 
142993e3fafSRobert Mustacchi /*
143993e3fafSRobert Mustacchi  * Default interrupt modulation value. This enables us to have 4000 interrupts /
144993e3fafSRobert Mustacchi  * second. This is supposed to be the default value of the controller. See xHCI
145993e3fafSRobert Mustacchi  * 1.1 / 4.17.2 for more information.
146993e3fafSRobert Mustacchi  */
1472aba3acdSRobert Mustacchi #define	XHCI_IMOD_DEFAULT	0x000003F8U
148993e3fafSRobert Mustacchi 
149993e3fafSRobert Mustacchi /*
150993e3fafSRobert Mustacchi  * Definitions that surround the default values used in various contexts. These
151993e3fafSRobert Mustacchi  * come from various parts of the xHCI specification. In general, see xHCI 1.1 /
152993e3fafSRobert Mustacchi  * 4.8.2. Note that the MPS_MASK is used for ISOCH and INTR endpoints which have
153993e3fafSRobert Mustacchi  * different sizes.
154993e3fafSRobert Mustacchi  *
155993e3fafSRobert Mustacchi  * The burst member is a bit more complicated. By default for USB 2 devices, it
156993e3fafSRobert Mustacchi  * only matters for ISOCH and INTR endpoints and so we use the macros below to
157993e3fafSRobert Mustacchi  * pull it out of the endpoint description's max packet field. For USB 3, it
158993e3fafSRobert Mustacchi  * matters for non-control endpoints. However, it comes out of a companion
159993e3fafSRobert Mustacchi  * description.
160993e3fafSRobert Mustacchi  *
161993e3fafSRobert Mustacchi  * By default the mult member is zero for all cases except for super speed
162993e3fafSRobert Mustacchi  * ISOCH endpoints, where it comes from the companion descriptor.
163993e3fafSRobert Mustacchi  */
164993e3fafSRobert Mustacchi #define	XHCI_CONTEXT_DEF_CERR		3
165993e3fafSRobert Mustacchi #define	XHCI_CONTEXT_ISOCH_CERR		0
166993e3fafSRobert Mustacchi #define	XHCI_CONTEXT_MPS_MASK		0x07ff
167993e3fafSRobert Mustacchi #define	XHCI_CONTEXT_BURST_MASK		0x1800
168993e3fafSRobert Mustacchi #define	XHCI_CONTEXT_BURST_SHIFT	11
169993e3fafSRobert Mustacchi #define	XHCI_CONTEXT_DEF_MULT		0
170993e3fafSRobert Mustacchi #define	XHCI_CONTEXT_DEF_MAX_ESIT	0
171993e3fafSRobert Mustacchi #define	XHCI_CONTEXT_DEF_CTRL_ATL	8
172993e3fafSRobert Mustacchi 
173993e3fafSRobert Mustacchi /*
174993e3fafSRobert Mustacchi  * This number represents the number of transfers that we'll set up for a given
175993e3fafSRobert Mustacchi  * interrupt transfer. Note that the idea here is that we'll want to allocate a
176993e3fafSRobert Mustacchi  * certain number of transfers to basically ensure that we'll always be able to
177993e3fafSRobert Mustacchi  * have a transfer available, even if the system is a bit caught up in trying to
178993e3fafSRobert Mustacchi  * process it and for some reason we can't fire the interrupt. As such, we
179993e3fafSRobert Mustacchi  * basically want to have enough available that at the fastest interval (125 us)
180993e3fafSRobert Mustacchi  * that we have enough. So in this case we choose 8, with the assumption that we
181993e3fafSRobert Mustacchi  * should be able to process at least one in a given millisecond. Note that this
182993e3fafSRobert Mustacchi  * is not based in fact and is really just as much a guess and a hope.
183993e3fafSRobert Mustacchi  *
184993e3fafSRobert Mustacchi  * While we could then use less resources for other interrupt transfers that are
185993e3fafSRobert Mustacchi  * slower, starting with uniform resource usage will make things a bit easier.
186993e3fafSRobert Mustacchi  */
187993e3fafSRobert Mustacchi #define	XHCI_INTR_IN_NTRANSFERS	8
188993e3fafSRobert Mustacchi 
189993e3fafSRobert Mustacchi /*
190993e3fafSRobert Mustacchi  * This number represents the number of xhci_transfer_t structures that we'll
191993e3fafSRobert Mustacchi  * set up for a given isochronous transfer polling request. A given isochronous
192993e3fafSRobert Mustacchi  * transfer may actually have multiple units of time associated with it. As
193993e3fafSRobert Mustacchi  * such, we basically want to treat this like a case of classic double
194993e3fafSRobert Mustacchi  * buffering. We have one ready to go while the other is being filled up. This
195993e3fafSRobert Mustacchi  * will compensate for additional latency in the system. This is smaller than
196993e3fafSRobert Mustacchi  * the Interrupt IN transfer case above as many callers may ask for multiple
197993e3fafSRobert Mustacchi  * intervals in a single request.
198993e3fafSRobert Mustacchi  */
199993e3fafSRobert Mustacchi #define	XHCI_ISOC_IN_NTRANSFERS	2
200993e3fafSRobert Mustacchi 
201993e3fafSRobert Mustacchi #define	XHCI_PERIODIC_IN_NTRANSFERS					\
202993e3fafSRobert Mustacchi 	MAX(XHCI_ISOC_IN_NTRANSFERS, XHCI_INTR_IN_NTRANSFERS)
203993e3fafSRobert Mustacchi 
204993e3fafSRobert Mustacchi /*
205993e3fafSRobert Mustacchi  * Mask for a route string which is a 20-bit value.
206993e3fafSRobert Mustacchi  */
207993e3fafSRobert Mustacchi #define	XHCI_ROUTE_MASK(x)	((x) & 0xfffff)
208993e3fafSRobert Mustacchi 
209993e3fafSRobert Mustacchi /*
210993e3fafSRobert Mustacchi  * This is the default tick that we use for timeouts while endpoints have
211993e3fafSRobert Mustacchi  * outstanding, active, non-periodic transfers. We choose one second as the USBA
212993e3fafSRobert Mustacchi  * specifies timeouts in units of seconds. Note that this is in microseconds, so
213993e3fafSRobert Mustacchi  * it can be fed into drv_usectohz().
214993e3fafSRobert Mustacchi  */
215993e3fafSRobert Mustacchi #define	XHCI_TICK_TIMEOUT_US	(MICROSEC)
216993e3fafSRobert Mustacchi 
217993e3fafSRobert Mustacchi /*
218993e3fafSRobert Mustacchi  * Set of bits that we need one of to indicate that this port has something
219993e3fafSRobert Mustacchi  * interesting on it.
220993e3fafSRobert Mustacchi  */
221993e3fafSRobert Mustacchi #define	XHCI_HUB_INTR_CHANGE_MASK	(XHCI_PS_CSC | XHCI_PS_PEC | \
222993e3fafSRobert Mustacchi     XHCI_PS_WRC | XHCI_PS_OCC | XHCI_PS_PRC | XHCI_PS_PLC | XHCI_PS_CEC)
223993e3fafSRobert Mustacchi 
224993e3fafSRobert Mustacchi /*
225993e3fafSRobert Mustacchi  * These represent known issues with various xHCI controllers.
226993e3fafSRobert Mustacchi  *
2272aba3acdSRobert Mustacchi  *	XHCI_QUIRK_NO_MSI	MSI support on this controller is known to be
2282aba3acdSRobert Mustacchi  *				broken.
229993e3fafSRobert Mustacchi  *
2302aba3acdSRobert Mustacchi  *	XHCI_QUIRK_32_ONLY	Only use 32-bit DMA addreses with this
2312aba3acdSRobert Mustacchi  *				controller.
232993e3fafSRobert Mustacchi  *
2332aba3acdSRobert Mustacchi  *	XHCI_QUIRK_INTC_EHCI	This is an Intel platform which supports
2342aba3acdSRobert Mustacchi  *				rerouting ports between EHCI and xHCI
2352aba3acdSRobert Mustacchi  *				controllers on the platform.
236993e3fafSRobert Mustacchi  */
237993e3fafSRobert Mustacchi typedef enum xhci_quirk {
238993e3fafSRobert Mustacchi 	XHCI_QUIRK_NO_MSI	= 0x01,
239993e3fafSRobert Mustacchi 	XHCI_QUIRK_32_ONLY	= 0x02,
240993e3fafSRobert Mustacchi 	XHCI_QUIRK_INTC_EHCI	= 0x04
241993e3fafSRobert Mustacchi } xhci_quirk_t;
242993e3fafSRobert Mustacchi 
243993e3fafSRobert Mustacchi /*
244993e3fafSRobert Mustacchi  * xHCI capability parameter flags. These are documented in xHCI 1.1 / 5.3.6.
245993e3fafSRobert Mustacchi  */
246993e3fafSRobert Mustacchi typedef enum xhci_cap_flags {
2472aba3acdSRobert Mustacchi 	XCAP_AC64	= 0x001,
248993e3fafSRobert Mustacchi 	XCAP_BNC	= 0x002,
249993e3fafSRobert Mustacchi 	XCAP_CSZ	= 0x004,
250993e3fafSRobert Mustacchi 	XCAP_PPC	= 0x008,
251993e3fafSRobert Mustacchi 	XCAP_PIND	= 0x010,
252993e3fafSRobert Mustacchi 	XCAP_LHRC	= 0x020,
253993e3fafSRobert Mustacchi 	XCAP_LTC	= 0x040,
254993e3fafSRobert Mustacchi 	XCAP_NSS	= 0x080,
255993e3fafSRobert Mustacchi 	XCAP_PAE	= 0x100,
256993e3fafSRobert Mustacchi 	XCAP_SPC	= 0x200,
257993e3fafSRobert Mustacchi 	XCAP_SEC	= 0x400,
258993e3fafSRobert Mustacchi 	XCAP_CFC	= 0x800
259993e3fafSRobert Mustacchi } xchi_cap_flags_t;
260993e3fafSRobert Mustacchi 
261993e3fafSRobert Mustacchi /*
262993e3fafSRobert Mustacchi  * Second set of capabilities, these are documented in xHCI 1.1 / 5.3.9.
263993e3fafSRobert Mustacchi  */
264993e3fafSRobert Mustacchi typedef enum xhci_cap2_flags {
265993e3fafSRobert Mustacchi 	XCAP2_U3C	= 0x01,
266993e3fafSRobert Mustacchi 	XCAP2_CMC	= 0x02,
267993e3fafSRobert Mustacchi 	XCAP2_FMC	= 0x04,
268993e3fafSRobert Mustacchi 	XCAP2_CTC	= 0x08,
269993e3fafSRobert Mustacchi 	XCAP2_LEC	= 0x10,
270993e3fafSRobert Mustacchi 	XCAP2_CIC	= 0x20
271993e3fafSRobert Mustacchi } xhci_cap2_flags_t;
272993e3fafSRobert Mustacchi 
273993e3fafSRobert Mustacchi /*
274993e3fafSRobert Mustacchi  * These represent and store the various capability registers that we'll need to
275993e3fafSRobert Mustacchi  * use. In addition, we stash a few other versioning related bits here. Note
276993e3fafSRobert Mustacchi  * that we cache more information than we might need so that we have it for
277993e3fafSRobert Mustacchi  * debugging purposes.
278993e3fafSRobert Mustacchi  */
279993e3fafSRobert Mustacchi typedef struct xhci_capability {
280993e3fafSRobert Mustacchi 	uint8_t			xcap_usb_vers;
281993e3fafSRobert Mustacchi 	uint16_t		xcap_hci_vers;
282993e3fafSRobert Mustacchi 	uint32_t		xcap_pagesize;
283993e3fafSRobert Mustacchi 	uint8_t			xcap_max_slots;
284993e3fafSRobert Mustacchi 	uint16_t		xcap_max_intrs;
285993e3fafSRobert Mustacchi 	uint8_t			xcap_max_ports;
286993e3fafSRobert Mustacchi 	boolean_t		xcap_ist_micro;
287993e3fafSRobert Mustacchi 	uint8_t			xcap_ist;
288993e3fafSRobert Mustacchi 	uint16_t		xcap_max_esrt;
289993e3fafSRobert Mustacchi 	boolean_t		xcap_scratch_restore;
290993e3fafSRobert Mustacchi 	uint16_t		xcap_max_scratch;
291993e3fafSRobert Mustacchi 	uint8_t			xcap_u1_lat;
292993e3fafSRobert Mustacchi 	uint16_t		xcap_u2_lat;
293993e3fafSRobert Mustacchi 	xchi_cap_flags_t	xcap_flags;
294993e3fafSRobert Mustacchi 	uint8_t			xcap_max_psa;
295993e3fafSRobert Mustacchi 	uint16_t		xcap_xecp_off;
296993e3fafSRobert Mustacchi 	xhci_cap2_flags_t	xcap_flags2;
297993e3fafSRobert Mustacchi 	int			xcap_intr_types;
298993e3fafSRobert Mustacchi } xhci_capability_t;
299993e3fafSRobert Mustacchi 
300993e3fafSRobert Mustacchi /*
301993e3fafSRobert Mustacchi  * This represents a single logical DMA allocation. For the vast majority of
302993e3fafSRobert Mustacchi  * non-transfer cases, it only represents a single DMA buffer and not a
303993e3fafSRobert Mustacchi  * scatter-gather list.
304993e3fafSRobert Mustacchi  */
305993e3fafSRobert Mustacchi typedef struct xhci_dma_buffer {
306993e3fafSRobert Mustacchi 	caddr_t			xdb_va;		/* Buffer VA */
307993e3fafSRobert Mustacchi 	size_t			xdb_len;	/* Buffer logical len */
308993e3fafSRobert Mustacchi 	ddi_acc_handle_t	xdb_acc_handle;	/* Access handle */
309993e3fafSRobert Mustacchi 	ddi_dma_handle_t	xdb_dma_handle;	/* DMA handle */
310993e3fafSRobert Mustacchi 	int			xdb_ncookies;	/* Number of actual cookies */
311993e3fafSRobert Mustacchi 	ddi_dma_cookie_t	xdb_cookies[XHCI_TRANSFER_DMA_SGL];
312993e3fafSRobert Mustacchi } xhci_dma_buffer_t;
313993e3fafSRobert Mustacchi 
314993e3fafSRobert Mustacchi /*
315993e3fafSRobert Mustacchi  * This is a single transfer descriptor. It's packed to match the hardware
316993e3fafSRobert Mustacchi  * layout.
317993e3fafSRobert Mustacchi  */
318993e3fafSRobert Mustacchi #pragma pack(1)
319993e3fafSRobert Mustacchi typedef struct xhci_trb {
320993e3fafSRobert Mustacchi 	uint64_t	trb_addr;
321993e3fafSRobert Mustacchi 	uint32_t	trb_status;
322993e3fafSRobert Mustacchi 	uint32_t	trb_flags;
323993e3fafSRobert Mustacchi } xhci_trb_t;
324993e3fafSRobert Mustacchi #pragma pack()
325993e3fafSRobert Mustacchi 
326993e3fafSRobert Mustacchi /*
327993e3fafSRobert Mustacchi  * This represents a single transfer that we want to allocate and perform.
328993e3fafSRobert Mustacchi  */
329993e3fafSRobert Mustacchi typedef struct xhci_transfer {
330993e3fafSRobert Mustacchi 	list_node_t		xt_link;
331993e3fafSRobert Mustacchi 	hrtime_t		xt_sched_time;
332993e3fafSRobert Mustacchi 	xhci_dma_buffer_t	xt_buffer;
333993e3fafSRobert Mustacchi 	uint_t			xt_ntrbs;
334993e3fafSRobert Mustacchi 	uint_t			xt_short;
335993e3fafSRobert Mustacchi 	uint_t			xt_timeout;
336993e3fafSRobert Mustacchi 	usb_cr_t		xt_cr;
337993e3fafSRobert Mustacchi 	boolean_t		xt_data_tohost;
338993e3fafSRobert Mustacchi 	xhci_trb_t		*xt_trbs;
3392aba3acdSRobert Mustacchi 	uint64_t		*xt_trbs_pa;
340993e3fafSRobert Mustacchi 	usb_isoc_pkt_descr_t	*xt_isoc;
341993e3fafSRobert Mustacchi 	usb_opaque_t		xt_usba_req;
342993e3fafSRobert Mustacchi } xhci_transfer_t;
343993e3fafSRobert Mustacchi 
344993e3fafSRobert Mustacchi /*
345993e3fafSRobert Mustacchi  * This represents a ring in xHCI, upon which event, transfer, and command TRBs
346993e3fafSRobert Mustacchi  * are scheduled.
347993e3fafSRobert Mustacchi  */
348993e3fafSRobert Mustacchi typedef struct xhci_ring {
349993e3fafSRobert Mustacchi 	xhci_dma_buffer_t	xr_dma;
350993e3fafSRobert Mustacchi 	uint_t			xr_ntrb;
351993e3fafSRobert Mustacchi 	xhci_trb_t		*xr_trb;
352993e3fafSRobert Mustacchi 	uint_t			xr_head;
353993e3fafSRobert Mustacchi 	uint_t			xr_tail;
354993e3fafSRobert Mustacchi 	uint8_t			xr_cycle;
355993e3fafSRobert Mustacchi } xhci_ring_t;
356993e3fafSRobert Mustacchi 
357993e3fafSRobert Mustacchi /*
358993e3fafSRobert Mustacchi  * This structure is used to represent the xHCI Device Context Base Address
359993e3fafSRobert Mustacchi  * Array. It's defined in section 6.1 of the specification and is required for
360993e3fafSRobert Mustacchi  * the controller to start.
361993e3fafSRobert Mustacchi  *
362993e3fafSRobert Mustacchi  * The maximum number of slots supported is always 256, therefore we size this
363993e3fafSRobert Mustacchi  * structure at its maximum.
364993e3fafSRobert Mustacchi  */
365993e3fafSRobert Mustacchi #define	XHCI_MAX_SLOTS	256
366993e3fafSRobert Mustacchi #define	XHCI_DCBAA_SCRATCHPAD_INDEX	0
367993e3fafSRobert Mustacchi 
368993e3fafSRobert Mustacchi typedef struct xhci_dcbaa {
369993e3fafSRobert Mustacchi 	uint64_t		*xdc_base_addrs;
370993e3fafSRobert Mustacchi 	xhci_dma_buffer_t	xdc_dma;
371993e3fafSRobert Mustacchi } xhci_dcbaa_t;
372993e3fafSRobert Mustacchi 
373993e3fafSRobert Mustacchi typedef struct xhci_scratchpad {
374993e3fafSRobert Mustacchi 	uint64_t		*xsp_addrs;
375993e3fafSRobert Mustacchi 	xhci_dma_buffer_t	xsp_addr_dma;
376993e3fafSRobert Mustacchi 	xhci_dma_buffer_t	*xsp_scratch_dma;
377993e3fafSRobert Mustacchi } xhci_scratchpad_t;
378993e3fafSRobert Mustacchi 
379993e3fafSRobert Mustacchi /*
380993e3fafSRobert Mustacchi  * Contexts. These structures are inserted into the DCBAA above and are used for
381993e3fafSRobert Mustacchi  * describing the state of the system. Note, that while many of these are
382993e3fafSRobert Mustacchi  * 32-bytes in size, the xHCI specification defines that they'll be extended to
383993e3fafSRobert Mustacchi  * 64-bytes with all the extra bytes as zeros if the CSZ flag is set in the
384993e3fafSRobert Mustacchi  * HCCPARAMS1 register, e.g. we have the flag XCAP_CSZ set.
385993e3fafSRobert Mustacchi  *
386993e3fafSRobert Mustacchi  * The device context covers the slot context and 31 endpoints.
387993e3fafSRobert Mustacchi  */
388993e3fafSRobert Mustacchi #define	XHCI_DEVICE_CONTEXT_32	1024
389993e3fafSRobert Mustacchi #define	XHCI_DEVICE_CONTEXT_64	2048
390993e3fafSRobert Mustacchi #define	XHCI_NUM_ENDPOINTS	31
391993e3fafSRobert Mustacchi #define	XHCI_DEFAULT_ENDPOINT	0
392993e3fafSRobert Mustacchi 
393993e3fafSRobert Mustacchi #pragma pack(1)
394993e3fafSRobert Mustacchi typedef struct xhci_slot_context {
395993e3fafSRobert Mustacchi 	uint32_t	xsc_info;
396993e3fafSRobert Mustacchi 	uint32_t	xsc_info2;
397993e3fafSRobert Mustacchi 	uint32_t	xsc_tt;
398993e3fafSRobert Mustacchi 	uint32_t	xsc_state;
399993e3fafSRobert Mustacchi 	uint32_t	xsc_reserved[4];
400993e3fafSRobert Mustacchi } xhci_slot_context_t;
401993e3fafSRobert Mustacchi 
402993e3fafSRobert Mustacchi typedef struct xhci_endpoint_context {
403993e3fafSRobert Mustacchi 	uint32_t	xec_info;
404993e3fafSRobert Mustacchi 	uint32_t	xec_info2;
405993e3fafSRobert Mustacchi 	uint64_t	xec_dequeue;
406993e3fafSRobert Mustacchi 	uint32_t	xec_txinfo;
407993e3fafSRobert Mustacchi 	uint32_t	xec_reserved[3];
408993e3fafSRobert Mustacchi } xhci_endpoint_context_t;
409993e3fafSRobert Mustacchi 
410993e3fafSRobert Mustacchi typedef struct xhci_input_context {
411993e3fafSRobert Mustacchi 	uint32_t	xic_drop_flags;
412993e3fafSRobert Mustacchi 	uint32_t	xic_add_flags;
413993e3fafSRobert Mustacchi 	uint32_t	xic_reserved[6];
414993e3fafSRobert Mustacchi } xhci_input_context_t;
415993e3fafSRobert Mustacchi #pragma pack()
416993e3fafSRobert Mustacchi 
417993e3fafSRobert Mustacchi /*
418993e3fafSRobert Mustacchi  * Definitions and structures for maintaining the event ring.
419993e3fafSRobert Mustacchi  */
420993e3fafSRobert Mustacchi #define	XHCI_EVENT_NSEGS	1
421993e3fafSRobert Mustacchi 
422993e3fafSRobert Mustacchi #pragma pack(1)
423993e3fafSRobert Mustacchi typedef struct xhci_event_segment {
424993e3fafSRobert Mustacchi 	uint64_t	xes_addr;
425993e3fafSRobert Mustacchi 	uint16_t	xes_size;
426993e3fafSRobert Mustacchi 	uint16_t	xes_rsvd0;
427993e3fafSRobert Mustacchi 	uint32_t	xes_rsvd1;
428993e3fafSRobert Mustacchi } xhci_event_segment_t;
429993e3fafSRobert Mustacchi #pragma pack()
430993e3fafSRobert Mustacchi 
431993e3fafSRobert Mustacchi typedef struct xhci_event_ring {
432993e3fafSRobert Mustacchi 	xhci_event_segment_t	*xev_segs;
433993e3fafSRobert Mustacchi 	xhci_dma_buffer_t	xev_dma;
434993e3fafSRobert Mustacchi 	xhci_ring_t		xev_ring;
435993e3fafSRobert Mustacchi } xhci_event_ring_t;
436993e3fafSRobert Mustacchi 
437993e3fafSRobert Mustacchi typedef enum xhci_command_ring_state {
438993e3fafSRobert Mustacchi 	XHCI_COMMAND_RING_IDLE		= 0x00,
439993e3fafSRobert Mustacchi 	XHCI_COMMAND_RING_RUNNING	= 0x01,
440993e3fafSRobert Mustacchi 	XHCI_COMMAND_RING_ABORTING	= 0x02,
441993e3fafSRobert Mustacchi 	XHCI_COMMAND_RING_ABORT_DONE	= 0x03
442993e3fafSRobert Mustacchi } xhci_command_ring_state_t;
443993e3fafSRobert Mustacchi 
444993e3fafSRobert Mustacchi typedef struct xhci_command_ring {
445993e3fafSRobert Mustacchi 	xhci_ring_t			xcr_ring;
446993e3fafSRobert Mustacchi 	kmutex_t			xcr_lock;
447993e3fafSRobert Mustacchi 	kcondvar_t			xcr_cv;
448993e3fafSRobert Mustacchi 	list_t				xcr_commands;
449993e3fafSRobert Mustacchi 	timeout_id_t			xcr_timeout;
450993e3fafSRobert Mustacchi 	xhci_command_ring_state_t	xcr_state;
451993e3fafSRobert Mustacchi } xhci_command_ring_t;
452993e3fafSRobert Mustacchi 
453993e3fafSRobert Mustacchi /*
454993e3fafSRobert Mustacchi  * Individual command states.
455993e3fafSRobert Mustacchi  *
456993e3fafSRobert Mustacchi  * XHCI_COMMAND_S_INIT		The command has yet to be inserted into the
4572aba3acdSRobert Mustacchi  *				command ring.
458993e3fafSRobert Mustacchi  *
459993e3fafSRobert Mustacchi  * XHCI_COMMAND_S_QUEUED	The command is queued in the command ring.
460993e3fafSRobert Mustacchi  *
461993e3fafSRobert Mustacchi  * XHCI_COMMAND_S_RECEIVED	A command completion for this was received.
462993e3fafSRobert Mustacchi  *
463993e3fafSRobert Mustacchi  * XHCI_COMMAND_S_DONE		The command has been executed. Note that it may
464