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