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