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