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