]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Bus/Pci/EhciDxe/EhciReg.h
add error handling on usb related modules.
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / EhciDxe / EhciReg.h
CommitLineData
913cb9dc 1/** @file\r
2\r
78c2ffb5 3 This file contains the definination for host controller register operation routines.\r
4\r
597f4ee2 5Copyright (c) 2007 - 2009, Intel Corporation\r
913cb9dc 6All rights reserved. This program and the accompanying materials\r
7are licensed and made available under the terms and conditions of the BSD License\r
8which accompanies this distribution. The full text of the license may be found at\r
9http://opensource.org/licenses/bsd-license.php\r
10\r
11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
913cb9dc 14**/\r
15\r
16#ifndef _EFI_EHCI_REG_H_\r
17#define _EFI_EHCI_REG_H_\r
18\r
19\r
78c2ffb5 20typedef enum {\r
913cb9dc 21 //\r
22 // Capability register offset\r
23 //\r
24 EHC_CAPLENGTH_OFFSET = 0, // Capability register length offset\r
25 EHC_HCSPARAMS_OFFSET = 0x04, // Structural Parameters 04-07h\r
26 EHC_HCCPARAMS_OFFSET = 0x08, // Capability parameters offset\r
27\r
28 //\r
29 // Capability register bit definition\r
30 //\r
31 HCSP_NPORTS = 0x0F, // Number of root hub port\r
32 HCCP_64BIT = 0x01, // 64-bit addressing capability\r
33\r
34 //\r
35 // Operational register offset\r
36 //\r
37 EHC_USBCMD_OFFSET = 0x0, // USB command register offset\r
38 EHC_USBSTS_OFFSET = 0x04, // Statue register offset\r
39 EHC_USBINTR_OFFSET = 0x08, // USB interrutp offset\r
40 EHC_FRINDEX_OFFSET = 0x0C, // Frame index offset\r
41 EHC_CTRLDSSEG_OFFSET = 0x10, // Control data structure segment offset\r
42 EHC_FRAME_BASE_OFFSET = 0x14, // Frame list base address offset\r
43 EHC_ASYNC_HEAD_OFFSET = 0x18, // Next asynchronous list address offset\r
44 EHC_CONFIG_FLAG_OFFSET = 0x40, // Configure flag register offset\r
45 EHC_PORT_STAT_OFFSET = 0x44, // Port status/control offset\r
46\r
47 EHC_FRAME_LEN = 1024,\r
48\r
49 //\r
50 // Register bit definition\r
51 //\r
52 CONFIGFLAG_ROUTE_EHC = 0x01, // Route port to EHC\r
53\r
54 USBCMD_RUN = 0x01, // Run/stop\r
55 USBCMD_RESET = 0x02, // Start the host controller reset\r
56 USBCMD_ENABLE_PERIOD = 0x10, // Enable periodic schedule\r
57 USBCMD_ENABLE_ASYNC = 0x20, // Enable asynchronous schedule\r
58 USBCMD_IAAD = 0x40, // Interrupt on async advance doorbell\r
59\r
60 USBSTS_IAA = 0x20, // Interrupt on async advance\r
61 USBSTS_PERIOD_ENABLED = 0x4000, // Periodic schedule status\r
62 USBSTS_ASYNC_ENABLED = 0x8000, // Asynchronous schedule status\r
63 USBSTS_HALT = 0x1000, // Host controller halted\r
64 USBSTS_SYS_ERROR = 0x10, // Host system error\r
65 USBSTS_INTACK_MASK = 0x003F, // Mask for the interrupt ACK, the WC\r
66 // (write clean) bits in USBSTS register\r
67\r
68 PORTSC_CONN = 0x01, // Current Connect Status\r
69 PORTSC_CONN_CHANGE = 0x02, // Connect Status Change\r
70 PORTSC_ENABLED = 0x04, // Port Enable / Disable\r
71 PORTSC_ENABLE_CHANGE = 0x08, // Port Enable / Disable Change\r
72 PORTSC_OVERCUR = 0x10, // Over current Active\r
73 PORTSC_OVERCUR_CHANGE = 0x20, // Over current Change\r
74 PORSTSC_RESUME = 0x40, // Force Port Resume\r
75 PORTSC_SUSPEND = 0x80, // Port Suspend State\r
76 PORTSC_RESET = 0x100, // Port Reset\r
77 PORTSC_LINESTATE_K = 0x400, // Line Status K-state\r
78 PORTSC_LINESTATE_J = 0x800, // Line Status J-state\r
79 PORTSC_POWER = 0x1000, // Port Power\r
80 PORTSC_OWNER = 0x2000, // Port Owner\r
81 PORTSC_CHANGE_MASK = 0x2A, // Mask of the port change bits,\r
82 // they are WC (write clean)\r
83 //\r
84 // PCI Configuration Registers\r
85 //\r
c52fa98c 86 EHC_BAR_INDEX = 0 /* how many bytes away from USB_BASE to 0x10 */\r
78c2ffb5 87}EHCI_REGISTER_OFFSET;\r
913cb9dc 88\r
89#define EHC_LINK_TERMINATED(Link) (((Link) & 0x01) != 0)\r
90\r
91#define EHC_ADDR(High, QhHw32) \\r
92 ((VOID *) (UINTN) (LShiftU64 ((High), 32) | ((QhHw32) & 0xFFFFFFF0)))\r
93\r
94#define EHCI_IS_DATAIN(EndpointAddr) EHC_BIT_IS_SET((EndpointAddr), 0x80)\r
95\r
96//\r
97// Structure to map the hardware port states to the\r
98// UEFI's port states.\r
99//\r
100typedef struct {\r
101 UINT16 HwState;\r
102 UINT16 UefiState;\r
103} USB_PORT_STATE_MAP;\r
104\r
105//\r
106// Ehci Data and Ctrl Structures\r
107//\r
108#pragma pack(1)\r
109typedef struct {\r
110 UINT8 PI;\r
111 UINT8 SubClassCode;\r
112 UINT8 BaseCode;\r
113} USB_CLASSC;\r
114#pragma pack()\r
115\r
78c2ffb5 116/**\r
117 Read EHCI capability register.\r
118\r
119 @param Ehc The EHCI device.\r
120 @param Offset Capability register address.\r
121\r
122 @return The register content.\r
913cb9dc 123\r
78c2ffb5 124**/\r
913cb9dc 125UINT32\r
126EhcReadCapRegister (\r
127 IN USB2_HC_DEV *Ehc,\r
128 IN UINT32 Offset\r
ed66e1bc 129 );\r
913cb9dc 130\r
131\r
132/**\r
78c2ffb5 133 Read EHCI Operation register.\r
913cb9dc 134\r
78c2ffb5 135 @param Ehc The EHCI device.\r
136 @param Offset The operation register offset.\r
913cb9dc 137\r
78c2ffb5 138 @return The register content.\r
913cb9dc 139\r
140**/\r
141UINT32\r
142EhcReadOpReg (\r
143 IN USB2_HC_DEV *Ehc,\r
144 IN UINT32 Offset\r
ed66e1bc 145 );\r
913cb9dc 146\r
147\r
148/**\r
78c2ffb5 149 Write the data to the EHCI operation register.\r
913cb9dc 150\r
78c2ffb5 151 @param Ehc The EHCI device.\r
152 @param Offset EHCI operation register offset.\r
153 @param Data The data to write.\r
913cb9dc 154\r
913cb9dc 155**/\r
156VOID\r
157EhcWriteOpReg (\r
158 IN USB2_HC_DEV *Ehc,\r
159 IN UINT32 Offset,\r
160 IN UINT32 Data\r
ed66e1bc 161 );\r
913cb9dc 162\r
efe9186f 163/**\r
164 Set one bit of the operational register while keeping other bits.\r
165\r
166 @param Ehc The EHCI device.\r
167 @param Offset The offset of the operational register.\r
168 @param Bit The bit mask of the register to set.\r
169\r
170**/\r
171VOID\r
172EhcSetOpRegBit (\r
173 IN USB2_HC_DEV *Ehc,\r
174 IN UINT32 Offset,\r
175 IN UINT32 Bit\r
176 );\r
177\r
178/**\r
179 Clear one bit of the operational register while keeping other bits.\r
180\r
181 @param Ehc The EHCI device.\r
182 @param Offset The offset of the operational register.\r
183 @param Bit The bit mask of the register to clear.\r
184\r
185**/\r
186VOID\r
187EhcClearOpRegBit (\r
188 IN USB2_HC_DEV *Ehc,\r
189 IN UINT32 Offset,\r
190 IN UINT32 Bit\r
191 );\r
913cb9dc 192\r
193/**\r
194 Add support for UEFI Over Legacy (UoL) feature, stop\r
78c2ffb5 195 the legacy USB SMI support.\r
913cb9dc 196\r
197 @param Ehc The EHCI device.\r
198\r
913cb9dc 199**/\r
200VOID\r
201EhcClearLegacySupport (\r
202 IN USB2_HC_DEV *Ehc\r
ed66e1bc 203 );\r
913cb9dc 204\r
205\r
206\r
207/**\r
208 Set door bell and wait it to be ACKed by host controller.\r
209 This function is used to synchronize with the hardware.\r
210\r
78c2ffb5 211 @param Ehc The EHCI device.\r
212 @param Timeout The time to wait before abort (in millisecond, ms).\r
913cb9dc 213\r
78c2ffb5 214 @retval EFI_SUCCESS Synchronized with the hardware.\r
215 @retval EFI_TIMEOUT Time out happened while waiting door bell to set.\r
913cb9dc 216\r
217**/\r
218EFI_STATUS\r
219EhcSetAndWaitDoorBell (\r
220 IN USB2_HC_DEV *Ehc,\r
221 IN UINT32 Timeout\r
ed66e1bc 222 );\r
913cb9dc 223\r
224\r
225/**\r
78c2ffb5 226 Clear all the interrutp status bits, these bits are Write-Clean.\r
913cb9dc 227\r
78c2ffb5 228 @param Ehc The EHCI device.\r
913cb9dc 229\r
913cb9dc 230**/\r
231VOID\r
232EhcAckAllInterrupt (\r
233 IN USB2_HC_DEV *Ehc\r
ed66e1bc 234 );\r
913cb9dc 235\r
236\r
237\r
238/**\r
78c2ffb5 239 Whether Ehc is halted.\r
913cb9dc 240\r
78c2ffb5 241 @param Ehc The EHCI device.\r
913cb9dc 242\r
78c2ffb5 243 @retval TRUE The controller is halted.\r
244 @retval FALSE It isn't halted.\r
913cb9dc 245\r
246**/\r
247BOOLEAN\r
248EhcIsHalt (\r
249 IN USB2_HC_DEV *Ehc\r
ed66e1bc 250 );\r
913cb9dc 251\r
252\r
253/**\r
78c2ffb5 254 Whether system error occurred.\r
913cb9dc 255\r
78c2ffb5 256 @param Ehc The EHCI device.\r
913cb9dc 257\r
78c2ffb5 258 @retval TRUE System error happened.\r
259 @retval FALSE No system error.\r
913cb9dc 260\r
261**/\r
262BOOLEAN\r
263EhcIsSysError (\r
264 IN USB2_HC_DEV *Ehc\r
ed66e1bc 265 );\r
913cb9dc 266\r
267\r
913cb9dc 268/**\r
78c2ffb5 269 Reset the host controller.\r
913cb9dc 270\r
78c2ffb5 271 @param Ehc The EHCI device.\r
272 @param Timeout Time to wait before abort (in millisecond, ms).\r
913cb9dc 273\r
78c2ffb5 274 @retval EFI_SUCCESS The host controller is reset.\r
275 @return Others Failed to reset the host.\r
913cb9dc 276\r
277**/\r
278EFI_STATUS\r
279EhcResetHC (\r
280 IN USB2_HC_DEV *Ehc,\r
281 IN UINT32 Timeout\r
ed66e1bc 282 );\r
913cb9dc 283\r
284\r
913cb9dc 285/**\r
78c2ffb5 286 Halt the host controller.\r
913cb9dc 287\r
78c2ffb5 288 @param Ehc The EHCI device.\r
289 @param Timeout Time to wait before abort.\r
913cb9dc 290\r
78c2ffb5 291 @return EFI_SUCCESS The EHCI is halt.\r
292 @return EFI_TIMEOUT Failed to halt the controller before Timeout.\r
913cb9dc 293\r
294**/\r
295EFI_STATUS\r
296EhcHaltHC (\r
297 IN USB2_HC_DEV *Ehc,\r
298 IN UINT32 Timeout\r
ed66e1bc 299 );\r
913cb9dc 300\r
301\r
913cb9dc 302/**\r
78c2ffb5 303 Set the EHCI to run.\r
913cb9dc 304\r
78c2ffb5 305 @param Ehc The EHCI device.\r
306 @param Timeout Time to wait before abort.\r
913cb9dc 307\r
78c2ffb5 308 @return EFI_SUCCESS The EHCI is running.\r
309 @return Others Failed to set the EHCI to run.\r
913cb9dc 310\r
311**/\r
312EFI_STATUS\r
313EhcRunHC (\r
314 IN USB2_HC_DEV *Ehc,\r
315 IN UINT32 Timeout\r
ed66e1bc 316 );\r
913cb9dc 317\r
318\r
319\r
320/**\r
321 Initialize the HC hardware.\r
78c2ffb5 322 EHCI spec lists the five things to do to initialize the hardware:\r
913cb9dc 323 1. Program CTRLDSSEGMENT\r
324 2. Set USBINTR to enable interrupts\r
325 3. Set periodic list base\r
326 4. Set USBCMD, interrupt threshold, frame list size etc\r
327 5. Write 1 to CONFIGFLAG to route all ports to EHCI\r
328\r
78c2ffb5 329 @param Ehc The EHCI device.\r
913cb9dc 330\r
78c2ffb5 331 @return EFI_SUCCESS The EHCI has come out of halt state.\r
332 @return EFI_TIMEOUT Time out happened.\r
913cb9dc 333\r
334**/\r
335EFI_STATUS\r
336EhcInitHC (\r
337 IN USB2_HC_DEV *Ehc\r
ed66e1bc 338 );\r
913cb9dc 339\r
340#endif\r