Home | History | Annotate | Download | only in Library
      1 /** @file
      2   Provide services to access I/O Ports and MMIO registers.
      3 
      4 Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions of the BSD License
      7 which accompanies this distribution.  The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #ifndef __IO_LIB_H__
     16 #define __IO_LIB_H__
     17 
     18 /**
     19   Macro that converts PCI Segment and I/O Port to an address that can be
     20   passed to the I/O Library functions.
     21 
     22   Computes an address that is compatible with the I/O Library functions.
     23   The unused upper bits of Segment, and Port are stripped prior to the
     24   generation of the address.
     25 
     26   @param  Segment   PCI Segment number.  Range 0..65535.
     27   @param  Port      I/O Port number.  Range 0..65535.
     28 
     29   @return An address that the I/o Library functions need.
     30 
     31 **/
     32 
     33 #define IO_LIB_ADDRESS(Segment,Port) \
     34   ( ((Port) & 0xffff) | (((Segment) & 0xffff) << 16) )
     35 
     36 /**
     37   Reads an 8-bit I/O port.
     38 
     39   Reads the 8-bit I/O port specified by Port. The 8-bit read value is returned.
     40   This function must guarantee that all I/O read and write operations are
     41   serialized.
     42 
     43   If 8-bit I/O port operations are not supported, then ASSERT().
     44 
     45   @param  Port  The I/O port to read.
     46 
     47   @return The value read.
     48 
     49 **/
     50 UINT8
     51 EFIAPI
     52 IoRead8 (
     53   IN      UINTN                     Port
     54   );
     55 
     56 /**
     57   Writes an 8-bit I/O port.
     58 
     59   Writes the 8-bit I/O port specified by Port with the value specified by Value
     60   and returns Value. This function must guarantee that all I/O read and write
     61   operations are serialized.
     62 
     63   If 8-bit I/O port operations are not supported, then ASSERT().
     64 
     65   @param  Port  The I/O port to write.
     66   @param  Value The value to write to the I/O port.
     67 
     68   @return The value written the I/O port.
     69 
     70 **/
     71 UINT8
     72 EFIAPI
     73 IoWrite8 (
     74   IN      UINTN                     Port,
     75   IN      UINT8                     Value
     76   );
     77 
     78 /**
     79   Reads an 8-bit I/O port, performs a bitwise OR, and writes the
     80   result back to the 8-bit I/O port.
     81 
     82   Reads the 8-bit I/O port specified by Port, performs a bitwise OR
     83   between the read result and the value specified by OrData, and writes the
     84   result to the 8-bit I/O port specified by Port. The value written to the I/O
     85   port is returned. This function must guarantee that all I/O read and write
     86   operations are serialized.
     87 
     88   If 8-bit I/O port operations are not supported, then ASSERT().
     89 
     90   @param  Port    The I/O port to write.
     91   @param  OrData  The value to OR with the read value from the I/O port.
     92 
     93   @return The value written back to the I/O port.
     94 
     95 **/
     96 UINT8
     97 EFIAPI
     98 IoOr8 (
     99   IN      UINTN                     Port,
    100   IN      UINT8                     OrData
    101   );
    102 
    103 /**
    104   Reads an 8-bit I/O port, performs a bitwise AND, and writes the result back
    105   to the 8-bit I/O port.
    106 
    107   Reads the 8-bit I/O port specified by Port, performs a bitwise AND between
    108   the read result and the value specified by AndData, and writes the result to
    109   the 8-bit I/O port specified by Port. The value written to the I/O port is
    110   returned. This function must guarantee that all I/O read and write operations
    111   are serialized.
    112 
    113   If 8-bit I/O port operations are not supported, then ASSERT().
    114 
    115   @param  Port    The I/O port to write.
    116   @param  AndData The value to AND with the read value from the I/O port.
    117 
    118   @return The value written back to the I/O port.
    119 
    120 **/
    121 UINT8
    122 EFIAPI
    123 IoAnd8 (
    124   IN      UINTN                     Port,
    125   IN      UINT8                     AndData
    126   );
    127 
    128 /**
    129   Reads an 8-bit I/O port, performs a bitwise AND followed by a bitwise
    130   OR, and writes the result back to the 8-bit I/O port.
    131 
    132   Reads the 8-bit I/O port specified by Port, performs a bitwise AND between
    133   the read result and the value specified by AndData, performs a bitwise OR
    134   between the result of the AND operation and the value specified by OrData,
    135   and writes the result to the 8-bit I/O port specified by Port. The value
    136   written to the I/O port is returned. This function must guarantee that all
    137   I/O read and write operations are serialized.
    138 
    139   If 8-bit I/O port operations are not supported, then ASSERT().
    140 
    141   @param  Port    The I/O port to write.
    142   @param  AndData The value to AND with the read value from the I/O port.
    143   @param  OrData  The value to OR with the result of the AND operation.
    144 
    145   @return The value written back to the I/O port.
    146 
    147 **/
    148 UINT8
    149 EFIAPI
    150 IoAndThenOr8 (
    151   IN      UINTN                     Port,
    152   IN      UINT8                     AndData,
    153   IN      UINT8                     OrData
    154   );
    155 
    156 /**
    157   Reads a bit field of an I/O register.
    158 
    159   Reads the bit field in an 8-bit I/O register. The bit field is specified by
    160   the StartBit and the EndBit. The value of the bit field is returned.
    161 
    162   If 8-bit I/O port operations are not supported, then ASSERT().
    163   If StartBit is greater than 7, then ASSERT().
    164   If EndBit is greater than 7, then ASSERT().
    165   If EndBit is less than StartBit, then ASSERT().
    166 
    167   @param  Port      The I/O port to read.
    168   @param  StartBit  The ordinal of the least significant bit in the bit field.
    169                     Range 0..7.
    170   @param  EndBit    The ordinal of the most significant bit in the bit field.
    171                     Range 0..7.
    172 
    173   @return The value read.
    174 
    175 **/
    176 UINT8
    177 EFIAPI
    178 IoBitFieldRead8 (
    179   IN      UINTN                     Port,
    180   IN      UINTN                     StartBit,
    181   IN      UINTN                     EndBit
    182   );
    183 
    184 /**
    185   Writes a bit field to an I/O register.
    186 
    187   Writes Value to the bit field of the I/O register. The bit field is specified
    188   by the StartBit and the EndBit. All other bits in the destination I/O
    189   register are preserved. The value written to the I/O port is returned.
    190 
    191   If 8-bit I/O port operations are not supported, then ASSERT().
    192   If StartBit is greater than 7, then ASSERT().
    193   If EndBit is greater than 7, then ASSERT().
    194   If EndBit is less than StartBit, then ASSERT().
    195   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
    196 
    197   @param  Port      The I/O port to write.
    198   @param  StartBit  The ordinal of the least significant bit in the bit field.
    199                     Range 0..7.
    200   @param  EndBit    The ordinal of the most significant bit in the bit field.
    201                     Range 0..7.
    202   @param  Value     New value of the bit field.
    203 
    204   @return The value written back to the I/O port.
    205 
    206 **/
    207 UINT8
    208 EFIAPI
    209 IoBitFieldWrite8 (
    210   IN      UINTN                     Port,
    211   IN      UINTN                     StartBit,
    212   IN      UINTN                     EndBit,
    213   IN      UINT8                     Value
    214   );
    215 
    216 /**
    217   Reads a bit field in an 8-bit port, performs a bitwise OR, and writes the
    218   result back to the bit field in the 8-bit port.
    219 
    220   Reads the 8-bit I/O port specified by Port, performs a bitwise OR
    221   between the read result and the value specified by OrData, and writes the
    222   result to the 8-bit I/O port specified by Port. The value written to the I/O
    223   port is returned. This function must guarantee that all I/O read and write
    224   operations are serialized. Extra left bits in OrData are stripped.
    225 
    226   If 8-bit I/O port operations are not supported, then ASSERT().
    227   If StartBit is greater than 7, then ASSERT().
    228   If EndBit is greater than 7, then ASSERT().
    229   If EndBit is less than StartBit, then ASSERT().
    230   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
    231 
    232   @param  Port      The I/O port to write.
    233   @param  StartBit  The ordinal of the least significant bit in the bit field.
    234                     Range 0..7.
    235   @param  EndBit    The ordinal of the most significant bit in the bit field.
    236                     Range 0..7.
    237   @param  OrData    The value to OR with the read value from the I/O port.
    238 
    239   @return The value written back to the I/O port.
    240 
    241 **/
    242 UINT8
    243 EFIAPI
    244 IoBitFieldOr8 (
    245   IN      UINTN                     Port,
    246   IN      UINTN                     StartBit,
    247   IN      UINTN                     EndBit,
    248   IN      UINT8                     OrData
    249   );
    250 
    251 /**
    252   Reads a bit field in an 8-bit port, performs a bitwise AND, and writes the
    253   result back to the bit field in the 8-bit port.
    254 
    255   Reads the 8-bit I/O port specified by Port, performs a bitwise AND between
    256   the read result and the value specified by AndData, and writes the result to
    257   the 8-bit I/O port specified by Port. The value written to the I/O port is
    258   returned. This function must guarantee that all I/O read and write operations
    259   are serialized. Extra left bits in AndData are stripped.
    260 
    261   If 8-bit I/O port operations are not supported, then ASSERT().
    262   If StartBit is greater than 7, then ASSERT().
    263   If EndBit is greater than 7, then ASSERT().
    264   If EndBit is less than StartBit, then ASSERT().
    265   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
    266 
    267   @param  Port      The I/O port to write.
    268   @param  StartBit  The ordinal of the least significant bit in the bit field.
    269                     Range 0..7.
    270   @param  EndBit    The ordinal of the most significant bit in the bit field.
    271                     Range 0..7.
    272   @param  AndData   The value to AND with the read value from the I/O port.
    273 
    274   @return The value written back to the I/O port.
    275 
    276 **/
    277 UINT8
    278 EFIAPI
    279 IoBitFieldAnd8 (
    280   IN      UINTN                     Port,
    281   IN      UINTN                     StartBit,
    282   IN      UINTN                     EndBit,
    283   IN      UINT8                     AndData
    284   );
    285 
    286 /**
    287   Reads a bit field in an 8-bit port, performs a bitwise AND followed by a
    288   bitwise OR, and writes the result back to the bit field in the
    289   8-bit port.
    290 
    291   Reads the 8-bit I/O port specified by Port, performs a bitwise AND followed
    292   by a bitwise OR between the read result and the value specified by
    293   AndData, and writes the result to the 8-bit I/O port specified by Port. The
    294   value written to the I/O port is returned. This function must guarantee that
    295   all I/O read and write operations are serialized. Extra left bits in both
    296   AndData and OrData are stripped.
    297 
    298   If 8-bit I/O port operations are not supported, then ASSERT().
    299   If StartBit is greater than 7, then ASSERT().
    300   If EndBit is greater than 7, then ASSERT().
    301   If EndBit is less than StartBit, then ASSERT().
    302   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
    303   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
    304 
    305   @param  Port      The I/O port to write.
    306   @param  StartBit  The ordinal of the least significant bit in the bit field.
    307                     Range 0..7.
    308   @param  EndBit    The ordinal of the most significant bit in the bit field.
    309                     Range 0..7.
    310   @param  AndData   The value to AND with the read value from the I/O port.
    311   @param  OrData    The value to OR with the result of the AND operation.
    312 
    313   @return The value written back to the I/O port.
    314 
    315 **/
    316 UINT8
    317 EFIAPI
    318 IoBitFieldAndThenOr8 (
    319   IN      UINTN                     Port,
    320   IN      UINTN                     StartBit,
    321   IN      UINTN                     EndBit,
    322   IN      UINT8                     AndData,
    323   IN      UINT8                     OrData
    324   );
    325 
    326 /**
    327   Reads a 16-bit I/O port.
    328 
    329   Reads the 16-bit I/O port specified by Port. The 16-bit read value is returned.
    330   This function must guarantee that all I/O read and write operations are
    331   serialized.
    332 
    333   If 16-bit I/O port operations are not supported, then ASSERT().
    334   If Port is not aligned on a 16-bit boundary, then ASSERT().
    335 
    336   @param  Port  The I/O port to read.
    337 
    338   @return The value read.
    339 
    340 **/
    341 UINT16
    342 EFIAPI
    343 IoRead16 (
    344   IN      UINTN                     Port
    345   );
    346 
    347 /**
    348   Writes a 16-bit I/O port.
    349 
    350   Writes the 16-bit I/O port specified by Port with the value specified by Value
    351   and returns Value. This function must guarantee that all I/O read and write
    352   operations are serialized.
    353 
    354   If 16-bit I/O port operations are not supported, then ASSERT().
    355   If Port is not aligned on a 16-bit boundary, then ASSERT().
    356 
    357   @param  Port  The I/O port to write.
    358   @param  Value The value to write to the I/O port.
    359 
    360   @return The value written the I/O port.
    361 
    362 **/
    363 UINT16
    364 EFIAPI
    365 IoWrite16 (
    366   IN      UINTN                     Port,
    367   IN      UINT16                    Value
    368   );
    369 
    370 /**
    371   Reads a 16-bit I/O port, performs a bitwise OR, and writes the
    372   result back to the 16-bit I/O port.
    373 
    374   Reads the 16-bit I/O port specified by Port, performs a bitwise OR
    375   between the read result and the value specified by OrData, and writes the
    376   result to the 16-bit I/O port specified by Port. The value written to the I/O
    377   port is returned. This function must guarantee that all I/O read and write
    378   operations are serialized.
    379 
    380   If 16-bit I/O port operations are not supported, then ASSERT().
    381   If Port is not aligned on a 16-bit boundary, then ASSERT().
    382 
    383   @param  Port    The I/O port to write.
    384   @param  OrData  The value to OR with the read value from the I/O port.
    385 
    386   @return The value written back to the I/O port.
    387 
    388 **/
    389 UINT16
    390 EFIAPI
    391 IoOr16 (
    392   IN      UINTN                     Port,
    393   IN      UINT16                    OrData
    394   );
    395 
    396 /**
    397   Reads a 16-bit I/O port, performs a bitwise AND, and writes the result back
    398   to the 16-bit I/O port.
    399 
    400   Reads the 16-bit I/O port specified by Port, performs a bitwise AND between
    401   the read result and the value specified by AndData, and writes the result to
    402   the 16-bit I/O port specified by Port. The value written to the I/O port is
    403   returned. This function must guarantee that all I/O read and write operations
    404   are serialized.
    405 
    406   If 16-bit I/O port operations are not supported, then ASSERT().
    407   If Port is not aligned on a 16-bit boundary, then ASSERT().
    408 
    409   @param  Port    The I/O port to write.
    410   @param  AndData The value to AND with the read value from the I/O port.
    411 
    412   @return The value written back to the I/O port.
    413 
    414 **/
    415 UINT16
    416 EFIAPI
    417 IoAnd16 (
    418   IN      UINTN                     Port,
    419   IN      UINT16                    AndData
    420   );
    421 
    422 /**
    423   Reads a 16-bit I/O port, performs a bitwise AND followed by a bitwise
    424   OR, and writes the result back to the 16-bit I/O port.
    425 
    426   Reads the 16-bit I/O port specified by Port, performs a bitwise AND between
    427   the read result and the value specified by AndData, performs a bitwise OR
    428   between the result of the AND operation and the value specified by OrData,
    429   and writes the result to the 16-bit I/O port specified by Port. The value
    430   written to the I/O port is returned. This function must guarantee that all
    431   I/O read and write operations are serialized.
    432 
    433   If 16-bit I/O port operations are not supported, then ASSERT().
    434   If Port is not aligned on a 16-bit boundary, then ASSERT().
    435 
    436   @param  Port    The I/O port to write.
    437   @param  AndData The value to AND with the read value from the I/O port.
    438   @param  OrData  The value to OR with the result of the AND operation.
    439 
    440   @return The value written back to the I/O port.
    441 
    442 **/
    443 UINT16
    444 EFIAPI
    445 IoAndThenOr16 (
    446   IN      UINTN                     Port,
    447   IN      UINT16                    AndData,
    448   IN      UINT16                    OrData
    449   );
    450 
    451 /**
    452   Reads a bit field of an I/O register.
    453 
    454   Reads the bit field in a 16-bit I/O register. The bit field is specified by
    455   the StartBit and the EndBit. The value of the bit field is returned.
    456 
    457   If 16-bit I/O port operations are not supported, then ASSERT().
    458   If Port is not aligned on a 16-bit boundary, then ASSERT().
    459   If StartBit is greater than 15, then ASSERT().
    460   If EndBit is greater than 15, then ASSERT().
    461   If EndBit is less than StartBit, then ASSERT().
    462 
    463   @param  Port      The I/O port to read.
    464   @param  StartBit  The ordinal of the least significant bit in the bit field.
    465                     Range 0..15.
    466   @param  EndBit    The ordinal of the most significant bit in the bit field.
    467                     Range 0..15.
    468 
    469   @return The value read.
    470 
    471 **/
    472 UINT16
    473 EFIAPI
    474 IoBitFieldRead16 (
    475   IN      UINTN                     Port,
    476   IN      UINTN                     StartBit,
    477   IN      UINTN                     EndBit
    478   );
    479 
    480 /**
    481   Writes a bit field to an I/O register.
    482 
    483   Writes Value to the bit field of the I/O register. The bit field is specified
    484   by the StartBit and the EndBit. All other bits in the destination I/O
    485   register are preserved. The value written to the I/O port is returned. Extra
    486   left bits in Value are stripped.
    487 
    488   If 16-bit I/O port operations are not supported, then ASSERT().
    489   If Port is not aligned on a 16-bit boundary, then ASSERT().
    490   If StartBit is greater than 15, then ASSERT().
    491   If EndBit is greater than 15, then ASSERT().
    492   If EndBit is less than StartBit, then ASSERT().
    493   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
    494 
    495   @param  Port      The I/O port to write.
    496   @param  StartBit  The ordinal of the least significant bit in the bit field.
    497                     Range 0..15.
    498   @param  EndBit    The ordinal of the most significant bit in the bit field.
    499                     Range 0..15.
    500   @param  Value     New value of the bit field.
    501 
    502   @return The value written back to the I/O port.
    503 
    504 **/
    505 UINT16
    506 EFIAPI
    507 IoBitFieldWrite16 (
    508   IN      UINTN                     Port,
    509   IN      UINTN                     StartBit,
    510   IN      UINTN                     EndBit,
    511   IN      UINT16                    Value
    512   );
    513 
    514 /**
    515   Reads a bit field in a 16-bit port, performs a bitwise OR, and writes the
    516   result back to the bit field in the 16-bit port.
    517 
    518   Reads the 16-bit I/O port specified by Port, performs a bitwise OR
    519   between the read result and the value specified by OrData, and writes the
    520   result to the 16-bit I/O port specified by Port. The value written to the I/O
    521   port is returned. This function must guarantee that all I/O read and write
    522   operations are serialized. Extra left bits in OrData are stripped.
    523 
    524   If 16-bit I/O port operations are not supported, then ASSERT().
    525   If Port is not aligned on a 16-bit boundary, then ASSERT().
    526   If StartBit is greater than 15, then ASSERT().
    527   If EndBit is greater than 15, then ASSERT().
    528   If EndBit is less than StartBit, then ASSERT().
    529   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
    530 
    531   @param  Port      The I/O port to write.
    532   @param  StartBit  The ordinal of the least significant bit in the bit field.
    533                     Range 0..15.
    534   @param  EndBit    The ordinal of the most significant bit in the bit field.
    535                     Range 0..15.
    536   @param  OrData    The value to OR with the read value from the I/O port.
    537 
    538   @return The value written back to the I/O port.
    539 
    540 **/
    541 UINT16
    542 EFIAPI
    543 IoBitFieldOr16 (
    544   IN      UINTN                     Port,
    545   IN      UINTN                     StartBit,
    546   IN      UINTN                     EndBit,
    547   IN      UINT16                    OrData
    548   );
    549 
    550 /**
    551   Reads a bit field in a 16-bit port, performs a bitwise AND, and writes the
    552   result back to the bit field in the 16-bit port.
    553 
    554   Reads the 16-bit I/O port specified by Port, performs a bitwise AND between
    555   the read result and the value specified by AndData, and writes the result to
    556   the 16-bit I/O port specified by Port. The value written to the I/O port is
    557   returned. This function must guarantee that all I/O read and write operations
    558   are serialized. Extra left bits in AndData are stripped.
    559 
    560   If 16-bit I/O port operations are not supported, then ASSERT().
    561   If Port is not aligned on a 16-bit boundary, then ASSERT().
    562   If StartBit is greater than 15, then ASSERT().
    563   If EndBit is greater than 15, then ASSERT().
    564   If EndBit is less than StartBit, then ASSERT().
    565   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
    566 
    567   @param  Port      The I/O port to write.
    568   @param  StartBit  The ordinal of the least significant bit in the bit field.
    569                     Range 0..15.
    570   @param  EndBit    The ordinal of the most significant bit in the bit field.
    571                     Range 0..15.
    572   @param  AndData   The value to AND with the read value from the I/O port.
    573 
    574   @return The value written back to the I/O port.
    575 
    576 **/
    577 UINT16
    578 EFIAPI
    579 IoBitFieldAnd16 (
    580   IN      UINTN                     Port,
    581   IN      UINTN                     StartBit,
    582   IN      UINTN                     EndBit,
    583   IN      UINT16                    AndData
    584   );
    585 
    586 /**
    587   Reads a bit field in a 16-bit port, performs a bitwise AND followed by a
    588   bitwise OR, and writes the result back to the bit field in the
    589   16-bit port.
    590 
    591   Reads the 16-bit I/O port specified by Port, performs a bitwise AND followed
    592   by a bitwise OR between the read result and the value specified by
    593   AndData, and writes the result to the 16-bit I/O port specified by Port. The
    594   value written to the I/O port is returned. This function must guarantee that
    595   all I/O read and write operations are serialized. Extra left bits in both
    596   AndData and OrData are stripped.
    597 
    598   If 16-bit I/O port operations are not supported, then ASSERT().
    599   If Port is not aligned on a 16-bit boundary, then ASSERT().
    600   If StartBit is greater than 15, then ASSERT().
    601   If EndBit is greater than 15, then ASSERT().
    602   If EndBit is less than StartBit, then ASSERT().
    603   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
    604   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
    605 
    606   @param  Port      The I/O port to write.
    607   @param  StartBit  The ordinal of the least significant bit in the bit field.
    608                     Range 0..15.
    609   @param  EndBit    The ordinal of the most significant bit in the bit field.
    610                     Range 0..15.
    611   @param  AndData   The value to AND with the read value from the I/O port.
    612   @param  OrData    The value to OR with the result of the AND operation.
    613 
    614   @return The value written back to the I/O port.
    615 
    616 **/
    617 UINT16
    618 EFIAPI
    619 IoBitFieldAndThenOr16 (
    620   IN      UINTN                     Port,
    621   IN      UINTN                     StartBit,
    622   IN      UINTN                     EndBit,
    623   IN      UINT16                    AndData,
    624   IN      UINT16                    OrData
    625   );
    626 
    627 /**
    628   Reads a 32-bit I/O port.
    629 
    630   Reads the 32-bit I/O port specified by Port. The 32-bit read value is returned.
    631   This function must guarantee that all I/O read and write operations are
    632   serialized.
    633 
    634   If 32-bit I/O port operations are not supported, then ASSERT().
    635   If Port is not aligned on a 32-bit boundary, then ASSERT().
    636 
    637   @param  Port  The I/O port to read.
    638 
    639   @return The value read.
    640 
    641 **/
    642 UINT32
    643 EFIAPI
    644 IoRead32 (
    645   IN      UINTN                     Port
    646   );
    647 
    648 /**
    649   Writes a 32-bit I/O port.
    650 
    651   Writes the 32-bit I/O port specified by Port with the value specified by Value
    652   and returns Value. This function must guarantee that all I/O read and write
    653   operations are serialized.
    654 
    655   If 32-bit I/O port operations are not supported, then ASSERT().
    656   If Port is not aligned on a 32-bit boundary, then ASSERT().
    657 
    658   @param  Port  The I/O port to write.
    659   @param  Value The value to write to the I/O port.
    660 
    661   @return The value written the I/O port.
    662 
    663 **/
    664 UINT32
    665 EFIAPI
    666 IoWrite32 (
    667   IN      UINTN                     Port,
    668   IN      UINT32                    Value
    669   );
    670 
    671 /**
    672   Reads a 32-bit I/O port, performs a bitwise OR, and writes the
    673   result back to the 32-bit I/O port.
    674 
    675   Reads the 32-bit I/O port specified by Port, performs a bitwise OR
    676   between the read result and the value specified by OrData, and writes the
    677   result to the 32-bit I/O port specified by Port. The value written to the I/O
    678   port is returned. This function must guarantee that all I/O read and write
    679   operations are serialized.
    680 
    681   If 32-bit I/O port operations are not supported, then ASSERT().
    682   If Port is not aligned on a 32-bit boundary, then ASSERT().
    683 
    684   @param  Port    The I/O port to write.
    685   @param  OrData  The value to OR with the read value from the I/O port.
    686 
    687   @return The value written back to the I/O port.
    688 
    689 **/
    690 UINT32
    691 EFIAPI
    692 IoOr32 (
    693   IN      UINTN                     Port,
    694   IN      UINT32                    OrData
    695   );
    696 
    697 /**
    698   Reads a 32-bit I/O port, performs a bitwise AND, and writes the result back
    699   to the 32-bit I/O port.
    700 
    701   Reads the 32-bit I/O port specified by Port, performs a bitwise AND between
    702   the read result and the value specified by AndData, and writes the result to
    703   the 32-bit I/O port specified by Port. The value written to the I/O port is
    704   returned. This function must guarantee that all I/O read and write operations
    705   are serialized.
    706 
    707   If 32-bit I/O port operations are not supported, then ASSERT().
    708   If Port is not aligned on a 32-bit boundary, then ASSERT().
    709 
    710   @param  Port    The I/O port to write.
    711   @param  AndData The value to AND with the read value from the I/O port.
    712 
    713   @return The value written back to the I/O port.
    714 
    715 **/
    716 UINT32
    717 EFIAPI
    718 IoAnd32 (
    719   IN      UINTN                     Port,
    720   IN      UINT32                    AndData
    721   );
    722 
    723 /**
    724   Reads a 32-bit I/O port, performs a bitwise AND followed by a bitwise
    725   OR, and writes the result back to the 32-bit I/O port.
    726 
    727   Reads the 32-bit I/O port specified by Port, performs a bitwise AND between
    728   the read result and the value specified by AndData, performs a bitwise OR
    729   between the result of the AND operation and the value specified by OrData,
    730   and writes the result to the 32-bit I/O port specified by Port. The value
    731   written to the I/O port is returned. This function must guarantee that all
    732   I/O read and write operations are serialized.
    733 
    734   If 32-bit I/O port operations are not supported, then ASSERT().
    735   If Port is not aligned on a 32-bit boundary, then ASSERT().
    736 
    737   @param  Port    The I/O port to write.
    738   @param  AndData The value to AND with the read value from the I/O port.
    739   @param  OrData  The value to OR with the result of the AND operation.
    740 
    741   @return The value written back to the I/O port.
    742 
    743 **/
    744 UINT32
    745 EFIAPI
    746 IoAndThenOr32 (
    747   IN      UINTN                     Port,
    748   IN      UINT32                    AndData,
    749   IN      UINT32                    OrData
    750   );
    751 
    752 /**
    753   Reads a bit field of an I/O register.
    754 
    755   Reads the bit field in a 32-bit I/O register. The bit field is specified by
    756   the StartBit and the EndBit. The value of the bit field is returned.
    757 
    758   If 32-bit I/O port operations are not supported, then ASSERT().
    759   If Port is not aligned on a 32-bit boundary, then ASSERT().
    760   If StartBit is greater than 31, then ASSERT().
    761   If EndBit is greater than 31, then ASSERT().
    762   If EndBit is less than StartBit, then ASSERT().
    763 
    764   @param  Port      The I/O port to read.
    765   @param  StartBit  The ordinal of the least significant bit in the bit field.
    766                     Range 0..31.
    767   @param  EndBit    The ordinal of the most significant bit in the bit field.
    768                     Range 0..31.
    769 
    770   @return The value read.
    771 
    772 **/
    773 UINT32
    774 EFIAPI
    775 IoBitFieldRead32 (
    776   IN      UINTN                     Port,
    777   IN      UINTN                     StartBit,
    778   IN      UINTN                     EndBit
    779   );
    780 
    781 /**
    782   Writes a bit field to an I/O register.
    783 
    784   Writes Value to the bit field of the I/O register. The bit field is specified
    785   by the StartBit and the EndBit. All other bits in the destination I/O
    786   register are preserved. The value written to the I/O port is returned. Extra
    787   left bits in Value are stripped.
    788 
    789   If 32-bit I/O port operations are not supported, then ASSERT().
    790   If Port is not aligned on a 32-bit boundary, then ASSERT().
    791   If StartBit is greater than 31, then ASSERT().
    792   If EndBit is greater than 31, then ASSERT().
    793   If EndBit is less than StartBit, then ASSERT().
    794   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
    795 
    796   @param  Port      The I/O port to write.
    797   @param  StartBit  The ordinal of the least significant bit in the bit field.
    798                     Range 0..31.
    799   @param  EndBit    The ordinal of the most significant bit in the bit field.
    800                     Range 0..31.
    801   @param  Value     New value of the bit field.
    802 
    803   @return The value written back to the I/O port.
    804 
    805 **/
    806 UINT32
    807 EFIAPI
    808 IoBitFieldWrite32 (
    809   IN      UINTN                     Port,
    810   IN      UINTN                     StartBit,
    811   IN      UINTN                     EndBit,
    812   IN      UINT32                    Value
    813   );
    814 
    815 /**
    816   Reads a bit field in a 32-bit port, performs a bitwise OR, and writes the
    817   result back to the bit field in the 32-bit port.
    818 
    819   Reads the 32-bit I/O port specified by Port, performs a bitwise OR
    820   between the read result and the value specified by OrData, and writes the
    821   result to the 32-bit I/O port specified by Port. The value written to the I/O
    822   port is returned. This function must guarantee that all I/O read and write
    823   operations are serialized. Extra left bits in OrData are stripped.
    824 
    825   If 32-bit I/O port operations are not supported, then ASSERT().
    826   If Port is not aligned on a 32-bit boundary, then ASSERT().
    827   If StartBit is greater than 31, then ASSERT().
    828   If EndBit is greater than 31, then ASSERT().
    829   If EndBit is less than StartBit, then ASSERT().
    830   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
    831 
    832   @param  Port      The I/O port to write.
    833   @param  StartBit  The ordinal of the least significant bit in the bit field.
    834                     Range 0..31.
    835   @param  EndBit    The ordinal of the most significant bit in the bit field.
    836                     Range 0..31.
    837   @param  OrData    The value to OR with the read value from the I/O port.
    838 
    839   @return The value written back to the I/O port.
    840 
    841 **/
    842 UINT32
    843 EFIAPI
    844 IoBitFieldOr32 (
    845   IN      UINTN                     Port,
    846   IN      UINTN                     StartBit,
    847   IN      UINTN                     EndBit,
    848   IN      UINT32                    OrData
    849   );
    850 
    851 /**
    852   Reads a bit field in a 32-bit port, performs a bitwise AND, and writes the
    853   result back to the bit field in the 32-bit port.
    854 
    855   Reads the 32-bit I/O port specified by Port, performs a bitwise AND between
    856   the read result and the value specified by AndData, and writes the result to
    857   the 32-bit I/O port specified by Port. The value written to the I/O port is
    858   returned. This function must guarantee that all I/O read and write operations
    859   are serialized. Extra left bits in AndData are stripped.
    860 
    861   If 32-bit I/O port operations are not supported, then ASSERT().
    862   If Port is not aligned on a 32-bit boundary, then ASSERT().
    863   If StartBit is greater than 31, then ASSERT().
    864   If EndBit is greater than 31, then ASSERT().
    865   If EndBit is less than StartBit, then ASSERT().
    866   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
    867 
    868   @param  Port      The I/O port to write.
    869   @param  StartBit  The ordinal of the least significant bit in the bit field.
    870                     Range 0..31.
    871   @param  EndBit    The ordinal of the most significant bit in the bit field.
    872                     Range 0..31.
    873   @param  AndData   The value to AND with the read value from the I/O port.
    874 
    875   @return The value written back to the I/O port.
    876 
    877 **/
    878 UINT32
    879 EFIAPI
    880 IoBitFieldAnd32 (
    881   IN      UINTN                     Port,
    882   IN      UINTN                     StartBit,
    883   IN      UINTN                     EndBit,
    884   IN      UINT32                    AndData
    885   );
    886 
    887 /**
    888   Reads a bit field in a 32-bit port, performs a bitwise AND followed by a
    889   bitwise OR, and writes the result back to the bit field in the
    890   32-bit port.
    891 
    892   Reads the 32-bit I/O port specified by Port, performs a bitwise AND followed
    893   by a bitwise OR between the read result and the value specified by
    894   AndData, and writes the result to the 32-bit I/O port specified by Port. The
    895   value written to the I/O port is returned. This function must guarantee that
    896   all I/O read and write operations are serialized. Extra left bits in both
    897   AndData and OrData are stripped.
    898 
    899   If 32-bit I/O port operations are not supported, then ASSERT().
    900   If Port is not aligned on a 32-bit boundary, then ASSERT().
    901   If StartBit is greater than 31, then ASSERT().
    902   If EndBit is greater than 31, then ASSERT().
    903   If EndBit is less than StartBit, then ASSERT().
    904   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
    905   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
    906 
    907   @param  Port      The I/O port to write.
    908   @param  StartBit  The ordinal of the least significant bit in the bit field.
    909                     Range 0..31.
    910   @param  EndBit    The ordinal of the most significant bit in the bit field.
    911                     Range 0..31.
    912   @param  AndData   The value to AND with the read value from the I/O port.
    913   @param  OrData    The value to OR with the result of the AND operation.
    914 
    915   @return The value written back to the I/O port.
    916 
    917 **/
    918 UINT32
    919 EFIAPI
    920 IoBitFieldAndThenOr32 (
    921   IN      UINTN                     Port,
    922   IN      UINTN                     StartBit,
    923   IN      UINTN                     EndBit,
    924   IN      UINT32                    AndData,
    925   IN      UINT32                    OrData
    926   );
    927 
    928 /**
    929   Reads a 64-bit I/O port.
    930 
    931   Reads the 64-bit I/O port specified by Port. The 64-bit read value is returned.
    932   This function must guarantee that all I/O read and write operations are
    933   serialized.
    934 
    935   If 64-bit I/O port operations are not supported, then ASSERT().
    936   If Port is not aligned on a 64-bit boundary, then ASSERT().
    937 
    938   @param  Port  The I/O port to read.
    939 
    940   @return The value read.
    941 
    942 **/
    943 UINT64
    944 EFIAPI
    945 IoRead64 (
    946   IN      UINTN                     Port
    947   );
    948 
    949 /**
    950   Writes a 64-bit I/O port.
    951 
    952   Writes the 64-bit I/O port specified by Port with the value specified by Value
    953   and returns Value. This function must guarantee that all I/O read and write
    954   operations are serialized.
    955 
    956   If 64-bit I/O port operations are not supported, then ASSERT().
    957   If Port is not aligned on a 64-bit boundary, then ASSERT().
    958 
    959   @param  Port  The I/O port to write.
    960   @param  Value The value to write to the I/O port.
    961 
    962   @return The value written the I/O port.
    963 
    964 **/
    965 UINT64
    966 EFIAPI
    967 IoWrite64 (
    968   IN      UINTN                     Port,
    969   IN      UINT64                    Value
    970   );
    971 
    972 /**
    973   Reads a 64-bit I/O port, performs a bitwise OR, and writes the
    974   result back to the 64-bit I/O port.
    975 
    976   Reads the 64-bit I/O port specified by Port, performs a bitwise OR
    977   between the read result and the value specified by OrData, and writes the
    978   result to the 64-bit I/O port specified by Port. The value written to the I/O
    979   port is returned. This function must guarantee that all I/O read and write
    980   operations are serialized.
    981 
    982   If 64-bit I/O port operations are not supported, then ASSERT().
    983   If Port is not aligned on a 64-bit boundary, then ASSERT().
    984 
    985   @param  Port    The I/O port to write.
    986   @param  OrData  The value to OR with the read value from the I/O port.
    987 
    988   @return The value written back to the I/O port.
    989 
    990 **/
    991 UINT64
    992 EFIAPI
    993 IoOr64 (
    994   IN      UINTN                     Port,
    995   IN      UINT64                    OrData
    996   );
    997 
    998 /**
    999   Reads a 64-bit I/O port, performs a bitwise AND, and writes the result back
   1000   to the 64-bit I/O port.
   1001 
   1002   Reads the 64-bit I/O port specified by Port, performs a bitwise AND between
   1003   the read result and the value specified by AndData, and writes the result to
   1004   the 64-bit I/O port specified by Port. The value written to the I/O port is
   1005   returned. This function must guarantee that all I/O read and write operations
   1006   are serialized.
   1007 
   1008   If 64-bit I/O port operations are not supported, then ASSERT().
   1009   If Port is not aligned on a 64-bit boundary, then ASSERT().
   1010 
   1011   @param  Port    The I/O port to write.
   1012   @param  AndData The value to AND with the read value from the I/O port.
   1013 
   1014   @return The value written back to the I/O port.
   1015 
   1016 **/
   1017 UINT64
   1018 EFIAPI
   1019 IoAnd64 (
   1020   IN      UINTN                     Port,
   1021   IN      UINT64                    AndData
   1022   );
   1023 
   1024 /**
   1025   Reads a 64-bit I/O port, performs a bitwise AND followed by a bitwise
   1026   OR, and writes the result back to the 64-bit I/O port.
   1027 
   1028   Reads the 64-bit I/O port specified by Port, performs a bitwise AND between
   1029   the read result and the value specified by AndData, performs a bitwise OR
   1030   between the result of the AND operation and the value specified by OrData,
   1031   and writes the result to the 64-bit I/O port specified by Port. The value
   1032   written to the I/O port is returned. This function must guarantee that all
   1033   I/O read and write operations are serialized.
   1034 
   1035   If 64-bit I/O port operations are not supported, then ASSERT().
   1036   If Port is not aligned on a 64-bit boundary, then ASSERT().
   1037 
   1038   @param  Port    The I/O port to write.
   1039   @param  AndData The value to AND with the read value from the I/O port.
   1040   @param  OrData  The value to OR with the result of the AND operation.
   1041 
   1042   @return The value written back to the I/O port.
   1043 
   1044 **/
   1045 UINT64
   1046 EFIAPI
   1047 IoAndThenOr64 (
   1048   IN      UINTN                     Port,
   1049   IN      UINT64                    AndData,
   1050   IN      UINT64                    OrData
   1051   );
   1052 
   1053 /**
   1054   Reads a bit field of an I/O register.
   1055 
   1056   Reads the bit field in a 64-bit I/O register. The bit field is specified by
   1057   the StartBit and the EndBit. The value of the bit field is returned.
   1058 
   1059   If 64-bit I/O port operations are not supported, then ASSERT().
   1060   If Port is not aligned on a 64-bit boundary, then ASSERT().
   1061   If StartBit is greater than 63, then ASSERT().
   1062   If EndBit is greater than 63, then ASSERT().
   1063   If EndBit is less than StartBit, then ASSERT().
   1064 
   1065   @param  Port      The I/O port to read.
   1066   @param  StartBit  The ordinal of the least significant bit in the bit field.
   1067                     Range 0..63.
   1068   @param  EndBit    The ordinal of the most significant bit in the bit field.
   1069                     Range 0..63.
   1070 
   1071   @return The value read.
   1072 
   1073 **/
   1074 UINT64
   1075 EFIAPI
   1076 IoBitFieldRead64 (
   1077   IN      UINTN                     Port,
   1078   IN      UINTN                     StartBit,
   1079   IN      UINTN                     EndBit
   1080   );
   1081 
   1082 /**
   1083   Writes a bit field to an I/O register.
   1084 
   1085   Writes Value to the bit field of the I/O register. The bit field is specified
   1086   by the StartBit and the EndBit. All other bits in the destination I/O
   1087   register are preserved. The value written to the I/O port is returned. Extra
   1088   left bits in Value are stripped.
   1089 
   1090   If 64-bit I/O port operations are not supported, then ASSERT().
   1091   If Port is not aligned on a 64-bit boundary, then ASSERT().
   1092   If StartBit is greater than 63, then ASSERT().
   1093   If EndBit is greater than 63, then ASSERT().
   1094   If EndBit is less than StartBit, then ASSERT().
   1095   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   1096 
   1097   @param  Port      The I/O port to write.
   1098   @param  StartBit  The ordinal of the least significant bit in the bit field.
   1099                     Range 0..63.
   1100   @param  EndBit    The ordinal of the most significant bit in the bit field.
   1101                     Range 0..63.
   1102   @param  Value     New value of the bit field.
   1103 
   1104   @return The value written back to the I/O port.
   1105 
   1106 **/
   1107 UINT64
   1108 EFIAPI
   1109 IoBitFieldWrite64 (
   1110   IN      UINTN                     Port,
   1111   IN      UINTN                     StartBit,
   1112   IN      UINTN                     EndBit,
   1113   IN      UINT64                    Value
   1114   );
   1115 
   1116 /**
   1117   Reads a bit field in a 64-bit port, performs a bitwise OR, and writes the
   1118   result back to the bit field in the 64-bit port.
   1119 
   1120   Reads the 64-bit I/O port specified by Port, performs a bitwise OR
   1121   between the read result and the value specified by OrData, and writes the
   1122   result to the 64-bit I/O port specified by Port. The value written to the I/O
   1123   port is returned. This function must guarantee that all I/O read and write
   1124   operations are serialized. Extra left bits in OrData are stripped.
   1125 
   1126   If 64-bit I/O port operations are not supported, then ASSERT().
   1127   If Port is not aligned on a 64-bit boundary, then ASSERT().
   1128   If StartBit is greater than 63, then ASSERT().
   1129   If EndBit is greater than 63, then ASSERT().
   1130   If EndBit is less than StartBit, then ASSERT().
   1131   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   1132 
   1133   @param  Port      The I/O port to write.
   1134   @param  StartBit  The ordinal of the least significant bit in the bit field.
   1135                     Range 0..63.
   1136   @param  EndBit    The ordinal of the most significant bit in the bit field.
   1137                     Range 0..63.
   1138   @param  OrData    The value to OR with the read value from the I/O port.
   1139 
   1140   @return The value written back to the I/O port.
   1141 
   1142 **/
   1143 UINT64
   1144 EFIAPI
   1145 IoBitFieldOr64 (
   1146   IN      UINTN                     Port,
   1147   IN      UINTN                     StartBit,
   1148   IN      UINTN                     EndBit,
   1149   IN      UINT64                    OrData
   1150   );
   1151 
   1152 /**
   1153   Reads a bit field in a 64-bit port, performs a bitwise AND, and writes the
   1154   result back to the bit field in the 64-bit port.
   1155 
   1156   Reads the 64-bit I/O port specified by Port, performs a bitwise AND between
   1157   the read result and the value specified by AndData, and writes the result to
   1158   the 64-bit I/O port specified by Port. The value written to the I/O port is
   1159   returned. This function must guarantee that all I/O read and write operations
   1160   are serialized. Extra left bits in AndData are stripped.
   1161 
   1162   If 64-bit I/O port operations are not supported, then ASSERT().
   1163   If Port is not aligned on a 64-bit boundary, then ASSERT().
   1164   If StartBit is greater than 63, then ASSERT().
   1165   If EndBit is greater than 63, then ASSERT().
   1166   If EndBit is less than StartBit, then ASSERT().
   1167   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   1168 
   1169   @param  Port      The I/O port to write.
   1170   @param  StartBit  The ordinal of the least significant bit in the bit field.
   1171                     Range 0..63.
   1172   @param  EndBit    The ordinal of the most significant bit in the bit field.
   1173                     Range 0..63.
   1174   @param  AndData   The value to AND with the read value from the I/O port.
   1175 
   1176   @return The value written back to the I/O port.
   1177 
   1178 **/
   1179 UINT64
   1180 EFIAPI
   1181 IoBitFieldAnd64 (
   1182   IN      UINTN                     Port,
   1183   IN      UINTN                     StartBit,
   1184   IN      UINTN                     EndBit,
   1185   IN      UINT64                    AndData
   1186   );
   1187 
   1188 /**
   1189   Reads a bit field in a 64-bit port, performs a bitwise AND followed by a
   1190   bitwise OR, and writes the result back to the bit field in the
   1191   64-bit port.
   1192 
   1193   Reads the 64-bit I/O port specified by Port, performs a bitwise AND followed
   1194   by a bitwise OR between the read result and the value specified by
   1195   AndData, and writes the result to the 64-bit I/O port specified by Port. The
   1196   value written to the I/O port is returned. This function must guarantee that
   1197   all I/O read and write operations are serialized. Extra left bits in both
   1198   AndData and OrData are stripped.
   1199 
   1200   If 64-bit I/O port operations are not supported, then ASSERT().
   1201   If Port is not aligned on a 64-bit boundary, then ASSERT().
   1202   If StartBit is greater than 63, then ASSERT().
   1203   If EndBit is greater than 63, then ASSERT().
   1204   If EndBit is less than StartBit, then ASSERT().
   1205   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   1206   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   1207 
   1208   @param  Port      The I/O port to write.
   1209   @param  StartBit  The ordinal of the least significant bit in the bit field.
   1210                     Range 0..63.
   1211   @param  EndBit    The ordinal of the most significant bit in the bit field.
   1212                     Range 0..63.
   1213   @param  AndData   The value to AND with the read value from the I/O port.
   1214   @param  OrData    The value to OR with the result of the AND operation.
   1215 
   1216   @return The value written back to the I/O port.
   1217 
   1218 **/
   1219 UINT64
   1220 EFIAPI
   1221 IoBitFieldAndThenOr64 (
   1222   IN      UINTN                     Port,
   1223   IN      UINTN                     StartBit,
   1224   IN      UINTN                     EndBit,
   1225   IN      UINT64                    AndData,
   1226   IN      UINT64                    OrData
   1227   );
   1228 
   1229 /**
   1230   Reads an 8-bit MMIO register.
   1231 
   1232   Reads the 8-bit MMIO register specified by Address. The 8-bit read value is
   1233   returned. This function must guarantee that all MMIO read and write
   1234   operations are serialized.
   1235 
   1236   If 8-bit MMIO register operations are not supported, then ASSERT().
   1237 
   1238   @param  Address The MMIO register to read.
   1239 
   1240   @return The value read.
   1241 
   1242 **/
   1243 UINT8
   1244 EFIAPI
   1245 MmioRead8 (
   1246   IN      UINTN                     Address
   1247   );
   1248 
   1249 /**
   1250   Writes an 8-bit MMIO register.
   1251 
   1252   Writes the 8-bit MMIO register specified by Address with the value specified
   1253   by Value and returns Value. This function must guarantee that all MMIO read
   1254   and write operations are serialized.
   1255 
   1256   If 8-bit MMIO register operations are not supported, then ASSERT().
   1257 
   1258   @param  Address The MMIO register to write.
   1259   @param  Value   The value to write to the MMIO register.
   1260 
   1261   @return Value.
   1262 
   1263 **/
   1264 UINT8
   1265 EFIAPI
   1266 MmioWrite8 (
   1267   IN      UINTN                     Address,
   1268   IN      UINT8                     Value
   1269   );
   1270 
   1271 /**
   1272   Reads an 8-bit MMIO register, performs a bitwise OR, and writes the
   1273   result back to the 8-bit MMIO register.
   1274 
   1275   Reads the 8-bit MMIO register specified by Address, performs a bitwise
   1276   OR between the read result and the value specified by OrData, and
   1277   writes the result to the 8-bit MMIO register specified by Address. The value
   1278   written to the MMIO register is returned. This function must guarantee that
   1279   all MMIO read and write operations are serialized.
   1280 
   1281   If 8-bit MMIO register operations are not supported, then ASSERT().
   1282 
   1283   @param  Address The MMIO register to write.
   1284   @param  OrData  The value to OR with the read value from the MMIO register.
   1285 
   1286   @return The value written back to the MMIO register.
   1287 
   1288 **/
   1289 UINT8
   1290 EFIAPI
   1291 MmioOr8 (
   1292   IN      UINTN                     Address,
   1293   IN      UINT8                     OrData
   1294   );
   1295 
   1296 /**
   1297   Reads an 8-bit MMIO register, performs a bitwise AND, and writes the result
   1298   back to the 8-bit MMIO register.
   1299 
   1300   Reads the 8-bit MMIO register specified by Address, performs a bitwise AND
   1301   between the read result and the value specified by AndData, and writes the
   1302   result to the 8-bit MMIO register specified by Address. The value written to
   1303   the MMIO register is returned. This function must guarantee that all MMIO
   1304   read and write operations are serialized.
   1305 
   1306   If 8-bit MMIO register operations are not supported, then ASSERT().
   1307 
   1308   @param  Address The MMIO register to write.
   1309   @param  AndData The value to AND with the read value from the MMIO register.
   1310 
   1311   @return The value written back to the MMIO register.
   1312 
   1313 **/
   1314 UINT8
   1315 EFIAPI
   1316 MmioAnd8 (
   1317   IN      UINTN                     Address,
   1318   IN      UINT8                     AndData
   1319   );
   1320 
   1321 /**
   1322   Reads an 8-bit MMIO register, performs a bitwise AND followed by a bitwise
   1323   OR, and writes the result back to the 8-bit MMIO register.
   1324 
   1325   Reads the 8-bit MMIO register specified by Address, performs a bitwise AND
   1326   between the read result and the value specified by AndData, performs a
   1327   bitwise OR between the result of the AND operation and the value specified by
   1328   OrData, and writes the result to the 8-bit MMIO register specified by
   1329   Address. The value written to the MMIO register is returned. This function
   1330   must guarantee that all MMIO read and write operations are serialized.
   1331 
   1332   If 8-bit MMIO register operations are not supported, then ASSERT().
   1333 
   1334 
   1335   @param  Address The MMIO register to write.
   1336   @param  AndData The value to AND with the read value from the MMIO register.
   1337   @param  OrData  The value to OR with the result of the AND operation.
   1338 
   1339   @return The value written back to the MMIO register.
   1340 
   1341 **/
   1342 UINT8
   1343 EFIAPI
   1344 MmioAndThenOr8 (
   1345   IN      UINTN                     Address,
   1346   IN      UINT8                     AndData,
   1347   IN      UINT8                     OrData
   1348   );
   1349 
   1350 /**
   1351   Reads a bit field of a MMIO register.
   1352 
   1353   Reads the bit field in an 8-bit MMIO register. The bit field is specified by
   1354   the StartBit and the EndBit. The value of the bit field is returned.
   1355 
   1356   If 8-bit MMIO register operations are not supported, then ASSERT().
   1357   If StartBit is greater than 7, then ASSERT().
   1358   If EndBit is greater than 7, then ASSERT().
   1359   If EndBit is less than StartBit, then ASSERT().
   1360 
   1361   @param  Address   MMIO register to read.
   1362   @param  StartBit  The ordinal of the least significant bit in the bit field.
   1363                     Range 0..7.
   1364   @param  EndBit    The ordinal of the most significant bit in the bit field.
   1365                     Range 0..7.
   1366 
   1367   @return The value read.
   1368 
   1369 **/
   1370 UINT8
   1371 EFIAPI
   1372 MmioBitFieldRead8 (
   1373   IN      UINTN                     Address,
   1374   IN      UINTN                     StartBit,
   1375   IN      UINTN                     EndBit
   1376   );
   1377 
   1378 /**
   1379   Writes a bit field to a MMIO register.
   1380 
   1381   Writes Value to the bit field of the MMIO register. The bit field is
   1382   specified by the StartBit and the EndBit. All other bits in the destination
   1383   MMIO register are preserved. The new value of the 8-bit register is returned.
   1384 
   1385   If 8-bit MMIO register operations are not supported, then ASSERT().
   1386   If StartBit is greater than 7, then ASSERT().
   1387   If EndBit is greater than 7, then ASSERT().
   1388   If EndBit is less than StartBit, then ASSERT().
   1389   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   1390 
   1391   @param  Address   MMIO register to write.
   1392   @param  StartBit  The ordinal of the least significant bit in the bit field.
   1393                     Range 0..7.
   1394   @param  EndBit    The ordinal of the most significant bit in the bit field.
   1395                     Range 0..7.
   1396   @param  Value     New value of the bit field.
   1397 
   1398   @return The value written back to the MMIO register.
   1399 
   1400 **/
   1401 UINT8
   1402 EFIAPI
   1403 MmioBitFieldWrite8 (
   1404   IN      UINTN                     Address,
   1405   IN      UINTN                     StartBit,
   1406   IN      UINTN                     EndBit,
   1407   IN      UINT8                     Value
   1408   );
   1409 
   1410 /**
   1411   Reads a bit field in an 8-bit MMIO register, performs a bitwise OR, and
   1412   writes the result back to the bit field in the 8-bit MMIO register.
   1413 
   1414   Reads the 8-bit MMIO register specified by Address, performs a bitwise
   1415   OR between the read result and the value specified by OrData, and
   1416   writes the result to the 8-bit MMIO register specified by Address. The value
   1417   written to the MMIO register is returned. This function must guarantee that
   1418   all MMIO read and write operations are serialized. Extra left bits in OrData
   1419   are stripped.
   1420 
   1421   If 8-bit MMIO register operations are not supported, then ASSERT().
   1422   If StartBit is greater than 7, then ASSERT().
   1423   If EndBit is greater than 7, then ASSERT().
   1424   If EndBit is less than StartBit, then ASSERT().
   1425   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   1426 
   1427   @param  Address   MMIO register to write.
   1428   @param  StartBit  The ordinal of the least significant bit in the bit field.
   1429                     Range 0..7.
   1430   @param  EndBit    The ordinal of the most significant bit in the bit field.
   1431                     Range 0..7.
   1432   @param  OrData    The value to OR with read value from the MMIO register.
   1433 
   1434   @return The value written back to the MMIO register.
   1435 
   1436 **/
   1437 UINT8
   1438 EFIAPI
   1439 MmioBitFieldOr8 (
   1440   IN      UINTN                     Address,
   1441   IN      UINTN                     StartBit,
   1442   IN      UINTN                     EndBit,
   1443   IN      UINT8                     OrData
   1444   );
   1445 
   1446 /**
   1447   Reads a bit field in an 8-bit MMIO register, performs a bitwise AND, and
   1448   writes the result back to the bit field in the 8-bit MMIO register.
   1449 
   1450   Reads the 8-bit MMIO register specified by Address, performs a bitwise AND
   1451   between the read result and the value specified by AndData, and writes the
   1452   result to the 8-bit MMIO register specified by Address. The value written to
   1453   the MMIO register is returned. This function must guarantee that all MMIO
   1454   read and write operations are serialized. Extra left bits in AndData are
   1455   stripped.
   1456 
   1457   If 8-bit MMIO register operations are not supported, then ASSERT().
   1458   If StartBit is greater than 7, then ASSERT().
   1459   If EndBit is greater than 7, then ASSERT().
   1460   If EndBit is less than StartBit, then ASSERT().
   1461   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   1462 
   1463   @param  Address   MMIO register to write.
   1464   @param  StartBit  The ordinal of the least significant bit in the bit field.
   1465                     Range 0..7.
   1466   @param  EndBit    The ordinal of the most significant bit in the bit field.
   1467                     Range 0..7.
   1468   @param  AndData   The value to AND with read value from the MMIO register.
   1469 
   1470   @return The value written back to the MMIO register.
   1471 
   1472 **/
   1473 UINT8
   1474 EFIAPI
   1475 MmioBitFieldAnd8 (
   1476   IN      UINTN                     Address,
   1477   IN      UINTN                     StartBit,
   1478   IN      UINTN                     EndBit,
   1479   IN      UINT8                     AndData
   1480   );
   1481 
   1482 /**
   1483   Reads a bit field in an 8-bit MMIO register, performs a bitwise AND followed
   1484   by a bitwise OR, and writes the result back to the bit field in the
   1485   8-bit MMIO register.
   1486 
   1487   Reads the 8-bit MMIO register specified by Address, performs a bitwise AND
   1488   followed by a bitwise OR between the read result and the value
   1489   specified by AndData, and writes the result to the 8-bit MMIO register
   1490   specified by Address. The value written to the MMIO register is returned.
   1491   This function must guarantee that all MMIO read and write operations are
   1492   serialized. Extra left bits in both AndData and OrData are stripped.
   1493 
   1494   If 8-bit MMIO register operations are not supported, then ASSERT().
   1495   If StartBit is greater than 7, then ASSERT().
   1496   If EndBit is greater than 7, then ASSERT().
   1497   If EndBit is less than StartBit, then ASSERT().
   1498   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   1499   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   1500 
   1501   @param  Address   MMIO register to write.
   1502   @param  StartBit  The ordinal of the least significant bit in the bit field.
   1503                     Range 0..7.
   1504   @param  EndBit    The ordinal of the most significant bit in the bit field.
   1505                     Range 0..7.
   1506   @param  AndData   The value to AND with read value from the MMIO register.
   1507   @param  OrData    The value to OR with the result of the AND operation.
   1508 
   1509   @return The value written back to the MMIO register.
   1510 
   1511 **/
   1512 UINT8
   1513 EFIAPI
   1514 MmioBitFieldAndThenOr8 (
   1515   IN      UINTN                     Address,
   1516   IN      UINTN                     StartBit,
   1517   IN      UINTN                     EndBit,
   1518   IN      UINT8                     AndData,
   1519   IN      UINT8                     OrData
   1520   );
   1521 
   1522 /**
   1523   Reads a 16-bit MMIO register.
   1524 
   1525   Reads the 16-bit MMIO register specified by Address. The 16-bit read value is
   1526   returned. This function must guarantee that all MMIO read and write
   1527   operations are serialized.
   1528 
   1529   If 16-bit MMIO register operations are not supported, then ASSERT().
   1530   If Address is not aligned on a 16-bit boundary, then ASSERT().
   1531 
   1532   @param  Address The MMIO register to read.
   1533 
   1534   @return The value read.
   1535 
   1536 **/
   1537 UINT16
   1538 EFIAPI
   1539 MmioRead16 (
   1540   IN      UINTN                     Address
   1541   );
   1542 
   1543 /**
   1544   Writes a 16-bit MMIO register.
   1545 
   1546   Writes the 16-bit MMIO register specified by Address with the value specified
   1547   by Value and returns Value. This function must guarantee that all MMIO read
   1548   and write operations are serialized.
   1549 
   1550   If 16-bit MMIO register operations are not supported, then ASSERT().
   1551   If Address is not aligned on a 16-bit boundary, then ASSERT().
   1552 
   1553   @param  Address The MMIO register to write.
   1554   @param  Value   The value to write to the MMIO register.
   1555 
   1556   @return Value.
   1557 
   1558 **/
   1559 UINT16
   1560 EFIAPI
   1561 MmioWrite16 (
   1562   IN      UINTN                     Address,
   1563   IN      UINT16                    Value
   1564   );
   1565 
   1566 /**
   1567   Reads a 16-bit MMIO register, performs a bitwise OR, and writes the
   1568   result back to the 16-bit MMIO register.
   1569 
   1570   Reads the 16-bit MMIO register specified by Address, performs a bitwise
   1571   OR between the read result and the value specified by OrData, and
   1572   writes the result to the 16-bit MMIO register specified by Address. The value
   1573   written to the MMIO register is returned. This function must guarantee that
   1574   all MMIO read and write operations are serialized.
   1575 
   1576   If 16-bit MMIO register operations are not supported, then ASSERT().
   1577   If Address is not aligned on a 16-bit boundary, then ASSERT().
   1578 
   1579   @param  Address The MMIO register to write.
   1580   @param  OrData  The value to OR with the read value from the MMIO register.
   1581 
   1582   @return The value written back to the MMIO register.
   1583 
   1584 **/
   1585 UINT16
   1586 EFIAPI
   1587 MmioOr16 (
   1588   IN      UINTN                     Address,
   1589   IN      UINT16                    OrData
   1590   );
   1591 
   1592 /**
   1593   Reads a 16-bit MMIO register, performs a bitwise AND, and writes the result
   1594   back to the 16-bit MMIO register.
   1595 
   1596   Reads the 16-bit MMIO register specified by Address, performs a bitwise AND
   1597   between the read result and the value specified by AndData, and writes the
   1598   result to the 16-bit MMIO register specified by Address. The value written to
   1599   the MMIO register is returned. This function must guarantee that all MMIO
   1600   read and write operations are serialized.
   1601 
   1602   If 16-bit MMIO register operations are not supported, then ASSERT().
   1603   If Address is not aligned on a 16-bit boundary, then ASSERT().
   1604 
   1605   @param  Address The MMIO register to write.
   1606   @param  AndData The value to AND with the read value from the MMIO register.
   1607 
   1608   @return The value written back to the MMIO register.
   1609 
   1610 **/
   1611 UINT16
   1612 EFIAPI
   1613 MmioAnd16 (
   1614   IN      UINTN                     Address,
   1615   IN      UINT16                    AndData
   1616   );
   1617 
   1618 /**
   1619   Reads a 16-bit MMIO register, performs a bitwise AND followed by a bitwise
   1620   OR, and writes the result back to the 16-bit MMIO register.
   1621 
   1622   Reads the 16-bit MMIO register specified by Address, performs a bitwise AND
   1623   between the read result and the value specified by AndData, performs a
   1624   bitwise OR between the result of the AND operation and the value specified by
   1625   OrData, and writes the result to the 16-bit MMIO register specified by
   1626   Address. The value written to the MMIO register is returned. This function
   1627   must guarantee that all MMIO read and write operations are serialized.
   1628 
   1629   If 16-bit MMIO register operations are not supported, then ASSERT().
   1630   If Address is not aligned on a 16-bit boundary, then ASSERT().
   1631 
   1632   @param  Address The MMIO register to write.
   1633   @param  AndData The value to AND with the read value from the MMIO register.
   1634   @param  OrData  The value to OR with the result of the AND operation.
   1635 
   1636   @return The value written back to the MMIO register.
   1637 
   1638 **/
   1639 UINT16
   1640 EFIAPI
   1641 MmioAndThenOr16 (
   1642   IN      UINTN                     Address,
   1643   IN      UINT16                    AndData,
   1644   IN      UINT16                    OrData
   1645   );
   1646 
   1647 /**
   1648   Reads a bit field of a MMIO register.
   1649 
   1650   Reads the bit field in a 16-bit MMIO register. The bit field is specified by
   1651   the StartBit and the EndBit. The value of the bit field is returned.
   1652 
   1653   If 16-bit MMIO register operations are not supported, then ASSERT().
   1654   If Address is not aligned on a 16-bit boundary, then ASSERT().
   1655   If StartBit is greater than 15, then ASSERT().
   1656   If EndBit is greater than 15, then ASSERT().
   1657   If EndBit is less than StartBit, then ASSERT().
   1658 
   1659   @param  Address   MMIO register to read.
   1660   @param  StartBit  The ordinal of the least significant bit in the bit field.
   1661                     Range 0..15.
   1662   @param  EndBit    The ordinal of the most significant bit in the bit field.
   1663                     Range 0..15.
   1664 
   1665   @return The value read.
   1666 
   1667 **/
   1668 UINT16
   1669 EFIAPI
   1670 MmioBitFieldRead16 (
   1671   IN      UINTN                     Address,
   1672   IN      UINTN                     StartBit,
   1673   IN      UINTN                     EndBit
   1674   );
   1675 
   1676 /**
   1677   Writes a bit field to a MMIO register.
   1678 
   1679   Writes Value to the bit field of the MMIO register. The bit field is
   1680   specified by the StartBit and the EndBit. All other bits in the destination
   1681   MMIO register are preserved. The new value of the 16-bit register is returned.
   1682 
   1683   If 16-bit MMIO register operations are not supported, then ASSERT().
   1684   If Address is not aligned on a 16-bit boundary, then ASSERT().
   1685   If StartBit is greater than 15, then ASSERT().
   1686   If EndBit is greater than 15, then ASSERT().
   1687   If EndBit is less than StartBit, then ASSERT().
   1688   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   1689 
   1690   @param  Address   MMIO register to write.
   1691   @param  StartBit  The ordinal of the least significant bit in the bit field.
   1692                     Range 0..15.
   1693   @param  EndBit    The ordinal of the most significant bit in the bit field.
   1694                     Range 0..15.
   1695   @param  Value     New value of the bit field.
   1696 
   1697   @return The value written back to the MMIO register.
   1698 
   1699 **/
   1700 UINT16
   1701 EFIAPI
   1702 MmioBitFieldWrite16 (
   1703   IN      UINTN                     Address,
   1704   IN      UINTN                     StartBit,
   1705   IN      UINTN                     EndBit,
   1706   IN      UINT16                    Value
   1707   );
   1708 
   1709 /**
   1710   Reads a bit field in a 16-bit MMIO register, performs a bitwise OR, and
   1711   writes the result back to the bit field in the 16-bit MMIO register.
   1712 
   1713   Reads the 16-bit MMIO register specified by Address, performs a bitwise
   1714   OR between the read result and the value specified by OrData, and
   1715   writes the result to the 16-bit MMIO register specified by Address. The value
   1716   written to the MMIO register is returned. This function must guarantee that
   1717   all MMIO read and write operations are serialized. Extra left bits in OrData
   1718   are stripped.
   1719 
   1720   If 16-bit MMIO register operations are not supported, then ASSERT().
   1721   If Address is not aligned on a 16-bit boundary, then ASSERT().
   1722   If StartBit is greater than 15, then ASSERT().
   1723   If EndBit is greater than 15, then ASSERT().
   1724   If EndBit is less than StartBit, then ASSERT().
   1725   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   1726 
   1727   @param  Address   MMIO register to write.
   1728   @param  StartBit  The ordinal of the least significant bit in the bit field.
   1729                     Range 0..15.
   1730   @param  EndBit    The ordinal of the most significant bit in the bit field.
   1731                     Range 0..15.
   1732   @param  OrData    The value to OR with read value from the MMIO register.
   1733 
   1734   @return The value written back to the MMIO register.
   1735 
   1736 **/
   1737 UINT16
   1738 EFIAPI
   1739 MmioBitFieldOr16 (
   1740   IN      UINTN                     Address,
   1741   IN      UINTN                     StartBit,
   1742   IN      UINTN                     EndBit,
   1743   IN      UINT16                    OrData
   1744   );
   1745 
   1746 /**
   1747   Reads a bit field in a 16-bit MMIO register, performs a bitwise AND, and
   1748   writes the result back to the bit field in the 16-bit MMIO register.
   1749 
   1750   Reads the 16-bit MMIO register specified by Address, performs a bitwise AND
   1751   between the read result and the value specified by AndData, and writes the
   1752   result to the 16-bit MMIO register specified by Address. The value written to
   1753   the MMIO register is returned. This function must guarantee that all MMIO
   1754   read and write operations are serialized. Extra left bits in AndData are
   1755   stripped.
   1756 
   1757   If 16-bit MMIO register operations are not supported, then ASSERT().
   1758   If Address is not aligned on a 16-bit boundary, then ASSERT().
   1759   If StartBit is greater than 15, then ASSERT().
   1760   If EndBit is greater than 15, then ASSERT().
   1761   If EndBit is less than StartBit, then ASSERT().
   1762   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   1763 
   1764   @param  Address   MMIO register to write.
   1765   @param  StartBit  The ordinal of the least significant bit in the bit field.
   1766                     Range 0..15.
   1767   @param  EndBit    The ordinal of the most significant bit in the bit field.
   1768                     Range 0..15.
   1769   @param  AndData   The value to AND with read value from the MMIO register.
   1770 
   1771   @return The value written back to the MMIO register.
   1772 
   1773 **/
   1774 UINT16
   1775 EFIAPI
   1776 MmioBitFieldAnd16 (
   1777   IN      UINTN                     Address,
   1778   IN      UINTN                     StartBit,
   1779   IN      UINTN                     EndBit,
   1780   IN      UINT16                    AndData
   1781   );
   1782 
   1783 /**
   1784   Reads a bit field in a 16-bit MMIO register, performs a bitwise AND followed
   1785   by a bitwise OR, and writes the result back to the bit field in the
   1786   16-bit MMIO register.
   1787 
   1788   Reads the 16-bit MMIO register specified by Address, performs a bitwise AND
   1789   followed by a bitwise OR between the read result and the value
   1790   specified by AndData, and writes the result to the 16-bit MMIO register
   1791   specified by Address. The value written to the MMIO register is returned.
   1792   This function must guarantee that all MMIO read and write operations are
   1793   serialized. Extra left bits in both AndData and OrData are stripped.
   1794 
   1795   If 16-bit MMIO register operations are not supported, then ASSERT().
   1796   If Address is not aligned on a 16-bit boundary, then ASSERT().
   1797   If StartBit is greater than 15, then ASSERT().
   1798   If EndBit is greater than 15, then ASSERT().
   1799   If EndBit is less than StartBit, then ASSERT().
   1800   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   1801   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   1802 
   1803   @param  Address   MMIO register to write.
   1804   @param  StartBit  The ordinal of the least significant bit in the bit field.
   1805                     Range 0..15.
   1806   @param  EndBit    The ordinal of the most significant bit in the bit field.
   1807                     Range 0..15.
   1808   @param  AndData   The value to AND with read value from the MMIO register.
   1809   @param  OrData    The value to OR with the result of the AND operation.
   1810 
   1811   @return The value written back to the MMIO register.
   1812 
   1813 **/
   1814 UINT16
   1815 EFIAPI
   1816 MmioBitFieldAndThenOr16 (
   1817   IN      UINTN                     Address,
   1818   IN      UINTN                     StartBit,
   1819   IN      UINTN                     EndBit,
   1820   IN      UINT16                    AndData,
   1821   IN      UINT16                    OrData
   1822   );
   1823 
   1824 /**
   1825   Reads a 32-bit MMIO register.
   1826 
   1827   Reads the 32-bit MMIO register specified by Address. The 32-bit read value is
   1828   returned. This function must guarantee that all MMIO read and write
   1829   operations are serialized.
   1830 
   1831   If 32-bit MMIO register operations are not supported, then ASSERT().
   1832   If Address is not aligned on a 32-bit boundary, then ASSERT().
   1833 
   1834   @param  Address The MMIO register to read.
   1835 
   1836   @return The value read.
   1837 
   1838 **/
   1839 UINT32
   1840 EFIAPI
   1841 MmioRead32 (
   1842   IN      UINTN                     Address
   1843   );
   1844 
   1845 /**
   1846   Writes a 32-bit MMIO register.
   1847 
   1848   Writes the 32-bit MMIO register specified by Address with the value specified
   1849   by Value and returns Value. This function must guarantee that all MMIO read
   1850   and write operations are serialized.
   1851 
   1852   If 32-bit MMIO register operations are not supported, then ASSERT().
   1853   If Address is not aligned on a 32-bit boundary, then ASSERT().
   1854 
   1855   @param  Address The MMIO register to write.
   1856   @param  Value   The value to write to the MMIO register.
   1857 
   1858   @return Value.
   1859 
   1860 **/
   1861 UINT32
   1862 EFIAPI
   1863 MmioWrite32 (
   1864   IN      UINTN                     Address,
   1865   IN      UINT32                    Value
   1866   );
   1867 
   1868 /**
   1869   Reads a 32-bit MMIO register, performs a bitwise OR, and writes the
   1870   result back to the 32-bit MMIO register.
   1871 
   1872   Reads the 32-bit MMIO register specified by Address, performs a bitwise
   1873   OR between the read result and the value specified by OrData, and
   1874   writes the result to the 32-bit MMIO register specified by Address. The value
   1875   written to the MMIO register is returned. This function must guarantee that
   1876   all MMIO read and write operations are serialized.
   1877 
   1878   If 32-bit MMIO register operations are not supported, then ASSERT().
   1879   If Address is not aligned on a 32-bit boundary, then ASSERT().
   1880 
   1881   @param  Address The MMIO register to write.
   1882   @param  OrData  The value to OR with the read value from the MMIO register.
   1883 
   1884   @return The value written back to the MMIO register.
   1885 
   1886 **/
   1887 UINT32
   1888 EFIAPI
   1889 MmioOr32 (
   1890   IN      UINTN                     Address,
   1891   IN      UINT32                    OrData
   1892   );
   1893 
   1894 /**
   1895   Reads a 32-bit MMIO register, performs a bitwise AND, and writes the result
   1896   back to the 32-bit MMIO register.
   1897 
   1898   Reads the 32-bit MMIO register specified by Address, performs a bitwise AND
   1899   between the read result and the value specified by AndData, and writes the
   1900   result to the 32-bit MMIO register specified by Address. The value written to
   1901   the MMIO register is returned. This function must guarantee that all MMIO
   1902   read and write operations are serialized.
   1903 
   1904   If 32-bit MMIO register operations are not supported, then ASSERT().
   1905   If Address is not aligned on a 32-bit boundary, then ASSERT().
   1906 
   1907   @param  Address The MMIO register to write.
   1908   @param  AndData The value to AND with the read value from the MMIO register.
   1909 
   1910   @return The value written back to the MMIO register.
   1911 
   1912 **/
   1913 UINT32
   1914 EFIAPI
   1915 MmioAnd32 (
   1916   IN      UINTN                     Address,
   1917   IN      UINT32                    AndData
   1918   );
   1919 
   1920 /**
   1921   Reads a 32-bit MMIO register, performs a bitwise AND followed by a bitwise
   1922   OR, and writes the result back to the 32-bit MMIO register.
   1923 
   1924   Reads the 32-bit MMIO register specified by Address, performs a bitwise AND
   1925   between the read result and the value specified by AndData, performs a
   1926   bitwise OR between the result of the AND operation and the value specified by
   1927   OrData, and writes the result to the 32-bit MMIO register specified by
   1928   Address. The value written to the MMIO register is returned. This function
   1929   must guarantee that all MMIO read and write operations are serialized.
   1930 
   1931   If 32-bit MMIO register operations are not supported, then ASSERT().
   1932   If Address is not aligned on a 32-bit boundary, then ASSERT().
   1933 
   1934   @param  Address The MMIO register to write.
   1935   @param  AndData The value to AND with the read value from the MMIO register.
   1936   @param  OrData  The value to OR with the result of the AND operation.
   1937 
   1938   @return The value written back to the MMIO register.
   1939 
   1940 **/
   1941 UINT32
   1942 EFIAPI
   1943 MmioAndThenOr32 (
   1944   IN      UINTN                     Address,
   1945   IN      UINT32                    AndData,
   1946   IN      UINT32                    OrData
   1947   );
   1948 
   1949 /**
   1950   Reads a bit field of a MMIO register.
   1951 
   1952   Reads the bit field in a 32-bit MMIO register. The bit field is specified by
   1953   the StartBit and the EndBit. The value of the bit field is returned.
   1954 
   1955   If 32-bit MMIO register operations are not supported, then ASSERT().
   1956   If Address is not aligned on a 32-bit boundary, then ASSERT().
   1957   If StartBit is greater than 31, then ASSERT().
   1958   If EndBit is greater than 31, then ASSERT().
   1959   If EndBit is less than StartBit, then ASSERT().
   1960 
   1961   @param  Address   MMIO register to read.
   1962   @param  StartBit  The ordinal of the least significant bit in the bit field.
   1963                     Range 0..31.
   1964   @param  EndBit    The ordinal of the most significant bit in the bit field.
   1965                     Range 0..31.
   1966 
   1967   @return The value read.
   1968 
   1969 **/
   1970 UINT32
   1971 EFIAPI
   1972 MmioBitFieldRead32 (
   1973   IN      UINTN                     Address,
   1974   IN      UINTN                     StartBit,
   1975   IN      UINTN                     EndBit
   1976   );
   1977 
   1978 /**
   1979   Writes a bit field to a MMIO register.
   1980 
   1981   Writes Value to the bit field of the MMIO register. The bit field is
   1982   specified by the StartBit and the EndBit. All other bits in the destination
   1983   MMIO register are preserved. The new value of the 32-bit register is returned.
   1984 
   1985   If 32-bit MMIO register operations are not supported, then ASSERT().
   1986   If Address is not aligned on a 32-bit boundary, then ASSERT().
   1987   If StartBit is greater than 31, then ASSERT().
   1988   If EndBit is greater than 31, then ASSERT().
   1989   If EndBit is less than StartBit, then ASSERT().
   1990   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   1991 
   1992   @param  Address   MMIO register to write.
   1993   @param  StartBit  The ordinal of the least significant bit in the bit field.
   1994                     Range 0..31.
   1995   @param  EndBit    The ordinal of the most significant bit in the bit field.
   1996                     Range 0..31.
   1997   @param  Value     New value of the bit field.
   1998 
   1999   @return The value written back to the MMIO register.
   2000 
   2001 **/
   2002 UINT32
   2003 EFIAPI
   2004 MmioBitFieldWrite32 (
   2005   IN      UINTN                     Address,
   2006   IN      UINTN                     StartBit,
   2007   IN      UINTN                     EndBit,
   2008   IN      UINT32                    Value
   2009   );
   2010 
   2011 /**
   2012   Reads a bit field in a 32-bit MMIO register, performs a bitwise OR, and
   2013   writes the result back to the bit field in the 32-bit MMIO register.
   2014 
   2015   Reads the 32-bit MMIO register specified by Address, performs a bitwise
   2016   OR between the read result and the value specified by OrData, and
   2017   writes the result to the 32-bit MMIO register specified by Address. The value
   2018   written to the MMIO register is returned. This function must guarantee that
   2019   all MMIO read and write operations are serialized. Extra left bits in OrData
   2020   are stripped.
   2021 
   2022   If 32-bit MMIO register operations are not supported, then ASSERT().
   2023   If Address is not aligned on a 32-bit boundary, then ASSERT().
   2024   If StartBit is greater than 31, then ASSERT().
   2025   If EndBit is greater than 31, then ASSERT().
   2026   If EndBit is less than StartBit, then ASSERT().
   2027   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   2028 
   2029   @param  Address   MMIO register to write.
   2030   @param  StartBit  The ordinal of the least significant bit in the bit field.
   2031                     Range 0..31.
   2032   @param  EndBit    The ordinal of the most significant bit in the bit field.
   2033                     Range 0..31.
   2034   @param  OrData    The value to OR with read value from the MMIO register.
   2035 
   2036   @return The value written back to the MMIO register.
   2037 
   2038 **/
   2039 UINT32
   2040 EFIAPI
   2041 MmioBitFieldOr32 (
   2042   IN      UINTN                     Address,
   2043   IN      UINTN                     StartBit,
   2044   IN      UINTN                     EndBit,
   2045   IN      UINT32                    OrData
   2046   );
   2047 
   2048 /**
   2049   Reads a bit field in a 32-bit MMIO register, performs a bitwise AND, and
   2050   writes the result back to the bit field in the 32-bit MMIO register.
   2051 
   2052   Reads the 32-bit MMIO register specified by Address, performs a bitwise AND
   2053   between the read result and the value specified by AndData, and writes the
   2054   result to the 32-bit MMIO register specified by Address. The value written to
   2055   the MMIO register is returned. This function must guarantee that all MMIO
   2056   read and write operations are serialized. Extra left bits in AndData are
   2057   stripped.
   2058 
   2059   If 32-bit MMIO register operations are not supported, then ASSERT().
   2060   If Address is not aligned on a 32-bit boundary, then ASSERT().
   2061   If StartBit is greater than 31, then ASSERT().
   2062   If EndBit is greater than 31, then ASSERT().
   2063   If EndBit is less than StartBit, then ASSERT().
   2064   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   2065 
   2066   @param  Address   MMIO register to write.
   2067   @param  StartBit  The ordinal of the least significant bit in the bit field.
   2068                     Range 0..31.
   2069   @param  EndBit    The ordinal of the most significant bit in the bit field.
   2070                     Range 0..31.
   2071   @param  AndData   The value to AND with read value from the MMIO register.
   2072 
   2073   @return The value written back to the MMIO register.
   2074 
   2075 **/
   2076 UINT32
   2077 EFIAPI
   2078 MmioBitFieldAnd32 (
   2079   IN      UINTN                     Address,
   2080   IN      UINTN                     StartBit,
   2081   IN      UINTN                     EndBit,
   2082   IN      UINT32                    AndData
   2083   );
   2084 
   2085 /**
   2086   Reads a bit field in a 32-bit MMIO register, performs a bitwise AND followed
   2087   by a bitwise OR, and writes the result back to the bit field in the
   2088   32-bit MMIO register.
   2089 
   2090   Reads the 32-bit MMIO register specified by Address, performs a bitwise AND
   2091   followed by a bitwise OR between the read result and the value
   2092   specified by AndData, and writes the result to the 32-bit MMIO register
   2093   specified by Address. The value written to the MMIO register is returned.
   2094   This function must guarantee that all MMIO read and write operations are
   2095   serialized. Extra left bits in both AndData and OrData are stripped.
   2096 
   2097   If 32-bit MMIO register operations are not supported, then ASSERT().
   2098   If Address is not aligned on a 32-bit boundary, then ASSERT().
   2099   If StartBit is greater than 31, then ASSERT().
   2100   If EndBit is greater than 31, then ASSERT().
   2101   If EndBit is less than StartBit, then ASSERT().
   2102   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   2103   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   2104 
   2105   @param  Address   MMIO register to write.
   2106   @param  StartBit  The ordinal of the least significant bit in the bit field.
   2107                     Range 0..31.
   2108   @param  EndBit    The ordinal of the most significant bit in the bit field.
   2109                     Range 0..31.
   2110   @param  AndData   The value to AND with read value from the MMIO register.
   2111   @param  OrData    The value to OR with the result of the AND operation.
   2112 
   2113   @return The value written back to the MMIO register.
   2114 
   2115 **/
   2116 UINT32
   2117 EFIAPI
   2118 MmioBitFieldAndThenOr32 (
   2119   IN      UINTN                     Address,
   2120   IN      UINTN                     StartBit,
   2121   IN      UINTN                     EndBit,
   2122   IN      UINT32                    AndData,
   2123   IN      UINT32                    OrData
   2124   );
   2125 
   2126 /**
   2127   Reads a 64-bit MMIO register.
   2128 
   2129   Reads the 64-bit MMIO register specified by Address. The 64-bit read value is
   2130   returned. This function must guarantee that all MMIO read and write
   2131   operations are serialized.
   2132 
   2133   If 64-bit MMIO register operations are not supported, then ASSERT().
   2134   If Address is not aligned on a 64-bit boundary, then ASSERT().
   2135 
   2136   @param  Address The MMIO register to read.
   2137 
   2138   @return The value read.
   2139 
   2140 **/
   2141 UINT64
   2142 EFIAPI
   2143 MmioRead64 (
   2144   IN      UINTN                     Address
   2145   );
   2146 
   2147 /**
   2148   Writes a 64-bit MMIO register.
   2149 
   2150   Writes the 64-bit MMIO register specified by Address with the value specified
   2151   by Value and returns Value. This function must guarantee that all MMIO read
   2152   and write operations are serialized.
   2153 
   2154   If 64-bit MMIO register operations are not supported, then ASSERT().
   2155   If Address is not aligned on a 64-bit boundary, then ASSERT().
   2156 
   2157   @param  Address The MMIO register to write.
   2158   @param  Value   The value to write to the MMIO register.
   2159 
   2160 **/
   2161 UINT64
   2162 EFIAPI
   2163 MmioWrite64 (
   2164   IN      UINTN                     Address,
   2165   IN      UINT64                    Value
   2166   );
   2167 
   2168 /**
   2169   Reads a 64-bit MMIO register, performs a bitwise OR, and writes the
   2170   result back to the 64-bit MMIO register.
   2171 
   2172   Reads the 64-bit MMIO register specified by Address, performs a bitwise
   2173   OR between the read result and the value specified by OrData, and
   2174   writes the result to the 64-bit MMIO register specified by Address. The value
   2175   written to the MMIO register is returned. This function must guarantee that
   2176   all MMIO read and write operations are serialized.
   2177 
   2178   If 64-bit MMIO register operations are not supported, then ASSERT().
   2179   If Address is not aligned on a 64-bit boundary, then ASSERT().
   2180 
   2181   @param  Address The MMIO register to write.
   2182   @param  OrData  The value to OR with the read value from the MMIO register.
   2183 
   2184   @return The value written back to the MMIO register.
   2185 
   2186 **/
   2187 UINT64
   2188 EFIAPI
   2189 MmioOr64 (
   2190   IN      UINTN                     Address,
   2191   IN      UINT64                    OrData
   2192   );
   2193 
   2194 /**
   2195   Reads a 64-bit MMIO register, performs a bitwise AND, and writes the result
   2196   back to the 64-bit MMIO register.
   2197 
   2198   Reads the 64-bit MMIO register specified by Address, performs a bitwise AND
   2199   between the read result and the value specified by AndData, and writes the
   2200   result to the 64-bit MMIO register specified by Address. The value written to
   2201   the MMIO register is returned. This function must guarantee that all MMIO
   2202   read and write operations are serialized.
   2203 
   2204   If 64-bit MMIO register operations are not supported, then ASSERT().
   2205   If Address is not aligned on a 64-bit boundary, then ASSERT().
   2206 
   2207   @param  Address The MMIO register to write.
   2208   @param  AndData The value to AND with the read value from the MMIO register.
   2209 
   2210   @return The value written back to the MMIO register.
   2211 
   2212 **/
   2213 UINT64
   2214 EFIAPI
   2215 MmioAnd64 (
   2216   IN      UINTN                     Address,
   2217   IN      UINT64                    AndData
   2218   );
   2219 
   2220 /**
   2221   Reads a 64-bit MMIO register, performs a bitwise AND followed by a bitwise
   2222   OR, and writes the result back to the 64-bit MMIO register.
   2223 
   2224   Reads the 64-bit MMIO register specified by Address, performs a bitwise AND
   2225   between the read result and the value specified by AndData, performs a
   2226   bitwise OR between the result of the AND operation and the value specified by
   2227   OrData, and writes the result to the 64-bit MMIO register specified by
   2228   Address. The value written to the MMIO register is returned. This function
   2229   must guarantee that all MMIO read and write operations are serialized.
   2230 
   2231   If 64-bit MMIO register operations are not supported, then ASSERT().
   2232   If Address is not aligned on a 64-bit boundary, then ASSERT().
   2233 
   2234   @param  Address The MMIO register to write.
   2235   @param  AndData The value to AND with the read value from the MMIO register.
   2236   @param  OrData  The value to OR with the result of the AND operation.
   2237 
   2238   @return The value written back to the MMIO register.
   2239 
   2240 **/
   2241 UINT64
   2242 EFIAPI
   2243 MmioAndThenOr64 (
   2244   IN      UINTN                     Address,
   2245   IN      UINT64                    AndData,
   2246   IN      UINT64                    OrData
   2247   );
   2248 
   2249 /**
   2250   Reads a bit field of a MMIO register.
   2251 
   2252   Reads the bit field in a 64-bit MMIO register. The bit field is specified by
   2253   the StartBit and the EndBit. The value of the bit field is returned.
   2254 
   2255   If 64-bit MMIO register operations are not supported, then ASSERT().
   2256   If Address is not aligned on a 64-bit boundary, then ASSERT().
   2257   If StartBit is greater than 63, then ASSERT().
   2258   If EndBit is greater than 63, then ASSERT().
   2259   If EndBit is less than StartBit, then ASSERT().
   2260 
   2261   @param  Address   MMIO register to read.
   2262   @param  StartBit  The ordinal of the least significant bit in the bit field.
   2263                     Range 0..63.
   2264   @param  EndBit    The ordinal of the most significant bit in the bit field.
   2265                     Range 0..63.
   2266 
   2267   @return The value read.
   2268 
   2269 **/
   2270 UINT64
   2271 EFIAPI
   2272 MmioBitFieldRead64 (
   2273   IN      UINTN                     Address,
   2274   IN      UINTN                     StartBit,
   2275   IN      UINTN                     EndBit
   2276   );
   2277 
   2278 /**
   2279   Writes a bit field to a MMIO register.
   2280 
   2281   Writes Value to the bit field of the MMIO register. The bit field is
   2282   specified by the StartBit and the EndBit. All other bits in the destination
   2283   MMIO register are preserved. The new value of the 64-bit register is returned.
   2284 
   2285   If 64-bit MMIO register operations are not supported, then ASSERT().
   2286   If Address is not aligned on a 64-bit boundary, then ASSERT().
   2287   If StartBit is greater than 63, then ASSERT().
   2288   If EndBit is greater than 63, then ASSERT().
   2289   If EndBit is less than StartBit, then ASSERT().
   2290   If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   2291 
   2292   @param  Address   MMIO register to write.
   2293   @param  StartBit  The ordinal of the least significant bit in the bit field.
   2294                     Range 0..63.
   2295   @param  EndBit    The ordinal of the most significant bit in the bit field.
   2296                     Range 0..63.
   2297   @param  Value     New value of the bit field.
   2298 
   2299   @return The value written back to the MMIO register.
   2300 
   2301 **/
   2302 UINT64
   2303 EFIAPI
   2304 MmioBitFieldWrite64 (
   2305   IN      UINTN                     Address,
   2306   IN      UINTN                     StartBit,
   2307   IN      UINTN                     EndBit,
   2308   IN      UINT64                    Value
   2309   );
   2310 
   2311 /**
   2312   Reads a bit field in a 64-bit MMIO register, performs a bitwise OR, and
   2313   writes the result back to the bit field in the 64-bit MMIO register.
   2314 
   2315   Reads the 64-bit MMIO register specified by Address, performs a bitwise
   2316   OR between the read result and the value specified by OrData, and
   2317   writes the result to the 64-bit MMIO register specified by Address. The value
   2318   written to the MMIO register is returned. This function must guarantee that
   2319   all MMIO read and write operations are serialized. Extra left bits in OrData
   2320   are stripped.
   2321 
   2322   If 64-bit MMIO register operations are not supported, then ASSERT().
   2323   If Address is not aligned on a 64-bit boundary, then ASSERT().
   2324   If StartBit is greater than 63, then ASSERT().
   2325   If EndBit is greater than 63, then ASSERT().
   2326   If EndBit is less than StartBit, then ASSERT().
   2327   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   2328 
   2329   @param  Address   MMIO register to write.
   2330   @param  StartBit  The ordinal of the least significant bit in the bit field.
   2331                     Range 0..63.
   2332   @param  EndBit    The ordinal of the most significant bit in the bit field.
   2333                     Range 0..63.
   2334   @param  OrData    The value to OR with read value from the MMIO register.
   2335 
   2336   @return The value written back to the MMIO register.
   2337 
   2338 **/
   2339 UINT64
   2340 EFIAPI
   2341 MmioBitFieldOr64 (
   2342   IN      UINTN                     Address,
   2343   IN      UINTN                     StartBit,
   2344   IN      UINTN                     EndBit,
   2345   IN      UINT64                    OrData
   2346   );
   2347 
   2348 /**
   2349   Reads a bit field in a 64-bit MMIO register, performs a bitwise AND, and
   2350   writes the result back to the bit field in the 64-bit MMIO register.
   2351 
   2352   Reads the 64-bit MMIO register specified by Address, performs a bitwise AND
   2353   between the read result and the value specified by AndData, and writes the
   2354   result to the 64-bit MMIO register specified by Address. The value written to
   2355   the MMIO register is returned. This function must guarantee that all MMIO
   2356   read and write operations are serialized. Extra left bits in AndData are
   2357   stripped.
   2358 
   2359   If 64-bit MMIO register operations are not supported, then ASSERT().
   2360   If Address is not aligned on a 64-bit boundary, then ASSERT().
   2361   If StartBit is greater than 63, then ASSERT().
   2362   If EndBit is greater than 63, then ASSERT().
   2363   If EndBit is less than StartBit, then ASSERT().
   2364   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   2365 
   2366   @param  Address   MMIO register to write.
   2367   @param  StartBit  The ordinal of the least significant bit in the bit field.
   2368                     Range 0..63.
   2369   @param  EndBit    The ordinal of the most significant bit in the bit field.
   2370                     Range 0..63.
   2371   @param  AndData   The value to AND with read value from the MMIO register.
   2372 
   2373   @return The value written back to the MMIO register.
   2374 
   2375 **/
   2376 UINT64
   2377 EFIAPI
   2378 MmioBitFieldAnd64 (
   2379   IN      UINTN                     Address,
   2380   IN      UINTN                     StartBit,
   2381   IN      UINTN                     EndBit,
   2382   IN      UINT64                    AndData
   2383   );
   2384 
   2385 /**
   2386   Reads a bit field in a 64-bit MMIO register, performs a bitwise AND followed
   2387   by a bitwise OR, and writes the result back to the bit field in the
   2388   64-bit MMIO register.
   2389 
   2390   Reads the 64-bit MMIO register specified by Address, performs a bitwise AND
   2391   followed by a bitwise OR between the read result and the value
   2392   specified by AndData, and writes the result to the 64-bit MMIO register
   2393   specified by Address. The value written to the MMIO register is returned.
   2394   This function must guarantee that all MMIO read and write operations are
   2395   serialized. Extra left bits in both AndData and OrData are stripped.
   2396 
   2397   If 64-bit MMIO register operations are not supported, then ASSERT().
   2398   If Address is not aligned on a 64-bit boundary, then ASSERT().
   2399   If StartBit is greater than 63, then ASSERT().
   2400   If EndBit is greater than 63, then ASSERT().
   2401   If EndBit is less than StartBit, then ASSERT().
   2402   If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   2403   If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
   2404 
   2405   @param  Address   MMIO register to write.
   2406   @param  StartBit  The ordinal of the least significant bit in the bit field.
   2407                     Range 0..63.
   2408   @param  EndBit    The ordinal of the most significant bit in the bit field.
   2409                     Range 0..63.
   2410   @param  AndData   The value to AND with read value from the MMIO register.
   2411   @param  OrData    The value to OR with the result of the AND operation.
   2412 
   2413   @return The value written back to the MMIO register.
   2414 
   2415 **/
   2416 UINT64
   2417 EFIAPI
   2418 MmioBitFieldAndThenOr64 (
   2419   IN      UINTN                     Address,
   2420   IN      UINTN                     StartBit,
   2421   IN      UINTN                     EndBit,
   2422   IN      UINT64                    AndData,
   2423   IN      UINT64                    OrData
   2424   );
   2425 
   2426 /**
   2427   Copy data from MMIO region to system memory by using 8-bit access.
   2428 
   2429   Copy data from MMIO region specified by starting address StartAddress
   2430   to system memory specified by Buffer by using 8-bit access. The total
   2431   number of byte to be copied is specified by Length. Buffer is returned.
   2432 
   2433   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
   2434   If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
   2435 
   2436 
   2437   @param  StartAddress    Starting address for the MMIO region to be copied from.
   2438   @param  Length          The size, in bytes, of Buffer.
   2439   @param  Buffer          Pointer to a system memory buffer receiving the data read.
   2440 
   2441   @return Buffer
   2442 
   2443 **/
   2444 UINT8 *
   2445 EFIAPI
   2446 MmioReadBuffer8 (
   2447   IN  UINTN       StartAddress,
   2448   IN  UINTN       Length,
   2449   OUT UINT8       *Buffer
   2450   );
   2451 
   2452 /**
   2453   Copy data from MMIO region to system memory by using 16-bit access.
   2454 
   2455   Copy data from MMIO region specified by starting address StartAddress
   2456   to system memory specified by Buffer by using 16-bit access. The total
   2457   number of byte to be copied is specified by Length. Buffer is returned.
   2458 
   2459   If StartAddress is not aligned on a 16-bit boundary, then ASSERT().
   2460 
   2461   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
   2462   If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
   2463 
   2464   If Length is not aligned on a 16-bit boundary, then ASSERT().
   2465   If Buffer is not aligned on a 16-bit boundary, then ASSERT().
   2466 
   2467   @param  StartAddress    Starting address for the MMIO region to be copied from.
   2468   @param  Length          The size, in bytes, of Buffer.
   2469   @param  Buffer          Pointer to a system memory buffer receiving the data read.
   2470 
   2471   @return Buffer
   2472 
   2473 **/
   2474 UINT16 *
   2475 EFIAPI
   2476 MmioReadBuffer16 (
   2477   IN  UINTN       StartAddress,
   2478   IN  UINTN       Length,
   2479   OUT UINT16      *Buffer
   2480   );
   2481 
   2482 /**
   2483   Copy data from MMIO region to system memory by using 32-bit access.
   2484 
   2485   Copy data from MMIO region specified by starting address StartAddress
   2486   to system memory specified by Buffer by using 32-bit access. The total
   2487   number of byte to be copied is specified by Length. Buffer is returned.
   2488 
   2489   If StartAddress is not aligned on a 32-bit boundary, then ASSERT().
   2490 
   2491   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
   2492   If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
   2493 
   2494   If Length is not aligned on a 32-bit boundary, then ASSERT().
   2495   If Buffer is not aligned on a 32-bit boundary, then ASSERT().
   2496 
   2497   @param  StartAddress    Starting address for the MMIO region to be copied from.
   2498   @param  Length          The size, in bytes, of Buffer.
   2499   @param  Buffer          Pointer to a system memory buffer receiving the data read.
   2500 
   2501   @return Buffer
   2502 
   2503 **/
   2504 UINT32 *
   2505 EFIAPI
   2506 MmioReadBuffer32 (
   2507   IN  UINTN       StartAddress,
   2508   IN  UINTN       Length,
   2509   OUT UINT32      *Buffer
   2510   );
   2511 
   2512 /**
   2513   Copy data from MMIO region to system memory by using 64-bit access.
   2514 
   2515   Copy data from MMIO region specified by starting address StartAddress
   2516   to system memory specified by Buffer by using 64-bit access. The total
   2517   number of byte to be copied is specified by Length. Buffer is returned.
   2518 
   2519   If StartAddress is not aligned on a 64-bit boundary, then ASSERT().
   2520 
   2521   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
   2522   If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
   2523 
   2524   If Length is not aligned on a 64-bit boundary, then ASSERT().
   2525   If Buffer is not aligned on a 64-bit boundary, then ASSERT().
   2526 
   2527   @param  StartAddress    Starting address for the MMIO region to be copied from.
   2528   @param  Length          The size, in bytes, of Buffer.
   2529   @param  Buffer          Pointer to a system memory buffer receiving the data read.
   2530 
   2531   @return Buffer
   2532 
   2533 **/
   2534 UINT64 *
   2535 EFIAPI
   2536 MmioReadBuffer64 (
   2537   IN  UINTN       StartAddress,
   2538   IN  UINTN       Length,
   2539   OUT UINT64      *Buffer
   2540   );
   2541 
   2542 /**
   2543   Copy data from system memory to MMIO region by using 8-bit access.
   2544 
   2545   Copy data from system memory specified by Buffer to MMIO region specified
   2546   by starting address StartAddress by using 8-bit access. The total number
   2547   of byte to be copied is specified by Length. Buffer is returned.
   2548 
   2549   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
   2550   If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().
   2551 
   2552 
   2553   @param  StartAddress    Starting address for the MMIO region to be copied to.
   2554   @param  Length          The size, in bytes, of Buffer.
   2555   @param  Buffer          Pointer to a system memory buffer containing the data to write.
   2556 
   2557   @return Buffer
   2558 
   2559 **/
   2560 UINT8 *
   2561 EFIAPI
   2562 MmioWriteBuffer8 (
   2563   IN  UINTN         StartAddress,
   2564   IN  UINTN         Length,
   2565   IN  CONST UINT8   *Buffer
   2566   );
   2567 
   2568 /**
   2569   Copy data from system memory to MMIO region by using 16-bit access.
   2570 
   2571   Copy data from system memory specified by Buffer to MMIO region specified
   2572   by starting address StartAddress by using 16-bit access. The total number
   2573   of byte to be copied is specified by Length. Buffer is returned.
   2574 
   2575   If StartAddress is not aligned on a 16-bit boundary, then ASSERT().
   2576 
   2577   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
   2578   If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().
   2579 
   2580   If Length is not aligned on a 16-bit boundary, then ASSERT().
   2581 
   2582   If Buffer is not aligned on a 16-bit boundary, then ASSERT().
   2583 
   2584   @param  StartAddress    Starting address for the MMIO region to be copied to.
   2585   @param  Length          The size, in bytes, of Buffer.
   2586   @param  Buffer          Pointer to a system memory buffer containing the data to write.
   2587 
   2588   @return Buffer
   2589 
   2590 **/
   2591 UINT16 *
   2592 EFIAPI
   2593 MmioWriteBuffer16 (
   2594   IN  UINTN        StartAddress,
   2595   IN  UINTN        Length,
   2596   IN  CONST UINT16 *Buffer
   2597   );
   2598 
   2599 /**
   2600   Copy data from system memory to MMIO region by using 32-bit access.
   2601 
   2602   Copy data from system memory specified by Buffer to MMIO region specified
   2603   by starting address StartAddress by using 32-bit access. The total number
   2604   of byte to be copied is specified by Length. Buffer is returned.
   2605 
   2606   If StartAddress is not aligned on a 32-bit boundary, then ASSERT().
   2607 
   2608   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
   2609   If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().
   2610 
   2611   If Length is not aligned on a 32-bit boundary, then ASSERT().
   2612 
   2613   If Buffer is not aligned on a 32-bit boundary, then ASSERT().
   2614 
   2615   @param  StartAddress    Starting address for the MMIO region to be copied to.
   2616   @param  Length          The size, in bytes, of Buffer.
   2617   @param  Buffer          Pointer to a system memory buffer containing the data to write.
   2618 
   2619   @return Buffer
   2620 
   2621 **/
   2622 UINT32 *
   2623 EFIAPI
   2624 MmioWriteBuffer32 (
   2625   IN  UINTN        StartAddress,
   2626   IN  UINTN        Length,
   2627   IN  CONST UINT32 *Buffer
   2628   );
   2629 
   2630 /**
   2631   Copy data from system memory to MMIO region by using 64-bit access.
   2632 
   2633   Copy data from system memory specified by Buffer to MMIO region specified
   2634   by starting address StartAddress by using 64-bit access. The total number
   2635   of byte to be copied is specified by Length. Buffer is returned.
   2636 
   2637   If StartAddress is not aligned on a 64-bit boundary, then ASSERT().
   2638 
   2639   If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT().
   2640   If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().
   2641 
   2642   If Length is not aligned on a 64-bit boundary, then ASSERT().
   2643 
   2644   If Buffer is not aligned on a 64-bit boundary, then ASSERT().
   2645 
   2646   @param  StartAddress    Starting address for the MMIO region to be copied to.
   2647   @param  Length          The size, in bytes, of Buffer.
   2648   @param  Buffer          Pointer to a system memory buffer containing the data to write.
   2649 
   2650   @return Buffer
   2651 
   2652 **/
   2653 UINT64 *
   2654 EFIAPI
   2655 MmioWriteBuffer64 (
   2656   IN  UINTN        StartAddress,
   2657   IN  UINTN        Length,
   2658   IN  CONST UINT64 *Buffer
   2659   );
   2660 
   2661 
   2662 #endif
   2663 
   2664