xref: /illumos-gate/usr/src/uts/common/sys/usb/hcd/ehci/ehci.h (revision 89b2a9fbeabf42fa54594df0e5927bcc50a07cc9)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef _SYS_USB_EHCI_H
27 #define	_SYS_USB_EHCI_H
28 
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 /*
35  * Enhanced Host Controller Driver (EHCI)
36  *
37  * The EHCI driver is a software driver which interfaces to the Universal
38  * Serial Bus layer (USBA) and the Host Controller (HC). The interface to
39  * the Host Controller is defined by the EHCI Host Controller Interface.
40  *
41  * This header file describes the registers and data structures shared by
42  * the EHCI USB controller (HC) and the EHCI Driver.
43  */
44 
45 #include <sys/types.h>
46 #include <sys/pci.h>
47 #include <sys/sunddi.h>
48 #include <sys/sunndi.h>
49 #include <sys/ndi_impldefs.h>
50 #include <sys/disp.h>
51 
52 #include <sys/usb/usba.h>
53 
54 #include <sys/usb/usba/hcdi.h>
55 
56 #include <sys/usb/hubd/hub.h>
57 #include <sys/usb/usba/hubdi.h>
58 #include <sys/usb/hubd/hubdvar.h>
59 
60 #include <sys/id32.h>
61 
62 #define	EHCI_MAX_RH_PORTS	31	/* Maximum root hub ports */
63 
64 
65 /*
66  * Each EHCI buffer can hold upto 4k bytes of data. Hence there is a
67  * restriction of 4k alignment while allocating a dma buffer.
68  */
69 #define	EHCI_4K_ALIGN			0x1000
70 
71 /*
72  * USB Host controller DMA scatter gather list defines for
73  * Sparc and non-sparc architectures.
74  */
75 #if defined(__sparc)
76 #define	EHCI_DMA_ATTR_MAX_XFER		0xffffffffull
77 #define	EHCI_DMA_ATTR_COUNT_MAX		0xffffffffull
78 #define	EHCI_DMA_ATTR_GRANULAR		512
79 #define	EHCI_DMA_ATTR_ALIGNMENT		EHCI_4K_ALIGN
80 #else
81 #define	EHCI_DMA_ATTR_MAX_XFER		0x00ffffffull
82 #define	EHCI_DMA_ATTR_COUNT_MAX		0x00ffffffull
83 #define	EHCI_DMA_ATTR_GRANULAR		1
84 #define	EHCI_DMA_ATTR_ALIGNMENT		EHCI_4K_ALIGN
85 #endif
86 
87 /* Set the default data structure (QTD,QH,SITD,ITD) to a 32 byte alignment */
88 #define	EHCI_DMA_ATTR_TD_QH_ALIGNMENT	0x0020
89 #define	EHCI_DMA_ATTR_PFL_ALIGNMENT	EHCI_4K_ALIGN
90 
91 /* TW scatter/gatter list defines */
92 #define	EHCI_DMA_ATTR_TW_SGLLEN		0x7fffffff
93 
94 /*
95  * EHCI Capability Registers
96  *
97  * The registers specify the limits, restrictions and capabilities of the
98  * specific EHCI Host Controller implementation.
99  */
100 typedef	volatile struct	ehci_caps {
101 	uint8_t		ehci_caps_length;	/* Capability register length */
102 	uint8_t		ehci_pad;		/* Reserved */
103 	uint16_t	ehci_version;		/* Interface version number */
104 	uint32_t	ehci_hcs_params;	/* Structural paramters */
105 	uint32_t	ehci_hcc_params;	/* Capability paramters */
106 	uint8_t		ehci_port_route[8];	/* Companion port route */
107 } ehci_caps_t;
108 
109 /*
110  * EHCI revision
111  *
112  * EHCI driver supports EHCI host controllers compliant to 0.95 and higher
113  * revisions of EHCI specifications.
114  */
115 #define	EHCI_REVISION_0_95		0x95	   /* Revision 0.95 */
116 
117 /* EHCI HCS Params Register Bits */
118 #define	EHCI_HCS_PORT_INDICATOR		0x00010000 /* Port indicator control */
119 #define	EHCI_HCS_NUM_COMP_CTRLS		0x0000F000 /* No of companion ctrls */
120 #define	EHCI_HCS_NUM_COMP_CTRL_SHIFT	12
121 #define	EHCI_HCS_NUM_PORTS_CC		0x00000F00 /* Ports per classic ctrls */
122 #define	EHCI_HCS_NUM_PORTS_CC_SHIFT	8
123 #define	EHCI_HCS_PORT_ROUTING_RULES	0x00000080 /* Port routing rules */
124 #define	EHCI_HCS_PORT_POWER_CONTROL	0x00000010 /* Port power control */
125 #define	EHCI_HCS_NUM_PORTS		0x0000000F /* No of root hub ports */
126 
127 /* EHCI HCC Params Register Bits */
128 #define	EHCI_HCC_EECP			0x0000FF00 /* Extended capbilities */
129 #define	EHCI_HCC_EECP_SHIFT		8
130 #define	EHCI_HCC_EECP_MIN_OFFSET	0x00000040 /* Minimum valid offset */
131 #define	EHCI_HCC_ISOCH_SCHED_THRESHOLD	0x000000F0 /* Isoch sched threshold */
132 #define	EHCI_HCC_ASYNC_SCHED_PARK_CAP	0x00000004 /* Async schedule park cap */
133 #define	EHCI_HCC_PROG_FRAME_LIST_FLAG	0x00000002 /* Prog frame list flag */
134 #define	EHCI_HCC_64BIT_ADDR_CAP		0x00000001 /* 64bit addr capability */
135 
136 /* EHCI Port Route Register Bits */
137 #define	EHCI_PORT_ROUTE_EVEN		0x0F	   /* Classic even port route */
138 #define	EHCI_PORT_ROUTE_ODD		0xF0	   /* Classic odd port route */
139 #define	EHCI_PORT_ROUTE_ODD_SHIFT	4
140 
141 
142 /*
143  * EHCI Operational Registers
144  *
145  * The EHCI Host Controller contains a set of on-chip operational registers
146  * which are mapped into a non-cacheable portion  of the system addressable
147  * space. These registers are also used by the EHCI Host Controller Driver.
148  * This structure must be aligned to 32 byte boundary.
149  */
150 typedef volatile struct ehci_regs {
151 	/* Control and status registers */
152 	uint32_t	ehci_command;		 /* USB commands */
153 	uint32_t	ehci_status;		 /* USB status */
154 	uint32_t	ehci_interrupt;		 /* Interrupt enable */
155 	uint32_t	ehci_frame_index;	 /* Frame index */
156 
157 	/* Memory pointer registers */
158 	uint32_t	ehci_ctrl_segment;	 /* Control data segment */
159 	uint32_t	ehci_periodic_list_base; /* Period frm list base addr */
160 	uint32_t	ehci_async_list_addr;	 /* Async list base address */
161 	uint32_t	ehci_pad[9];		 /* Head of the bulk list */
162 
163 	/* Root hub registers */
164 	uint32_t	ehci_config_flag;	 /* Config Flag */
165 	uint32_t	ehci_rh_port_status[EHCI_MAX_RH_PORTS];
166 			/* Root hub port status and control information */
167 } ehci_regs_t;
168 
169 /* EHCI Command Register Bits */
170 #define	EHCI_CMD_INTR_THRESHOLD		0x00FF0000 /* Intr threshold control */
171 #define	EHCI_CMD_INTR_SHIFT		16
172 #define	EHCI_CMD_01_INTR		0x00010000 /* 01 micro-frame */
173 #define	EHCI_CMD_02_INTR		0x00020000 /* 02 micro-frames */
174 #define	EHCI_CMD_04_INTR		0x00040000 /* 04 micro-frames */
175 #define	EHCI_CMD_08_INTR		0x00080000 /* 08 micro-frames */
176 #define	EHCI_CMD_16_INTR		0x00100000 /* 16 micro-frames */
177 #define	EHCI_CMD_32_INTR		0x00200000 /* 32 micro-frames */
178 #define	EHCI_CMD_64_INTR		0x00400000 /* 64 micro-frames */
179 
180 #define	EHCI_CMD_ASYNC_PARK_ENABLE	0x00000800 /* Async sched park enable */
181 #define	EHCI_CMD_ASYNC_PARK_COUNT	0x00000300 /* Async sched park count */
182 #define	EHCI_CMD_ASYNC_PARK_COUNT_1	0x00000100 /* Async sched park cnt 1 */
183 #define	EHCI_CMD_ASYNC_PARK_COUNT_2	0x00000200 /* Async sched park cnt 2 */
184 #define	EHCI_CMD_ASYNC_PARK_COUNT_3	0x00000300 /* Async sched park cnt 3 */
185 #define	EHCI_CMD_ASYNC_PARK_SHIFT	8
186 #define	EHCI_CMD_LIGHT_HC_RESET		0x00000080 /* Light host ctrl reset */
187 #define	EHCI_CMD_INTR_ON_ASYNC_ADVANCE	0x00000040 /* Async advance doorbell */
188 #define	EHCI_CMD_ASYNC_SCHED_ENABLE	0x00000020 /* Async schedule enable */
189 #define	EHCI_CMD_PERIODIC_SCHED_ENABLE	0x00000010 /* Periodic sched enable */
190 #define	EHCI_CMD_FRAME_LIST_SIZE	0x0000000C /* Frame list size */
191 #define	EHCI_CMD_FRAME_LIST_SIZE_SHIFT	2
192 #define	EHCI_CMD_FRAME_1024_SIZE	0x00000000 /* 1024 frame list size */
193 #define	EHCI_CMD_FRAME_512_SIZE		0x00000004 /* 512 frame list size */
194 #define	EHCI_CMD_FRAME_256_SIZE		0X00000008 /* 256 frame list size */
195 #define	EHCI_CMD_HOST_CTRL_RESET	0x00000002 /* Host controller reset */
196 #define	EHCI_CMD_HOST_CTRL_RS		0x00000001 /* Host ctrl run or stop */
197 #define	EHCI_CMD_HOST_CTRL_RUN		0x00000001 /* Host controller run */
198 #define	EHCI_CMD_HOST_CTRL_STOP		0x00000000 /* Host controller stop */
199 
200 /* EHCI Status Register Bits */
201 #define	EHCI_STS_ASYNC_SCHED_STATUS	0x00008000 /* Async schedule status */
202 #define	EHCI_STS_PERIODIC_SCHED_STATUS	0x00004000 /* Periodic sched status */
203 #define	EHCI_STS_EMPTY_ASYNC_SCHEDULE	0x00002000 /* Empty async schedule */
204 #define	EHCI_STS_HOST_CTRL_HALTED	0x00001000 /* Host controller Halted */
205 #define	EHCI_STS_ASYNC_ADVANCE_INTR	0x00000020 /* Intr on async advance */
206 #define	EHCI_STS_HOST_SYSTEM_ERROR_INTR	0x00000010 /* Host system error */
207 #define	EHCI_STS_FRM_LIST_ROLLOVER_INTR	0x00000008 /* Frame list rollover */
208 #define	EHCI_STS_RH_PORT_CHANGE_INTR	0x00000004 /* Port change detect */
209 #define	EHCI_STS_USB_ERROR_INTR		0x00000002 /* USB error interrupt */
210 #define	EHCI_STS_USB_INTR		0x00000001 /* USB interrupt */
211 
212 /* EHCI Interrupt Register Bits */
213 #define	EHCI_INTR_ASYNC_ADVANCE		0x00000020 /* Async advance interrupt */
214 #define	EHCI_INTR_HOST_SYSTEM_ERROR	0x00000010 /* Host system error intr */
215 #define	EHCI_INTR_FRAME_LIST_ROLLOVER	0x00000008 /* Framelist rollover intr */
216 #define	EHCI_INTR_RH_PORT_CHANGE	0x00000004 /* Port change interrupt */
217 #define	EHCI_INTR_USB_ERROR		0x00000002 /* USB error interrupt */
218 #define	EHCI_INTR_USB			0x00000001 /* USB interrupt */
219 
220 /* EHCI Frame Index Register Bits */
221 #define	EHCI_FRAME_INDEX		0x00003FFF /* Frame index */
222 #define	EHCI_FRAME_1024			0x00003FFF /* 1024 elements */
223 #define	EHCI_FRAME_0512			0x00001FFF /* 512 elements */
224 #define	EHCI_FRAME_0256			0x00000FFF /* 256 elements */
225 
226 /* EHCI Control Data Structure Segment Register Bits */
227 /* Most significant 32 bits for all EHCI data structures in 64bit addressing */
228 #define	EHCI_CTRLD_SEGMENT		0xFFFFFFFF /* Control data segment */
229 
230 /* EHCI Periodic Frame List Base Address Register Bits */
231 #define	EHCI_PERIODIC_LIST_BASE		0xFFFFF000 /* Periodic framelist addr */
232 #define	EHCI_PERIODIC_LIST_BASE_SHIFT	12
233 
234 /* EHCI Asynchronous List Address Register Bits */
235 #define	EHCI_ASYNC_LIST_ADDR		0xFFFFFFE0 /* Async list address */
236 #define	EHCI_ASYNC_LIST_ADDR_SHIFT	5
237 
238 /* EHCI Config Flag Register Bits */
239 #define	EHCI_CONFIG_FLAG		0x00000001 /* Route host controllers */
240 #define	EHCI_CONFIG_FLAG_CLASSIC	0x00000000 /* Route to Classic ctrl */
241 #define	EHCI_CONFIG_FLAG_EHCI		0x00000001 /* Route to EHCI ctrl */
242 
243 /* EHCI Root Hub Port Status and Control Register Bits */
244 #define	EHCI_RH_PORT_OVER_CURENT_ENABLE	0x00400000 /* Over current enable */
245 #define	EHCI_RH_PORT_DISCONNECT_ENABLE	0x00200000 /* Disconnect enable */
246 #define	EHCI_RH_PORT_CONNECT_ENABLE	0x00100000 /* Connect enable */
247 #define	EHCI_RH_PORT_INDICATOR		0x0000C000 /* Port indicator control */
248 #define	EHCI_RH_PORT_IND_SHIFT		14
249 #define	EHCI_RH_PORT_IND_OFF		0x00000000 /* Port indicators off */
250 #define	EHCI_RH_PORT_IND_AMBER		0x00004000 /* Amber port indicator */
251 #define	EHCI_RH_PORT_IND_GREEN		0x00008000 /* Green port indicator */
252 #define	EHCI_RH_PORT_OWNER		0x00002000 /* Port ownership */
253 #define	EHCI_RH_PORT_OWNER_CLASSIC	0x00002000 /* Classic port ownership */
254 #define	EHCI_RH_PORT_OWNER_EHCI		0x00000000 /* EHCI port ownership */
255 #define	EHCI_RH_PORT_POWER		0x00001000 /* Port power */
256 #define	EHCI_RH_PORT_LINE_STATUS	0x00000C00 /* USB speed line status */
257 #define	EHCI_RH_PORT_LOW_SPEED		0x00000400 /* Low speed */
258 #define	EHCI_RH_PORT_RESET		0x00000100 /* Port reset */
259 #define	EHCI_RH_PORT_SUSPEND		0x00000080 /* Port suspend */
260 #define	EHCI_RH_PORT_RESUME		0x00000040 /* Port resume */
261 #define	EHCI_RH_PORT_OVER_CURR_CHANGE	0x00000020 /* Over current change */
262 #define	EHCI_RH_PORT_OVER_CURR_ACTIVE	0x00000010 /* Over current active */
263 #define	EHCI_RH_PORT_ENABLE_CHANGE	0x00000008 /* Port enable change */
264 #define	EHCI_RH_PORT_ENABLE		0x00000004 /* Port enable */
265 #define	EHCI_RH_PORT_CONNECT_STS_CHANGE	0x00000002 /* Connect status change */
266 #define	EHCI_RH_PORT_CONNECT_STATUS	0x00000001 /* Connect status */
267 
268 /* Root hub port change bits mask */
269 #define	EHCI_RH_PORT_CLEAR_MASK		0x0000002A /* Clear bits mask */
270 
271 
272 /*
273  * EHCI Extended Capability Registers
274  *
275  * Currently this register only specifies BIOS handoff information.
276  */
277 #define	EHCI_EX_CAP_SPECIFICS		0xFFFF0000
278 #define	EHCI_EX_CAP_SPECIFICS_SHIFT	16
279 #define	EHCI_EX_CAP_NEXT_PTR		0x0000FF00
280 #define	EHCI_EX_CAP_NEXT_PTR_SHIFT	8
281 #define	EHCI_EX_CAP_ID			0x000000FF
282 #define	EHCI_EX_CAP_ID_SHIFT		0
283 #define	EHCI_EX_CAP_ID_BIOS_HANDOFF	1
284 
285 #define	EHCI_LEGSUP_OS_OWNED_SEM	0x01000000
286 #define	EHCI_LEGSUP_BIOS_OWNED_SEM	0x00010000
287 
288 
289 /*
290  * Host Controller Periodic Frame List Area
291  *
292  * The Host Controller Periodic Frame List Area is a 4K structre of system
293  * memory that is established by the Host Controller Driver (HCD) and this
294  * structre is used for communication between HCD and HC. The HCD maintains
295  * a pointer to this structure in the Host Controller (HC). This structure
296  * must be aligned to a 4K boundary. There are 1024 periodic frame list
297  * entries.
298  */
299 
300 #define	EHCI_NUM_INTR_QH_LISTS		32	/* No of intr lists */
301 #define	EHCI_NUM_STATIC_NODES		63	/* No of static QHs */
302 #define	EHCI_NUM_PERIODIC_FRAME_LISTS	1024	/* No of entries */
303 
304 typedef volatile struct ehci_periodic_frame_list {
305 	uint32_t	ehci_periodic_frame_list_table[
306 			    EHCI_NUM_PERIODIC_FRAME_LISTS]; /* 1024 lists */
307 } ehci_periodic_frame_list_t;
308 
309 
310 /*
311  * Host Controller Queue Head
312  *
313  * An Queue Head (QH) is a memory structure that describes the information
314  * necessary for the Host Controller to communicate with a device endpoint
315  * except High Speed and Full Speed Isochronous's endpoints. An QH includes
316  * a Queue Element Transfer Descriptor (QTD) pointer.  This structure must
317  * be aligned to a 32 byte boundary.
318  */
319 typedef volatile struct ehci_qh {
320 	/* Endpoint capabilities or characteristics */
321 	uint32_t	qh_link_ptr;	  /* Next QH or ITD or SITD */
322 	uint32_t	qh_ctrl;	  /* Generic control information */
323 	uint32_t	qh_split_ctrl;	  /* Split transaction control info */
324 	uint32_t	qh_curr_qtd;	  /* Current QTD */
325 
326 	/* Tranfer overlay */
327 	uint32_t	qh_next_qtd;	  /* Next QTD */
328 	uint32_t	qh_alt_next_qtd;  /* Next alternate QTD */
329 	uint32_t	qh_status;	  /* Status of current QTD */
330 	uint32_t	qh_buf[5];	  /* Buffer pointers */
331 	uint32_t	qh_buf_high[5];	  /* For 64 bit addressing */
332 
333 	/* HCD private fields */
334 	uint32_t	qh_dummy_qtd;	  /* Current dummy qtd */
335 	uint32_t	qh_prev;	  /* Prevous QH */
336 	uint32_t	qh_state;	  /* QH's state */
337 	uint32_t	qh_reclaim_next;  /* Next QH on reclaim list */
338 	uint32_t	qh_reclaim_frame; /* Reclaim usb frame number */
339 	uint8_t		qh_pad[8];	  /* Required padding */
340 } ehci_qh_t;
341 
342 /*
343  * qh_link_ptr control bits.
344  */
345 #define	EHCI_QH_LINK_PTR		0xFFFFFFE0	/* QH link ptr mask */
346 #define	EHCI_QH_LINK_REF		0x00000006	/* Ref to QH/ITD/SITD */
347 #define	EHCI_QH_LINK_REF_ITD		0x00000000	/* Isoch QTD pointer */
348 #define	EHCI_QH_LINK_REF_QH		0x00000002	/* QH pointer */
349 #define	EHCI_QH_LINK_REF_SITD		0x00000004	/* SIQTD pointer */
350 #define	EHCI_QH_LINK_REF_FSTN		0x00000006	/* FSTN pointer */
351 #define	EHCI_QH_LINK_PTR_VALID		0x00000001	/* Link ptr validity */
352 
353 /*
354  * qh_ctrl control bits.
355  */
356 #define	EHCI_QH_CTRL_NC_RL		0xF0000000	/* Nak count reload */
357 #define	EHCI_QH_CTRL_NC_RL_SHIFT	28		/* NC reload shift */
358 #define	EHCI_QH_CTRL_MAX_NC		0xF0000000	/* Max Nak counts */
359 #define	EHCI_QH_CTRL_CONTROL_ED_FLAG	0x08000000	/* Ctrl endpoint flag */
360 #define	EHCI_QH_CTRL_MAXPKTSZ		0x07FF0000	/* Max packet length */
361 #define	EHCI_QH_CTRL_MAXPKTSZ_SHIFT	16		/* Max packet shift */
362 #define	EHCI_QH_CTRL_RECLAIM_HEAD	0x00008000	/* Head reclaim list */
363 #define	EHCI_QH_CTRL_DATA_TOGGLE	0x00004000	/* Data toggle */
364 #define	EHCI_QH_CTRL_ED_SPEED		0x00003000	/* Endpoint speed */
365 #define	EHCI_QH_CTRL_ED_FULL_SPEED	0x00000000	/* FullSpeed endpoint */
366 #define	EHCI_QH_CTRL_ED_LOW_SPEED	0x00001000	/* LowSpeed endpoint */
367 #define	EHCI_QH_CTRL_ED_HIGH_SPEED	0x00002000	/* HighSpeed endpoint */
368 #define	EHCI_QH_CTRL_ED_SPEED_SHIFT	12		/* ED speed shift */
369 #define	EHCI_QH_CTRL_ED_NUMBER		0x00000F00	/* Endpoint number */
370 #define	EHCI_QH_CTRL_ED_NUMBER_SHIFT	8		/* ED number shift */
371 #define	EHCI_QH_CTRL_ED_INACTIVATE	0x00000080	/* Inctivate endpoint */
372 #define	EHCI_QH_CTRL_DEVICE_ADDRESS	0x0000007F	/* Device address */
373 
374 /*
375  * q_split_ctrl control bits.
376  */
377 #define	EHCI_QH_SPLIT_CTRL_MULT		0xC0000000	/* HB multiplier */
378 #define	EHCI_QH_SPLIT_CTRL_MULT_SHIFT	30		/* HB mult Shift */
379 #define	EHCI_QH_SPLIT_CTRL_1_XACTS	0x40000000	/* 1 Xacts per uFrame */
380 #define	EHCI_QH_SPLIT_CTRL_2_XACTS	0x80000000	/* 2 Xacts per uFrame */
381 #define	EHCI_QH_SPLIT_CTRL_3_XACTS	0xC0000000	/* 3 Xacts per uFrame */
382 #define	EHCI_QH_SPLIT_CTRL_HUB_PORT	0x3F800000	/* HS hub port number */
383 #define	EHCI_QH_SPLIT_CTRL_HUB_PORT_SHIFT 23		/* HS hubport no shft */
384 #define	EHCI_QH_SPLIT_CTRL_HUB_ADDR	0x007F0000	/* HS hub address */
385 #define	EHCI_QH_SPLIT_CTRL_HUB_ADDR_SHIFT 16		/* HS hub addr mask */
386 #define	EHCI_QH_SPLIT_CTRL_COMP_MASK	0x0000FF00	/* Split comp mask */
387 #define	EHCI_QH_SPLIT_CTRL_COMP_SHIFT	8		/* Split comp shift */
388 #define	EHCI_QH_SPLIT_CTRL_INTR_MASK	0x000000FF	/* Intr schedule mask */
389 
390 /*
391  * qh_curr_qtd control bits.
392  */
393 #define	EHCI_QH_CURR_QTD_PTR		0xFFFFFFE0	/* Curr element QTD */
394 
395 /*
396  * qh_next_qtd control bits.
397  */
398 #define	EHCI_QH_NEXT_QTD_PTR		0xFFFFFFE0	/* Next QTD */
399 #define	EHCI_QH_NEXT_QTD_PTR_VALID	0x00000001	/* Next QTD validity */
400 
401 /*
402  * qh_alt_next_qtd control bits.
403  */
404 #define	EHCI_QH_ALT_NEXT_QTD_PTR	0xFFFFFFE0	/* Alternate next QTD */
405 #define	EHCI_QH_ALT_NEXT_QTD_PTR_VALID	0x00000001	/* Alt QTD validity */
406 #define	EHCI_QH_ALT_NEXT_QTD_NAKCNT	0x0000001E	/* NAK counter */
407 
408 /*
409  * qh_status control bits.
410  */
411 #define	EHCI_QH_STS_DATA_TOGGLE		0x80000000	/* Data toggle */
412 #define	EHCI_QH_STS_BYTES_TO_XFER	0x7FFF0000	/* Bytes to transfer */
413 #define	EHCI_QH_STS_BYTES_TO_XFER_SHIFT	16		/* Bytes to xfer mask */
414 #define	EHCI_QH_STS_INTR_ON_COMPLETE	0x00008000	/* Intr on complete */
415 #define	EHCI_QH_STS_C_PAGE		0x00007000	/* C page */
416 #define	EHCI_QH_STS_ERROR_COUNTER	0x00000C00	/* Error counter */
417 #define	EHCI_QH_STS_ERROR_COUNT_MASK	0x00000C00	/* Error count mask */
418 #define	EHCI_QH_STS_PID_CODE		0x00000300	/* PID code */
419 #define	EHCI_QH_STS_XACT_STATUS		0x000000FF	/* Xact Status */
420 #define	EHCI_QH_STS_HS_XACT_STATUS	0x000000F8	/* HS Xact status */
421 #define	EHCI_QH_STS_NON_HS_XACT_STATUS	0x000000FD	/* Non HS Xact status */
422 #define	EHCI_QH_STS_NO_ERROR		0x00000000	/* No error */
423 #define	EHCI_QH_STS_ACTIVE		0x00000080	/* Active */
424 #define	EHCI_QH_STS_HALTED		0x00000040	/* Halted */
425 #define	EHCI_QH_STS_DATA_BUFFER_ERR	0x00000020	/* Data buffer error */
426 #define	EHCI_QH_STS_BABBLE_DETECTED	0x00000010	/* Babble detected */
427 #define	EHCI_QH_STS_XACT_ERROR		0x00000008	/* Transaction error */
428 #define	EHCI_QH_STS_MISSED_uFRAME	0x00000004	/* Missed micro frame */
429 #define	EHCI_QH_STS_SPLIT_XSTATE	0x00000002	/* Split xact state */
430 #define	EHCI_QH_STS_DO_START_SPLIT	0x00000000	/* Do start split */
431 #define	EHCI_QH_STS_DO_COMPLETE_SPLIT	0x00000002	/* Do complete split */
432 #define	EHCI_QH_STS_PING_STATE		0x00000001	/* Ping state */
433 #define	EHCI_QH_STS_DO_OUT		0x00000000	/* Do OUT */
434 #define	EHCI_QH_STS_DO_PING		0x00000001	/* Do PING */
435 #define	EHCI_QH_STS_PRD_SPLIT_XACT_ERR	0x00000001	/* Periodic split err */
436 
437 /*
438  * qh_buf[X] control bits.
439  */
440 #define	EHCI_QH_BUF_PTR			0xFFFFF000	/* Buffer pointer */
441 #define	EHCI_QH_BUF_CURR_OFFSET		0x00000FFF	/* Current offset */
442 #define	EHCI_QH_BUF_CPROG_MASK		0x000000FF	/* Split progress */
443 #define	EHCI_QH_BUF_SBYTES		0x00000FE0	/* Software S bytes */
444 #define	EHCI_QH_BUF_FRAME_TAG		0x0000001F	/* Split xct frametag */
445 
446 /*
447  * qh_buf_high[X] control bits.
448  */
449 #define	EHCI_QH_BUF_HIGH_PTR		0xFFFFFFFF	/* For 64 addressing */
450 
451 /*
452  * qh_state
453  *
454  * QH States
455  */
456 #define	EHCI_QH_FREE			1		/* Free QH */
457 #define	EHCI_QH_STATIC			2		/* Static QH */
458 #define	EHCI_QH_ACTIVE			3		/* Active QH */
459 
460 
461 /*
462  * Host Controller Queue Element Transfer Descriptor
463  *
464  * A Queue Element Transfer Descriptor (QTD) is a memory structure that
465  * describes the information necessary for the Host Controller	(HC) to
466  * transfer a block  of data to or from a device endpoint except High
467  * Speed and Full Speed Isochronous's endpoints. These QTD's will be
468  * attached to a Queue Head (QH). This structure must be aligned to a
469  * 32 byte boundary.
470  */
471 typedef	volatile struct ehci_qtd {
472 	uint32_t	qtd_next_qtd;		/* Next QTD */
473 	uint32_t	qtd_alt_next_qtd;	/* Next alternate QTD */
474 	uint32_t	qtd_ctrl;		/* Control information */
475 	uint32_t	qtd_buf[5];		/* Buffer pointers */
476 	uint32_t	qtd_buf_high[5];	/* For 64 bit addressing */
477 
478 	/* HCD private fields */
479 	uint32_t	qtd_trans_wrapper;	/* Transfer wrapper */
480 	uint32_t	qtd_tw_next_qtd;	/* Next qtd on TW */
481 	uint32_t	qtd_active_qtd_next;	/* Next QTD on active list */
482 	uint32_t	qtd_active_qtd_prev;	/* Prev QTD on active list */
483 	uint32_t	qtd_state;		/* QTD state */
484 	uint32_t	qtd_ctrl_phase;		/* Control xfer phase info */
485 	uint32_t	qtd_xfer_offs;		/* Starting buffer offset */
486 	uint32_t	qtd_xfer_len;		/* Transfer length */
487 	uint8_t		qtd_pad[12];		/* Required padding */
488 } ehci_qtd_t;
489 
490 /*
491  * qtd_next_qtd control bits.
492  */
493 #define	EHCI_QTD_NEXT_QTD_PTR		0xFFFFFFE0	/* Next QTD pointer */
494 #define	EHCI_QTD_NEXT_QTD_PTR_VALID	0x00000001	/* Next QTD validity */
495 
496 /*
497  * qtd_alt_next_qtd control bits.
498  */
499 #define	EHCI_QTD_ALT_NEXT_QTD_PTR	0xFFFFFFE0	/* Alt QTD pointer */
500 #define	EHCI_QTD_ALT_NEXT_QTD_PTR_VALID 0x00000001	/* Alt QTD validity */
501 
502 /*
503  * qtd_ctrl control bits.
504  */
505 #define	EHCI_QTD_CTRL_DATA_TOGGLE	0x80000000	/* Data toggle */
506 #define	EHCI_QTD_CTRL_DATA_TOGGLE_0	0x00000000	/* Data toggle 0 */
507 #define	EHCI_QTD_CTRL_DATA_TOGGLE_1	0x80000000	/* Data toggle 1 */
508 #define	EHCI_QTD_CTRL_BYTES_TO_XFER	0x7FFF0000	/* Bytes to xfer */
509 #define	EHCI_QTD_CTRL_BYTES_TO_XFER_SHIFT 16		/* Bytes xfer mask */
510 #define	EHCI_QTD_CTRL_INTR_ON_COMPLETE	0x00008000	/* Intr on complete */
511 #define	EHCI_QTD_CTRL_C_PAGE		0x00007000	/* Current page */
512 #define	EHCI_QTD_CTRL_MAX_ERR_COUNTS	0x00000C00	/* Max error counts */
513 #define	EHCI_QTD_CTRL_PID_CODE		0x00000300	/* PID code */
514 #define	EHCI_QTD_CTRL_OUT_PID		0x00000000	/* OUT token */
515 #define	EHCI_QTD_CTRL_IN_PID		0x00000100	/* IN token */
516 #define	EHCI_QTD_CTRL_SETUP_PID		0x00000200	/* SETUP token */
517 #define	EHCI_QTD_CTRL_XACT_STATUS	0x000000FF	/* Xact status */
518 #define	EHCI_QTD_CTRL_HS_XACT_STATUS	0x000000F8	/* HS Xact status */
519 #define	EHCI_QTD_CTRL_NON_HS_XACT_STATUS 0x000000FD	/* Non HS Xact status */
520 #define	EHCI_QTD_CTRL_NO_ERROR		0x00000000	/* No error */
521 #define	EHCI_QTD_CTRL_ACTIVE_XACT	0x00000080	/* Active xact */
522 #define	EHCI_QTD_CTRL_HALTED_XACT	0x00000040	/* Halted due to err */
523 #define	EHCI_QTD_CTRL_DATA_BUFFER_ERROR	0x00000020	/* Data buffer error */
524 #define	EHCI_QTD_CTRL_ERR_COUNT_MASK	0x00000C00	/* Error count */
525 #define	EHCI_QTD_CTRL_BABBLE_DETECTED	0x00000010	/* Babble detected */
526 #define	EHCI_QTD_CTRL_XACT_ERROR	0x00000008	/* Transaction error */
527 #define	EHCI_QTD_CTRL_MISSED_uFRAME	0x00000004	/* Missed uFrame */
528 #define	EHCI_QTD_CTRL_SPLIT_XACT_STATE	0x00000002	/* Split xact state */
529 #define	EHCI_QTD_CTRL_DO_START_SPLIT	0x00000000	/* Do start split */
530 #define	EHCI_QTD_CTRL_DO_COMPLETE_SPLIT	0x00000002	/* Do complete split */
531 #define	EHCI_QTD_CTRL_PING_STATE	0x00000001	/* Ping state */
532 #define	EHCI_QTD_CTRL_DO_OUT		0x00000000	/* Do OUT */
533 #define	EHCI_QTD_CTRL_DO_PING		0x00000001	/* Do PING */
534 #define	EHCI_QTD_CTRL_PRD_SPLIT_XACT_ERR 0x00000001	/* Periodic split err */
535 
536 /*
537  * qtd_buf[X] control bits.
538  */
539 #define	EHCI_QTD_BUF_PTR		0xFFFFF000	/* Buffer pointer */
540 #define	EHCI_QTD_BUF_CURR_OFFSET	0x00000FFF	/* Current offset */
541 
542 /*
543  * qtd_buf_high[X] control bits.
544  */
545 #define	EHCI_QTD_BUF_HIGH_PTR		0xFFFFFFFF	/* 64 bit addressing */
546 
547 /*
548  * qtd_state
549  *
550  * QTD States
551  */
552 #define	EHCI_QTD_FREE			1		/* Free QTD */
553 #define	EHCI_QTD_DUMMY			2		/* Dummy QTD */
554 #define	EHCI_QTD_ACTIVE			3		/* Active QTD */
555 #define	EHCI_QTD_RECLAIM		4		/* Reclaim QTD */
556 
557 /*
558  * qtd_ctrl_phase
559  *
560  * Control Transfer Phase information
561  */
562 #define	EHCI_CTRL_SETUP_PHASE		1		/* Setup phase */
563 #define	EHCI_CTRL_DATA_PHASE		2		/* Data phase */
564 #define	EHCI_CTRL_STATUS_PHASE		3		/* Status phase */
565 
566 /*
567  * Host Controller Split Isochronous Transfer Descripter
568  *
569  * iTD/siTD is a memory structure that describes the information necessary for
570  * the Host Controller (HC) to transfer a block of data to or from a
571  * 1.1 isochronous device end point.  The iTD/siTD will be inserted between
572  * the periodic frame list and the interrupt tree lattice.  This structure
573  * must be aligned to a 32 byte boundary.
574  */
575 typedef	volatile struct ehci_itd {
576 	uint32_t	itd_link_ptr;		/* Next TD */
577 	uint32_t	itd_body[15];		/* iTD and siTD body */
578 	uint32_t	itd_body_high[7];	/* For 64 bit addressing */
579 
580 	/* Padding required */
581 	uint32_t	itd_pad;
582 
583 	/* HCD private fields */
584 	uint32_t	itd_trans_wrapper;	/* Transfer wrapper */
585 	uint32_t	itd_itw_next_itd;	/* Next iTD on TW */
586 	uint32_t	itd_next_active_itd;	/* Next iTD in active list */
587 	uint32_t	itd_state;		/* iTD state */
588 	uint32_t	itd_index[8];		/* iTD index */
589 	uint64_t	itd_frame_number;	/* Frame iTD exists */
590 	uint64_t	itd_reclaim_number;	/* Frame iTD is reclaimed */
591 } ehci_itd_t;
592 
593 /*
594  * Generic Link Ptr Bits
595  * EHCI_TD_LINK_PTR : Points to the next data object to be processed
596  * EHCI_TD_LINK_PTR_TYPE : Type of reference this descriptor is
597  * EHCI_TD_LINK_PTR_VALID : Is this link pointer valid
598  */
599 #define	EHCI_ITD_LINK_PTR		0xFFFFFFE0	/* TD link ptr mask */
600 #define	EHCI_ITD_LINK_REF		0x00000006	/* Ref to TD/ITD/SITD */
601 #define	EHCI_ITD_LINK_REF_ITD		0x00000000	/* ITD pointer */
602 #define	EHCI_ITD_LINK_REF_QH		0x00000002	/* QH pointer */
603 #define	EHCI_ITD_LINK_REF_SITD		0x00000004	/* SITD pointer */
604 #define	EHCI_ITD_LINK_REF_FSTN		0x00000006	/* FSTN pointer */
605 #define	EHCI_ITD_LINK_PTR_INVALID	0x00000001	/* Link ptr validity */
606 
607 #define	EHCI_ITD_CTRL_LIST_SIZE		8
608 #define	EHCI_ITD_BUFFER_LIST_SIZE	7
609 #define	EHCI_ITD_CTRL0			0	/* Status and Ctrl List */
610 #define	EHCI_ITD_CTRL1			1
611 #define	EHCI_ITD_CTRL2			2
612 #define	EHCI_ITD_CTRL3			3
613 #define	EHCI_ITD_CTRL4			4
614 #define	EHCI_ITD_CTRL5			5
615 #define	EHCI_ITD_CTRL6			6
616 #define	EHCI_ITD_CTRL7			7
617 #define	EHCI_ITD_BUFFER0		8	/* Buffer Page Ptr List */
618 #define	EHCI_ITD_BUFFER1		9
619 #define	EHCI_ITD_BUFFER2		10
620 #define	EHCI_ITD_BUFFER3		11
621 #define	EHCI_ITD_BUFFER4		12
622 #define	EHCI_ITD_BUFFER5		13
623 #define	EHCI_ITD_BUFFER6		14
624 
625 /*
626  * iTD Transaction Status and Control bits
627  */
628 #define	EHCI_ITD_XFER_STATUS_MASK	0xF0000000
629 #define	EHCI_ITD_XFER_STATUS_SHIFT	28
630 #define	EHCI_ITD_XFER_ACTIVE		0x80000000
631 #define	EHCI_ITD_XFER_DATA_BUFFER_ERR	0x40000000
632 #define	EHCI_ITD_XFER_BABBLE		0x20000000
633 #define	EHCI_ITD_XFER_ERROR		0x10000000
634 #define	EHCI_ITD_XFER_LENGTH		0x0FFF0000
635 #define	EHCI_ITD_XFER_IOC		0x00008000
636 #define	EHCI_ITD_XFER_IOC_ON		0x00008000
637 #define	EHCI_ITD_XFER_IOC_OFF		0x00000000
638 #define	EHCI_ITD_XFER_PAGE_SELECT	0x00007000
639 #define	EHCI_ITD_XFER_OFFSET		0x00000FFF
640 
641 /*
642  * iTD Buffer Page Pointer bits
643  */
644 #define	EHCI_ITD_CTRL_BUFFER_MASK	0xFFFFF000
645 #define	EHCI_ITD_CTRL_ENDPT_MASK	0x00000F00
646 #define	EHCI_ITD_CTRL_DEVICE_MASK	0x0000007F
647 #define	EHCI_ITD_CTRL_DIR		0x00000800
648 #define	EHCI_ITD_CTRL_DIR_IN		0x00000800
649 #define	EHCI_ITD_CTRL_DIR_OUT		0x00000000
650 #define	EHCI_ITD_CTRL_MAX_PACKET_MASK	0x000007FF
651 #define	EHCI_ITD_CTRL_MULTI_MASK	0x00000003
652 #define	EHCI_ITD_CTRL_ONE_XACT		0x00000001
653 #define	EHCI_ITD_CTRL_TWO_XACT		0x00000002
654 #define	EHCI_ITD_CTRL_THREE_XACT	0x00000003
655 
656 /* Unused iTD index */
657 #define	EHCI_ITD_UNUSED_INDEX		0xFFFFFFFF
658 
659 #define	EHCI_SITD_CTRL			0
660 #define	EHCI_SITD_UFRAME_SCHED		1
661 #define	EHCI_SITD_XFER_STATE		2
662 #define	EHCI_SITD_BUFFER0		3
663 #define	EHCI_SITD_BUFFER1		4
664 #define	EHCI_SITD_PREV_SITD		5
665 
666 /*
667  * sitd_ctrl bits
668  * EHCI_SITD_CTRL_DIR : Direction of transaction
669  * EHCI_SITD_CTRL_PORT_MASK : Port # of recipient transaction translator(TT)
670  * EHCI_SITD_CTRL_HUB_MASK : Device address of the TT's hub
671  * EHCI_SITD_CTRL_END_PT_MASK : Endpoint # on device serving as data source/sink
672  * EHCI_SITD_CTRL_DEVICE_MASK : Address of device serving as data source/sink
673  */
674 #define	EHCI_SITD_CTRL_DIR		0x80000000
675 #define	EHCI_SITD_CTRL_DIR_IN		0x80000000
676 #define	EHCI_SITD_CTRL_DIR_OUT		0x00000000
677 #define	EHCI_SITD_CTRL_PORT_MASK	0x7F000000
678 #define	EHCI_SITD_CTRL_PORT_SHIFT	24
679 #define	EHCI_SITD_CTRL_HUB_MASK		0x007F0000
680 #define	EHCI_SITD_CTRL_HUB_SHIFT	16
681 #define	EHCI_SITD_CTRL_END_PT_MASK	0x00000F00
682 #define	EHCI_SITD_CTRL_END_PT_SHIFT	8
683 #define	EHCI_SITD_CTRL_DEVICE_MASK	0x0000007F
684 #define	EHCI_SITD_CTRL_DEVICE_SHIFT	0
685 
686 /*
687  * sitd_uframe_sched bits
688  * EHCI_SITD_UFRAME_CMASK_MASK : Determines which uFrame the HC executes CSplit
689  * EHCI_SITD_UFRAME_SMASK_MASK : Determines which uFrame the HC executes SSplit
690  */
691 #define	EHCI_SITD_UFRAME_CMASK_MASK	0x0000FF00
692 #define	EHCI_SITD_UFRAME_CMASK_SHIFT	8
693 #define	EHCI_SITD_UFRAME_SMASK_MASK	0x000000FF
694 #define	EHCI_SITD_UFRAME_SMASK_SHIFT	0
695 
696 /*
697  * sitd_xfer_state bits
698  * EHCI_SITD_XFER_IOC_MASK : Interrupt when transaction is complete.
699  * EHCI_SITD_XFER_PAGE_MASK : Which data page pointer should be concatenated
700  *				with the CurrentOffset to construct a data
701  *				buffer pointer
702  * EHCI_SITD_XFER_TOTAL_MASK : Total number of bytes expected in xfer(1023 Max).
703  * EHCI_SITD_XFER_CPROG_MASK : HC tracks which CSplit has been executed.
704  * EHCI_SITD_XFER_STATUS_MASK : Status of xfer
705  */
706 #define	EHCI_SITD_XFER_IOC_MASK		0x80000000
707 #define	EHCI_SITD_XFER_IOC_ON		0x80000000
708 #define	EHCI_SITD_XFER_IOC_OFF		0x00000000
709 #define	EHCI_SITD_XFER_PAGE_MASK	0x40000000
710 #define	EHCI_SITD_XFER_PAGE_0		0x00000000
711 #define	EHCI_SITD_XFER_PAGE_1		0x40000000
712 #define	EHCI_SITD_XFER_TOTAL_MASK	0x03FF0000
713 #define	EHCI_SITD_XFER_TOTAL_SHIFT	16
714 #define	EHCI_SITD_XFER_CPROG_MASK	0x0000FF00
715 #define	EHCI_SITD_XFER_CPROG_SHIFT	8
716 #define	EHCI_SITD_XFER_STATUS_MASK	0x000000FF
717 #define	EHCI_SITD_XFER_STATUS_SHIFT	0
718 #define	EHCI_SITD_XFER_ACTIVE		0x80
719 #define	EHCI_SITD_XFER_ERROR		0x40
720 #define	EHCI_SITD_XFER_DATA_BUFFER_ERR	0x20
721 #define	EHCI_SITD_XFER_BABBLE		0x10
722 #define	EHCI_SITD_XFER_XACT_ERROR	0x08
723 #define	EHCI_SITD_XFER_MISSED_UFRAME	0x04
724 #define	EHCI_SITD_XFER_SPLIT_XACT_STATE	0x02
725 #define	EHCI_SITD_XFER_SSPLIT_STATE	0x00
726 #define	EHCI_SITD_XFER_CSPLIT_STATE	0x02
727 
728 /*
729  * sitd_xfer_buffer0/1
730  * EHCI_SITD_XFER_BUFFER_MASK : Buffer Pointer List
731  * EHCI_SITD_XFER_OFFSET_MASK : Current byte offset
732  * EHCI_SITD_XFER_TP_MASK : Transaction position
733  * EHCI_SITD_XFER_TCOUNT_MASK : Transaction count
734  */
735 #define	EHCI_SITD_XFER_BUFFER_MASK	0xFFFFF000
736 #define	EHCI_SITD_XFER_BUFFER_SHIFT	12
737 #define	EHCI_SITD_XFER_OFFSET_MASK	0x00000FFF
738 #define	EHCI_SITD_XFER_OFFSET_SHIFT	0
739 #define	EHCI_SITD_XFER_TP_MASK		0x00000018
740 #define	EHCI_SITD_XFER_TP_ALL		0x0
741 #define	EHCI_SITD_XFER_TP_BEGIN		0x1
742 #define	EHCI_SITD_XFER_TP_MID		0x2
743 #define	EHCI_SITD_XFER_TP_END		0x3
744 #define	EHCI_SITD_XFER_TCOUNT_MASK	0x00000007
745 #define	EHCI_SITD_XFER_TCOUNT_SHIFT	0
746 
747 /*
748  * qtd_state
749  *
750  * ITD States
751  */
752 #define	EHCI_ITD_FREE			1		/* Free ITD */
753 #define	EHCI_ITD_DUMMY			2		/* Dummy ITD */
754 #define	EHCI_ITD_ACTIVE			3		/* Active ITD */
755 #define	EHCI_ITD_RECLAIM		4		/* Reclaim ITD */
756 
757 #ifdef __cplusplus
758 }
759 #endif
760 
761 #endif	/* _SYS_USB_EHCI_H */
762