1 /** @file
2 Private Header file for Usb Host Controller PEIM
3 
4 Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
5 
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions
8 of the BSD License which accompanies this distribution.  The
9 full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
11 
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 
15 **/
16 
17 #ifndef _EFI_PEI_XHCI_REG_H_
18 #define _EFI_PEI_XHCI_REG_H_
19 
20 //
21 // Capability registers offset
22 //
23 #define XHC_CAPLENGTH_OFFSET            0x00    // Capability register length offset
24 #define XHC_HCIVERSION_OFFSET           0x02    // Interface Version Number 02-03h
25 #define XHC_HCSPARAMS1_OFFSET           0x04    // Structural Parameters 1
26 #define XHC_HCSPARAMS2_OFFSET           0x08    // Structural Parameters 2
27 #define XHC_HCSPARAMS3_OFFSET           0x0c    // Structural Parameters 3
28 #define XHC_HCCPARAMS_OFFSET            0x10    // Capability Parameters
29 #define XHC_DBOFF_OFFSET                0x14    // Doorbell Offset
30 #define XHC_RTSOFF_OFFSET               0x18    // Runtime Register Space Offset
31 
32 //
33 // Operational registers offset
34 //
35 #define XHC_USBCMD_OFFSET               0x0000  // USB Command Register Offset
36 #define XHC_USBSTS_OFFSET               0x0004  // USB Status Register Offset
37 #define XHC_PAGESIZE_OFFSET             0x0008  // USB Page Size Register Offset
38 #define XHC_DNCTRL_OFFSET               0x0014  // Device Notification Control Register Offset
39 #define XHC_CRCR_OFFSET                 0x0018  // Command Ring Control Register Offset
40 #define XHC_DCBAAP_OFFSET               0x0030  // Device Context Base Address Array Pointer Register Offset
41 #define XHC_CONFIG_OFFSET               0x0038  // Configure Register Offset
42 #define XHC_PORTSC_OFFSET               0x0400  // Port Status and Control Register Offset
43 
44 //
45 // Runtime registers offset
46 //
47 #define XHC_MFINDEX_OFFSET              0x00    // Microframe Index Register Offset
48 #define XHC_IMAN_OFFSET                 0x20    // Interrupter X Management Register Offset
49 #define XHC_IMOD_OFFSET                 0x24    // Interrupter X Moderation Register Offset
50 #define XHC_ERSTSZ_OFFSET               0x28    // Event Ring Segment Table Size Register Offset
51 #define XHC_ERSTBA_OFFSET               0x30    // Event Ring Segment Table Base Address Register Offset
52 #define XHC_ERDP_OFFSET                 0x38    // Event Ring Dequeue Pointer Register Offset
53 
54 //
55 // Register Bit Definition
56 //
57 #define XHC_USBCMD_RUN                  BIT0    // Run/Stop
58 #define XHC_USBCMD_RESET                BIT1    // Host Controller Reset
59 #define XHC_USBCMD_INTE                 BIT2    // Interrupter Enable
60 #define XHC_USBCMD_HSEE                 BIT3    // Host System Error Enable
61 
62 #define XHC_USBSTS_HALT                 BIT0    // Host Controller Halted
63 #define XHC_USBSTS_HSE                  BIT2    // Host System Error
64 #define XHC_USBSTS_EINT                 BIT3    // Event Interrupt
65 #define XHC_USBSTS_PCD                  BIT4    // Port Change Detect
66 #define XHC_USBSTS_SSS                  BIT8    // Save State Status
67 #define XHC_USBSTS_RSS                  BIT9    // Restore State Status
68 #define XHC_USBSTS_SRE                  BIT10   // Save/Restore Error
69 #define XHC_USBSTS_CNR                  BIT11   // Host Controller Not Ready
70 #define XHC_USBSTS_HCE                  BIT12   // Host Controller Error
71 
72 #define XHC_PAGESIZE_MASK               0xFFFF  // Page Size
73 
74 #define XHC_CRCR_RCS                    BIT0    // Ring Cycle State
75 #define XHC_CRCR_CS                     BIT1    // Command Stop
76 #define XHC_CRCR_CA                     BIT2    // Command Abort
77 #define XHC_CRCR_CRR                    BIT3    // Command Ring Running
78 
79 #define XHC_CONFIG_MASK                 0xFF    // Max Device Slots Enabled
80 
81 #define XHC_PORTSC_CCS                  BIT0    // Current Connect Status
82 #define XHC_PORTSC_PED                  BIT1    // Port Enabled/Disabled
83 #define XHC_PORTSC_OCA                  BIT3    // Over-current Active
84 #define XHC_PORTSC_RESET                BIT4    // Port Reset
85 #define XHC_PORTSC_PLS                  (BIT5|BIT6|BIT7|BIT8)   // Port Link State
86 #define XHC_PORTSC_PP                   BIT9    // Port Power
87 #define XHC_PORTSC_PS                   (BIT10|BIT11|BIT12)     // Port Speed
88 #define XHC_PORTSC_LWS                  BIT16   // Port Link State Write Strobe
89 #define XHC_PORTSC_CSC                  BIT17   // Connect Status Change
90 #define XHC_PORTSC_PEC                  BIT18   // Port Enabled/Disabled Change
91 #define XHC_PORTSC_WRC                  BIT19   // Warm Port Reset Change
92 #define XHC_PORTSC_OCC                  BIT20   // Over-Current Change
93 #define XHC_PORTSC_PRC                  BIT21   // Port Reset Change
94 #define XHC_PORTSC_PLC                  BIT22   // Port Link State Change
95 #define XHC_PORTSC_CEC                  BIT23   // Port Config Error Change
96 #define XHC_PORTSC_CAS                  BIT24   // Cold Attach Status
97 
98 #define XHC_HUB_PORTSC_CCS              BIT0    // Hub's Current Connect Status
99 #define XHC_HUB_PORTSC_PED              BIT1    // Hub's Port Enabled/Disabled
100 #define XHC_HUB_PORTSC_OCA              BIT3    // Hub's Over-current Active
101 #define XHC_HUB_PORTSC_RESET            BIT4    // Hub's Port Reset
102 #define XHC_HUB_PORTSC_PP               BIT9    // Hub's Port Power
103 #define XHC_HUB_PORTSC_CSC              BIT16   // Hub's Connect Status Change
104 #define XHC_HUB_PORTSC_PEC              BIT17   // Hub's Port Enabled/Disabled Change
105 #define XHC_HUB_PORTSC_OCC              BIT19   // Hub's Over-Current Change
106 #define XHC_HUB_PORTSC_PRC              BIT20   // Hub's Port Reset Change
107 #define XHC_HUB_PORTSC_BHRC             BIT21   // Hub's Port Warm Reset Change
108 
109 #define XHC_IMAN_IP                     BIT0    // Interrupt Pending
110 #define XHC_IMAN_IE                     BIT1    // Interrupt Enable
111 
112 #define XHC_IMODI_MASK                  0x0000FFFF  // Interrupt Moderation Interval
113 #define XHC_IMODC_MASK                  0xFFFF0000  // Interrupt Moderation Counter
114 
115 
116 #pragma pack (1)
117 typedef struct {
118   UINT8                 MaxSlots;       // Number of Device Slots
119   UINT16                MaxIntrs:11;    // Number of Interrupters
120   UINT16                Rsvd:5;
121   UINT8                 MaxPorts;       // Number of Ports
122 } HCSPARAMS1;
123 
124 //
125 // Structural Parameters 1 Register Bitmap Definition
126 //
127 typedef union {
128   UINT32                Dword;
129   HCSPARAMS1            Data;
130 } XHC_HCSPARAMS1;
131 
132 typedef struct {
133   UINT32                Ist:4;          // Isochronous Scheduling Threshold
134   UINT32                Erst:4;         // Event Ring Segment Table Max
135   UINT32                Rsvd:13;
136   UINT32                ScratchBufHi:5; // Max Scratchpad Buffers Hi
137   UINT32                Spr:1;          // Scratchpad Restore
138   UINT32                ScratchBufLo:5; // Max Scratchpad Buffers Lo
139 } HCSPARAMS2;
140 
141 //
142 // Structural Parameters 2 Register Bitmap Definition
143 //
144 typedef union {
145   UINT32                Dword;
146   HCSPARAMS2            Data;
147 } XHC_HCSPARAMS2;
148 
149 typedef struct {
150   UINT16                Ac64:1;        // 64-bit Addressing Capability
151   UINT16                Bnc:1;         // BW Negotiation Capability
152   UINT16                Csz:1;         // Context Size
153   UINT16                Ppc:1;         // Port Power Control
154   UINT16                Pind:1;        // Port Indicators
155   UINT16                Lhrc:1;        // Light HC Reset Capability
156   UINT16                Ltc:1;         // Latency Tolerance Messaging Capability
157   UINT16                Nss:1;         // No Secondary SID Support
158   UINT16                Pae:1;         // Parse All Event Data
159   UINT16                Rsvd:3;
160   UINT16                MaxPsaSize:4;  // Maximum Primary Stream Array Size
161   UINT16                ExtCapReg;     // xHCI Extended Capabilities Pointer
162 } HCCPARAMS;
163 
164 //
165 // Capability Parameters Register Bitmap Definition
166 //
167 typedef union {
168   UINT32                Dword;
169   HCCPARAMS             Data;
170 } XHC_HCCPARAMS;
171 
172 #pragma pack ()
173 
174 //
175 // XHCi Data and Ctrl Structures
176 //
177 #pragma pack(1)
178 typedef struct {
179   UINT8                   Pi;
180   UINT8                   SubClassCode;
181   UINT8                   BaseCode;
182 } USB_CLASSC;
183 
184 typedef struct {
185   UINT8                     Length;
186   UINT8                     DescType;
187   UINT8                     NumPorts;
188   UINT16                    HubCharacter;
189   UINT8                     PwrOn2PwrGood;
190   UINT8                     HubContrCurrent;
191   UINT8                     Filler[16];
192 } EFI_USB_HUB_DESCRIPTOR;
193 #pragma pack()
194 
195 //
196 //  Hub Class Feature Selector for Clear Port Feature Request
197 //  It's the extension of hub class feature selector of USB 2.0 in USB 3.0 Spec.
198 //  For more details, Please refer to USB 3.0 Spec Table 10-7.
199 //
200 typedef enum {
201   Usb3PortBHPortReset          = 28,
202   Usb3PortBHPortResetChange    = 29
203 } XHC_PORT_FEATURE;
204 
205 //
206 // Structure to map the hardware port states to the
207 // UEFI's port states.
208 //
209 typedef struct {
210   UINT32                  HwState;
211   UINT16                  UefiState;
212 } USB_PORT_STATE_MAP;
213 
214 //
215 // Structure to map the hardware port states to feature selector for clear port feature request.
216 //
217 typedef struct {
218   UINT32                  HwState;
219   UINT16                  Selector;
220 } USB_CLEAR_PORT_MAP;
221 
222 /**
223   Read XHCI Operation register.
224 
225   @param Xhc            The XHCI device.
226   @param Offset         The operation register offset.
227 
228   @retval the register content read.
229 
230 **/
231 UINT32
232 XhcPeiReadOpReg (
233   IN  PEI_XHC_DEV       *Xhc,
234   IN  UINT32            Offset
235   );
236 
237 /**
238   Write the data to the XHCI operation register.
239 
240   @param Xhc            The XHCI device.
241   @param Offset         The operation register offset.
242   @param Data           The data to write.
243 
244 **/
245 VOID
246 XhcPeiWriteOpReg (
247   IN PEI_XHC_DEV        *Xhc,
248   IN UINT32             Offset,
249   IN UINT32             Data
250   );
251 
252 /**
253   Set one bit of the operational register while keeping other bits.
254 
255   @param  Xhc           The XHCI device.
256   @param  Offset        The offset of the operational register.
257   @param  Bit           The bit mask of the register to set.
258 
259 **/
260 VOID
261 XhcPeiSetOpRegBit (
262   IN PEI_XHC_DEV        *Xhc,
263   IN UINT32             Offset,
264   IN UINT32             Bit
265   );
266 
267 /**
268   Clear one bit of the operational register while keeping other bits.
269 
270   @param  Xhc           The XHCI device.
271   @param  Offset        The offset of the operational register.
272   @param  Bit           The bit mask of the register to clear.
273 
274 **/
275 VOID
276 XhcPeiClearOpRegBit (
277   IN PEI_XHC_DEV        *Xhc,
278   IN UINT32             Offset,
279   IN UINT32             Bit
280   );
281 
282 /**
283   Wait the operation register's bit as specified by Bit
284   to be set (or clear).
285 
286   @param  Xhc           The XHCI device.
287   @param  Offset        The offset of the operational register.
288   @param  Bit           The bit of the register to wait for.
289   @param  WaitToSet     Wait the bit to set or clear.
290   @param  Timeout       The time to wait before abort (in microsecond, us).
291 
292   @retval EFI_SUCCESS   The bit successfully changed by host controller.
293   @retval EFI_TIMEOUT   The time out occurred.
294 
295 **/
296 EFI_STATUS
297 XhcPeiWaitOpRegBit (
298   IN PEI_XHC_DEV        *Xhc,
299   IN UINT32             Offset,
300   IN UINT32             Bit,
301   IN BOOLEAN            WaitToSet,
302   IN UINT32             Timeout
303   );
304 
305 /**
306   Read XHCI door bell register.
307 
308   @param  Xhc           The XHCI device.
309   @param  Offset        The offset of the door bell register.
310 
311   @return The register content read
312 
313 **/
314 UINT32
315 XhcPeiReadDoorBellReg (
316   IN  PEI_XHC_DEV       *Xhc,
317   IN  UINT32            Offset
318   );
319 
320 /**
321   Write the data to the XHCI door bell register.
322 
323   @param  Xhc           The XHCI device.
324   @param  Offset        The offset of the door bell register.
325   @param  Data          The data to write.
326 
327 **/
328 VOID
329 XhcPeiWriteDoorBellReg (
330   IN PEI_XHC_DEV        *Xhc,
331   IN UINT32             Offset,
332   IN UINT32             Data
333   );
334 
335 /**
336   Read XHCI runtime register.
337 
338   @param  Xhc           The XHCI device.
339   @param  Offset        The offset of the runtime register.
340 
341   @return The register content read
342 
343 **/
344 UINT32
345 XhcPeiReadRuntimeReg (
346   IN PEI_XHC_DEV        *Xhc,
347   IN  UINT32            Offset
348   );
349 
350 /**
351   Write the data to the XHCI runtime register.
352 
353   @param  Xhc           The XHCI device.
354   @param  Offset        The offset of the runtime register.
355   @param  Data          The data to write.
356 
357 **/
358 VOID
359 XhcPeiWriteRuntimeReg (
360   IN PEI_XHC_DEV        *Xhc,
361   IN UINT32             Offset,
362   IN UINT32             Data
363   );
364 
365 /**
366   Set one bit of the runtime register while keeping other bits.
367 
368   @param  Xhc           The XHCI device.
369   @param  Offset        The offset of the runtime register.
370   @param  Bit           The bit mask of the register to set.
371 
372 **/
373 VOID
374 XhcPeiSetRuntimeRegBit (
375   IN PEI_XHC_DEV        *Xhc,
376   IN UINT32             Offset,
377   IN UINT32             Bit
378   );
379 
380 /**
381   Clear one bit of the runtime register while keeping other bits.
382 
383   @param  Xhc           The XHCI device.
384   @param  Offset        The offset of the runtime register.
385   @param  Bit           The bit mask of the register to set.
386 
387 **/
388 VOID
389 XhcPeiClearRuntimeRegBit (
390   IN PEI_XHC_DEV        *Xhc,
391   IN UINT32             Offset,
392   IN UINT32             Bit
393   );
394 
395 /**
396   Check whether Xhc is halted.
397 
398   @param  Xhc           The XHCI device.
399 
400   @retval TRUE          The controller is halted.
401   @retval FALSE         The controller isn't halted.
402 
403 **/
404 BOOLEAN
405 XhcPeiIsHalt (
406   IN PEI_XHC_DEV        *Xhc
407   );
408 
409 /**
410   Check whether system error occurred.
411 
412   @param  Xhc           The XHCI device.
413 
414   @retval TRUE          System error happened.
415   @retval FALSE         No system error.
416 
417 **/
418 BOOLEAN
419 XhcPeiIsSysError (
420   IN PEI_XHC_DEV        *Xhc
421   );
422 
423 /**
424   Reset the host controller.
425 
426   @param  Xhc           The XHCI device.
427   @param  Timeout       Time to wait before abort (in millisecond, ms).
428 
429   @retval EFI_TIMEOUT   The transfer failed due to time out.
430   @retval Others        Failed to reset the host.
431 
432 **/
433 EFI_STATUS
434 XhcPeiResetHC (
435   IN PEI_XHC_DEV        *Xhc,
436   IN UINT32             Timeout
437   );
438 
439 /**
440   Halt the host controller.
441 
442   @param  Xhc           The XHCI device.
443   @param  Timeout       Time to wait before abort.
444 
445   @retval EFI_TIMEOUT   Failed to halt the controller before Timeout.
446   @retval EFI_SUCCESS   The XHCI is halt.
447 
448 **/
449 EFI_STATUS
450 XhcPeiHaltHC (
451   IN PEI_XHC_DEV        *Xhc,
452   IN UINT32             Timeout
453   );
454 
455 /**
456   Set the XHCI to run.
457 
458   @param  Xhc           The XHCI device.
459   @param  Timeout       Time to wait before abort.
460 
461   @retval EFI_SUCCESS   The XHCI is running.
462   @retval Others        Failed to set the XHCI to run.
463 
464 **/
465 EFI_STATUS
466 XhcPeiRunHC (
467   IN PEI_XHC_DEV        *Xhc,
468   IN UINT32             Timeout
469   );
470 
471 #endif
472