1 /** @file
2 
3   The definition for UHCI register operation routines.
4 
5 Copyright (c) 2007 - 2010, 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_UHCI_REG_H_
17 #define _EFI_UHCI_REG_H_
18 
19 //
20 // UHCI register offset
21 //
22 
23 #define UHCI_FRAME_NUM        1024
24 
25 //
26 // Register offset and PCI related staff
27 //
28 #define USB_BAR_INDEX         4
29 
30 #define USBCMD_OFFSET         0
31 #define USBSTS_OFFSET         2
32 #define USBINTR_OFFSET        4
33 #define USBPORTSC_OFFSET      0x10
34 #define USB_FRAME_NO_OFFSET   6
35 #define USB_FRAME_BASE_OFFSET 8
36 #define USB_EMULATION_OFFSET  0xC0
37 
38 //
39 // Packet IDs
40 //
41 #define SETUP_PACKET_ID       0x2D
42 #define INPUT_PACKET_ID       0x69
43 #define OUTPUT_PACKET_ID      0xE1
44 #define ERROR_PACKET_ID       0x55
45 
46 //
47 // USB port status and control bit definition.
48 //
49 #define USBPORTSC_CCS         BIT0  // Current Connect Status
50 #define USBPORTSC_CSC         BIT1  // Connect Status Change
51 #define USBPORTSC_PED         BIT2  // Port Enable / Disable
52 #define USBPORTSC_PEDC        BIT3  // Port Enable / Disable Change
53 #define USBPORTSC_LSL         BIT4  // Line Status Low BIT
54 #define USBPORTSC_LSH         BIT5  // Line Status High BIT
55 #define USBPORTSC_RD          BIT6  // Resume Detect
56 #define USBPORTSC_LSDA        BIT8  // Low Speed Device Attached
57 #define USBPORTSC_PR          BIT9  // Port Reset
58 #define USBPORTSC_SUSP        BIT12 // Suspend
59 
60 //
61 // UHCI Spec said it must implement 2 ports each host at least,
62 // and if more, check whether the bit7 of PORTSC is always 1.
63 // So here assume the max of port number each host is 16.
64 //
65 #define USB_MAX_ROOTHUB_PORT  0x0F
66 
67 //
68 // Command register bit definitions
69 //
70 #define USBCMD_RS             BIT0  // Run/Stop
71 #define USBCMD_HCRESET        BIT1  // Host reset
72 #define USBCMD_GRESET         BIT2  // Global reset
73 #define USBCMD_EGSM           BIT3  // Global Suspend Mode
74 #define USBCMD_FGR            BIT4  // Force Global Resume
75 #define USBCMD_SWDBG          BIT5  // SW Debug mode
76 #define USBCMD_CF             BIT6  // Config Flag (sw only)
77 #define USBCMD_MAXP           BIT7  // Max Packet (0 = 32, 1 = 64)
78 
79 //
80 // USB Status register bit definitions
81 //
82 #define USBSTS_USBINT         BIT0  // Interrupt due to IOC
83 #define USBSTS_ERROR          BIT1  // Interrupt due to error
84 #define USBSTS_RD             BIT2  // Resume Detect
85 #define USBSTS_HSE            BIT3  // Host System Error
86 #define USBSTS_HCPE           BIT4  // Host Controller Process Error
87 #define USBSTS_HCH            BIT5  // HC Halted
88 
89 #define USBTD_ACTIVE          BIT7  // TD is still active
90 #define USBTD_STALLED         BIT6  // TD is stalled
91 #define USBTD_BUFFERR         BIT5  // Buffer underflow or overflow
92 #define USBTD_BABBLE          BIT4  // Babble condition
93 #define USBTD_NAK             BIT3  // NAK is received
94 #define USBTD_CRC             BIT2  // CRC/Time out error
95 #define USBTD_BITSTUFF        BIT1  // Bit stuff error
96 
97 
98 /**
99   Read a UHCI register.
100 
101   @param  PciIo        The EFI_PCI_IO_PROTOCOL to use.
102   @param  Offset       Register offset to USB_BAR_INDEX.
103 
104   @return Content of register.
105 
106 **/
107 UINT16
108 UhciReadReg (
109   IN EFI_PCI_IO_PROTOCOL     *PciIo,
110   IN UINT32                  Offset
111   );
112 
113 
114 
115 /**
116   Write data to UHCI register.
117 
118   @param  PciIo        The EFI_PCI_IO_PROTOCOL to use.
119   @param  Offset       Register offset to USB_BAR_INDEX.
120   @param  Data         Data to write.
121 
122   @return None.
123 
124 **/
125 VOID
126 UhciWriteReg (
127   IN EFI_PCI_IO_PROTOCOL     *PciIo,
128   IN UINT32                  Offset,
129   IN UINT16                  Data
130   );
131 
132 
133 
134 /**
135   Set a bit of the UHCI Register.
136 
137   @param  PciIo        The EFI_PCI_IO_PROTOCOL to use.
138   @param  Offset       Register offset to USB_BAR_INDEX.
139   @param  Bit          The bit to set.
140 
141   @return None.
142 
143 **/
144 VOID
145 UhciSetRegBit (
146   IN EFI_PCI_IO_PROTOCOL     *PciIo,
147   IN UINT32                  Offset,
148   IN UINT16                  Bit
149   );
150 
151 
152 
153 /**
154   Clear a bit of the UHCI Register.
155 
156   @param  PciIo        The PCI_IO protocol to access the PCI.
157   @param  Offset       Register offset to USB_BAR_INDEX.
158   @param  Bit          The bit to clear.
159 
160   @return None.
161 
162 **/
163 VOID
164 UhciClearRegBit (
165   IN EFI_PCI_IO_PROTOCOL     *PciIo,
166   IN UINT32                  Offset,
167   IN UINT16                  Bit
168   );
169 
170 
171 /**
172   Clear all the interrutp status bits, these bits
173   are Write-Clean.
174 
175   @param  Uhc          The UHCI device.
176 
177   @return None.
178 
179 **/
180 VOID
181 UhciAckAllInterrupt (
182   IN  USB_HC_DEV          *Uhc
183   );
184 
185 
186 /**
187   Stop the host controller.
188 
189   @param  Uhc          The UHCI device.
190   @param  Timeout      Max time allowed.
191 
192   @retval EFI_SUCCESS  The host controller is stopped.
193   @retval EFI_TIMEOUT  Failed to stop the host controller.
194 
195 **/
196 EFI_STATUS
197 UhciStopHc (
198   IN USB_HC_DEV         *Uhc,
199   IN UINTN              Timeout
200   );
201 
202 
203 
204 /**
205   Check whether the host controller operates well.
206 
207   @param  PciIo        The PCI_IO protocol to use.
208 
209   @retval TRUE         Host controller is working.
210   @retval FALSE        Host controller is halted or system error.
211 
212 **/
213 BOOLEAN
214 UhciIsHcWorking (
215   IN EFI_PCI_IO_PROTOCOL     *PciIo
216   );
217 
218 
219 /**
220   Set the UHCI frame list base address. It can't use
221   UhciWriteReg which access memory in UINT16.
222 
223   @param  PciIo        The EFI_PCI_IO_PROTOCOL to use.
224   @param  Addr         Address to set.
225 
226   @return None.
227 
228 **/
229 VOID
230 UhciSetFrameListBaseAddr (
231   IN EFI_PCI_IO_PROTOCOL     *PciIo,
232   IN VOID                    *Addr
233   );
234 
235 
236 /**
237   Disable USB Emulation.
238 
239   @param  PciIo        The EFI_PCI_IO_PROTOCOL protocol to use.
240 
241   @return None.
242 
243 **/
244 VOID
245 UhciTurnOffUsbEmulation (
246   IN EFI_PCI_IO_PROTOCOL     *PciIo
247   );
248 #endif
249