1 /** @file 2 PCI Library functions that use 3 (a) I/O ports 0xCF8 and 0xCFC to perform PCI Configuration cycles, layering 4 on top of one PCI CF8 Library instance; or 5 (b) PCI Library functions that use the 256 MB PCI Express MMIO window to 6 perform PCI Configuration cycles, layering on PCI Express Library. 7 8 The decision is made in the entry point function, based on the OVMF platform 9 type, and then adhered to during the lifetime of the client module. 10 11 Copyright (C) 2016, Red Hat, Inc. 12 13 Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR> 14 This program and the accompanying materials 15 are licensed and made available under the terms and conditions of the BSD License 16 which accompanies this distribution. The full text of the license may be found at 17 http://opensource.org/licenses/bsd-license.php. 18 19 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 20 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 21 22 **/ 23 24 25 #include <Base.h> 26 27 #include <IndustryStandard/Q35MchIch9.h> 28 29 #include <Library/PciLib.h> 30 #include <Library/PciCf8Lib.h> 31 #include <Library/PciExpressLib.h> 32 #include <Library/PcdLib.h> 33 34 STATIC BOOLEAN mRunningOnQ35; 35 36 RETURN_STATUS 37 EFIAPI 38 InitializeConfigAccessMethod ( 39 VOID 40 ) 41 { 42 mRunningOnQ35 = (PcdGet16 (PcdOvmfHostBridgePciDevId) == 43 INTEL_Q35_MCH_DEVICE_ID); 44 return RETURN_SUCCESS; 45 } 46 47 /** 48 Registers a PCI device so PCI configuration registers may be accessed after 49 SetVirtualAddressMap(). 50 51 Registers the PCI device specified by Address so all the PCI configuration registers 52 associated with that PCI device may be accessed after SetVirtualAddressMap() is called. 53 54 If Address > 0x0FFFFFFF, then ASSERT(). 55 56 @param Address The address that encodes the PCI Bus, Device, Function and 57 Register. 58 59 @retval RETURN_SUCCESS The PCI device was registered for runtime access. 60 @retval RETURN_UNSUPPORTED An attempt was made to call this function 61 after ExitBootServices(). 62 @retval RETURN_UNSUPPORTED The resources required to access the PCI device 63 at runtime could not be mapped. 64 @retval RETURN_OUT_OF_RESOURCES There are not enough resources available to 65 complete the registration. 66 67 **/ 68 RETURN_STATUS 69 EFIAPI 70 PciRegisterForRuntimeAccess ( 71 IN UINTN Address 72 ) 73 { 74 return mRunningOnQ35 ? 75 PciExpressRegisterForRuntimeAccess (Address) : 76 PciCf8RegisterForRuntimeAccess (Address); 77 } 78 79 /** 80 Reads an 8-bit PCI configuration register. 81 82 Reads and returns the 8-bit PCI configuration register specified by Address. 83 This function must guarantee that all PCI read and write operations are 84 serialized. 85 86 If Address > 0x0FFFFFFF, then ASSERT(). 87 88 @param Address The address that encodes the PCI Bus, Device, Function and 89 Register. 90 91 @return The read value from the PCI configuration register. 92 93 **/ 94 UINT8 95 EFIAPI 96 PciRead8 ( 97 IN UINTN Address 98 ) 99 { 100 return mRunningOnQ35 ? 101 PciExpressRead8 (Address) : 102 PciCf8Read8 (Address); 103 } 104 105 /** 106 Writes an 8-bit PCI configuration register. 107 108 Writes the 8-bit PCI configuration register specified by Address with the 109 value specified by Value. Value is returned. This function must guarantee 110 that all PCI read and write operations are serialized. 111 112 If Address > 0x0FFFFFFF, then ASSERT(). 113 114 @param Address The address that encodes the PCI Bus, Device, Function and 115 Register. 116 @param Value The value to write. 117 118 @return The value written to the PCI configuration register. 119 120 **/ 121 UINT8 122 EFIAPI 123 PciWrite8 ( 124 IN UINTN Address, 125 IN UINT8 Value 126 ) 127 { 128 return mRunningOnQ35 ? 129 PciExpressWrite8 (Address, Value) : 130 PciCf8Write8 (Address, Value); 131 } 132 133 /** 134 Performs a bitwise OR of an 8-bit PCI configuration register with 135 an 8-bit value. 136 137 Reads the 8-bit PCI configuration register specified by Address, performs a 138 bitwise OR between the read result and the value specified by 139 OrData, and writes the result to the 8-bit PCI configuration register 140 specified by Address. The value written to the PCI configuration register is 141 returned. This function must guarantee that all PCI read and write operations 142 are serialized. 143 144 If Address > 0x0FFFFFFF, then ASSERT(). 145 146 @param Address The address that encodes the PCI Bus, Device, Function and 147 Register. 148 @param OrData The value to OR with the PCI configuration register. 149 150 @return The value written back to the PCI configuration register. 151 152 **/ 153 UINT8 154 EFIAPI 155 PciOr8 ( 156 IN UINTN Address, 157 IN UINT8 OrData 158 ) 159 { 160 return mRunningOnQ35 ? 161 PciExpressOr8 (Address, OrData) : 162 PciCf8Or8 (Address, OrData); 163 } 164 165 /** 166 Performs a bitwise AND of an 8-bit PCI configuration register with an 8-bit 167 value. 168 169 Reads the 8-bit PCI configuration register specified by Address, performs a 170 bitwise AND between the read result and the value specified by AndData, and 171 writes the result to the 8-bit PCI configuration register specified by 172 Address. The value written to the PCI configuration register is returned. 173 This function must guarantee that all PCI read and write operations are 174 serialized. 175 176 If Address > 0x0FFFFFFF, then ASSERT(). 177 178 @param Address The address that encodes the PCI Bus, Device, Function and 179 Register. 180 @param AndData The value to AND with the PCI configuration register. 181 182 @return The value written back to the PCI configuration register. 183 184 **/ 185 UINT8 186 EFIAPI 187 PciAnd8 ( 188 IN UINTN Address, 189 IN UINT8 AndData 190 ) 191 { 192 return mRunningOnQ35 ? 193 PciExpressAnd8 (Address, AndData) : 194 PciCf8And8 (Address, AndData); 195 } 196 197 /** 198 Performs a bitwise AND of an 8-bit PCI configuration register with an 8-bit 199 value, followed a bitwise OR with another 8-bit value. 200 201 Reads the 8-bit PCI configuration register specified by Address, performs a 202 bitwise AND between the read result and the value specified by AndData, 203 performs a bitwise OR between the result of the AND operation and 204 the value specified by OrData, and writes the result to the 8-bit PCI 205 configuration register specified by Address. The value written to the PCI 206 configuration register is returned. This function must guarantee that all PCI 207 read and write operations are serialized. 208 209 If Address > 0x0FFFFFFF, then ASSERT(). 210 211 @param Address The address that encodes the PCI Bus, Device, Function and 212 Register. 213 @param AndData The value to AND with the PCI configuration register. 214 @param OrData The value to OR with the result of the AND operation. 215 216 @return The value written back to the PCI configuration register. 217 218 **/ 219 UINT8 220 EFIAPI 221 PciAndThenOr8 ( 222 IN UINTN Address, 223 IN UINT8 AndData, 224 IN UINT8 OrData 225 ) 226 { 227 return mRunningOnQ35 ? 228 PciExpressAndThenOr8 (Address, AndData, OrData) : 229 PciCf8AndThenOr8 (Address, AndData, OrData); 230 } 231 232 /** 233 Reads a bit field of a PCI configuration register. 234 235 Reads the bit field in an 8-bit PCI configuration register. The bit field is 236 specified by the StartBit and the EndBit. The value of the bit field is 237 returned. 238 239 If Address > 0x0FFFFFFF, then ASSERT(). 240 If StartBit is greater than 7, then ASSERT(). 241 If EndBit is greater than 7, then ASSERT(). 242 If EndBit is less than StartBit, then ASSERT(). 243 244 @param Address The PCI configuration register to read. 245 @param StartBit The ordinal of the least significant bit in the bit field. 246 Range 0..7. 247 @param EndBit The ordinal of the most significant bit in the bit field. 248 Range 0..7. 249 250 @return The value of the bit field read from the PCI configuration register. 251 252 **/ 253 UINT8 254 EFIAPI 255 PciBitFieldRead8 ( 256 IN UINTN Address, 257 IN UINTN StartBit, 258 IN UINTN EndBit 259 ) 260 { 261 return mRunningOnQ35 ? 262 PciExpressBitFieldRead8 (Address, StartBit, EndBit) : 263 PciCf8BitFieldRead8 (Address, StartBit, EndBit); 264 } 265 266 /** 267 Writes a bit field to a PCI configuration register. 268 269 Writes Value to the bit field of the PCI configuration register. The bit 270 field is specified by the StartBit and the EndBit. All other bits in the 271 destination PCI configuration register are preserved. The new value of the 272 8-bit register is returned. 273 274 If Address > 0x0FFFFFFF, then ASSERT(). 275 If StartBit is greater than 7, then ASSERT(). 276 If EndBit is greater than 7, then ASSERT(). 277 If EndBit is less than StartBit, then ASSERT(). 278 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 279 280 @param Address The PCI configuration register to write. 281 @param StartBit The ordinal of the least significant bit in the bit field. 282 Range 0..7. 283 @param EndBit The ordinal of the most significant bit in the bit field. 284 Range 0..7. 285 @param Value The new value of the bit field. 286 287 @return The value written back to the PCI configuration register. 288 289 **/ 290 UINT8 291 EFIAPI 292 PciBitFieldWrite8 ( 293 IN UINTN Address, 294 IN UINTN StartBit, 295 IN UINTN EndBit, 296 IN UINT8 Value 297 ) 298 { 299 return mRunningOnQ35 ? 300 PciExpressBitFieldWrite8 (Address, StartBit, EndBit, Value) : 301 PciCf8BitFieldWrite8 (Address, StartBit, EndBit, Value); 302 } 303 304 /** 305 Reads a bit field in an 8-bit PCI configuration, performs a bitwise OR, and 306 writes the result back to the bit field in the 8-bit port. 307 308 Reads the 8-bit PCI configuration register specified by Address, performs a 309 bitwise OR between the read result and the value specified by 310 OrData, and writes the result to the 8-bit PCI configuration register 311 specified by Address. The value written to the PCI configuration register is 312 returned. This function must guarantee that all PCI read and write operations 313 are serialized. Extra left bits in OrData are stripped. 314 315 If Address > 0x0FFFFFFF, then ASSERT(). 316 If StartBit is greater than 7, then ASSERT(). 317 If EndBit is greater than 7, then ASSERT(). 318 If EndBit is less than StartBit, then ASSERT(). 319 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 320 321 @param Address The PCI configuration register to write. 322 @param StartBit The ordinal of the least significant bit in the bit field. 323 Range 0..7. 324 @param EndBit The ordinal of the most significant bit in the bit field. 325 Range 0..7. 326 @param OrData The value to OR with the PCI configuration register. 327 328 @return The value written back to the PCI configuration register. 329 330 **/ 331 UINT8 332 EFIAPI 333 PciBitFieldOr8 ( 334 IN UINTN Address, 335 IN UINTN StartBit, 336 IN UINTN EndBit, 337 IN UINT8 OrData 338 ) 339 { 340 return mRunningOnQ35 ? 341 PciExpressBitFieldOr8 (Address, StartBit, EndBit, OrData) : 342 PciCf8BitFieldOr8 (Address, StartBit, EndBit, OrData); 343 } 344 345 /** 346 Reads a bit field in an 8-bit PCI configuration register, performs a bitwise 347 AND, and writes the result back to the bit field in the 8-bit register. 348 349 Reads the 8-bit PCI configuration register specified by Address, performs a 350 bitwise AND between the read result and the value specified by AndData, and 351 writes the result to the 8-bit PCI configuration register specified by 352 Address. The value written to the PCI configuration register is returned. 353 This function must guarantee that all PCI read and write operations are 354 serialized. Extra left bits in AndData are stripped. 355 356 If Address > 0x0FFFFFFF, then ASSERT(). 357 If StartBit is greater than 7, then ASSERT(). 358 If EndBit is greater than 7, then ASSERT(). 359 If EndBit is less than StartBit, then ASSERT(). 360 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 361 362 @param Address The PCI configuration register to write. 363 @param StartBit The ordinal of the least significant bit in the bit field. 364 Range 0..7. 365 @param EndBit The ordinal of the most significant bit in the bit field. 366 Range 0..7. 367 @param AndData The value to AND with the PCI configuration register. 368 369 @return The value written back to the PCI configuration register. 370 371 **/ 372 UINT8 373 EFIAPI 374 PciBitFieldAnd8 ( 375 IN UINTN Address, 376 IN UINTN StartBit, 377 IN UINTN EndBit, 378 IN UINT8 AndData 379 ) 380 { 381 return mRunningOnQ35 ? 382 PciExpressBitFieldAnd8 (Address, StartBit, EndBit, AndData) : 383 PciCf8BitFieldAnd8 (Address, StartBit, EndBit, AndData); 384 } 385 386 /** 387 Reads a bit field in an 8-bit port, performs a bitwise AND followed by a 388 bitwise OR, and writes the result back to the bit field in the 389 8-bit port. 390 391 Reads the 8-bit PCI configuration register specified by Address, performs a 392 bitwise AND followed by a bitwise OR between the read result and 393 the value specified by AndData, and writes the result to the 8-bit PCI 394 configuration register specified by Address. The value written to the PCI 395 configuration register is returned. This function must guarantee that all PCI 396 read and write operations are serialized. Extra left bits in both AndData and 397 OrData are stripped. 398 399 If Address > 0x0FFFFFFF, then ASSERT(). 400 If StartBit is greater than 7, then ASSERT(). 401 If EndBit is greater than 7, then ASSERT(). 402 If EndBit is less than StartBit, then ASSERT(). 403 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 404 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 405 406 @param Address The PCI configuration register to write. 407 @param StartBit The ordinal of the least significant bit in the bit field. 408 Range 0..7. 409 @param EndBit The ordinal of the most significant bit in the bit field. 410 Range 0..7. 411 @param AndData The value to AND with the PCI configuration register. 412 @param OrData The value to OR with the result of the AND operation. 413 414 @return The value written back to the PCI configuration register. 415 416 **/ 417 UINT8 418 EFIAPI 419 PciBitFieldAndThenOr8 ( 420 IN UINTN Address, 421 IN UINTN StartBit, 422 IN UINTN EndBit, 423 IN UINT8 AndData, 424 IN UINT8 OrData 425 ) 426 { 427 return mRunningOnQ35 ? 428 PciExpressBitFieldAndThenOr8 (Address, StartBit, EndBit, AndData, OrData) : 429 PciCf8BitFieldAndThenOr8 (Address, StartBit, EndBit, AndData, OrData); 430 } 431 432 /** 433 Reads a 16-bit PCI configuration register. 434 435 Reads and returns the 16-bit PCI configuration register specified by Address. 436 This function must guarantee that all PCI read and write operations are 437 serialized. 438 439 If Address > 0x0FFFFFFF, then ASSERT(). 440 If Address is not aligned on a 16-bit boundary, then ASSERT(). 441 442 @param Address The address that encodes the PCI Bus, Device, Function and 443 Register. 444 445 @return The read value from the PCI configuration register. 446 447 **/ 448 UINT16 449 EFIAPI 450 PciRead16 ( 451 IN UINTN Address 452 ) 453 { 454 return mRunningOnQ35 ? 455 PciExpressRead16 (Address) : 456 PciCf8Read16 (Address); 457 } 458 459 /** 460 Writes a 16-bit PCI configuration register. 461 462 Writes the 16-bit PCI configuration register specified by Address with the 463 value specified by Value. Value is returned. This function must guarantee 464 that all PCI read and write operations are serialized. 465 466 If Address > 0x0FFFFFFF, then ASSERT(). 467 If Address is not aligned on a 16-bit boundary, then ASSERT(). 468 469 @param Address The address that encodes the PCI Bus, Device, Function and 470 Register. 471 @param Value The value to write. 472 473 @return The value written to the PCI configuration register. 474 475 **/ 476 UINT16 477 EFIAPI 478 PciWrite16 ( 479 IN UINTN Address, 480 IN UINT16 Value 481 ) 482 { 483 return mRunningOnQ35 ? 484 PciExpressWrite16 (Address, Value) : 485 PciCf8Write16 (Address, Value); 486 } 487 488 /** 489 Performs a bitwise OR of a 16-bit PCI configuration register with 490 a 16-bit value. 491 492 Reads the 16-bit PCI configuration register specified by Address, performs a 493 bitwise OR between the read result and the value specified by 494 OrData, and writes the result to the 16-bit PCI configuration register 495 specified by Address. The value written to the PCI configuration register is 496 returned. This function must guarantee that all PCI read and write operations 497 are serialized. 498 499 If Address > 0x0FFFFFFF, then ASSERT(). 500 If Address is not aligned on a 16-bit boundary, then ASSERT(). 501 502 @param Address The address that encodes the PCI Bus, Device, Function and 503 Register. 504 @param OrData The value to OR with the PCI configuration register. 505 506 @return The value written back to the PCI configuration register. 507 508 **/ 509 UINT16 510 EFIAPI 511 PciOr16 ( 512 IN UINTN Address, 513 IN UINT16 OrData 514 ) 515 { 516 return mRunningOnQ35 ? 517 PciExpressOr16 (Address, OrData) : 518 PciCf8Or16 (Address, OrData); 519 } 520 521 /** 522 Performs a bitwise AND of a 16-bit PCI configuration register with a 16-bit 523 value. 524 525 Reads the 16-bit PCI configuration register specified by Address, performs a 526 bitwise AND between the read result and the value specified by AndData, and 527 writes the result to the 16-bit PCI configuration register specified by 528 Address. The value written to the PCI configuration register is returned. 529 This function must guarantee that all PCI read and write operations are 530 serialized. 531 532 If Address > 0x0FFFFFFF, then ASSERT(). 533 If Address is not aligned on a 16-bit boundary, then ASSERT(). 534 535 @param Address The address that encodes the PCI Bus, Device, Function and 536 Register. 537 @param AndData The value to AND with the PCI configuration register. 538 539 @return The value written back to the PCI configuration register. 540 541 **/ 542 UINT16 543 EFIAPI 544 PciAnd16 ( 545 IN UINTN Address, 546 IN UINT16 AndData 547 ) 548 { 549 return mRunningOnQ35 ? 550 PciExpressAnd16 (Address, AndData) : 551 PciCf8And16 (Address, AndData); 552 } 553 554 /** 555 Performs a bitwise AND of a 16-bit PCI configuration register with a 16-bit 556 value, followed a bitwise OR with another 16-bit value. 557 558 Reads the 16-bit PCI configuration register specified by Address, performs a 559 bitwise AND between the read result and the value specified by AndData, 560 performs a bitwise OR between the result of the AND operation and 561 the value specified by OrData, and writes the result to the 16-bit PCI 562 configuration register specified by Address. The value written to the PCI 563 configuration register is returned. This function must guarantee that all PCI 564 read and write operations are serialized. 565 566 If Address > 0x0FFFFFFF, then ASSERT(). 567 If Address is not aligned on a 16-bit boundary, then ASSERT(). 568 569 @param Address The address that encodes the PCI Bus, Device, Function and 570 Register. 571 @param AndData The value to AND with the PCI configuration register. 572 @param OrData The value to OR with the result of the AND operation. 573 574 @return The value written back to the PCI configuration register. 575 576 **/ 577 UINT16 578 EFIAPI 579 PciAndThenOr16 ( 580 IN UINTN Address, 581 IN UINT16 AndData, 582 IN UINT16 OrData 583 ) 584 { 585 return mRunningOnQ35 ? 586 PciExpressAndThenOr16 (Address, AndData, OrData) : 587 PciCf8AndThenOr16 (Address, AndData, OrData); 588 } 589 590 /** 591 Reads a bit field of a PCI configuration register. 592 593 Reads the bit field in a 16-bit PCI configuration register. The bit field is 594 specified by the StartBit and the EndBit. The value of the bit field is 595 returned. 596 597 If Address > 0x0FFFFFFF, then ASSERT(). 598 If Address is not aligned on a 16-bit boundary, then ASSERT(). 599 If StartBit is greater than 15, then ASSERT(). 600 If EndBit is greater than 15, then ASSERT(). 601 If EndBit is less than StartBit, then ASSERT(). 602 603 @param Address The PCI configuration register to read. 604 @param StartBit The ordinal of the least significant bit in the bit field. 605 Range 0..15. 606 @param EndBit The ordinal of the most significant bit in the bit field. 607 Range 0..15. 608 609 @return The value of the bit field read from the PCI configuration register. 610 611 **/ 612 UINT16 613 EFIAPI 614 PciBitFieldRead16 ( 615 IN UINTN Address, 616 IN UINTN StartBit, 617 IN UINTN EndBit 618 ) 619 { 620 return mRunningOnQ35 ? 621 PciExpressBitFieldRead16 (Address, StartBit, EndBit) : 622 PciCf8BitFieldRead16 (Address, StartBit, EndBit); 623 } 624 625 /** 626 Writes a bit field to a PCI configuration register. 627 628 Writes Value to the bit field of the PCI configuration register. The bit 629 field is specified by the StartBit and the EndBit. All other bits in the 630 destination PCI configuration register are preserved. The new value of the 631 16-bit register is returned. 632 633 If Address > 0x0FFFFFFF, then ASSERT(). 634 If Address is not aligned on a 16-bit boundary, then ASSERT(). 635 If StartBit is greater than 15, then ASSERT(). 636 If EndBit is greater than 15, then ASSERT(). 637 If EndBit is less than StartBit, then ASSERT(). 638 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 639 640 @param Address The PCI configuration register to write. 641 @param StartBit The ordinal of the least significant bit in the bit field. 642 Range 0..15. 643 @param EndBit The ordinal of the most significant bit in the bit field. 644 Range 0..15. 645 @param Value The new value of the bit field. 646 647 @return The value written back to the PCI configuration register. 648 649 **/ 650 UINT16 651 EFIAPI 652 PciBitFieldWrite16 ( 653 IN UINTN Address, 654 IN UINTN StartBit, 655 IN UINTN EndBit, 656 IN UINT16 Value 657 ) 658 { 659 return mRunningOnQ35 ? 660 PciExpressBitFieldWrite16 (Address, StartBit, EndBit, Value) : 661 PciCf8BitFieldWrite16 (Address, StartBit, EndBit, Value); 662 } 663 664 /** 665 Reads a bit field in a 16-bit PCI configuration, performs a bitwise OR, and 666 writes the result back to the bit field in the 16-bit port. 667 668 Reads the 16-bit PCI configuration register specified by Address, performs a 669 bitwise OR between the read result and the value specified by 670 OrData, and writes the result to the 16-bit PCI configuration register 671 specified by Address. The value written to the PCI configuration register is 672 returned. This function must guarantee that all PCI read and write operations 673 are serialized. Extra left bits in OrData are stripped. 674 675 If Address > 0x0FFFFFFF, then ASSERT(). 676 If Address is not aligned on a 16-bit boundary, then ASSERT(). 677 If StartBit is greater than 15, then ASSERT(). 678 If EndBit is greater than 15, then ASSERT(). 679 If EndBit is less than StartBit, then ASSERT(). 680 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 681 682 @param Address The PCI configuration register to write. 683 @param StartBit The ordinal of the least significant bit in the bit field. 684 Range 0..15. 685 @param EndBit The ordinal of the most significant bit in the bit field. 686 Range 0..15. 687 @param OrData The value to OR with the PCI configuration register. 688 689 @return The value written back to the PCI configuration register. 690 691 **/ 692 UINT16 693 EFIAPI 694 PciBitFieldOr16 ( 695 IN UINTN Address, 696 IN UINTN StartBit, 697 IN UINTN EndBit, 698 IN UINT16 OrData 699 ) 700 { 701 return mRunningOnQ35 ? 702 PciExpressBitFieldOr16 (Address, StartBit, EndBit, OrData) : 703 PciCf8BitFieldOr16 (Address, StartBit, EndBit, OrData); 704 } 705 706 /** 707 Reads a bit field in a 16-bit PCI configuration register, performs a bitwise 708 AND, and writes the result back to the bit field in the 16-bit register. 709 710 Reads the 16-bit PCI configuration register specified by Address, performs a 711 bitwise AND between the read result and the value specified by AndData, and 712 writes the result to the 16-bit PCI configuration register specified by 713 Address. The value written to the PCI configuration register is returned. 714 This function must guarantee that all PCI read and write operations are 715 serialized. Extra left bits in AndData are stripped. 716 717 If Address > 0x0FFFFFFF, then ASSERT(). 718 If Address is not aligned on a 16-bit boundary, then ASSERT(). 719 If StartBit is greater than 15, then ASSERT(). 720 If EndBit is greater than 15, then ASSERT(). 721 If EndBit is less than StartBit, then ASSERT(). 722 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 723 724 @param Address The PCI configuration register to write. 725 @param StartBit The ordinal of the least significant bit in the bit field. 726 Range 0..15. 727 @param EndBit The ordinal of the most significant bit in the bit field. 728 Range 0..15. 729 @param AndData The value to AND with the PCI configuration register. 730 731 @return The value written back to the PCI configuration register. 732 733 **/ 734 UINT16 735 EFIAPI 736 PciBitFieldAnd16 ( 737 IN UINTN Address, 738 IN UINTN StartBit, 739 IN UINTN EndBit, 740 IN UINT16 AndData 741 ) 742 { 743 return mRunningOnQ35 ? 744 PciExpressBitFieldAnd16 (Address, StartBit, EndBit, AndData) : 745 PciCf8BitFieldAnd16 (Address, StartBit, EndBit, AndData); 746 } 747 748 /** 749 Reads a bit field in a 16-bit port, performs a bitwise AND followed by a 750 bitwise OR, and writes the result back to the bit field in the 751 16-bit port. 752 753 Reads the 16-bit PCI configuration register specified by Address, performs a 754 bitwise AND followed by a bitwise OR between the read result and 755 the value specified by AndData, and writes the result to the 16-bit PCI 756 configuration register specified by Address. The value written to the PCI 757 configuration register is returned. This function must guarantee that all PCI 758 read and write operations are serialized. Extra left bits in both AndData and 759 OrData are stripped. 760 761 If Address > 0x0FFFFFFF, then ASSERT(). 762 If Address is not aligned on a 16-bit boundary, then ASSERT(). 763 If StartBit is greater than 15, then ASSERT(). 764 If EndBit is greater than 15, then ASSERT(). 765 If EndBit is less than StartBit, then ASSERT(). 766 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 767 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 768 769 @param Address The PCI configuration register to write. 770 @param StartBit The ordinal of the least significant bit in the bit field. 771 Range 0..15. 772 @param EndBit The ordinal of the most significant bit in the bit field. 773 Range 0..15. 774 @param AndData The value to AND with the PCI configuration register. 775 @param OrData The value to OR with the result of the AND operation. 776 777 @return The value written back to the PCI configuration register. 778 779 **/ 780 UINT16 781 EFIAPI 782 PciBitFieldAndThenOr16 ( 783 IN UINTN Address, 784 IN UINTN StartBit, 785 IN UINTN EndBit, 786 IN UINT16 AndData, 787 IN UINT16 OrData 788 ) 789 { 790 return mRunningOnQ35 ? 791 PciExpressBitFieldAndThenOr16 (Address, StartBit, EndBit, AndData, OrData) : 792 PciCf8BitFieldAndThenOr16 (Address, StartBit, EndBit, AndData, OrData); 793 } 794 795 /** 796 Reads a 32-bit PCI configuration register. 797 798 Reads and returns the 32-bit PCI configuration register specified by Address. 799 This function must guarantee that all PCI read and write operations are 800 serialized. 801 802 If Address > 0x0FFFFFFF, then ASSERT(). 803 If Address is not aligned on a 32-bit boundary, then ASSERT(). 804 805 @param Address The address that encodes the PCI Bus, Device, Function and 806 Register. 807 808 @return The read value from the PCI configuration register. 809 810 **/ 811 UINT32 812 EFIAPI 813 PciRead32 ( 814 IN UINTN Address 815 ) 816 { 817 return mRunningOnQ35 ? 818 PciExpressRead32 (Address) : 819 PciCf8Read32 (Address); 820 } 821 822 /** 823 Writes a 32-bit PCI configuration register. 824 825 Writes the 32-bit PCI configuration register specified by Address with the 826 value specified by Value. Value is returned. This function must guarantee 827 that all PCI read and write operations are serialized. 828 829 If Address > 0x0FFFFFFF, then ASSERT(). 830 If Address is not aligned on a 32-bit boundary, then ASSERT(). 831 832 @param Address The address that encodes the PCI Bus, Device, Function and 833 Register. 834 @param Value The value to write. 835 836 @return The value written to the PCI configuration register. 837 838 **/ 839 UINT32 840 EFIAPI 841 PciWrite32 ( 842 IN UINTN Address, 843 IN UINT32 Value 844 ) 845 { 846 return mRunningOnQ35 ? 847 PciExpressWrite32 (Address, Value) : 848 PciCf8Write32 (Address, Value); 849 } 850 851 /** 852 Performs a bitwise OR of a 32-bit PCI configuration register with 853 a 32-bit value. 854 855 Reads the 32-bit PCI configuration register specified by Address, performs a 856 bitwise OR between the read result and the value specified by 857 OrData, and writes the result to the 32-bit PCI configuration register 858 specified by Address. The value written to the PCI configuration register is 859 returned. This function must guarantee that all PCI read and write operations 860 are serialized. 861 862 If Address > 0x0FFFFFFF, then ASSERT(). 863 If Address is not aligned on a 32-bit boundary, then ASSERT(). 864 865 @param Address The address that encodes the PCI Bus, Device, Function and 866 Register. 867 @param OrData The value to OR with the PCI configuration register. 868 869 @return The value written back to the PCI configuration register. 870 871 **/ 872 UINT32 873 EFIAPI 874 PciOr32 ( 875 IN UINTN Address, 876 IN UINT32 OrData 877 ) 878 { 879 return mRunningOnQ35 ? 880 PciExpressOr32 (Address, OrData) : 881 PciCf8Or32 (Address, OrData); 882 } 883 884 /** 885 Performs a bitwise AND of a 32-bit PCI configuration register with a 32-bit 886 value. 887 888 Reads the 32-bit PCI configuration register specified by Address, performs a 889 bitwise AND between the read result and the value specified by AndData, and 890 writes the result to the 32-bit PCI configuration register specified by 891 Address. The value written to the PCI configuration register is returned. 892 This function must guarantee that all PCI read and write operations are 893 serialized. 894 895 If Address > 0x0FFFFFFF, then ASSERT(). 896 If Address is not aligned on a 32-bit boundary, then ASSERT(). 897 898 @param Address The address that encodes the PCI Bus, Device, Function and 899 Register. 900 @param AndData The value to AND with the PCI configuration register. 901 902 @return The value written back to the PCI configuration register. 903 904 **/ 905 UINT32 906 EFIAPI 907 PciAnd32 ( 908 IN UINTN Address, 909 IN UINT32 AndData 910 ) 911 { 912 return mRunningOnQ35 ? 913 PciExpressAnd32 (Address, AndData) : 914 PciCf8And32 (Address, AndData); 915 } 916 917 /** 918 Performs a bitwise AND of a 32-bit PCI configuration register with a 32-bit 919 value, followed a bitwise OR with another 32-bit value. 920 921 Reads the 32-bit PCI configuration register specified by Address, performs a 922 bitwise AND between the read result and the value specified by AndData, 923 performs a bitwise OR between the result of the AND operation and 924 the value specified by OrData, and writes the result to the 32-bit PCI 925 configuration register specified by Address. The value written to the PCI 926 configuration register is returned. This function must guarantee that all PCI 927 read and write operations are serialized. 928 929 If Address > 0x0FFFFFFF, then ASSERT(). 930 If Address is not aligned on a 32-bit boundary, then ASSERT(). 931 932 @param Address The address that encodes the PCI Bus, Device, Function and 933 Register. 934 @param AndData The value to AND with the PCI configuration register. 935 @param OrData The value to OR with the result of the AND operation. 936 937 @return The value written back to the PCI configuration register. 938 939 **/ 940 UINT32 941 EFIAPI 942 PciAndThenOr32 ( 943 IN UINTN Address, 944 IN UINT32 AndData, 945 IN UINT32 OrData 946 ) 947 { 948 return mRunningOnQ35 ? 949 PciExpressAndThenOr32 (Address, AndData, OrData) : 950 PciCf8AndThenOr32 (Address, AndData, OrData); 951 } 952 953 /** 954 Reads a bit field of a PCI configuration register. 955 956 Reads the bit field in a 32-bit PCI configuration register. The bit field is 957 specified by the StartBit and the EndBit. The value of the bit field is 958 returned. 959 960 If Address > 0x0FFFFFFF, then ASSERT(). 961 If Address is not aligned on a 32-bit boundary, then ASSERT(). 962 If StartBit is greater than 31, then ASSERT(). 963 If EndBit is greater than 31, then ASSERT(). 964 If EndBit is less than StartBit, then ASSERT(). 965 966 @param Address The PCI configuration register to read. 967 @param StartBit The ordinal of the least significant bit in the bit field. 968 Range 0..31. 969 @param EndBit The ordinal of the most significant bit in the bit field. 970 Range 0..31. 971 972 @return The value of the bit field read from the PCI configuration register. 973 974 **/ 975 UINT32 976 EFIAPI 977 PciBitFieldRead32 ( 978 IN UINTN Address, 979 IN UINTN StartBit, 980 IN UINTN EndBit 981 ) 982 { 983 return mRunningOnQ35 ? 984 PciExpressBitFieldRead32 (Address, StartBit, EndBit) : 985 PciCf8BitFieldRead32 (Address, StartBit, EndBit); 986 } 987 988 /** 989 Writes a bit field to a PCI configuration register. 990 991 Writes Value to the bit field of the PCI configuration register. The bit 992 field is specified by the StartBit and the EndBit. All other bits in the 993 destination PCI configuration register are preserved. The new value of the 994 32-bit register is returned. 995 996 If Address > 0x0FFFFFFF, then ASSERT(). 997 If Address is not aligned on a 32-bit boundary, then ASSERT(). 998 If StartBit is greater than 31, then ASSERT(). 999 If EndBit is greater than 31, then ASSERT(). 1000 If EndBit is less than StartBit, then ASSERT(). 1001 If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1002 1003 @param Address The PCI configuration register to write. 1004 @param StartBit The ordinal of the least significant bit in the bit field. 1005 Range 0..31. 1006 @param EndBit The ordinal of the most significant bit in the bit field. 1007 Range 0..31. 1008 @param Value The new value of the bit field. 1009 1010 @return The value written back to the PCI configuration register. 1011 1012 **/ 1013 UINT32 1014 EFIAPI 1015 PciBitFieldWrite32 ( 1016 IN UINTN Address, 1017 IN UINTN StartBit, 1018 IN UINTN EndBit, 1019 IN UINT32 Value 1020 ) 1021 { 1022 return mRunningOnQ35 ? 1023 PciExpressBitFieldWrite32 (Address, StartBit, EndBit, Value) : 1024 PciCf8BitFieldWrite32 (Address, StartBit, EndBit, Value); 1025 } 1026 1027 /** 1028 Reads a bit field in a 32-bit PCI configuration, performs a bitwise OR, and 1029 writes the result back to the bit field in the 32-bit port. 1030 1031 Reads the 32-bit PCI configuration register specified by Address, performs a 1032 bitwise OR between the read result and the value specified by 1033 OrData, and writes the result to the 32-bit PCI configuration register 1034 specified by Address. The value written to the PCI configuration register is 1035 returned. This function must guarantee that all PCI read and write operations 1036 are serialized. Extra left bits in OrData are stripped. 1037 1038 If Address > 0x0FFFFFFF, then ASSERT(). 1039 If Address is not aligned on a 32-bit boundary, then ASSERT(). 1040 If StartBit is greater than 31, then ASSERT(). 1041 If EndBit is greater than 31, then ASSERT(). 1042 If EndBit is less than StartBit, then ASSERT(). 1043 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1044 1045 @param Address The PCI configuration register to write. 1046 @param StartBit The ordinal of the least significant bit in the bit field. 1047 Range 0..31. 1048 @param EndBit The ordinal of the most significant bit in the bit field. 1049 Range 0..31. 1050 @param OrData The value to OR with the PCI configuration register. 1051 1052 @return The value written back to the PCI configuration register. 1053 1054 **/ 1055 UINT32 1056 EFIAPI 1057 PciBitFieldOr32 ( 1058 IN UINTN Address, 1059 IN UINTN StartBit, 1060 IN UINTN EndBit, 1061 IN UINT32 OrData 1062 ) 1063 { 1064 return mRunningOnQ35 ? 1065 PciExpressBitFieldOr32 (Address, StartBit, EndBit, OrData) : 1066 PciCf8BitFieldOr32 (Address, StartBit, EndBit, OrData); 1067 } 1068 1069 /** 1070 Reads a bit field in a 32-bit PCI configuration register, performs a bitwise 1071 AND, and writes the result back to the bit field in the 32-bit register. 1072 1073 Reads the 32-bit PCI configuration register specified by Address, performs a 1074 bitwise AND between the read result and the value specified by AndData, and 1075 writes the result to the 32-bit PCI configuration register specified by 1076 Address. The value written to the PCI configuration register is returned. 1077 This function must guarantee that all PCI read and write operations are 1078 serialized. Extra left bits in AndData are stripped. 1079 1080 If Address > 0x0FFFFFFF, then ASSERT(). 1081 If Address is not aligned on a 32-bit boundary, then ASSERT(). 1082 If StartBit is greater than 31, then ASSERT(). 1083 If EndBit is greater than 31, then ASSERT(). 1084 If EndBit is less than StartBit, then ASSERT(). 1085 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1086 1087 @param Address The PCI configuration register to write. 1088 @param StartBit The ordinal of the least significant bit in the bit field. 1089 Range 0..31. 1090 @param EndBit The ordinal of the most significant bit in the bit field. 1091 Range 0..31. 1092 @param AndData The value to AND with the PCI configuration register. 1093 1094 @return The value written back to the PCI configuration register. 1095 1096 **/ 1097 UINT32 1098 EFIAPI 1099 PciBitFieldAnd32 ( 1100 IN UINTN Address, 1101 IN UINTN StartBit, 1102 IN UINTN EndBit, 1103 IN UINT32 AndData 1104 ) 1105 { 1106 return mRunningOnQ35 ? 1107 PciExpressBitFieldAnd32 (Address, StartBit, EndBit, AndData) : 1108 PciCf8BitFieldAnd32 (Address, StartBit, EndBit, AndData); 1109 } 1110 1111 /** 1112 Reads a bit field in a 32-bit port, performs a bitwise AND followed by a 1113 bitwise OR, and writes the result back to the bit field in the 1114 32-bit port. 1115 1116 Reads the 32-bit PCI configuration register specified by Address, performs a 1117 bitwise AND followed by a bitwise OR between the read result and 1118 the value specified by AndData, and writes the result to the 32-bit PCI 1119 configuration register specified by Address. The value written to the PCI 1120 configuration register is returned. This function must guarantee that all PCI 1121 read and write operations are serialized. Extra left bits in both AndData and 1122 OrData are stripped. 1123 1124 If Address > 0x0FFFFFFF, then ASSERT(). 1125 If Address is not aligned on a 32-bit boundary, then ASSERT(). 1126 If StartBit is greater than 31, then ASSERT(). 1127 If EndBit is greater than 31, then ASSERT(). 1128 If EndBit is less than StartBit, then ASSERT(). 1129 If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1130 If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 1131 1132 @param Address The PCI configuration register to write. 1133 @param StartBit The ordinal of the least significant bit in the bit field. 1134 Range 0..31. 1135 @param EndBit The ordinal of the most significant bit in the bit field. 1136 Range 0..31. 1137 @param AndData The value to AND with the PCI configuration register. 1138 @param OrData The value to OR with the result of the AND operation. 1139 1140 @return The value written back to the PCI configuration register. 1141 1142 **/ 1143 UINT32 1144 EFIAPI 1145 PciBitFieldAndThenOr32 ( 1146 IN UINTN Address, 1147 IN UINTN StartBit, 1148 IN UINTN EndBit, 1149 IN UINT32 AndData, 1150 IN UINT32 OrData 1151 ) 1152 { 1153 return mRunningOnQ35 ? 1154 PciExpressBitFieldAndThenOr32 (Address, StartBit, EndBit, AndData, OrData) : 1155 PciCf8BitFieldAndThenOr32 (Address, StartBit, EndBit, AndData, OrData); 1156 } 1157 1158 /** 1159 Reads a range of PCI configuration registers into a caller supplied buffer. 1160 1161 Reads the range of PCI configuration registers specified by StartAddress and 1162 Size into the buffer specified by Buffer. This function only allows the PCI 1163 configuration registers from a single PCI function to be read. Size is 1164 returned. When possible 32-bit PCI configuration read cycles are used to read 1165 from StartAdress to StartAddress + Size. Due to alignment restrictions, 8-bit 1166 and 16-bit PCI configuration read cycles may be used at the beginning and the 1167 end of the range. 1168 1169 If StartAddress > 0x0FFFFFFF, then ASSERT(). 1170 If ((StartAddress & 0xFFF) + Size) > 0x1000, then ASSERT(). 1171 If Size > 0 and Buffer is NULL, then ASSERT(). 1172 1173 @param StartAddress The starting address that encodes the PCI Bus, Device, 1174 Function and Register. 1175 @param Size The size in bytes of the transfer. 1176 @param Buffer The pointer to a buffer receiving the data read. 1177 1178 @return Size 1179 1180 **/ 1181 UINTN 1182 EFIAPI 1183 PciReadBuffer ( 1184 IN UINTN StartAddress, 1185 IN UINTN Size, 1186 OUT VOID *Buffer 1187 ) 1188 { 1189 return mRunningOnQ35 ? 1190 PciExpressReadBuffer (StartAddress, Size, Buffer) : 1191 PciCf8ReadBuffer (StartAddress, Size, Buffer); 1192 } 1193 1194 /** 1195 Copies the data in a caller supplied buffer to a specified range of PCI 1196 configuration space. 1197 1198 Writes the range of PCI configuration registers specified by StartAddress and 1199 Size from the buffer specified by Buffer. This function only allows the PCI 1200 configuration registers from a single PCI function to be written. Size is 1201 returned. When possible 32-bit PCI configuration write cycles are used to 1202 write from StartAdress to StartAddress + Size. Due to alignment restrictions, 1203 8-bit and 16-bit PCI configuration write cycles may be used at the beginning 1204 and the end of the range. 1205 1206 If StartAddress > 0x0FFFFFFF, then ASSERT(). 1207 If ((StartAddress & 0xFFF) + Size) > 0x1000, then ASSERT(). 1208 If Size > 0 and Buffer is NULL, then ASSERT(). 1209 1210 @param StartAddress The starting address that encodes the PCI Bus, Device, 1211 Function and Register. 1212 @param Size The size in bytes of the transfer. 1213 @param Buffer The pointer to a buffer containing the data to write. 1214 1215 @return Size written to StartAddress. 1216 1217 **/ 1218 UINTN 1219 EFIAPI 1220 PciWriteBuffer ( 1221 IN UINTN StartAddress, 1222 IN UINTN Size, 1223 IN VOID *Buffer 1224 ) 1225 { 1226 return mRunningOnQ35 ? 1227 PciExpressWriteBuffer (StartAddress, Size, Buffer) : 1228 PciCf8WriteBuffer (StartAddress, Size, Buffer); 1229 } 1230