1 /** @file 2 The PCI Root Bridge header file. 3 4 Copyright (c) 2013-2015 Intel Corporation. 5 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 17 #ifndef _PCI_ROOT_BRIDGE_H_ 18 #define _PCI_ROOT_BRIDGE_H_ 19 20 #include <PiDxe.h> 21 #include <IndustryStandard/Acpi.h> 22 #include <IndustryStandard/Pci.h> 23 #include <PciHostResource.h> 24 25 // 26 // Driver Consumed Protocol Prototypes 27 // 28 #include <Protocol/Metronome.h> 29 #include <Protocol/CpuIo2.h> 30 #include <Protocol/DevicePath.h> 31 #include <Protocol/Runtime.h> 32 #include <Protocol/PciRootBridgeIo.h> 33 #include <Library/UefiLib.h> 34 #include <Library/DebugLib.h> 35 #include <Library/DevicePathLib.h> 36 #include <Library/BaseMemoryLib.h> 37 #include <Library/DxeServicesTableLib.h> 38 #include <Library/UefiBootServicesTableLib.h> 39 #include <Library/BaseLib.h> 40 41 42 // 43 // Define the region of memory used for DMA memory 44 // 45 #define DMA_MEMORY_TOP 0x0000000001FFFFFFULL 46 47 // 48 // The number of PCI root bridges 49 // 50 #define ROOT_BRIDGE_COUNT 1 51 52 // 53 // The default latency for controllers 54 // 55 #define DEFAULT_PCI_LATENCY 0x20 56 57 // 58 // Define resource status constant 59 // 60 typedef struct { 61 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_OPERATION Operation; 62 UINTN NumberOfBytes; 63 UINTN NumberOfPages; 64 EFI_PHYSICAL_ADDRESS HostAddress; 65 EFI_PHYSICAL_ADDRESS MappedHostAddress; 66 } MAP_INFO; 67 68 typedef struct { 69 ACPI_HID_DEVICE_PATH AcpiDevicePath; 70 EFI_DEVICE_PATH_PROTOCOL EndDevicePath; 71 } EFI_PCI_ROOT_BRIDGE_DEVICE_PATH; 72 73 #define PCI_ROOT_BRIDGE_SIGNATURE SIGNATURE_32 ('e', '2', 'p', 'b') 74 75 typedef struct { 76 UINT32 Signature; 77 EFI_LIST_ENTRY Link; 78 EFI_HANDLE Handle; 79 UINT64 RootBridgeAllocAttrib; 80 UINT64 Attributes; 81 UINT64 Supports; 82 PCI_RES_NODE ResAllocNode[6]; 83 PCI_ROOT_BRIDGE_RESOURCE_APERTURE Aperture; 84 EFI_LOCK PciLock; 85 UINTN PciAddress; 86 UINTN PciData; 87 UINT32 HecBase; 88 UINT32 HecLen; 89 UINTN BusScanCount; 90 BOOLEAN BusNumberAssigned; 91 VOID *ConfigBuffer; 92 EFI_DEVICE_PATH_PROTOCOL *DevicePath; 93 EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL Io; 94 } PCI_ROOT_BRIDGE_INSTANCE; 95 96 // 97 // Driver Instance Data Macros 98 // 99 #define DRIVER_INSTANCE_FROM_PCI_ROOT_BRIDGE_IO_THIS(a) CR (a, PCI_ROOT_BRIDGE_INSTANCE, Io, PCI_ROOT_BRIDGE_SIGNATURE) 100 101 #define DRIVER_INSTANCE_FROM_LIST_ENTRY(a) CR (a, PCI_ROOT_BRIDGE_INSTANCE, Link, PCI_ROOT_BRIDGE_SIGNATURE) 102 103 EFI_STATUS 104 SimpleIioRootBridgeConstructor ( 105 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *Protocol, 106 IN EFI_HANDLE HostBridgeHandle, 107 IN PCI_ROOT_BRIDGE_RESOURCE_APERTURE *ResAppeture, 108 IN UINT64 AllocAttributes 109 ) 110 /*++ 111 112 Routine Description: 113 114 Construct the Pci Root Bridge Io protocol. 115 116 Arguments: 117 118 Protocol - Protocol to initialize. 119 HostBridgeHandle - Handle to the HostBridge. 120 ResAppeture - Resource apperture of the root bridge. 121 AllocAttributes - Attribute of resouce allocated. 122 123 Returns: 124 125 EFI_SUCCESS - Success. 126 Others - Fail. 127 128 --*/ 129 ; 130 131 // 132 // Protocol Member Function Prototypes 133 // 134 EFI_STATUS 135 EFIAPI 136 RootBridgeIoPollMem ( 137 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, 138 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, 139 IN UINT64 Address, 140 IN UINT64 Mask, 141 IN UINT64 Value, 142 IN UINT64 Delay, 143 OUT UINT64 *Result 144 ) 145 /*++ 146 147 Routine Description: 148 149 Poll an address in memory mapped space until an exit condition is met 150 or a timeout occurs. 151 152 Arguments: 153 154 This - Pointer to EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL instance. 155 Width - Width of the memory operation. 156 Address - The base address of the memory operation. 157 Mask - Mask used for polling criteria. 158 Value - Comparison value used for polling exit criteria. 159 Delay - Number of 100ns units to poll. 160 Result - Pointer to the last value read from memory location. 161 162 Returns: 163 164 EFI_SUCCESS - Success. 165 EFI_INVALID_PARAMETER - Invalid parameter found. 166 EFI_TIMEOUT - Delay expired before a match occurred. 167 EFI_OUT_OF_RESOURCES - Fail due to lack of resources. 168 169 --*/ 170 ; 171 172 EFI_STATUS 173 EFIAPI 174 RootBridgeIoPollIo ( 175 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, 176 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, 177 IN UINT64 Address, 178 IN UINT64 Mask, 179 IN UINT64 Value, 180 IN UINT64 Delay, 181 OUT UINT64 *Result 182 ) 183 /*++ 184 185 Routine Description: 186 187 Poll an address in I/O space until an exit condition is met 188 or a timeout occurs. 189 190 Arguments: 191 192 This - Pointer to EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL instance. 193 Width - Width of I/O operation. 194 Address - The base address of the I/O operation. 195 Mask - Mask used for polling criteria. 196 Value - Comparison value used for polling exit criteria. 197 Delay - Number of 100ns units to poll. 198 Result - Pointer to the last value read from memory location. 199 200 Returns: 201 202 EFI_SUCCESS - Success. 203 EFI_INVALID_PARAMETER - Invalid parameter found. 204 EFI_TIMEOUT - Delay expired before a match occurred. 205 EFI_OUT_OF_RESOURCES - Fail due to lack of resources. 206 207 --*/ 208 ; 209 210 EFI_STATUS 211 EFIAPI 212 RootBridgeIoMemRead ( 213 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, 214 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, 215 IN UINT64 Address, 216 IN UINTN Count, 217 IN OUT VOID *Buffer 218 ) 219 /*++ 220 221 Routine Description: 222 223 Allow read from memory mapped I/O space. 224 225 Arguments: 226 227 This - Pointer to EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL instance. 228 Width - The width of memory operation. 229 Address - Base address of the memory operation. 230 Count - Number of memory opeartion to perform. 231 Buffer - The destination buffer to store data. 232 233 Returns: 234 235 EFI_SUCCESS - Success. 236 EFI_INVALID_PARAMETER - Invalid parameter found. 237 EFI_OUT_OF_RESOURCES - Fail due to lack of resources. 238 239 --*/ 240 ; 241 242 EFI_STATUS 243 EFIAPI 244 RootBridgeIoMemWrite ( 245 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, 246 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, 247 IN UINT64 Address, 248 IN UINTN Count, 249 IN OUT VOID *Buffer 250 ) 251 /*++ 252 253 Routine Description: 254 255 Allow write to memory mapped I/O space. 256 257 Arguments: 258 259 This - Pointer to EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL instance. 260 Width - The width of memory operation. 261 Address - Base address of the memory operation. 262 Count - Number of memory opeartion to perform. 263 Buffer - The source buffer to write data from. 264 265 Returns: 266 267 EFI_SUCCESS - Success. 268 EFI_INVALID_PARAMETER - Invalid parameter found. 269 EFI_OUT_OF_RESOURCES - Fail due to lack of resources. 270 271 --*/ 272 ; 273 274 EFI_STATUS 275 EFIAPI 276 RootBridgeIoIoRead ( 277 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, 278 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, 279 IN UINT64 UserAddress, 280 IN UINTN Count, 281 IN OUT VOID *UserBuffer 282 ) 283 /*++ 284 285 Routine Description: 286 287 Enable a PCI driver to read PCI controller registers in the 288 PCI root bridge I/O space. 289 290 Arguments: 291 292 This - A pointer to EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL 293 Width - Signifies the width of the memory operation. 294 UserAddress - The base address of the I/O operation. 295 Count - The number of I/O operations to perform. 296 UserBuffer - The destination buffer to store the results. 297 298 Returns: 299 300 EFI_SUCCESS - The data was read from the PCI root bridge. 301 EFI_INVALID_PARAMETER - Invalid parameters found. 302 EFI_OUT_OF_RESOURCES - The request could not be completed due to a lack of 303 resources. 304 --*/ 305 ; 306 307 EFI_STATUS 308 EFIAPI 309 RootBridgeIoIoWrite ( 310 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, 311 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, 312 IN UINT64 UserAddress, 313 IN UINTN Count, 314 IN OUT VOID *UserBuffer 315 ) 316 /*++ 317 318 Routine Description: 319 320 Enable a PCI driver to write to PCI controller registers in the 321 PCI root bridge I/O space. 322 323 Arguments: 324 325 This - A pointer to EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL 326 Width - Signifies the width of the memory operation. 327 UserAddress - The base address of the I/O operation. 328 Count - The number of I/O operations to perform. 329 UserBuffer - The source buffer to write data from. 330 331 Returns: 332 333 EFI_SUCCESS - The data was written to the PCI root bridge. 334 EFI_INVALID_PARAMETER - Invalid parameters found. 335 EFI_OUT_OF_RESOURCES - The request could not be completed due to a lack of 336 resources. 337 --*/ 338 ; 339 340 EFI_STATUS 341 EFIAPI 342 RootBridgeIoCopyMem ( 343 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, 344 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, 345 IN UINT64 DestAddress, 346 IN UINT64 SrcAddress, 347 IN UINTN Count 348 ) 349 /*++ 350 351 Routine Description: 352 353 Copy one region of PCI root bridge memory space to be copied to 354 another region of PCI root bridge memory space. 355 356 Arguments: 357 358 This - A pointer to EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL instance. 359 Width - Signifies the width of the memory operation. 360 DestAddress - Destination address of the memory operation. 361 SrcAddress - Source address of the memory operation. 362 Count - Number of memory operations to perform. 363 364 Returns: 365 366 EFI_SUCCESS - The data was copied successfully. 367 EFI_INVALID_PARAMETER - Invalid parameters found. 368 EFI_OUT_OF_RESOURCES - The request could not be completed due to a lack of 369 resources. 370 --*/ 371 ; 372 373 EFI_STATUS 374 EFIAPI 375 RootBridgeIoPciRead ( 376 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, 377 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, 378 IN UINT64 Address, 379 IN UINTN Count, 380 IN OUT VOID *Buffer 381 ) 382 /*++ 383 384 Routine Description: 385 386 Allows read from PCI configuration space. 387 388 Arguments: 389 390 This - A pointer to EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL 391 Width - Signifies the width of the memory operation. 392 Address - The address within the PCI configuration space 393 for the PCI controller. 394 Count - The number of PCI configuration operations 395 to perform. 396 Buffer - The destination buffer to store the results. 397 398 Returns: 399 400 EFI_SUCCESS - The data was read from the PCI root bridge. 401 EFI_INVALID_PARAMETER - Invalid parameters found. 402 EFI_OUT_OF_RESOURCES - The request could not be completed due to a lack of 403 resources. 404 --*/ 405 ; 406 407 EFI_STATUS 408 EFIAPI 409 RootBridgeIoPciWrite ( 410 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, 411 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, 412 IN UINT64 Address, 413 IN UINTN Count, 414 IN OUT VOID *Buffer 415 ) 416 /*++ 417 418 Routine Description: 419 420 Allows write to PCI configuration space. 421 422 Arguments: 423 424 This - A pointer to EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL 425 Width - Signifies the width of the memory operation. 426 Address - The address within the PCI configuration space 427 for the PCI controller. 428 Count - The number of PCI configuration operations 429 to perform. 430 Buffer - The source buffer to get the results. 431 432 Returns: 433 434 EFI_SUCCESS - The data was written to the PCI root bridge. 435 EFI_INVALID_PARAMETER - Invalid parameters found. 436 EFI_OUT_OF_RESOURCES - The request could not be completed due to a lack of 437 resources. 438 --*/ 439 ; 440 441 EFI_STATUS 442 EFIAPI 443 RootBridgeIoMap ( 444 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, 445 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_OPERATION Operation, 446 IN VOID *HostAddress, 447 IN OUT UINTN *NumberOfBytes, 448 OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, 449 OUT VOID **Mapping 450 ) 451 /*++ 452 453 Routine Description: 454 455 Provides the PCI controller-specific address needed to access 456 system memory for DMA. 457 458 Arguments: 459 460 This - A pointer to the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL. 461 Operation - Indicate if the bus master is going to read or write 462 to system memory. 463 HostAddress - The system memory address to map on the PCI controller. 464 NumberOfBytes - On input the number of bytes to map. 465 On output the number of bytes that were mapped. 466 DeviceAddress - The resulting map address for the bus master PCI 467 controller to use to access the system memory's HostAddress. 468 Mapping - The value to pass to Unmap() when the bus master DMA 469 operation is complete. 470 471 Returns: 472 473 EFI_SUCCESS - Success. 474 EFI_INVALID_PARAMETER - Invalid parameters found. 475 EFI_UNSUPPORTED - The HostAddress cannot be mapped as a common 476 buffer. 477 EFI_DEVICE_ERROR - The System hardware could not map the requested 478 address. 479 EFI_OUT_OF_RESOURCES - The request could not be completed due to 480 lack of resources. 481 482 --*/ 483 ; 484 485 EFI_STATUS 486 EFIAPI 487 RootBridgeIoUnmap ( 488 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, 489 IN VOID *Mapping 490 ) 491 /*++ 492 493 Routine Description: 494 495 Completes the Map() operation and releases any corresponding resources. 496 497 Arguments: 498 499 This - Pointer to the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL instance. 500 Mapping - The value returned from Map() operation. 501 502 Returns: 503 504 EFI_SUCCESS - The range was unmapped successfully. 505 EFI_INVALID_PARAMETER - Mapping is not a value that was returned 506 by Map operation. 507 EFI_DEVICE_ERROR - The data was not committed to the target 508 system memory. 509 510 --*/ 511 ; 512 513 EFI_STATUS 514 EFIAPI 515 RootBridgeIoAllocateBuffer ( 516 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, 517 IN EFI_ALLOCATE_TYPE Type, 518 IN EFI_MEMORY_TYPE MemoryType, 519 IN UINTN Pages, 520 OUT VOID **HostAddress, 521 IN UINT64 Attributes 522 ) 523 /*++ 524 525 Routine Description: 526 527 Allocates pages that are suitable for a common buffer mapping. 528 529 Arguments: 530 531 This - Pointer to EFI_ROOT_BRIDGE_IO_PROTOCOL instance. 532 Type - Not used and can be ignored. 533 MemoryType - Type of memory to allocate. 534 Pages - Number of pages to allocate. 535 HostAddress - Pointer to store the base system memory address 536 of the allocated range. 537 Attributes - Requested bit mask of attributes of the allocated 538 range. 539 540 Returns: 541 542 EFI_SUCCESS - The requested memory range were allocated. 543 EFI_INVALID_PARAMETER - Invalid parameter found. 544 EFI_UNSUPPORTED - Attributes is unsupported. 545 546 --*/ 547 ; 548 549 EFI_STATUS 550 EFIAPI 551 RootBridgeIoFreeBuffer ( 552 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, 553 IN UINTN Pages, 554 OUT VOID *HostAddress 555 ) 556 /*++ 557 558 Routine Description: 559 560 Free memory allocated in AllocateBuffer. 561 562 Arguments: 563 564 This - Pointer to EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL 565 instance. 566 Pages - Number of pages to free. 567 HostAddress - The base system memory address of the 568 allocated range. 569 570 Returns: 571 572 EFI_SUCCESS - Requested memory pages were freed. 573 EFI_INVALID_PARAMETER - Invalid parameter found. 574 575 --*/ 576 ; 577 578 EFI_STATUS 579 EFIAPI 580 RootBridgeIoFlush ( 581 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This 582 ) 583 /*++ 584 585 Routine Description: 586 587 Flushes all PCI posted write transactions from a PCI host 588 bridge to system memory. 589 590 Arguments: 591 592 This - Pointer to EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL instance. 593 594 Returns: 595 596 EFI_SUCCESS - PCI posted write transactions were flushed 597 from PCI host bridge to system memory. 598 EFI_DEVICE_ERROR - Fail due to hardware error. 599 600 --*/ 601 ; 602 603 EFI_STATUS 604 EFIAPI 605 RootBridgeIoGetAttributes ( 606 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, 607 OUT UINT64 *Supported, 608 OUT UINT64 *Attributes 609 ) 610 /*++ 611 612 Routine Description: 613 614 Get the attributes that a PCI root bridge supports and 615 the attributes the PCI root bridge is currently using. 616 617 Arguments: 618 619 This - Pointer to EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL 620 instance. 621 Supports - A pointer to the mask of attributes that 622 this PCI root bridge supports. 623 Attributes - A pointer to the mask of attributes that 624 this PCI root bridge is currently using. 625 Returns: 626 627 EFI_SUCCESS - Success. 628 EFI_INVALID_PARAMETER - Invalid parameter found. 629 630 --*/ 631 632 // GC_TODO: Supported - add argument and description to function comment 633 // 634 // GC_TODO: Supported - add argument and description to function comment 635 // 636 // GC_TODO: Supported - add argument and description to function comment 637 // 638 ; 639 640 EFI_STATUS 641 EFIAPI 642 RootBridgeIoSetAttributes ( 643 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, 644 IN UINT64 Attributes, 645 IN OUT UINT64 *ResourceBase, 646 IN OUT UINT64 *ResourceLength 647 ) 648 /*++ 649 650 Routine Description: 651 652 Sets the attributes for a resource range on a PCI root bridge. 653 654 Arguments: 655 656 This - Pointer to EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL instance. 657 Attributes - The mask of attributes to set. 658 ResourceBase - Pointer to the base address of the resource range 659 to be modified by the attributes specified by Attributes. 660 ResourceLength - Pointer to the length of the resource range to be modified. 661 662 Returns: 663 EFI_SUCCESS - Success. 664 EFI_INVALID_PARAMETER - Invalid parameter found. 665 EFI_OUT_OF_RESOURCES - Not enough resources to set the attributes upon. 666 667 --*/ 668 ; 669 670 EFI_STATUS 671 EFIAPI 672 RootBridgeIoConfiguration ( 673 IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, 674 OUT VOID **Resources 675 ) 676 /*++ 677 678 Routine Description: 679 680 Retrieves the current resource settings of this PCI root bridge 681 in the form of a set of ACPI 2.0 resource descriptor. 682 683 Arguments: 684 685 This - Pointer to the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL instance. 686 Resources - Pointer to the ACPI 2.0 resource descriptor that 687 describe the current configuration of this PCI root 688 bridge. 689 690 Returns: 691 692 EFI_SUCCESS - Success. 693 EFI_UNSUPPORTED - Current configuration of the PCI root bridge 694 could not be retrieved. 695 696 --*/ 697 ; 698 699 #endif 700