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