]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Bus/Pci/XhciDxe/XhciReg.h
Enabling usb3.0 XHCI support.
[mirror_edk2.git] / MdeModulePkg / Bus / Pci / XhciDxe / XhciReg.h
1 /** @file
2
3 This file contains the register definition of XHCI host controller.
4
5 Copyright (c) 2011, 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_XHCI_REG_H_
17 #define _EFI_XHCI_REG_H_
18
19 #define PCI_IF_XHCI 0x30
20
21 //
22 // PCI Configuration Registers
23 //
24 #define XHC_BAR_INDEX 0x00
25
26 #define XHC_PCI_BAR_OFFSET 0x10 // Memory Bar Register Offset
27 #define XHC_PCI_BAR_MASK 0xFFFF // Memory Base Address Mask
28
29 #define USB_HUB_CLASS_CODE 0x09
30 #define USB_HUB_SUBCLASS_CODE 0x00
31
32 //============================================//
33 // XHCI register offset //
34 //============================================//
35
36 //
37 // Capability registers offset
38 //
39 #define XHC_CAPLENGTH_OFFSET 0x00 // Capability register length offset
40 #define XHC_HCIVERSION_OFFSET 0x02 // Interface Version Number 02-03h
41 #define XHC_HCSPARAMS1_OFFSET 0x04 // Structural Parameters 1
42 #define XHC_HCSPARAMS2_OFFSET 0x08 // Structural Parameters 2
43 #define XHC_HCSPARAMS3_OFFSET 0x0c // Structural Parameters 3
44 #define XHC_HCCPARAMS_OFFSET 0x10 // Capability Parameters
45 #define XHC_DBOFF_OFFSET 0x14 // Doorbell Offset
46 #define XHC_RTSOFF_OFFSET 0x18 // Runtime Register Space Offset
47
48 //
49 // Operational registers offset
50 //
51 #define XHC_USBCMD_OFFSET 0x0000 // USB Command Register Offset
52 #define XHC_USBSTS_OFFSET 0x0004 // USB Status Register Offset
53 #define XHC_PAGESIZE_OFFSET 0x0008 // USB Page Size Register Offset
54 #define XHC_DNCTRL_OFFSET 0x0014 // Device Notification Control Register Offset
55 #define XHC_CRCR_OFFSET 0x0018 // Command Ring Control Register Offset
56 #define XHC_DCBAAP_OFFSET 0x0030 // Device Context Base Address Array Pointer Register Offset
57 #define XHC_CONFIG_OFFSET 0x0038 // Configure Register Offset
58 #define XHC_PORTSC_OFFSET 0x0400 // Port Status and Control Register Offset
59
60 //
61 // Runtime registers offset
62 //
63 #define XHC_MFINDEX_OFFSET 0x00 // Microframe Index Register Offset
64 #define XHC_IMAN_OFFSET 0x20 // Interrupter X Management Register Offset
65 #define XHC_IMOD_OFFSET 0x24 // Interrupter X Moderation Register Offset
66 #define XHC_ERSTSZ_OFFSET 0x28 // Event Ring Segment Table Size Register Offset
67 #define XHC_ERSTBA_OFFSET 0x30 // Event Ring Segment Table Base Address Register Offset
68 #define XHC_ERDP_OFFSET 0x38 // Event Ring Dequeue Pointer Register Offset
69
70 #define USBLEGSP_BIOS_SEMAPHORE BIT16 // HC BIOS Owned Semaphore
71 #define USBLEGSP_OS_SEMAPHORE BIT24 // HC OS Owned Semaphore
72
73 #pragma pack (1)
74 //
75 // Structural Parameters 1 Register Bitmap Definition
76 //
77 typedef union _XHC_HCSPARAMS1 {
78 UINT32 Dword;
79 struct {
80 UINT8 MaxSlots; // Number of Device Slots
81 UINT16 MaxIntrs:11; // Number of Interrupters
82 UINT16 Rsvd:5;
83 UINT8 MaxPorts; // Number of Ports
84 } Data;
85 } XHC_HCSPARAMS1;
86
87 //
88 // Structural Parameters 2 Register Bitmap Definition
89 //
90 typedef union _XHC_HCSPARAMS2 {
91 UINT32 Dword;
92 struct {
93 UINT32 Ist:4; // Isochronous Scheduling Threshold
94 UINT32 Erst:4; // Event Ring Segment Table Max
95 UINT32 Rsvd:13;
96 UINT32 ScratchBufHi:5; // Max Scratchpad Buffers Hi
97 UINT32 Spr:1; // Scratchpad Restore
98 UINT32 ScratchBufLo:5; // Max Scratchpad Buffers Lo
99 } Data;
100 } XHC_HCSPARAMS2;
101
102 //
103 // Capability Parameters Register Bitmap Definition
104 //
105 typedef union _XHC_HCCPARAMS {
106 UINT32 Dword;
107 struct {
108 UINT16 Ac64:1; // 64-bit Addressing Capability
109 UINT16 Bnc:1; // BW Negotiation Capability
110 UINT16 Csz:1; // Context Size
111 UINT16 Ppc:1; // Port Power Control
112 UINT16 Pind:1; // Port Indicators
113 UINT16 Lhrc:1; // Light HC Reset Capability
114 UINT16 Ltc:1; // Latency Tolerance Messaging Capability
115 UINT16 Nss:1; // No Secondary SID Support
116 UINT16 Pae:1; // Parse All Event Data
117 UINT16 Rsvd:3;
118 UINT16 MaxPsaSize:4; // Maximum Primary Stream Array Size
119 UINT16 ExtCapReg; // xHCI Extended Capabilities Pointer
120 } Data;
121 } XHC_HCCPARAMS;
122
123 #pragma pack ()
124
125 //
126 // Register Bit Definition
127 //
128 #define XHC_USBCMD_RUN BIT0 // Run/Stop
129 #define XHC_USBCMD_RESET BIT1 // Host Controller Reset
130 #define XHC_USBCMD_INTE BIT2 // Interrupter Enable
131 #define XHC_USBCMD_HSEE BIT3 // Host System Error Enable
132
133 #define XHC_USBSTS_HALT BIT0 // Host Controller Halted
134 #define XHC_USBSTS_HSE BIT2 // Host System Error
135 #define XHC_USBSTS_EINT BIT3 // Event Interrupt
136 #define XHC_USBSTS_PCD BIT4 // Port Change Detect
137 #define XHC_USBSTS_SSS BIT8 // Save State Status
138 #define XHC_USBSTS_RSS BIT9 // Restore State Status
139 #define XHC_USBSTS_SRE BIT10 // Save/Restore Error
140 #define XHC_USBSTS_CNR BIT11 // Host Controller Not Ready
141 #define XHC_USBSTS_HCE BIT12 // Host Controller Error
142
143 #define XHC_PAGESIZE_MASK 0xFFFF // Page Size
144
145 #define XHC_CRCR_RCS BIT0 // Ring Cycle State
146 #define XHC_CRCR_CS BIT1 // Command Stop
147 #define XHC_CRCR_CA BIT2 // Command Abort
148 #define XHC_CRCR_CRR BIT3 // Command Ring Running
149
150 #define XHC_CONFIG_MASK 0xFF // Command Ring Running
151
152 #define XHC_PORTSC_CCS BIT0 // Current Connect Status
153 #define XHC_PORTSC_PED BIT1 // Port Enabled/Disabled
154 #define XHC_PORTSC_OCA BIT3 // Over-current Active
155 #define XHC_PORTSC_RESET BIT4 // Port Reset
156 #define XHC_PORTSC_PLS (BIT5|BIT6|BIT7|BIT8) // Port Link State
157 #define XHC_PORTSC_PP BIT9 // Port Power
158 #define XHC_PORTSC_PS (BIT10|BIT11|BIT12|BIT13) // Port Speed
159 #define XHC_PORTSC_LWS BIT16 // Port Link State Write Strobe
160 #define XHC_PORTSC_CSC BIT17 // Connect Status Change
161 #define XHC_PORTSC_PEC BIT18 // Port Enabled/Disabled Change
162 #define XHC_PORTSC_WRC BIT19 // Warm Port Reset Change
163 #define XHC_PORTSC_OCC BIT20 // Over-Current Change
164 #define XHC_PORTSC_PRC BIT21 // Port Reset Change
165 #define XHC_PORTSC_PLC BIT22 // Port Link State Change
166 #define XHC_PORTSC_CEC BIT23 // Port Config Error Change
167 #define XHC_PORTSC_CAS BIT24 // Cold Attach Status
168
169 #define XHC_IMAN_IP BIT0 // Interrupt Pending
170 #define XHC_IMAN_IE BIT1 // Interrupt Enable
171
172 #define XHC_IMODI_MASK 0x0000FFFF // Interrupt Moderation Interval
173 #define XHC_IMODC_MASK 0xFFFF0000 // Interrupt Moderation Counter
174
175 //
176 // Structure to map the hardware port states to the
177 // UEFI's port states.
178 //
179 typedef struct {
180 UINT32 HwState;
181 UINT16 UefiState;
182 } USB_PORT_STATE_MAP;
183
184 /**
185 Read 1-byte width XHCI capability register.
186
187 @param Xhc The XHCI device.
188 @param Offset The offset of the 1-byte width capability register.
189
190 @return The register content read.
191 @retval If err, return 0xFFFF.
192
193 **/
194 UINT8
195 XhcReadCapReg8 (
196 IN USB_XHCI_DEV *Xhc,
197 IN UINT32 Offset
198 );
199
200 /**
201 Read 4-bytes width XHCI capability register.
202
203 @param Xhc The XHCI device.
204 @param Offset The offset of the 4-bytes width capability register.
205
206 @return The register content read.
207 @retval If err, return 0xFFFFFFFF.
208
209 **/
210 UINT32
211 XhcReadCapReg (
212 IN USB_XHCI_DEV *Xhc,
213 IN UINT32 Offset
214 );
215
216 /**
217 Read 4-bytes width XHCI Operational register.
218
219 @param Xhc The XHCI device.
220 @param Offset The offset of the 4-bytes width operational register.
221
222 @return The register content read.
223 @retval If err, return 0xFFFFFFFF.
224
225 **/
226 UINT32
227 XhcReadOpReg (
228 IN USB_XHCI_DEV *Xhc,
229 IN UINT32 Offset
230 );
231
232 /**
233 Write the data to the 4-bytes width XHCI operational register.
234
235 @param Xhc The XHCI device.
236 @param Offset The offset of the 4-bytes width operational register.
237 @param Data The data to write.
238
239 **/
240 VOID
241 XhcWriteOpReg (
242 IN USB_XHCI_DEV *Xhc,
243 IN UINT32 Offset,
244 IN UINT32 Data
245 );
246
247 /**
248 Write the data to the 2-bytes width XHCI operational register.
249
250 @param Xhc The XHCI device.
251 @param Offset The offset of the 2-bytes width operational register.
252 @param Data The data to write.
253
254 **/
255 VOID
256 XhcWriteOpReg16 (
257 IN USB_XHCI_DEV *Xhc,
258 IN UINT32 Offset,
259 IN UINT16 Data
260 );
261
262 /**
263 Write the data to the 8-bytes width XHCI operational register.
264
265 @param Xhc The XHCI device.
266 @param Offset The offset of the 8-bytes width operational register.
267 @param Data The data to write.
268
269 **/
270 VOID
271 XhcWriteOpReg64 (
272 IN USB_XHCI_DEV *Xhc,
273 IN UINT32 Offset,
274 IN UINT64 Data
275 );
276
277 /**
278 Read XHCI runtime register.
279
280 @param Xhc The XHCI device.
281 @param Offset The offset of the runtime register.
282
283 @return The register content read
284
285 **/
286 UINT32
287 XhcReadRuntimeReg (
288 IN USB_XHCI_DEV *Xhc,
289 IN UINT32 Offset
290 );
291
292 /**
293 Read 8-bytes width XHCI runtime register.
294
295 @param Xhc The XHCI device.
296 @param Offset The offset of the 8-bytes width runtime register.
297
298 @return The register content read
299
300 **/
301 UINT64
302 XhcReadRuntimeReg64 (
303 IN USB_XHCI_DEV *Xhc,
304 IN UINT32 Offset
305 );
306
307 /**
308 Write the data to the XHCI runtime register.
309
310 @param Xhc The XHCI device.
311 @param Offset The offset of the runtime register.
312 @param Data The data to write.
313
314 **/
315 VOID
316 XhcWriteRuntimeReg (
317 IN USB_XHCI_DEV *Xhc,
318 IN UINT32 Offset,
319 IN UINT32 Data
320 );
321
322 /**
323 Write the data to the 8-bytes width XHCI runtime register.
324
325 @param Xhc The XHCI device.
326 @param Offset The offset of the 8-bytes width runtime register.
327 @param Data The data to write.
328
329 **/
330 VOID
331 XhcWriteRuntimeReg64 (
332 IN USB_XHCI_DEV *Xhc,
333 IN UINT32 Offset,
334 IN UINT64 Data
335 );
336
337 /**
338 Read XHCI door bell register.
339
340 @param Xhc The XHCI device.
341 @param Offset The offset of the door bell register.
342
343 @return The register content read
344
345 **/
346 UINT32
347 XhcReadDoorBellReg (
348 IN USB_XHCI_DEV *Xhc,
349 IN UINT32 Offset
350 );
351
352 /**
353 Write the data to the XHCI door bell register.
354
355 @param Xhc The XHCI device.
356 @param Offset The offset of the door bell register.
357 @param Data The data to write.
358
359 **/
360 VOID
361 XhcWriteDoorBellReg (
362 IN USB_XHCI_DEV *Xhc,
363 IN UINT32 Offset,
364 IN UINT32 Data
365 );
366
367 /**
368 Set one bit of the operational register while keeping other bits.
369
370 @param Xhc The XHCI device.
371 @param Offset The offset of the operational register.
372 @param Bit The bit mask of the register to set.
373
374 **/
375 VOID
376 XhcSetOpRegBit (
377 IN USB_XHCI_DEV *Xhc,
378 IN UINT32 Offset,
379 IN UINT32 Bit
380 );
381
382 /**
383 Clear one bit of the operational register while keeping other bits.
384
385 @param Xhc The XHCI device.
386 @param Offset The offset of the operational register.
387 @param Bit The bit mask of the register to clear.
388
389 **/
390 VOID
391 XhcClearOpRegBit (
392 IN USB_XHCI_DEV *Xhc,
393 IN UINT32 Offset,
394 IN UINT32 Bit
395 );
396
397 /**
398 Wait the operation register's bit as specified by Bit
399 to be set (or clear).
400
401 @param Xhc The XHCI device.
402 @param Offset The offset of the operational register.
403 @param Bit The bit of the register to wait for.
404 @param WaitToSet Wait the bit to set or clear.
405 @param Timeout The time to wait before abort (in millisecond, ms).
406
407 @retval EFI_SUCCESS The bit successfully changed by host controller.
408 @retval EFI_TIMEOUT The time out occurred.
409
410 **/
411 EFI_STATUS
412 XhcWaitOpRegBit (
413 IN USB_XHCI_DEV *Xhc,
414 IN UINT32 Offset,
415 IN UINT32 Bit,
416 IN BOOLEAN WaitToSet,
417 IN UINT32 Timeout
418 );
419
420 /**
421 Read XHCI runtime register.
422
423 @param Xhc The XHCI device.
424 @param Offset The offset of the runtime register.
425
426 @return The register content read
427
428 **/
429 UINT32
430 XhcReadRuntimeReg (
431 IN USB_XHCI_DEV *Xhc,
432 IN UINT32 Offset
433 );
434
435 /**
436 Write the data to the XHCI runtime register.
437
438 @param Xhc The XHCI device.
439 @param Offset The offset of the runtime register.
440 @param Data The data to write.
441
442 **/
443 VOID
444 XhcWriteRuntimeReg (
445 IN USB_XHCI_DEV *Xhc,
446 IN UINT32 Offset,
447 IN UINT32 Data
448 );
449
450 /**
451 Set one bit of the runtime register while keeping other bits.
452
453 @param Xhc The XHCI device.
454 @param Offset The offset of the runtime register.
455 @param Bit The bit mask of the register to set.
456
457 **/
458 VOID
459 XhcSetRuntimeRegBit (
460 IN USB_XHCI_DEV *Xhc,
461 IN UINT32 Offset,
462 IN UINT32 Bit
463 );
464
465 /**
466 Clear one bit of the runtime register while keeping other bits.
467
468 @param Xhc The XHCI device.
469 @param Offset The offset of the runtime register.
470 @param Bit The bit mask of the register to set.
471
472 **/
473 VOID
474 XhcClearRuntimeRegBit (
475 IN USB_XHCI_DEV *Xhc,
476 IN UINT32 Offset,
477 IN UINT32 Bit
478 );
479
480 /**
481 Whether the XHCI host controller is halted.
482
483 @param Xhc The XHCI device.
484
485 @retval TRUE The controller is halted.
486 @retval FALSE It isn't halted.
487
488 **/
489 BOOLEAN
490 XhcIsHalt (
491 IN USB_XHCI_DEV *Xhc
492 );
493
494 /**
495 Whether system error occurred.
496
497 @param Xhc The XHCI device.
498
499 @retval TRUE System error happened.
500 @retval FALSE No system error.
501
502 **/
503 BOOLEAN
504 XhcIsSysError (
505 IN USB_XHCI_DEV *Xhc
506 );
507
508 /**
509 Reset the XHCI host controller.
510
511 @param Xhc The XHCI device.
512 @param Timeout Time to wait before abort (in millisecond, ms).
513
514 @retval EFI_SUCCESS The XHCI host controller is reset.
515 @return Others Failed to reset the XHCI before Timeout.
516
517 **/
518 EFI_STATUS
519 XhcResetHC (
520 IN USB_XHCI_DEV *Xhc,
521 IN UINT32 Timeout
522 );
523
524 /**
525 Halt the XHCI host controller.
526
527 @param Xhc The XHCI device.
528 @param Timeout Time to wait before abort (in millisecond, ms).
529
530 @return EFI_SUCCESS The XHCI host controller is halt.
531 @return EFI_TIMEOUT Failed to halt the XHCI before Timeout.
532
533 **/
534 EFI_STATUS
535 XhcHaltHC (
536 IN USB_XHCI_DEV *Xhc,
537 IN UINT32 Timeout
538 );
539
540 /**
541 Set the XHCI host controller to run.
542
543 @param Xhc The XHCI device.
544 @param Timeout Time to wait before abort (in millisecond, ms).
545
546 @return EFI_SUCCESS The XHCI host controller is running.
547 @return EFI_TIMEOUT Failed to set the XHCI to run before Timeout.
548
549 **/
550 EFI_STATUS
551 XhcRunHC (
552 IN USB_XHCI_DEV *Xhc,
553 IN UINT32 Timeout
554 );
555
556 /**
557 Calculate the XHCI legacy support capability register offset.
558
559 @param Xhc The XHCI device.
560
561 @return The offset of XHCI legacy support capability register.
562
563 **/
564 UINT32
565 XhcGetLegSupCapAddr (
566 IN USB_XHCI_DEV *Xhc
567 );
568
569 #endif