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