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