ehcihw.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. /*++
  2. Copyright (c) 2013 Minoca Corp.
  3. This file is licensed under the terms of the GNU General Public License
  4. version 3. Alternative licensing terms are available. Contact
  5. info@minocacorp.com for details. See the LICENSE file at the root of this
  6. project for complete licensing information.
  7. Module Name:
  8. ehcihw.h
  9. Abstract:
  10. This header contains EHCI hardware definitions.
  11. Author:
  12. Evan Green 18-Mar-2013
  13. --*/
  14. //
  15. // ------------------------------------------------------------------- Includes
  16. //
  17. //
  18. // ---------------------------------------------------------------- Definitions
  19. //
  20. //
  21. // Define PCI configuration register offsets.
  22. //
  23. #define EHCI_USB_REGISTER_BASE_REGISTER 0x10
  24. #define EHCI_USB_REGISTER_BASE_ADDRESS_MASK 0xFFFFFF00
  25. #define EHCI_EECP_LEGACY_SUPPORT_REGISTER 0x00
  26. #define EHCI_LEGACY_SUPPORT_OS_OWNED (1 << 24)
  27. #define EHCI_LEGACY_SUPPORT_BIOS_OWNED (1 << 16)
  28. #define EHCI_EECP_LEGACY_SUPPORT_REGISTER 0x00
  29. #define EHCI_EECP_LEGACY_CONTROL_REGISTER 0x04
  30. //
  31. // Define EHCI capability register offsets.
  32. //
  33. #define EHCI_CAPABILITY_LENGTH_REGISTER 0x00
  34. #define EHCI_CAPABILITY_VERSION_REGISTER 0x02
  35. #define EHCI_CAPABILITY_PARAMETERS_REGISTER 0x04
  36. #define EHCI_CAPABILITY_PARAMETERS_PORT_COUNT_MASK 0x0000000F
  37. #define EHCI_CAPABILITY_CAPABILITIES_REGISTER 0x08
  38. #define EHCI_CAPABILITY_CAPABILITIES_EXTENDED_CAPABILITIES_MASK 0x0000FF00
  39. #define EHCI_CAPABILITY_CAPABILITIES_EXTENDED_CAPABILITIES_SHIFT 8
  40. #define EHCI_CAPABILITY_PORT_ROUTING_REGISTER 0x0C
  41. //
  42. // Define the default number of frame list pointers in a schedule.
  43. //
  44. #define EHCI_DEFAULT_FRAME_LIST_ENTRY_COUNT 1024
  45. #define EHCI_FRAME_LIST_ALIGNMENT 4096
  46. #define EHCI_TRANSFER_POINTER_COUNT 5
  47. #define EHCI_PAGE_SIZE 4096
  48. #define EHCI_TRANSFER_MAX_PACKET_SIZE \
  49. (EHCI_TRANSFER_POINTER_COUNT * EHCI_PAGE_SIZE)
  50. //
  51. // EHCI USB Command bit definitions
  52. //
  53. #define EHCI_COMMAND_INTERRUPT_EVERY_1_UFRAME (0x1 << 16)
  54. #define EHCI_COMMAND_INTERRUPT_EVERY_2_UFRAMES (0x2 << 16)
  55. #define EHCI_COMMAND_INTERRUPT_EVERY_4_UFRAMES (0x4 << 16)
  56. #define EHCI_COMMAND_INTERRUPT_EVERY_8_UFRAMES (0x8 << 16)
  57. #define EHCI_COMMAND_INTERRUPT_EVERY_16_UFRAMES (0x10 << 16)
  58. #define EHCI_COMMAND_INTERRUPT_EVERY_32_UFRAMES (0x20 << 16)
  59. #define EHCI_COMMAND_INTERRUPT_EVERY_64_UFRAMES (0x40 << 16)
  60. #define ECHI_COMMAND_ASYNC_PARK_ENABLE (1 << 11)
  61. #define EHCI_COMMAND_PARK_COUNT_SHIFT 8
  62. #define EHCI_COMMAND_LIGHT_CONTROLLER_RESET (1 << 7)
  63. #define EHCI_COMMAND_INTERRUPT_ON_ASYNC_ADVANCE (1 << 6)
  64. #define EHCI_COMMAND_ENABLE_ASYNC_SCHEDULE (1 << 5)
  65. #define EHCI_COMMAND_ENABLE_PERIODIC_SCHEDULE (1 << 4)
  66. #define EHCI_COMMAND_1024_FRAME_LIST_ENTRIES (0 << 2)
  67. #define EHCI_COMMAND_512_FRAME_LIST_ENTRIES (1 << 2)
  68. #define EHCI_COMMAND_256_FRAME_LIST_ENTRIES (2 << 2)
  69. #define EHCI_COMMAND_CONTROLLER_RESET (1 << 1)
  70. #define EHCI_COMMAND_RUN (1 << 0)
  71. //
  72. // EHCI USB Status bit definitions
  73. //
  74. #define EHCI_STATUS_ASYNC_SCHEDULE_STATUS (1 << 15)
  75. #define EHCI_STATUS_PERIODIC_SCHEDULE_STATUS (1 << 14)
  76. #define EHCI_STATUS_RECLAMATION (1 << 13)
  77. #define EHCI_STATUS_HALTED (1 << 12)
  78. #define EHCI_STATUS_INTERRUPT_ON_ASYNC_ADVANCE (1 << 5)
  79. #define EHCI_STATUS_HOST_SYSTEM_ERROR (1 << 4)
  80. #define EHCI_STATUS_FRAME_LIST_ROLLOVER (1 << 3)
  81. #define EHCI_STATUS_PORT_CHANGE_DETECT (1 << 2)
  82. #define EHCI_STATUS_USB_ERROR_INTERRUPT (1 << 1)
  83. #define EHCI_STATUS_USB_INTERRUPT (1 << 0)
  84. #define EHCI_STATUS_INTERRUPT_MASK \
  85. (EHCI_STATUS_INTERRUPT_ON_ASYNC_ADVANCE | \
  86. EHCI_STATUS_HOST_SYSTEM_ERROR | \
  87. EHCI_STATUS_FRAME_LIST_ROLLOVER | \
  88. EHCI_STATUS_PORT_CHANGE_DETECT | \
  89. EHCI_STATUS_USB_ERROR_INTERRUPT | \
  90. EHCI_STATUS_USB_INTERRUPT)
  91. //
  92. // EHCI Interrupt Enable bit definitions
  93. //
  94. #define EHCI_INTERRUPT_ASYNC_ADVANCE (1 << 5)
  95. #define EHCI_INTERRUPT_HOST_SYSTEM_ERROR (1 << 4)
  96. #define EHCI_INTERRUPT_FRAME_LIST_ROLLOVER (1 << 3)
  97. #define EHCI_INTERRUPT_PORT_CHANGE (1 << 2)
  98. #define EHCI_INTERRUPT_USB_ERROR (1 << 1)
  99. #define EHCI_INTERRUPT_ENABLE (1 << 0)
  100. //
  101. // EHCI Port Status bit definitions
  102. // For the line state registers, K state is a low speed device, J state is a
  103. // full or high speed device.
  104. //
  105. #define EHCI_PORT_WAKE_ON_OVER_CURRENT (1 << 22)
  106. #define EHCI_PORT_WAKE_ON_DISCONNECT (1 << 21)
  107. #define EHCI_PORT_WAKE_ON_CONNECT (1 << 20)
  108. #define EHCI_PORT_TEST_MODE_DISABLED (0x0 << 16)
  109. #define EHCI_PORT_TEST_J_STATE (0x1 << 16)
  110. #define EHCI_PORT_TEST_K_STATE (0x2 << 16)
  111. #define EHCI_PORT_TEST_SE0_NAK (0x3 << 16)
  112. #define EHCI_PORT_TEST_PACKET (0x4 << 16)
  113. #define EHCI_PORT_TEST_FORCE_ENABLE (0x5 << 16)
  114. #define EHCI_PORT_INDICATOR_OFF (0x0 << 14)
  115. #define EHCI_PORT_INDICATOR_AMBER (0x1 << 14)
  116. #define EHCI_PORT_INDICATOR_GREEN (0x2 << 14)
  117. #define EHCI_PORT_INDICATOR_MASK (0x3 << 14)
  118. #define EHCI_PORT_OWNER (1 << 13)
  119. #define EHCI_PORT_POWER (1 << 12)
  120. #define EHCI_PORT_LINE_STATE_SE0 (0x0 << 10)
  121. #define EHCI_PORT_LINE_STATE_K (0x1 << 10)
  122. #define EHCI_PORT_LINE_STATE_J (0x2 << 10)
  123. #define EHCI_PORT_LINE_STATE_MASK (0x3 << 10)
  124. #define EHCI_PORT_RESET (1 << 8)
  125. #define EHCI_PORT_SUSPEND (1 << 7)
  126. #define EHCI_PORT_RESUME (1 << 6)
  127. #define EHCI_PORT_OVER_CURRENT_CHANGE (1 << 5)
  128. #define EHCI_PORT_OVER_CURRENT_ACTIVE (1 << 4)
  129. #define EHCI_PORT_ENABLE_CHANGE (1 << 3)
  130. #define EHCI_PORT_ENABLE (1 << 2)
  131. #define EHCI_PORT_CONNECT_STATUS_CHANGE (1 << 1)
  132. #define EHCI_PORT_CONNECT_STATUS (1 << 0)
  133. //
  134. // Define common bits across all link pointers.
  135. //
  136. #define EHCI_LINK_TYPE_ISOCHRONOUS_TRANSFER (0x0 << 1)
  137. #define EHCI_LINK_TYPE_QUEUE_HEAD (0x1 << 1)
  138. #define EHCI_LINK_TYPE_SPLIT_ISOCHRONOUS_TRANSFER (0x2 << 1)
  139. #define EHCI_LINK_TYPE_FRAME_SPAN_TRAVERSAL_NODE (0x3 << 1)
  140. #define EHCI_LINK_TERMINATE (1 << 0)
  141. #define EHCI_LINK_ADDRESS_MASK 0xFFFFFFE0
  142. #define EHCI_LINK_ALIGNMENT 32
  143. //
  144. // Define Transfer Descriptor Token and Page 0 bit definitions.
  145. //
  146. #define EHCI_TRANSFER_DATA_TOGGLE (1 << 31)
  147. #define EHCI_TRANSFER_TOTAL_BYTES_MASK 0x7FFF0000
  148. #define EHCI_TRANSFER_TOTAL_BYTES_SHIFT 16
  149. #define EHCI_TRANSFER_INTERRUPT_ON_COMPLETE (1 << 15)
  150. #define EHCI_TRANSFER_CURRENT_PAGE_SHIFT 12
  151. #define EHCI_TRANSFER_3_ERRORS_ALLOWED (0x3 << 10)
  152. #define EHCI_TRANSFER_2_ERRORS_ALLOWED (0x2 << 10)
  153. #define EHCI_TRANSFER_1_ERROR_ALLOWED (0x1 << 10)
  154. #define EHCI_TRANSFER_UNLIMITED_ERRORS (0x0 << 10)
  155. #define EHCI_TRANSFER_ERROR_COUNT_SHIFT 10
  156. #define EHCI_TRANSFER_PID_CODE_OUT (0x0 << 8)
  157. #define EHCI_TRANSFER_PID_CODE_IN (0x1 << 8)
  158. #define EHCI_TRANSFER_PID_CODE_SETUP (0x2 << 8)
  159. #define EHCI_TRANSFER_STATUS_ACTIVE (1 << 7)
  160. #define EHCI_TRANSFER_STATUS_HALTED (1 << 6)
  161. #define EHCI_TRANSFER_STATUS_DATA_BUFFER_ERROR (1 << 5)
  162. #define EHCI_TRANSFER_BABBLE_ERROR (1 << 4)
  163. #define EHCI_TRANSFER_TRANSACTION_ERROR (1 << 3)
  164. #define EHCI_TRANSFER_MISSED_MICRO_FRAME_ERROR (1 << 2)
  165. #define EHCI_TRANSFER_SPLIT_DO_COMPLETE (1 << 1)
  166. #define EHCI_TRANSFER_SPLIT_DO_PING (1 << 0)
  167. #define EHCI_TRANSFER_ERROR_MASK \
  168. (EHCI_TRANSFER_STATUS_HALTED | \
  169. EHCI_TRANSFER_STATUS_DATA_BUFFER_ERROR | \
  170. EHCI_TRANSFER_BABBLE_ERROR | \
  171. EHCI_TRANSFER_TRANSACTION_ERROR | \
  172. EHCI_TRANSFER_MISSED_MICRO_FRAME_ERROR)
  173. #define EHCI_TRANSFER_CURRENT_OFFSET_MASK 0x00000FFF
  174. #define EHCI_TRANSFER_BUFFER_POINTER_MASK 0xFFFFF000
  175. //
  176. // Define Queue Head endpoint capability bit definitions.
  177. //
  178. #define EHCI_QUEUE_DEFAULT_NAK_RELOAD_COUNT 1
  179. #define EHCI_QUEUE_MAX_NAK_RELOAD_COUNT 0xF
  180. #define EHCI_QUEUE_NAK_RELOAD_COUNT_SHIFT 28
  181. #define EHCI_QUEUE_CONTROL_ENDPOINT (1 << 27)
  182. #define EHCI_QUEUE_MAX_PACKET_LENGTH_SHIFT 16
  183. #define EHCI_QUEUE_MAX_PACKET_LENGTH_MASK 0x07FF0000
  184. #define EHCI_QUEUE_RECLAMATION_HEAD (1 << 15)
  185. #define EHCI_QUEUE_USE_TRANSFER_DESCRIPTOR_DATA_TOGGLE (1 << 14)
  186. #define EHCI_QUEUE_FULL_SPEED (0x0 << 12)
  187. #define EHCI_QUEUE_LOW_SPEED (0x1 << 12)
  188. #define EHCI_QUEUE_HIGH_SPEED (0x2 << 12)
  189. #define EHCI_QUEUE_ENDPOINT_SHIFT 8
  190. #define EHCI_QUEUE_INACTIVATE_ON_NEXT_TRANSACTION (1 << 7)
  191. #define EHCI_QUEUE_DEVICE_ADDRESS_MASK 0x7F
  192. #define EHCI_QUEUE_1_TRANSACTION_PER_MICRO_FRAME (0x1 << 30)
  193. #define EHCI_QUEUE_2_TRANSACTIONS_PER_MICRO_FRAME (0x2 << 30)
  194. #define EHCI_QUEUE_3_TRANSACTIONS_PER_MICRO_FRAME (0x3 << 30)
  195. #define EHCI_QUEUE_PORT_NUMBER_SHIFT 23
  196. #define EHCI_QUEUE_PORT_NUMBER_MASK 0x3F800000
  197. #define EHCI_QUEUE_HUB_ADDRESS_SHIFT 16
  198. #define EHCI_QUEUE_HUB_ADDRESS_MASK 0x007F0000
  199. #define EHCI_QUEUE_SPLIT_COMPLETION_MASK 0x0000FF00
  200. #define EHCI_QUEUE_SPLIT_COMPLETION_SHIFT 8
  201. #define EHCI_QUEUE_INTERRUPT_SCHEDULE_MASK 0x000000FF
  202. #define EHCI_QUEUE_SPLIT_START_MASK EHCI_QUEUE_INTERRUPT_SCHEDULE_MASK
  203. //
  204. // ------------------------------------------------------ Data Type Definitions
  205. //
  206. typedef enum _EHCI_REGISTER {
  207. EhciRegisterUsbCommand = 0x00, // USBCMD
  208. EhciRegisterUsbStatus = 0x04, // USBSTS
  209. EhciRegisterUsbInterruptEnable = 0x08, // USBINTR
  210. EhciRegisterFrameNumber = 0x0C, // FRINDEX
  211. EhciRegisterSegmentSelector = 0x10, // CTRLDSSEGMENT
  212. EhciRegisterPeriodicListBase = 0x14, // PERIODICLISTBASE
  213. EhciRegisterAsynchronousListAddress = 0x18, // ASYNCLISTADDR
  214. EhciRegisterConfigured = 0x40, // CONFIGFLAG
  215. EhciRegisterPortStatusBase = 0x44, // PORTSC[1-N_PORTS]
  216. } EHCI_REGISTER, *PEHCI_REGISTER;
  217. /*++
  218. Structure Description:
  219. This structure defines the hardware-mandated structure for EHCI transfer
  220. descriptors, which are the heart of moving data through USB on EHCI host
  221. controllers. Pointers to this structure must be 32-byte aligned as required
  222. by the EHCI specification.
  223. Members:
  224. NextTransfer - Stores a link pointer containing the physical address of the
  225. next transfer in the queue.
  226. AlternateNextTransfer - Stores a link pointer containing the physical
  227. address of the next transfer should this transfer be a short IN
  228. packet.
  229. Token - Stores the working control/status information of the transfer.
  230. BufferPointer - Stores an array of physical pointers to the data to
  231. transfer. This data must be virtually contiguous, essentially meaning
  232. that buffers that are not the first or last must be a full 4096 bytes
  233. large.
  234. BufferAddressHigh - Stores the high 32 bits of each of the addresses in the
  235. buffer pointers. This is only referenced by the hardware if 64 bit
  236. structures are supported.
  237. --*/
  238. #pragma pack(push, 1)
  239. typedef struct _EHCI_TRANSFER_DESCRIPTOR {
  240. ULONG NextTransfer;
  241. ULONG AlternateNextTransfer;
  242. ULONG Token;
  243. ULONG BufferPointer[EHCI_TRANSFER_POINTER_COUNT];
  244. ULONG BufferAddressHigh[EHCI_TRANSFER_POINTER_COUNT];
  245. } PACKED EHCI_TRANSFER_DESCRIPTOR, *PEHCI_TRANSFER_DESCRIPTOR;
  246. /*++
  247. Structure Description:
  248. This structure defines the hardware-mandated structure for EHCI transfer
  249. queues, which manage sets of transfer descriptors for all transfer types
  250. except isochronous. Pointers to this structure must be 32-byte aligned as
  251. required by the EHCI specification.
  252. Members:
  253. HorizontalLink - Stores a pointer to the next element after this queue,
  254. which if on the periodic list may be an Isochronous Transfer Descriptor,
  255. Queue Head, or Frame Span Traversal Node. On the asynchronous list, this
  256. would only be another Queue Head.
  257. Destination - Stores queue adressing information and transfer length.
  258. SplitInformation - Stores information relating largely to performing full/
  259. low speed split transactions.
  260. CurrentTransferDescriptorLink - Stores the link pointer to the transfer
  261. descriptor currently being processed.
  262. TransferOverlay - Stores the working space for the EHCI controller when
  263. processing transfer descriptors on this queue.
  264. --*/
  265. typedef struct _EHCI_QUEUE_HEAD {
  266. ULONG HorizontalLink;
  267. ULONG Destination;
  268. ULONG SplitInformation;
  269. ULONG CurrentTransferDescriptorLink;
  270. EHCI_TRANSFER_DESCRIPTOR TransferOverlay;
  271. } PACKED EHCI_QUEUE_HEAD, *PEHCI_QUEUE_HEAD;
  272. /*++
  273. Structure Description:
  274. This structure defines the hardware-mandated structure for EHCI Frame
  275. Span Traversal Nodes, which are used to ensure split transactions that
  276. occur across a frame boundary get the appropriate attention from the
  277. periodic schedule.
  278. Members:
  279. NormalPathLink - Stores the normal path to the next element in the periodic
  280. schedule, which is automatically traversed during micro-frames 2-7 and
  281. when not in restore path mode.
  282. BackPathLink - Store the link to the valid in-progress split transaction,
  283. in which case this is called a Save-Place node. If the T bit is set,
  284. then the back path link is invalid, and this node is considered a
  285. Restore node.
  286. --*/
  287. typedef struct _EHCI_FRAME_SPAN_TRAVERSAL_NODE {
  288. ULONG NormalPathLink;
  289. ULONG BackPathLink;
  290. } PACKED EHCI_FRAME_SPAN_TRAVERSAL_NODE, *PEHCI_FRAME_SPAN_TRAVERSAL_NODE;
  291. /*++
  292. Structure Description:
  293. This structure defines the hardware-mandated structure for an EHCI periodic
  294. schedule. It contains 1024 frame list pointers by default, which get
  295. executed 8 times for each frame.
  296. Members:
  297. Frame - Stores the array of frame list pointers, one for each frame in
  298. the schedule.
  299. --*/
  300. typedef struct _EHCI_PERIODIC_SCHEDULE {
  301. ULONG FrameLink[EHCI_DEFAULT_FRAME_LIST_ENTRY_COUNT];
  302. } PACKED EHCI_PERIODIC_SCHEDULE, *PEHCI_PERIODIC_SCHEDULE;
  303. #pragma pack(pop)
  304. //
  305. // -------------------------------------------------------------------- Globals
  306. //
  307. //
  308. // -------------------------------------------------------- Function Prototypes
  309. //