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