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_RESERVED 0 284 #define EHCI_EX_CAP_ID_BIOS_HANDOFF 1 285 286 #define EHCI_LEGSUP_OS_OWNED_SEM 0x01000000 287 #define EHCI_LEGSUP_BIOS_OWNED_SEM 0x00010000 288 289 290 /* 291 * Host Controller Periodic Frame List Area 292 * 293 * The Host Controller Periodic Frame List Area is a 4K structre of system 294 * memory that is established by the Host Controller Driver (HCD) and this 295 * structre is used for communication between HCD and HC. The HCD maintains 296 * a pointer to this structure in the Host Controller (HC). This structure 297 * must be aligned to a 4K boundary. There are 1024 periodic frame list 298 * entries. 299 */ 300 301 #define EHCI_NUM_INTR_QH_LISTS 32 /* No of intr lists */ 302 #define EHCI_NUM_STATIC_NODES 63 /* No of static QHs */ 303 #define EHCI_NUM_PERIODIC_FRAME_LISTS 1024 /* No of entries */ 304 305 typedef volatile struct ehci_periodic_frame_list { 306 uint32_t ehci_periodic_frame_list_table[ 307 EHCI_NUM_PERIODIC_FRAME_LISTS]; /* 1024 lists */ 308 } ehci_periodic_frame_list_t; 309 310 311 /* 312 * Host Controller Queue Head 313 * 314 * An Queue Head (QH) is a memory structure that describes the information 315 * necessary for the Host Controller to communicate with a device endpoint 316 * except High Speed and Full Speed Isochronous's endpoints. An QH includes 317 * a Queue Element Transfer Descriptor (QTD) pointer. This structure must 318 * be aligned to a 32 byte boundary. 319 */ 320 typedef volatile struct ehci_qh { 321 /* Endpoint capabilities or characteristics */ 322 uint32_t qh_link_ptr; /* Next QH or ITD or SITD */ 323 uint32_t qh_ctrl; /* Generic control information */ 324 uint32_t qh_split_ctrl; /* Split transaction control info */ 325 uint32_t qh_curr_qtd; /* Current QTD */ 326 327 /* Tranfer overlay */ 328 uint32_t qh_next_qtd; /* Next QTD */ 329 uint32_t qh_alt_next_qtd; /* Next alternate QTD */ 330 uint32_t qh_status; /* Status of current QTD */ 331 uint32_t qh_buf[5]; /* Buffer pointers */ 332 uint32_t qh_buf_high[5]; /* For 64 bit addressing */ 333 334 /* HCD private fields */ 335 uint32_t qh_dummy_qtd; /* Current dummy qtd */ 336 uint32_t qh_prev; /* Prevous QH */ 337 uint32_t qh_state; /* QH's state */ 338 uint32_t qh_reclaim_next; /* Next QH on reclaim list */ 339 uint32_t qh_reclaim_frame; /* Reclaim usb frame number */ 340 uint8_t qh_pad[8]; /* Required padding */ 341 } ehci_qh_t; 342 343 /* 344 * qh_link_ptr control bits. 345 */ 346 #define EHCI_QH_LINK_PTR 0xFFFFFFE0 /* QH link ptr mask */ 347 #define EHCI_QH_LINK_REF 0x00000006 /* Ref to QH/ITD/SITD */ 348 #define EHCI_QH_LINK_REF_ITD 0x00000000 /* Isoch QTD pointer */ 349 #define EHCI_QH_LINK_REF_QH 0x00000002 /* QH pointer */ 350 #define EHCI_QH_LINK_REF_SITD 0x00000004 /* SIQTD pointer */ 351 #define EHCI_QH_LINK_REF_FSTN 0x00000006 /* FSTN pointer */ 352 #define EHCI_QH_LINK_PTR_VALID 0x00000001 /* Link ptr validity */ 353 354 /* 355 * qh_ctrl control bits. 356 */ 357 #define EHCI_QH_CTRL_NC_RL 0xF0000000 /* Nak count reload */ 358 #define EHCI_QH_CTRL_NC_RL_SHIFT 28 /* NC reload shift */ 359 #define EHCI_QH_CTRL_MAX_NC 0xF0000000 /* Max Nak counts */ 360 #define EHCI_QH_CTRL_CONTROL_ED_FLAG 0x08000000 /* Ctrl endpoint flag */ 361 #define EHCI_QH_CTRL_MAXPKTSZ 0x07FF0000 /* Max packet length */ 362 #define EHCI_QH_CTRL_MAXPKTSZ_SHIFT 16 /* Max packet shift */ 363 #define EHCI_QH_CTRL_RECLAIM_HEAD 0x00008000 /* Head reclaim list */ 364 #define EHCI_QH_CTRL_DATA_TOGGLE 0x00004000 /* Data toggle */ 365 #define EHCI_QH_CTRL_ED_SPEED 0x00003000 /* Endpoint speed */ 366 #define EHCI_QH_CTRL_ED_FULL_SPEED 0x00000000 /* FullSpeed endpoint */ 367 #define EHCI_QH_CTRL_ED_LOW_SPEED 0x00001000 /* LowSpeed endpoint */ 368 #define EHCI_QH_CTRL_ED_HIGH_SPEED 0x00002000 /* HighSpeed endpoint */ 369 #define EHCI_QH_CTRL_ED_SPEED_SHIFT 12 /* ED speed shift */ 370 #define EHCI_QH_CTRL_ED_NUMBER 0x00000F00 /* Endpoint number */ 371 #define EHCI_QH_CTRL_ED_NUMBER_SHIFT 8 /* ED number shift */ 372 #define EHCI_QH_CTRL_ED_INACTIVATE 0x00000080 /* Inctivate endpoint */ 373 #define EHCI_QH_CTRL_DEVICE_ADDRESS 0x0000007F /* Device address */ 374 375 /* 376 * q_split_ctrl control bits. 377 */ 378 #define EHCI_QH_SPLIT_CTRL_MULT 0xC0000000 /* HB multiplier */ 379 #define EHCI_QH_SPLIT_CTRL_MULT_SHIFT 30 /* HB mult Shift */ 380 #define EHCI_QH_SPLIT_CTRL_1_XACTS 0x40000000 /* 1 Xacts per uFrame */ 381 #define EHCI_QH_SPLIT_CTRL_2_XACTS 0x80000000 /* 2 Xacts per uFrame */ 382 #define EHCI_QH_SPLIT_CTRL_3_XACTS 0xC0000000 /* 3 Xacts per uFrame */ 383 #define EHCI_QH_SPLIT_CTRL_HUB_PORT 0x3F800000 /* HS hub port number */ 384 #define EHCI_QH_SPLIT_CTRL_HUB_PORT_SHIFT 23 /* HS hubport no shft */ 385 #define EHCI_QH_SPLIT_CTRL_HUB_ADDR 0x007F0000 /* HS hub address */ 386 #define EHCI_QH_SPLIT_CTRL_HUB_ADDR_SHIFT 16 /* HS hub addr mask */ 387 #define EHCI_QH_SPLIT_CTRL_COMP_MASK 0x0000FF00 /* Split comp mask */ 388 #define EHCI_QH_SPLIT_CTRL_COMP_SHIFT 8 /* Split comp shift */ 389 #define EHCI_QH_SPLIT_CTRL_INTR_MASK 0x000000FF /* Intr schedule mask */ 390 391 /* 392 * qh_curr_qtd control bits. 393 */ 394 #define EHCI_QH_CURR_QTD_PTR 0xFFFFFFE0 /* Curr element QTD */ 395 396 /* 397 * qh_next_qtd control bits. 398 */ 399 #define EHCI_QH_NEXT_QTD_PTR 0xFFFFFFE0 /* Next QTD */ 400 #define EHCI_QH_NEXT_QTD_PTR_VALID 0x00000001 /* Next QTD validity */ 401 402 /* 403 * qh_alt_next_qtd control bits. 404 */ 405 #define EHCI_QH_ALT_NEXT_QTD_PTR 0xFFFFFFE0 /* Alternate next QTD */ 406 #define EHCI_QH_ALT_NEXT_QTD_PTR_VALID 0x00000001 /* Alt QTD validity */ 407 #define EHCI_QH_ALT_NEXT_QTD_NAKCNT 0x0000001E /* NAK counter */ 408 409 /* 410 * qh_status control bits. 411 */ 412 #define EHCI_QH_STS_DATA_TOGGLE 0x80000000 /* Data toggle */ 413 #define EHCI_QH_STS_BYTES_TO_XFER 0x7FFF0000 /* Bytes to transfer */ 414 #define EHCI_QH_STS_BYTES_TO_XFER_SHIFT 16 /* Bytes to xfer mask */ 415 #define EHCI_QH_STS_INTR_ON_COMPLETE 0x00008000 /* Intr on complete */ 416 #define EHCI_QH_STS_C_PAGE 0x00007000 /* C page */ 417 #define EHCI_QH_STS_ERROR_COUNTER 0x00000C00 /* Error counter */ 418 #define EHCI_QH_STS_ERROR_COUNT_MASK 0x00000C00 /* Error count mask */ 419 #define EHCI_QH_STS_PID_CODE 0x00000300 /* PID code */ 420 #define EHCI_QH_STS_XACT_STATUS 0x000000FF /* Xact Status */ 421 #define EHCI_QH_STS_HS_XACT_STATUS 0x000000F8 /* HS Xact status */ 422 #define EHCI_QH_STS_NON_HS_XACT_STATUS 0x000000FD /* Non HS Xact status */ 423 #define EHCI_QH_STS_NO_ERROR 0x00000000 /* No error */ 424 #define EHCI_QH_STS_ACTIVE 0x00000080 /* Active */ 425 #define EHCI_QH_STS_HALTED 0x00000040 /* Halted */ 426 #define EHCI_QH_STS_DATA_BUFFER_ERR 0x00000020 /* Data buffer error */ 427 #define EHCI_QH_STS_BABBLE_DETECTED 0x00000010 /* Babble detected */ 428 #define EHCI_QH_STS_XACT_ERROR 0x00000008 /* Transaction error */ 429 #define EHCI_QH_STS_MISSED_uFRAME 0x00000004 /* Missed micro frame */ 430 #define EHCI_QH_STS_SPLIT_XSTATE 0x00000002 /* Split xact state */ 431 #define EHCI_QH_STS_DO_START_SPLIT 0x00000000 /* Do start split */ 432 #define EHCI_QH_STS_DO_COMPLETE_SPLIT 0x00000002 /* Do complete split */ 433 #define EHCI_QH_STS_PING_STATE 0x00000001 /* Ping state */ 434 #define EHCI_QH_STS_DO_OUT 0x00000000 /* Do OUT */ 435 #define EHCI_QH_STS_DO_PING 0x00000001 /* Do PING */ 436 #define EHCI_QH_STS_PRD_SPLIT_XACT_ERR 0x00000001 /* Periodic split err */ 437 438 /* 439 * qh_buf[X] control bits. 440 */ 441 #define EHCI_QH_BUF_PTR 0xFFFFF000 /* Buffer pointer */ 442 #define EHCI_QH_BUF_CURR_OFFSET 0x00000FFF /* Current offset */ 443 #define EHCI_QH_BUF_CPROG_MASK 0x000000FF /* Split progress */ 444 #define EHCI_QH_BUF_SBYTES 0x00000FE0 /* Software S bytes */ 445 #define EHCI_QH_BUF_FRAME_TAG 0x0000001F /* Split xct frametag */ 446 447 /* 448 * qh_buf_high[X] control bits. 449 */ 450 #define EHCI_QH_BUF_HIGH_PTR 0xFFFFFFFF /* For 64 addressing */ 451 452 /* 453 * qh_state 454 * 455 * QH States 456 */ 457 #define EHCI_QH_FREE 1 /* Free QH */ 458 #define EHCI_QH_STATIC 2 /* Static QH */ 459 #define EHCI_QH_ACTIVE 3 /* Active QH */ 460 461 462 /* 463 * Host Controller Queue Element Transfer Descriptor 464 * 465 * A Queue Element Transfer Descriptor (QTD) is a memory structure that 466 * describes the information necessary for the Host Controller (HC) to 467 * transfer a block of data to or from a device endpoint except High 468 * Speed and Full Speed Isochronous's endpoints. These QTD's will be 469 * attached to a Queue Head (QH). This structure must be aligned to a 470 * 32 byte boundary. 471 */ 472 typedef volatile struct ehci_qtd { 473 uint32_t qtd_next_qtd; /* Next QTD */ 474 uint32_t qtd_alt_next_qtd; /* Next alternate QTD */ 475 uint32_t qtd_ctrl; /* Control information */ 476 uint32_t qtd_buf[5]; /* Buffer pointers */ 477 uint32_t qtd_buf_high[5]; /* For 64 bit addressing */ 478 479 /* HCD private fields */ 480 uint32_t qtd_trans_wrapper; /* Transfer wrapper */ 481 uint32_t qtd_tw_next_qtd; /* Next qtd on TW */ 482 uint32_t qtd_active_qtd_next; /* Next QTD on active list */ 483 uint32_t qtd_active_qtd_prev; /* Prev QTD on active list */ 484 uint32_t qtd_state; /* QTD state */ 485 uint32_t qtd_ctrl_phase; /* Control xfer phase info */ 486 uint32_t qtd_xfer_offs; /* Starting buffer offset */ 487 uint32_t qtd_xfer_len; /* Transfer length */ 488 uint8_t qtd_pad[12]; /* Required padding */ 489 } ehci_qtd_t; 490 491 /* 492 * qtd_next_qtd control bits. 493 */ 494 #define EHCI_QTD_NEXT_QTD_PTR 0xFFFFFFE0 /* Next QTD pointer */ 495 #define EHCI_QTD_NEXT_QTD_PTR_VALID 0x00000001 /* Next QTD validity */ 496 497 /* 498 * qtd_alt_next_qtd control bits. 499 */ 500 #define EHCI_QTD_ALT_NEXT_QTD_PTR 0xFFFFFFE0 /* Alt QTD pointer */ 501 #define EHCI_QTD_ALT_NEXT_QTD_PTR_VALID 0x00000001 /* Alt QTD validity */ 502 503 /* 504 * qtd_ctrl control bits. 505 */ 506 #define EHCI_QTD_CTRL_DATA_TOGGLE 0x80000000 /* Data toggle */ 507 #define EHCI_QTD_CTRL_DATA_TOGGLE_0 0x00000000 /* Data toggle 0 */ 508 #define EHCI_QTD_CTRL_DATA_TOGGLE_1 0x80000000 /* Data toggle 1 */ 509 #define EHCI_QTD_CTRL_BYTES_TO_XFER 0x7FFF0000 /* Bytes to xfer */ 510 #define EHCI_QTD_CTRL_BYTES_TO_XFER_SHIFT 16 /* Bytes xfer mask */ 511 #define EHCI_QTD_CTRL_INTR_ON_COMPLETE 0x00008000 /* Intr on complete */ 512 #define EHCI_QTD_CTRL_C_PAGE 0x00007000 /* Current page */ 513 #define EHCI_QTD_CTRL_MAX_ERR_COUNTS 0x00000C00 /* Max error counts */ 514 #define EHCI_QTD_CTRL_PID_CODE 0x00000300 /* PID code */ 515 #define EHCI_QTD_CTRL_OUT_PID 0x00000000 /* OUT token */ 516 #define EHCI_QTD_CTRL_IN_PID 0x00000100 /* IN token */ 517 #define EHCI_QTD_CTRL_SETUP_PID 0x00000200 /* SETUP token */ 518 #define EHCI_QTD_CTRL_XACT_STATUS 0x000000FF /* Xact status */ 519 #define EHCI_QTD_CTRL_HS_XACT_STATUS 0x000000F8 /* HS Xact status */ 520 #define EHCI_QTD_CTRL_NON_HS_XACT_STATUS 0x000000FD /* Non HS Xact status */ 521 #define EHCI_QTD_CTRL_NO_ERROR 0x00000000 /* No error */ 522 #define EHCI_QTD_CTRL_ACTIVE_XACT 0x00000080 /* Active xact */ 523 #define EHCI_QTD_CTRL_HALTED_XACT 0x00000040 /* Halted due to err */ 524 #define EHCI_QTD_CTRL_DATA_BUFFER_ERROR 0x00000020 /* Data buffer error */ 525 #define EHCI_QTD_CTRL_ERR_COUNT_MASK 0x00000C00 /* Error count */ 526 #define EHCI_QTD_CTRL_BABBLE_DETECTED 0x00000010 /* Babble detected */ 527 #define EHCI_QTD_CTRL_XACT_ERROR 0x00000008 /* Transaction error */ 528 #define EHCI_QTD_CTRL_MISSED_uFRAME 0x00000004 /* Missed uFrame */ 529 #define EHCI_QTD_CTRL_SPLIT_XACT_STATE 0x00000002 /* Split xact state */ 530 #define EHCI_QTD_CTRL_DO_START_SPLIT 0x00000000 /* Do start split */ 531 #define EHCI_QTD_CTRL_DO_COMPLETE_SPLIT 0x00000002 /* Do complete split */ 532 #define EHCI_QTD_CTRL_PING_STATE 0x00000001 /* Ping state */ 533 #define EHCI_QTD_CTRL_DO_OUT 0x00000000 /* Do OUT */ 534 #define EHCI_QTD_CTRL_DO_PING 0x00000001 /* Do PING */ 535 #define EHCI_QTD_CTRL_PRD_SPLIT_XACT_ERR 0x00000001 /* Periodic split err */ 536 537 /* 538 * qtd_buf[X] control bits. 539 */ 540 #define EHCI_QTD_BUF_PTR 0xFFFFF000 /* Buffer pointer */ 541 #define EHCI_QTD_BUF_CURR_OFFSET 0x00000FFF /* Current offset */ 542 543 /* 544 * qtd_buf_high[X] control bits. 545 */ 546 #define EHCI_QTD_BUF_HIGH_PTR 0xFFFFFFFF /* 64 bit addressing */ 547 548 /* 549 * qtd_state 550 * 551 * QTD States 552 */ 553 #define EHCI_QTD_FREE 1 /* Free QTD */ 554 #define EHCI_QTD_DUMMY 2 /* Dummy QTD */ 555 #define EHCI_QTD_ACTIVE 3 /* Active QTD */ 556 #define EHCI_QTD_RECLAIM 4 /* Reclaim QTD */ 557 558 /* 559 * qtd_ctrl_phase 560 * 561 * Control Transfer Phase information 562 */ 563 #define EHCI_CTRL_SETUP_PHASE 1 /* Setup phase */ 564 #define EHCI_CTRL_DATA_PHASE 2 /* Data phase */ 565 #define EHCI_CTRL_STATUS_PHASE 3 /* Status phase */ 566 567 /* 568 * Host Controller Split Isochronous Transfer Descripter 569 * 570 * iTD/siTD is a memory structure that describes the information necessary for 571 * the Host Controller (HC) to transfer a block of data to or from a 572 * 1.1 isochronous device end point. The iTD/siTD will be inserted between 573 * the periodic frame list and the interrupt tree lattice. This structure 574 * must be aligned to a 32 byte boundary. 575 */ 576 typedef volatile struct ehci_itd { 577 uint32_t itd_link_ptr; /* Next TD */ 578 uint32_t itd_body[15]; /* iTD and siTD body */ 579 uint32_t itd_body_high[7]; /* For 64 bit addressing */ 580 581 /* Padding required */ 582 uint32_t itd_pad; 583 584 /* HCD private fields */ 585 uint32_t itd_trans_wrapper; /* Transfer wrapper */ 586 uint32_t itd_itw_next_itd; /* Next iTD on TW */ 587 uint32_t itd_next_active_itd; /* Next iTD in active list */ 588 uint32_t itd_state; /* iTD state */ 589 uint32_t itd_index[8]; /* iTD index */ 590 uint64_t itd_frame_number; /* Frame iTD exists */ 591 uint64_t itd_reclaim_number; /* Frame iTD is reclaimed */ 592 } ehci_itd_t; 593 594 /* 595 * Generic Link Ptr Bits 596 * EHCI_TD_LINK_PTR : Points to the next data object to be processed 597 * EHCI_TD_LINK_PTR_TYPE : Type of reference this descriptor is 598 * EHCI_TD_LINK_PTR_VALID : Is this link pointer valid 599 */ 600 #define EHCI_ITD_LINK_PTR 0xFFFFFFE0 /* TD link ptr mask */ 601 #define EHCI_ITD_LINK_REF 0x00000006 /* Ref to TD/ITD/SITD */ 602 #define EHCI_ITD_LINK_REF_ITD 0x00000000 /* ITD pointer */ 603 #define EHCI_ITD_LINK_REF_QH 0x00000002 /* QH pointer */ 604 #define EHCI_ITD_LINK_REF_SITD 0x00000004 /* SITD pointer */ 605 #define EHCI_ITD_LINK_REF_FSTN 0x00000006 /* FSTN pointer */ 606 #define EHCI_ITD_LINK_PTR_INVALID 0x00000001 /* Link ptr validity */ 607 608 #define EHCI_ITD_CTRL_LIST_SIZE 8 609 #define EHCI_ITD_BUFFER_LIST_SIZE 7 610 #define EHCI_ITD_CTRL0 0 /* Status and Ctrl List */ 611 #define EHCI_ITD_CTRL1 1 612 #define EHCI_ITD_CTRL2 2 613 #define EHCI_ITD_CTRL3 3 614 #define EHCI_ITD_CTRL4 4 615 #define EHCI_ITD_CTRL5 5 616 #define EHCI_ITD_CTRL6 6 617 #define EHCI_ITD_CTRL7 7 618 #define EHCI_ITD_BUFFER0 8 /* Buffer Page Ptr List */ 619 #define EHCI_ITD_BUFFER1 9 620 #define EHCI_ITD_BUFFER2 10 621 #define EHCI_ITD_BUFFER3 11 622 #define EHCI_ITD_BUFFER4 12 623 #define EHCI_ITD_BUFFER5 13 624 #define EHCI_ITD_BUFFER6 14 625 626 /* 627 * iTD Transaction Status and Control bits 628 */ 629 #define EHCI_ITD_XFER_STATUS_MASK 0xF0000000 630 #define EHCI_ITD_XFER_STATUS_SHIFT 28 631 #define EHCI_ITD_XFER_ACTIVE 0x80000000 632 #define EHCI_ITD_XFER_DATA_BUFFER_ERR 0x40000000 633 #define EHCI_ITD_XFER_BABBLE 0x20000000 634 #define EHCI_ITD_XFER_ERROR 0x10000000 635 #define EHCI_ITD_XFER_LENGTH 0x0FFF0000 636 #define EHCI_ITD_XFER_IOC 0x00008000 637 #define EHCI_ITD_XFER_IOC_ON 0x00008000 638 #define EHCI_ITD_XFER_IOC_OFF 0x00000000 639 #define EHCI_ITD_XFER_PAGE_SELECT 0x00007000 640 #define EHCI_ITD_XFER_OFFSET 0x00000FFF 641 642 /* 643 * iTD Buffer Page Pointer bits 644 */ 645 #define EHCI_ITD_CTRL_BUFFER_MASK 0xFFFFF000 646 #define EHCI_ITD_CTRL_ENDPT_MASK 0x00000F00 647 #define EHCI_ITD_CTRL_DEVICE_MASK 0x0000007F 648 #define EHCI_ITD_CTRL_DIR 0x00000800 649 #define EHCI_ITD_CTRL_DIR_IN 0x00000800 650 #define EHCI_ITD_CTRL_DIR_OUT 0x00000000 651 #define EHCI_ITD_CTRL_MAX_PACKET_MASK 0x000007FF 652 #define EHCI_ITD_CTRL_MULTI_MASK 0x00000003 653 #define EHCI_ITD_CTRL_ONE_XACT 0x00000001 654 #define EHCI_ITD_CTRL_TWO_XACT 0x00000002 655 #define EHCI_ITD_CTRL_THREE_XACT 0x00000003 656 657 /* Unused iTD index */ 658 #define EHCI_ITD_UNUSED_INDEX 0xFFFFFFFF 659 660 #define EHCI_SITD_CTRL 0 661 #define EHCI_SITD_UFRAME_SCHED 1 662 #define EHCI_SITD_XFER_STATE 2 663 #define EHCI_SITD_BUFFER0 3 664 #define EHCI_SITD_BUFFER1 4 665 #define EHCI_SITD_PREV_SITD 5 666 667 /* 668 * sitd_ctrl bits 669 * EHCI_SITD_CTRL_DIR : Direction of transaction 670 * EHCI_SITD_CTRL_PORT_MASK : Port # of recipient transaction translator(TT) 671 * EHCI_SITD_CTRL_HUB_MASK : Device address of the TT's hub 672 * EHCI_SITD_CTRL_END_PT_MASK : Endpoint # on device serving as data source/sink 673 * EHCI_SITD_CTRL_DEVICE_MASK : Address of device serving as data source/sink 674 */ 675 #define EHCI_SITD_CTRL_DIR 0x80000000 676 #define EHCI_SITD_CTRL_DIR_IN 0x80000000 677 #define EHCI_SITD_CTRL_DIR_OUT 0x00000000 678 #define EHCI_SITD_CTRL_PORT_MASK 0x7F000000 679 #define EHCI_SITD_CTRL_PORT_SHIFT 24 680 #define EHCI_SITD_CTRL_HUB_MASK 0x007F0000 681 #define EHCI_SITD_CTRL_HUB_SHIFT 16 682 #define EHCI_SITD_CTRL_END_PT_MASK 0x00000F00 683 #define EHCI_SITD_CTRL_END_PT_SHIFT 8 684 #define EHCI_SITD_CTRL_DEVICE_MASK 0x0000007F 685 #define EHCI_SITD_CTRL_DEVICE_SHIFT 0 686 687 /* 688 * sitd_uframe_sched bits 689 * EHCI_SITD_UFRAME_CMASK_MASK : Determines which uFrame the HC executes CSplit 690 * EHCI_SITD_UFRAME_SMASK_MASK : Determines which uFrame the HC executes SSplit 691 */ 692 #define EHCI_SITD_UFRAME_CMASK_MASK 0x0000FF00 693 #define EHCI_SITD_UFRAME_CMASK_SHIFT 8 694 #define EHCI_SITD_UFRAME_SMASK_MASK 0x000000FF 695 #define EHCI_SITD_UFRAME_SMASK_SHIFT 0 696 697 /* 698 * sitd_xfer_state bits 699 * EHCI_SITD_XFER_IOC_MASK : Interrupt when transaction is complete. 700 * EHCI_SITD_XFER_PAGE_MASK : Which data page pointer should be concatenated 701 * with the CurrentOffset to construct a data 702 * buffer pointer 703 * EHCI_SITD_XFER_TOTAL_MASK : Total number of bytes expected in xfer(1023 Max). 704 * EHCI_SITD_XFER_CPROG_MASK : HC tracks which CSplit has been executed. 705 * EHCI_SITD_XFER_STATUS_MASK : Status of xfer 706 */ 707 #define EHCI_SITD_XFER_IOC_MASK 0x80000000 708 #define EHCI_SITD_XFER_IOC_ON 0x80000000 709 #define EHCI_SITD_XFER_IOC_OFF 0x00000000 710 #define EHCI_SITD_XFER_PAGE_MASK 0x40000000 711 #define EHCI_SITD_XFER_PAGE_0 0x00000000 712 #define EHCI_SITD_XFER_PAGE_1 0x40000000 713 #define EHCI_SITD_XFER_TOTAL_MASK 0x03FF0000 714 #define EHCI_SITD_XFER_TOTAL_SHIFT 16 715 #define EHCI_SITD_XFER_CPROG_MASK 0x0000FF00 716 #define EHCI_SITD_XFER_CPROG_SHIFT 8 717 #define EHCI_SITD_XFER_STATUS_MASK 0x000000FF 718 #define EHCI_SITD_XFER_STATUS_SHIFT 0 719 #define EHCI_SITD_XFER_ACTIVE 0x80 720 #define EHCI_SITD_XFER_ERROR 0x40 721 #define EHCI_SITD_XFER_DATA_BUFFER_ERR 0x20 722 #define EHCI_SITD_XFER_BABBLE 0x10 723 #define EHCI_SITD_XFER_XACT_ERROR 0x08 724 #define EHCI_SITD_XFER_MISSED_UFRAME 0x04 725 #define EHCI_SITD_XFER_SPLIT_XACT_STATE 0x02 726 #define EHCI_SITD_XFER_SSPLIT_STATE 0x00 727 #define EHCI_SITD_XFER_CSPLIT_STATE 0x02 728 729 /* 730 * sitd_xfer_buffer0/1 731 * EHCI_SITD_XFER_BUFFER_MASK : Buffer Pointer List 732 * EHCI_SITD_XFER_OFFSET_MASK : Current byte offset 733 * EHCI_SITD_XFER_TP_MASK : Transaction position 734 * EHCI_SITD_XFER_TCOUNT_MASK : Transaction count 735 */ 736 #define EHCI_SITD_XFER_BUFFER_MASK 0xFFFFF000 737 #define EHCI_SITD_XFER_BUFFER_SHIFT 12 738 #define EHCI_SITD_XFER_OFFSET_MASK 0x00000FFF 739 #define EHCI_SITD_XFER_OFFSET_SHIFT 0 740 #define EHCI_SITD_XFER_TP_MASK 0x00000018 741 #define EHCI_SITD_XFER_TP_ALL 0x0 742 #define EHCI_SITD_XFER_TP_BEGIN 0x1 743 #define EHCI_SITD_XFER_TP_MID 0x2 744 #define EHCI_SITD_XFER_TP_END 0x3 745 #define EHCI_SITD_XFER_TCOUNT_MASK 0x00000007 746 #define EHCI_SITD_XFER_TCOUNT_SHIFT 0 747 748 /* 749 * qtd_state 750 * 751 * ITD States 752 */ 753 #define EHCI_ITD_FREE 1 /* Free ITD */ 754 #define EHCI_ITD_DUMMY 2 /* Dummy ITD */ 755 #define EHCI_ITD_ACTIVE 3 /* Active ITD */ 756 #define EHCI_ITD_RECLAIM 4 /* Reclaim ITD */ 757 758 #ifdef __cplusplus 759 } 760 #endif 761 762 #endif /* _SYS_USB_EHCI_H */ 763