xref: /haiku/src/add-ons/kernel/busses/usb/xhci_hardware.h (revision 1978089f7cec856677e46204e992c7273d70b9af)
1 /*
2  * Copyright 2011-2012, Haiku Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Jian Chiang <j.jian.chiang@gmail.com>
7  *		Jérôme Duval <jerome.duval@gmail.com>
8  *		Akshay Jaggi <akshay1994.leo@gmail.com>
9  */
10 #ifndef XHCI_HARDWARE_H
11 #define XHCI_HARDWARE_H
12 
13 // PCI IDs
14 #define	PCI_VENDOR_INTEL						0x8086
15 #define	PCI_DEVICE_INTEL_PANTHER_POINT_XHCI		0x1e31
16 #define	PCI_DEVICE_INTEL_LYNX_POINT_XHCI		0x8c31
17 #define	PCI_DEVICE_INTEL_LYNX_POINT_LP_XHCI		0x9c31
18 #define	PCI_DEVICE_INTEL_BAYTRAIL_XHCI			0x0f35
19 #define	PCI_DEVICE_INTEL_WILDCAT_POINT_XHCI		0x8cb1
20 #define	PCI_DEVICE_INTEL_WILDCAT_POINT_LP_XHCI	0x9cb1
21 
22 // Intel quirks registers in PCI config
23 #define	XHCI_INTEL_USB3PRM				0xdc	// USB 3.0 Port Routing Mask
24 #define	XHCI_INTEL_USB3_PSSEN			0xd8	// USB 3.0 Port SuperSpeed Enable
25 #define	XHCI_INTEL_USB2PRM				0xd4	// USB 2.0 Port Routing Mask
26 #define	XHCI_INTEL_XUSB2PR				0xd0	// USB 2.0 Port Routing
27 
28 // Host Controller Capability Registers
29 #define XHCI_HCI_CAPLENGTH	0x00		// HCI Capability Register Length
30 #define HCI_CAPLENGTH(p)		(((p) >> 0) & 0xff)
31 #define XHCI_HCI_VERSION	0x00		// HCI Interface Version Number
32 #define HCI_VERSION(p)			(((p) >> 16) & 0xffff)
33 #define XHCI_HCSPARAMS1		0x04		// Structural Parameters 1
34 // HCSPARAMS1
35 #define HCS_MAX_SLOTS(p)		(((p) >> 0) & 0xff)
36 #define HCS_MAX_PORTS(p)		(((p) >> 24) & 0xff)
37 #define XHCI_HCSPARAMS2		0x08		// Structural Parameters 2
38 #define HCS_IST(p)				(((p) >> 0) & 0xf)
39 #define HCS_ERST_MAX(p)			(((p) >> 4) & 0xf)
40 #define HCS_SPR(p)				(((p) >> 26) & 0x1)
41 #define HCS_MAX_SC_BUFFERS(p)	(((((p) >> 21) & 0x1f)<<5)|(((p) >> 27) & 0x1f))
42 #define XHCI_HCSPARAMS3		0x0C		// Structural Parameters 3
43 #define HCS_U1_DEVICE_LATENCY(p)	(((p) >> 0) & 0xff)
44 #define HCS_U2_DEVICE_LATENCY(p)	(((p) >> 16) & 0xffff)
45 #define XHCI_HCCPARAMS		0x10		// Capability Parameters
46 #define HCC_AC64(p)				(((p) >> 0) & 0x1)
47 #define HCC_BNC(p)				(((p) >> 1) & 0x1)
48 #define HCC_CSZ(p)				(((p) >> 2) & 0x1)
49 #define HCC_PPC(p)				(((p) >> 3) & 0x1)
50 #define HCC_PIND(p)				(((p) >> 4) & 0x1)
51 #define HCC_LHRC(p)				(((p) >> 5) & 0x1)
52 #define HCC_LTC(p)				(((p) >> 6) & 0x1)
53 #define HCC_NSS(p)				(((p) >> 7) & 0x1)
54 #define HCC_PAE(p)				(((p) >> 8) & 0x1)
55 #define HCC_SPC(p)				(((p) >> 9) & 0x1)
56 #define HCC_SEC(p)				(((p) >> 10) & 0x1)
57 #define HCC_CFC(p)				(((p) >> 11) & 0x1)
58 #define HCC_MAXPSASIZE(p)		(((p) >> 12) & 0xf)
59 #define HCC_XECP(p)				(((p) >> 16) & 0xfff)
60 #define XHCI_DBOFF			0x14		// Doorbell Register offset
61 #define XHCI_RTSOFF			0x18		// Runtime Register Space offset
62 
63 
64 // Host Controller Operational Registers
65 #define XHCI_CMD			0x00		// USB Command
66 // USB Command Register
67 #define CMD_RUN				(1 << 0)
68 #define CMD_HCRST			(1 << 1)	// Host Controller Reset
69 #define CMD_INTE			(1 << 2)	// IRQ Enable
70 #define CMD_HSEE			(1 << 3)	// Host System Error En
71 #define CMD_LHCRST			(1 << 7)	// Light Host Controller Reset
72 #define CMD_CSS				(1 << 8)	// Controller Save State
73 #define CMD_CRS				(1 << 9)	// Controller Restore State
74 #define CMD_EWE				(1 << 10)	// Enable Wrap Event
75 
76 #define XHCI_STS			0x04		// USB Status
77 // USB Status Register
78 #define STS_HCH				(1 << 0)	// Host Controller Halt
79 #define STS_HSE				(1 << 2)	// Host System Error
80 #define STS_EINT			(1 << 3)	// Event Interrupt
81 #define STS_PCD				(1 << 4)	// Port Change Detect
82 #define STS_SSS				(1 << 8)	// Save State Status
83 #define STS_RSS				(1 << 9)	// Restore State Status
84 #define STS_SRE				(1 << 10)	// Save Restore Error
85 #define STS_CNR				(1 << 11)	// Controller Not Ready
86 #define STS_HCE				(1 << 12)	// Host Controller Error
87 
88 #define XHCI_PAGESIZE		0x08		// PAGE SIZE
89 #define XHCI_DNCTRL			0x14
90 // Section 5.4.5
91 #define XHCI_CRCR_LO		0x18
92 #define XHCI_CRCR_HI		0x1C
93 #define CRCR_RCS			(1<<0)
94 #define CRCR_CS				(1<<1)
95 #define CRCR_CA				(1<<2)
96 #define CRCR_CRR			(1<<3)
97 // Section 5.4.6
98 #define XHCI_DCBAAP_LO		0x30
99 #define XHCI_DCBAAP_HI		0x34
100 // Section 5.4.7
101 #define XHCI_CONFIG			0x38
102 
103 
104 // Host Controller Runtime Registers
105 #define XHCI_MFINDEX		0x0000
106 // Section 5.5.2.1
107 #define XHCI_IMAN(n)		(0x0020 + (0x20 * (n)))
108 // IMAN
109 #define IMAN_INTR_ENA		0x00000002
110 // Section 5.5.2.2
111 #define XHCI_IMOD(n)		(0x0024 + (0x20 * (n)))
112 // Section 5.5.2.3.1
113 #define XHCI_ERSTSZ(n)		(0x0028 + (0x20 * (n)))
114 // ERSTSZ
115 #define XHCI_ERSTS_SET(x)	((x) & 0xFFFF)
116 // Section 5.5.2.3.2
117 #define XHCI_ERSTBA_LO(n)	(0x0030 + (0x20 * (n)))
118 #define XHCI_ERSTBA_HI(n)	(0x0034 + (0x20 * (n)))
119 // Section 5.5.2.3.3
120 #define XHCI_ERDP_LO(n)		(0x0038 + (0x20 * (n)))
121 #define XHCI_ERDP_HI(n)		(0x003C + (0x20 * (n)))
122 // Event Handler Busy (EHB)
123 #define ERDP_BUSY			(1 << 3)
124 
125 
126 // Host Controller Doorbell Registers
127 #define XHCI_DOORBELL(n)				(0x0000 + (4 * (n)))
128 #define XHCI_DOORBELL_TARGET(x)			((x) & 0xff)
129 #define XHCI_DOORBELL_TARGET_GET(x)		((x) & 0xff)
130 #define XHCI_DOORBELL_STREAMID(x)		(((x) & 0xffff) << 16)
131 #define XHCI_DOORBELL_STREAMID_GET(x)	(((x) >> 16) & 0xffff)
132 
133 
134 // Extended Capabilities
135 #define XECP_ID(x)				((x) & 0xff)
136 #define HCS0_XECP(x)			(((x) >> 16) & 0xffff)
137 #define XECP_NEXT(x)			(((x) >> 8) & 0xff)
138 #define XHCI_LEGSUP_CAPID		0x01
139 #define XHCI_LEGSUP_OSOWNED		(1 << 24)	// OS Owned Semaphore
140 #define XHCI_LEGSUP_BIOSOWNED	(1 << 16)	// BIOS Owned Semaphore
141 
142 #define XHCI_LEGCTLSTS				0x04
143 #define XHCI_LEGCTLSTS_DISABLE_SMI	((0x7 << 1) + (0xff << 5) + (0x7 << 17))
144 #define XHCI_LEGCTLSTS_EVENTS_SMI	(0x7 << 29)
145 
146 #define XHCI_SUPPORTED_PROTOCOLS_CAPID		0x02
147 #define XHCI_SUPPORTED_PROTOCOLS_0_MINOR(x)	(((x) >> 16) & 0xff)
148 #define XHCI_SUPPORTED_PROTOCOLS_0_MAJOR(x)	(((x) >> 24) & 0xff)
149 
150 #define XHCI_SUPPORTED_PROTOCOLS_1_COUNT(x)	(((x) >> 8) & 0xff)
151 #define XHCI_SUPPORTED_PROTOCOLS_1_OFFSET(x) (((x) >> 0) & 0xff)
152 
153 
154 // Port status Registers
155 // Section 5.4.8
156 #define XHCI_PORTSC(n)			(0x400 + (0x10 * (n)))
157 #define PS_CCS					(1 << 0)
158 #define PS_PED					(1 << 1)
159 #define PS_OCA					(1 << 3)
160 #define PS_PR					(1 << 4)
161 #define PS_PP					(1 << 9)
162 #define PS_SPEED_GET(x)			(((x) >> 10) & 0xF)
163 #define PS_LWS					(1 << 16)
164 #define PS_CSC					(1 << 17)
165 #define PS_PEC					(1 << 18)
166 #define PS_WRC					(1 << 19)
167 #define PS_OCC					(1 << 20)
168 #define PS_PRC					(1 << 21)
169 #define PS_PLC					(1 << 22)
170 #define PS_CEC					(1 << 23)
171 #define PS_CAS					(1 << 24)
172 #define PS_WCE					(1 << 25)
173 #define PS_WDE					(1 << 26)
174 #define PS_WPR					(1 << 30)
175 
176 #define PS_CLEAR				0x80FF00F7U
177 
178 #define PS_PLS_MASK				(0xf << 5)
179 #define PS_XDEV_U0				(0x0 << 5)
180 #define PS_XDEV_U1				(0x1 << 5)
181 #define PS_XDEV_U2				(0x2 << 5)
182 #define PS_XDEV_U3				(0x3 << 5)
183 #define PS_XDEV_DISABLED		(0x4 << 5)
184 #define PS_XDEV_RXDETECT		(0x5 << 5)
185 #define PS_XDEV_INACTIVE		(0x6 << 5)
186 #define PS_XDEV_POLLING			(0x7 << 5)
187 #define PS_XDEV_RECOVERY		(0x8 << 5)
188 #define PS_XDEV_HOT_RESET		(0x9 << 5)
189 #define PS_XDEV_COMP_MODE		(0xa << 5)
190 #define PS_XDEV_TEST_MODE		(0xb << 5)
191 #define PS_XDEV_RESUME			(0xf << 5)
192 
193 
194 // Completion Code
195 #define TRB_2_COMP_CODE_GET(x)		(((x) >> 24) & 0xff)
196 #define COMP_INVALID				0
197 #define COMP_SUCCESS				1
198 #define COMP_DATA_BUFFER			2
199 #define COMP_BABBLE					3
200 #define COMP_USB_TRANSACTION		4
201 #define COMP_TRB					5
202 #define COMP_STALL					6
203 #define COMP_RESOURCE				7
204 #define COMP_BANDWIDTH				8
205 #define COMP_NO_SLOTS				9
206 #define COMP_INVALID_STREAM			10
207 #define COMP_SLOT_NOT_ENABLED		11
208 #define COMP_ENDPOINT_NOT_ENABLED	12
209 #define COMP_SHORT_PACKET			13
210 #define COMP_RING_UNDERRUN			14
211 #define COMP_RING_OVERRUN			15
212 #define COMP_VF_RING_FULL			16
213 #define COMP_PARAMETER				17
214 #define COMP_BANDWIDTH_OVERRUN		18
215 #define COMP_CONTEXT_STATE			19
216 #define COMP_NO_PING_RESPONSE		20
217 #define COMP_EVENT_RING_FULL		21
218 #define COMP_INCOMPATIBLE_DEVICE	22
219 #define COMP_MISSED_SERVICE			23
220 #define COMP_COMMAND_RING_STOPPED	24
221 #define COMP_COMMAND_ABORTED		25
222 #define COMP_STOPPED				26
223 #define COMP_STOPPED_LENGTH_INVALID	27
224 #define COMP_MAX_EXIT_LATENCY		29
225 #define COMP_ISOC_OVERRUN			31
226 #define COMP_EVENT_LOST				32
227 #define COMP_UNDEFINED				33
228 #define COMP_INVALID_STREAM_ID		34
229 #define COMP_SECONDARY_BANDWIDTH	35
230 #define COMP_SPLIT_TRANSACTION		36
231 
232 #define TRB_2_TD_SIZE(x)		(((x) & 0x1F) << 17)
233 #define TRB_2_TD_SIZE_GET(x)	(((x) >> 17) & 0x1F)
234 #define TRB_2_REM(x)			((x) & 0xFFFFFF)
235 #define TRB_2_REM_GET(x)		((x) & 0xFFFFFF)
236 #define TRB_2_BYTES(x)			((x) & 0x1FFFF)
237 #define TRB_2_BYTES_GET(x)		((x) & 0x1FFFF)
238 #define TRB_2_IRQ(x)			(((x) & 0x3FF) << 22)
239 #define TRB_2_IRQ_GET(x)		(((x) >> 22) & 0x3FF)
240 #define TRB_2_STREAM(x)			(((x) & 0xFF) << 16)
241 #define TRB_2_STREAM_GET(x)		(((x) >> 16) & 0xFF)
242 
243 #define TRB_3_TYPE(x)			(((x) & 0x3F) << 10)
244 #define TRB_3_TYPE_GET(x)		(((x) >> 10) & 0x3F)
245 // TRB Type (table 131)
246 #define TRB_TYPE_NORMAL					1
247 #define TRB_TYPE_SETUP_STAGE			2
248 #define TRB_TYPE_DATA_STAGE				3
249 #define TRB_TYPE_STATUS_STAGE			4
250 #define TRB_TYPE_ISOCH					5
251 #define TRB_TYPE_LINK					6
252 #define TRB_TYPE_EVENT_DATA				7
253 #define TRB_TYPE_TR_NOOP				8
254 // commands
255 #define TRB_TYPE_ENABLE_SLOT			9
256 #define TRB_TYPE_DISABLE_SLOT			10
257 #define TRB_TYPE_ADDRESS_DEVICE			11
258 #define TRB_TYPE_CONFIGURE_ENDPOINT		12
259 #define TRB_TYPE_EVALUATE_CONTEXT		13
260 #define TRB_TYPE_RESET_ENDPOINT			14
261 #define TRB_TYPE_STOP_ENDPOINT			15
262 #define TRB_TYPE_SET_TR_DEQUEUE			16
263 #define TRB_TYPE_RESET_DEVICE			17
264 #define TRB_TYPE_FORCE_EVENT			18
265 #define TRB_TYPE_NEGOCIATE_BW			19
266 #define TRB_TYPE_SET_LATENCY_TOLERANCE	20
267 #define TRB_TYPE_GET_PORT_BW			21
268 #define TRB_TYPE_FORCE_HEADER			22
269 #define TRB_TYPE_CMD_NOOP				23
270 // events
271 #define TRB_TYPE_TRANSFER				32
272 #define TRB_TYPE_COMMAND_COMPLETION		33
273 #define TRB_TYPE_PORT_STATUS_CHANGE		34
274 #define TRB_TYPE_BANDWIDTH_REQUEST		35
275 #define TRB_TYPE_DOORBELL				36
276 #define TRB_TYPE_HOST_CONTROLLER		37
277 #define TRB_TYPE_DEVICE_NOTIFICATION	38
278 #define TRB_TYPE_MFINDEX_WRAP			39
279 // vendor
280 #define TRB_TYPE_NEC_COMMAND_COMPLETION	48
281 #define TRB_TYPE_NEC_GET_FIRMWARE_REV	49
282 
283 #define TRB_3_CYCLE_BIT				(1U << 0)
284 #define TRB_3_TC_BIT				(1U << 1)
285 #define TRB_3_ENT_BIT				(1U << 1)
286 #define TRB_3_ISP_BIT				(1U << 2)
287 #define TRB_3_EVENT_DATA_BIT		(1U << 2)
288 #define TRB_3_NSNOOP_BIT			(1U << 3)
289 #define TRB_3_CHAIN_BIT				(1U << 4)
290 #define TRB_3_IOC_BIT				(1U << 5)
291 #define TRB_3_IDT_BIT				(1U << 6)
292 #define TRB_3_BEI_BIT				(1U << 9)
293 #define TRB_3_DCEP_BIT				(1U << 9)
294 #define TRB_3_PRSV_BIT				(1U << 9)
295 #define TRB_3_BSR_BIT				(1U << 9)
296 #define TRB_3_TRT_MASK				(3U << 16)
297 #define TRB_3_DIR_IN				(1U << 16)
298 #define TRB_3_TRT_OUT				(2U << 16)
299 #define TRB_3_TRT_IN				(3U << 16)
300 #define TRB_3_SUSPEND_ENDPOINT_BIT	(1U << 23)
301 #define TRB_3_ISO_SIA_BIT			(1U << 31)
302 
303 #define TRB_3_TBC(x)			(((x) & 0x3) << 7)
304 #define TRB_3_TBC_GET(x)		(((x) >> 7) & 0x3)
305 #define TRB_3_TLBPC(x)			(((x) & 0xf) << 16)
306 #define TRB_3_TLBPC_GET(x)		(((x) >> 16) & 0xf)
307 #define TRB_3_ENDPOINT(x)		(((x) & 0x1f) << 16)
308 #define TRB_3_ENDPOINT_GET(x)	(((x) >> 16) & 0x1f)
309 #define TRB_3_FRID(x)			(((x) & 0x7ff) << 20)
310 #define TRB_3_FRID_GET(x)		(((x) >> 20) & 0x7ff)
311 #define TRB_3_SLOT(x)			(((x) & 0xff) << 24)
312 #define TRB_3_SLOT_GET(x)		(((x) >> 24) & 0xff)
313 
314 
315 #define XHCI_MAX_EVENTS			(16 * 13)
316 #define XHCI_MAX_COMMANDS		(16 * 1)
317 #define XHCI_MAX_SLOTS			255
318 #define XHCI_MAX_PORTS			127
319 #define XHCI_MAX_ENDPOINTS		32
320 // the spec says 1023, however this would cross the page boundary
321 #define XHCI_MAX_SCRATCHPADS	256
322 #define XHCI_MAX_DEVICES		128
323 #define XHCI_MAX_TRANSFERS		8
324 
325 
326 struct xhci_trb {
327 	uint64 address;
328 	uint32 status;
329 	uint32 flags;
330 } __attribute__((__aligned__(4)));
331 
332 
333 // Section 6.5
334 struct xhci_erst_element {
335 	uint64	rs_addr;
336 	uint32	rs_size;
337 	uint32	rsvdz;
338 } __attribute__((__aligned__(64)));
339 
340 
341 struct xhci_device_context_array {
342 	uint64	baseAddress[XHCI_MAX_SLOTS];
343 	struct {
344 		uint64 padding;
345 	} __attribute__((__aligned__(64)));
346 	uint64	scratchpad[XHCI_MAX_SCRATCHPADS];
347 };
348 
349 
350 struct xhci_slot_ctx {
351 	uint32	dwslot0;
352 	uint32	dwslot1;
353 	uint32	dwslot2;
354 	uint32	dwslot3;
355 	uint32	reserved[4];
356 };
357 
358 #define SLOT_0_ROUTE(x)					((x) & 0xFFFFF)
359 #define SLOT_0_ROUTE_GET(x)				((x) & 0xFFFFF)
360 #define SLOT_0_SPEED(x)					(((x) & 0xF) << 20)
361 #define SLOT_0_SPEED_GET(x)				(((x) >> 20) & 0xF)
362 #define SLOT_0_MTT_BIT					(1U << 25)
363 #define SLOT_0_HUB_BIT					(1U << 26)
364 #define SLOT_0_NUM_ENTRIES(x)			(((x) & 0x1F) << 27)
365 #define SLOT_0_NUM_ENTRIES_GET(x)		(((x) >> 27) & 0x1F)
366 
367 #define SLOT_1_MAX_EXIT_LATENCY(x)		((x) & 0xFFFF)
368 #define SLOT_1_MAX_EXIT_LATENCY_GET(x)	((x) & 0xFFFF)
369 #define SLOT_1_RH_PORT(x)				(((x) & 0xFF) << 16)
370 #define SLOT_1_RH_PORT_GET(x)			(((x) >> 16) & 0xFF)
371 #define SLOT_1_NUM_PORTS(x)				(((x) & 0xFF) << 24)
372 #define SLOT_1_NUM_PORTS_GET(x)			(((x) >> 24) & 0xFF)
373 
374 #define SLOT_2_TT_HUB_SLOT(x)			((x) & 0xFF)
375 #define SLOT_2_TT_HUB_SLOT_GET(x)		((x) & 0xFF)
376 #define SLOT_2_PORT_NUM(x)				(((x) & 0xFF) << 8)
377 #define SLOT_2_PORT_NUM_GET(x)			(((x) >> 8) & 0xFF)
378 #define SLOT_2_TT_TIME(x)				(((x) & 0x3) << 16)
379 #define SLOT_2_TT_TIME_GET(x)			(((x) >> 16) & 0x3)
380 #define SLOT_2_IRQ_TARGET(x)			(((x) & 0x7F) << 22)
381 #define SLOT_2_IRQ_TARGET_GET(x)		(((x) >> 22) & 0x7F)
382 
383 #define SLOT_3_DEVICE_ADDRESS(x)		((x) & 0xFF)
384 #define SLOT_3_DEVICE_ADDRESS_GET(x)	((x) & 0xFF)
385 #define SLOT_3_SLOT_STATE(x)			(((x) & 0x1F) << 27)
386 #define SLOT_3_SLOT_STATE_GET(x)		(((x) >> 27) & 0x1F)
387 
388 #define	HUB_TTT_GET(x)					(((x) >> 5) & 0x3)
389 
390 struct xhci_endpoint_ctx {
391 	uint32	dwendpoint0;
392 	uint32	dwendpoint1;
393 	uint64	qwendpoint2;
394 	uint32	dwendpoint4;
395 	uint32	reserved[3];
396 };
397 
398 
399 #define ENDPOINT_0_STATE(x)				((x) & 0x7)
400 #define ENDPOINT_0_STATE_GET(x)			((x) & 0x7)
401 #define ENDPOINT_0_MULT(x)				(((x) & 0x3) << 8)
402 #define ENDPOINT_0_MULT_GET(x)			(((x) >> 8) & 0x3)
403 #define ENDPOINT_0_MAXPSTREAMS(x)		(((x) & 0x1F) << 10)
404 #define ENDPOINT_0_MAXPSTREAMS_GET(x)	(((x) >> 10) & 0x1F)
405 #define ENDPOINT_0_LSA_BIT				(1U << 15)
406 #define ENDPOINT_0_INTERVAL(x)			(((x) & 0xFF) << 16)
407 #define ENDPOINT_0_INTERVAL_GET(x)		(((x) >> 16) & 0xFF)
408 
409 #define ENDPOINT_1_CERR(x)				(((x) & 0x3) << 1)
410 #define ENDPOINT_1_CERR_GET(x)			(((x) >> 1) & 0x3)
411 #define ENDPOINT_1_EPTYPE(x)			(((x) & 0x7) << 3)
412 #define ENDPOINT_1_EPTYPE_GET(x)		(((x) >> 3) & 0x7)
413 #define ENDPOINT_1_HID_BIT				(1U << 7)
414 #define ENDPOINT_1_MAXBURST(x)			(((x) & 0xFF) << 8)
415 #define ENDPOINT_1_MAXBURST_GET(x)		(((x) >> 8) & 0xFF)
416 #define ENDPOINT_1_MAXPACKETSIZE(x)		(((x) & 0xFFFF) << 16)
417 #define ENDPOINT_1_MAXPACKETSIZE_GET(x)	(((x) >> 16) & 0xFFFF)
418 
419 #define ENDPOINT_2_DCS_BIT				(1U << 0)
420 
421 #define ENDPOINT_4_AVGTRBLENGTH(x)		((x) & 0xFFFF)
422 #define ENDPOINT_4_AVGTRBLENGTH_GET(x)	((x) & 0xFFFF)
423 #define ENDPOINT_4_MAXESITPAYLOAD(x)	(((x) & 0xFFFF) << 16)
424 #define ENDPOINT_4_MAXESITPAYLOAD_GET(x) (((x) >> 16) & 0xFFFF)
425 
426 #define ENDPOINT_STATE_DISABLED		0
427 #define ENDPOINT_STATE_RUNNING		1
428 #define ENDPOINT_STATE_HALTED		2
429 #define ENDPOINT_STATE_STOPPED		3
430 #define ENDPOINT_STATE_ERROR		4
431 #define ENDPOINT_STATE_RESERVED_5	5
432 #define ENDPOINT_STATE_RESERVED_6	6
433 #define ENDPOINT_STATE_RESERVED_7	7
434 
435 struct xhci_stream_ctx {
436 	uint64	qwstream0;
437 	uint32	reserved[2];
438 };
439 
440 
441 struct xhci_input_ctx {
442 	uint32	dropFlags;
443 	uint32	addFlags;
444 	uint32	reserved[6];
445 };
446 
447 
448 struct xhci_input_device_ctx {
449 	struct xhci_input_ctx input;
450 	struct xhci_slot_ctx slot;
451 	struct xhci_endpoint_ctx endpoints[XHCI_MAX_ENDPOINTS - 1];
452 };
453 
454 
455 struct xhci_device_ctx {
456 	struct xhci_slot_ctx slot;
457 	struct xhci_endpoint_ctx endpoints[XHCI_MAX_ENDPOINTS - 1];
458 };
459 
460 
461 #endif // !XHCI_HARDWARE_H
462