]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Include/Library/IoLib.h
Code and comments have been checked with spec.
[mirror_edk2.git] / MdePkg / Include / Library / IoLib.h
index 4e9b7f5652efe434bc1ad72e1cf5fe9564378b4a..5f544d04fba2538360017c2d5660207b61a666f6 100644 (file)
@@ -1,22 +1,35 @@
 /** @file\r
-  I/O and MMIO Library Services\r
+  Provide services to access I/O Ports and MMIO registers.\r
 \r
-  Copyright (c) 2006, Intel Corporation\r
-  All rights reserved. This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
+Copyright (c) 2006 - 2008, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
 \r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-  Module Name:  IoLib.h\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
 **/\r
 \r
 #ifndef __IO_LIB_H__\r
 #define __IO_LIB_H__\r
 \r
+/**\r
+  Macro that converts PCI Segment and I/O Port to an address that can be\r
+  passed to the I/O Library functions.\r
+  \r
+  Computes an address that is compatible with the I/O Library functions.  \r
+  The unused upper bits of Segment, and Port are stripped prior to the \r
+  generation of the address.\r
+  \r
+  @param  Segment   PCI Segment number.  Range 0..65535.\r
+  @param  Port      I/O Port number.  Range 0..65535.\r
+  \r
+  @return An address that the I/o Library functions need.\r
+\r
+**/\r
+\r
 #define IO_LIB_ADDRESS(Segment,Port) \\r
   ( ((Port) & 0xffff) | (((Segment) & 0xffff) << 16) )\r
 \r
@@ -314,6 +327,7 @@ IoBitFieldAndThenOr8 (
   serialized.\r
 \r
   If 16-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 16-bit boundary, then ASSERT().\r
 \r
   @param  Port  The I/O port to read.\r
 \r
@@ -334,7 +348,8 @@ IoRead16 (
   operations are serialized.\r
 \r
   If 16-bit I/O port operations are not supported, then ASSERT().\r
-\r
+  If Port is not aligned on a 16-bit boundary, then ASSERT().\r
+  \r
   @param  Port  The I/O port to write.\r
   @param  Value The value to write to the I/O port.\r
 \r
@@ -359,6 +374,7 @@ IoWrite16 (
   operations are serialized.\r
 \r
   If 16-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 16-bit boundary, then ASSERT().\r
 \r
   @param  Port    The I/O port to write.\r
   @param  OrData  The value to OR with the read value from the I/O port.\r
@@ -384,7 +400,8 @@ IoOr16 (
   are serialized.\r
 \r
   If 16-bit I/O port operations are not supported, then ASSERT().\r
-\r
+  If Port is not aligned on a 16-bit boundary, then ASSERT().\r
+  \r
   @param  Port    The I/O port to write.\r
   @param  AndData The value to AND with the read value from the I/O port.\r
 \r
@@ -410,7 +427,8 @@ IoAnd16 (
   I/O read and write operations are serialized.\r
 \r
   If 16-bit I/O port operations are not supported, then ASSERT().\r
-\r
+  If Port is not aligned on a 16-bit boundary, then ASSERT().\r
+  \r
   @param  Port    The I/O port to write.\r
   @param  AndData The value to AND with the read value from the I/O port.\r
   @param  OrData  The value to OR with the result of the AND operation.\r
@@ -433,6 +451,7 @@ IoAndThenOr16 (
   the StartBit and the EndBit. The value of the bit field is returned.\r
 \r
   If 16-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 16-bit boundary, then ASSERT().\r
   If StartBit is greater than 15, then ASSERT().\r
   If EndBit is greater than 15, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -463,6 +482,7 @@ IoBitFieldRead16 (
   left bits in Value are stripped.\r
 \r
   If 16-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 16-bit boundary, then ASSERT().\r
   If StartBit is greater than 15, then ASSERT().\r
   If EndBit is greater than 15, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -497,6 +517,7 @@ IoBitFieldWrite16 (
   operations are serialized. Extra left bits in OrData are stripped.\r
 \r
   If 16-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 16-bit boundary, then ASSERT().\r
   If StartBit is greater than 15, then ASSERT().\r
   If EndBit is greater than 15, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -531,6 +552,7 @@ IoBitFieldOr16 (
   are serialized. Extra left bits in AndData are stripped.\r
 \r
   If 16-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 16-bit boundary, then ASSERT().\r
   If StartBit is greater than 15, then ASSERT().\r
   If EndBit is greater than 15, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -567,6 +589,7 @@ IoBitFieldAnd16 (
   AndData and OrData are stripped.\r
 \r
   If 16-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 16-bit boundary, then ASSERT().\r
   If StartBit is greater than 15, then ASSERT().\r
   If EndBit is greater than 15, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -600,7 +623,8 @@ IoBitFieldAndThenOr16 (
   serialized.\r
 \r
   If 32-bit I/O port operations are not supported, then ASSERT().\r
-\r
+  If Port is not aligned on a 32-bit boundary, then ASSERT().\r
+  \r
   @param  Port  The I/O port to read.\r
 \r
   @return The value read.\r
@@ -620,7 +644,8 @@ IoRead32 (
   operations are serialized.\r
 \r
   If 32-bit I/O port operations are not supported, then ASSERT().\r
-\r
+  If Port is not aligned on a 32-bit boundary, then ASSERT().\r
+  \r
   @param  Port  The I/O port to write.\r
   @param  Value The value to write to the I/O port.\r
 \r
@@ -645,6 +670,7 @@ IoWrite32 (
   operations are serialized.\r
 \r
   If 32-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 32-bit boundary, then ASSERT().\r
 \r
   @param  Port    The I/O port to write.\r
   @param  OrData  The value to OR with the read value from the I/O port.\r
@@ -670,6 +696,7 @@ IoOr32 (
   are serialized.\r
 \r
   If 32-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 32-bit boundary, then ASSERT().\r
 \r
   @param  Port    The I/O port to write.\r
   @param  AndData The value to AND with the read value from the I/O port.\r
@@ -696,6 +723,7 @@ IoAnd32 (
   I/O read and write operations are serialized.\r
 \r
   If 32-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 32-bit boundary, then ASSERT().\r
 \r
   @param  Port    The I/O port to write.\r
   @param  AndData The value to AND with the read value from the I/O port.\r
@@ -719,6 +747,7 @@ IoAndThenOr32 (
   the StartBit and the EndBit. The value of the bit field is returned.\r
 \r
   If 32-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 32-bit boundary, then ASSERT().\r
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -749,6 +778,7 @@ IoBitFieldRead32 (
   left bits in Value are stripped.\r
 \r
   If 32-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 32-bit boundary, then ASSERT().\r
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -783,6 +813,7 @@ IoBitFieldWrite32 (
   operations are serialized. Extra left bits in OrData are stripped.\r
 \r
   If 32-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 32-bit boundary, then ASSERT().\r
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -817,6 +848,7 @@ IoBitFieldOr32 (
   are serialized. Extra left bits in AndData are stripped.\r
 \r
   If 32-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 32-bit boundary, then ASSERT().\r
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -853,6 +885,7 @@ IoBitFieldAnd32 (
   AndData and OrData are stripped.\r
 \r
   If 32-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 32-bit boundary, then ASSERT().\r
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -886,6 +919,7 @@ IoBitFieldAndThenOr32 (
   serialized.\r
 \r
   If 64-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 64-bit boundary, then ASSERT().\r
 \r
   @param  Port  The I/O port to read.\r
 \r
@@ -906,6 +940,7 @@ IoRead64 (
   operations are serialized.\r
 \r
   If 64-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 64-bit boundary, then ASSERT().\r
 \r
   @param  Port  The I/O port to write.\r
   @param  Value The value to write to the I/O port.\r
@@ -931,6 +966,7 @@ IoWrite64 (
   operations are serialized.\r
 \r
   If 64-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 64-bit boundary, then ASSERT().\r
 \r
   @param  Port    The I/O port to write.\r
   @param  OrData  The value to OR with the read value from the I/O port.\r
@@ -956,6 +992,7 @@ IoOr64 (
   are serialized.\r
 \r
   If 64-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 64-bit boundary, then ASSERT().\r
 \r
   @param  Port    The I/O port to write.\r
   @param  AndData The value to AND with the read value from the I/O port.\r
@@ -982,6 +1019,7 @@ IoAnd64 (
   I/O read and write operations are serialized.\r
 \r
   If 64-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 64-bit boundary, then ASSERT().\r
 \r
   @param  Port    The I/O port to write.\r
   @param  AndData The value to AND with the read value from the I/O port.\r
@@ -1005,6 +1043,7 @@ IoAndThenOr64 (
   the StartBit and the EndBit. The value of the bit field is returned.\r
 \r
   If 64-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 64-bit boundary, then ASSERT().\r
   If StartBit is greater than 63, then ASSERT().\r
   If EndBit is greater than 63, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -1035,6 +1074,7 @@ IoBitFieldRead64 (
   left bits in Value are stripped.\r
 \r
   If 64-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 64-bit boundary, then ASSERT().\r
   If StartBit is greater than 63, then ASSERT().\r
   If EndBit is greater than 63, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -1069,6 +1109,7 @@ IoBitFieldWrite64 (
   operations are serialized. Extra left bits in OrData are stripped.\r
 \r
   If 64-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 64-bit boundary, then ASSERT().\r
   If StartBit is greater than 63, then ASSERT().\r
   If EndBit is greater than 63, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -1103,6 +1144,7 @@ IoBitFieldOr64 (
   are serialized. Extra left bits in AndData are stripped.\r
 \r
   If 64-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 64-bit boundary, then ASSERT().\r
   If StartBit is greater than 63, then ASSERT().\r
   If EndBit is greater than 63, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -1139,6 +1181,7 @@ IoBitFieldAnd64 (
   AndData and OrData are stripped.\r
 \r
   If 64-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 64-bit boundary, then ASSERT().\r
   If StartBit is greater than 63, then ASSERT().\r
   If EndBit is greater than 63, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -1458,6 +1501,7 @@ MmioBitFieldAndThenOr8 (
   operations are serialized.\r
 \r
   If 16-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 16-bit boundary, then ASSERT().\r
 \r
   @param  Address The MMIO register to read.\r
 \r
@@ -1478,6 +1522,7 @@ MmioRead16 (
   and write operations are serialized.\r
 \r
   If 16-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 16-bit boundary, then ASSERT().\r
 \r
   @param  Address The MMIO register to write.\r
   @param  Value   The value to write to the MMIO register.\r
@@ -1501,6 +1546,7 @@ MmioWrite16 (
   all MMIO read and write operations are serialized.\r
 \r
   If 16-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 16-bit boundary, then ASSERT().\r
 \r
   @param  Address The MMIO register to write.\r
   @param  OrData  The value to OR with the read value from the MMIO register.\r
@@ -1526,6 +1572,7 @@ MmioOr16 (
   read and write operations are serialized.\r
 \r
   If 16-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 16-bit boundary, then ASSERT().\r
 \r
   @param  Address The MMIO register to write.\r
   @param  AndData The value to AND with the read value from the MMIO register.\r
@@ -1552,7 +1599,7 @@ MmioAnd16 (
   must guarantee that all MMIO read and write operations are serialized.\r
 \r
   If 16-bit MMIO register operations are not supported, then ASSERT().\r
-\r
+  If Address is not aligned on a 16-bit boundary, then ASSERT().\r
 \r
   @param  Address The MMIO register to write.\r
   @param  AndData The value to AND with the read value from the MMIO register.\r
@@ -1576,6 +1623,7 @@ MmioAndThenOr16 (
   the StartBit and the EndBit. The value of the bit field is returned.\r
 \r
   If 16-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 16-bit boundary, then ASSERT().\r
   If StartBit is greater than 15, then ASSERT().\r
   If EndBit is greater than 15, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -1605,6 +1653,7 @@ MmioBitFieldRead16 (
   MMIO register are preserved. The new value of the 16-bit register is returned.\r
 \r
   If 16-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 16-bit boundary, then ASSERT().\r
   If StartBit is greater than 15, then ASSERT().\r
   If EndBit is greater than 15, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -1640,6 +1689,7 @@ MmioBitFieldWrite16 (
   are stripped.\r
 \r
   If 16-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 16-bit boundary, then ASSERT().\r
   If StartBit is greater than 15, then ASSERT().\r
   If EndBit is greater than 15, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -1675,6 +1725,7 @@ MmioBitFieldOr16 (
   stripped.\r
 \r
   If 16-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 16-bit boundary, then ASSERT().\r
   If StartBit is greater than 15, then ASSERT().\r
   If EndBit is greater than 15, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -1711,6 +1762,7 @@ MmioBitFieldAnd16 (
   serialized. Extra left bits in both AndData and OrData are stripped.\r
 \r
   If 16-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 16-bit boundary, then ASSERT().\r
   If StartBit is greater than 15, then ASSERT().\r
   If EndBit is greater than 15, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -1744,6 +1796,7 @@ MmioBitFieldAndThenOr16 (
   operations are serialized.\r
 \r
   If 32-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 32-bit boundary, then ASSERT().\r
 \r
   @param  Address The MMIO register to read.\r
 \r
@@ -1764,6 +1817,7 @@ MmioRead32 (
   and write operations are serialized.\r
 \r
   If 32-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 32-bit boundary, then ASSERT().\r
 \r
   @param  Address The MMIO register to write.\r
   @param  Value   The value to write to the MMIO register.\r
@@ -1787,6 +1841,7 @@ MmioWrite32 (
   all MMIO read and write operations are serialized.\r
 \r
   If 32-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 32-bit boundary, then ASSERT().\r
 \r
   @param  Address The MMIO register to write.\r
   @param  OrData  The value to OR with the read value from the MMIO register.\r
@@ -1812,6 +1867,7 @@ MmioOr32 (
   read and write operations are serialized.\r
 \r
   If 32-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 32-bit boundary, then ASSERT().\r
 \r
   @param  Address The MMIO register to write.\r
   @param  AndData The value to AND with the read value from the MMIO register.\r
@@ -1838,7 +1894,7 @@ MmioAnd32 (
   must guarantee that all MMIO read and write operations are serialized.\r
 \r
   If 32-bit MMIO register operations are not supported, then ASSERT().\r
-\r
+  If Address is not aligned on a 32-bit boundary, then ASSERT().\r
 \r
   @param  Address The MMIO register to write.\r
   @param  AndData The value to AND with the read value from the MMIO register.\r
@@ -1862,6 +1918,7 @@ MmioAndThenOr32 (
   the StartBit and the EndBit. The value of the bit field is returned.\r
 \r
   If 32-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 32-bit boundary, then ASSERT().\r
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -1891,6 +1948,7 @@ MmioBitFieldRead32 (
   MMIO register are preserved. The new value of the 32-bit register is returned.\r
 \r
   If 32-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 32-bit boundary, then ASSERT().\r
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -1926,6 +1984,7 @@ MmioBitFieldWrite32 (
   are stripped.\r
 \r
   If 32-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 32-bit boundary, then ASSERT().\r
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -1961,6 +2020,7 @@ MmioBitFieldOr32 (
   stripped.\r
 \r
   If 32-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 32-bit boundary, then ASSERT().\r
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -1997,6 +2057,7 @@ MmioBitFieldAnd32 (
   serialized. Extra left bits in both AndData and OrData are stripped.\r
 \r
   If 32-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 32-bit boundary, then ASSERT().\r
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -2030,6 +2091,7 @@ MmioBitFieldAndThenOr32 (
   operations are serialized.\r
 \r
   If 64-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 64-bit boundary, then ASSERT().\r
 \r
   @param  Address The MMIO register to read.\r
 \r
@@ -2050,6 +2112,7 @@ MmioRead64 (
   and write operations are serialized.\r
 \r
   If 64-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 64-bit boundary, then ASSERT().\r
 \r
   @param  Address The MMIO register to write.\r
   @param  Value   The value to write to the MMIO register.\r
@@ -2073,6 +2136,7 @@ MmioWrite64 (
   all MMIO read and write operations are serialized.\r
 \r
   If 64-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 64-bit boundary, then ASSERT().\r
 \r
   @param  Address The MMIO register to write.\r
   @param  OrData  The value to OR with the read value from the MMIO register.\r
@@ -2098,6 +2162,7 @@ MmioOr64 (
   read and write operations are serialized.\r
 \r
   If 64-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 64-bit boundary, then ASSERT().\r
 \r
   @param  Address The MMIO register to write.\r
   @param  AndData The value to AND with the read value from the MMIO register.\r
@@ -2124,7 +2189,7 @@ MmioAnd64 (
   must guarantee that all MMIO read and write operations are serialized.\r
 \r
   If 64-bit MMIO register operations are not supported, then ASSERT().\r
-\r
+  If Address is not aligned on a 64-bit boundary, then ASSERT().\r
 \r
   @param  Address The MMIO register to write.\r
   @param  AndData The value to AND with the read value from the MMIO register.\r
@@ -2148,6 +2213,7 @@ MmioAndThenOr64 (
   the StartBit and the EndBit. The value of the bit field is returned.\r
 \r
   If 64-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 64-bit boundary, then ASSERT().\r
   If StartBit is greater than 63, then ASSERT().\r
   If EndBit is greater than 63, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -2177,6 +2243,7 @@ MmioBitFieldRead64 (
   MMIO register are preserved. The new value of the 64-bit register is returned.\r
 \r
   If 64-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 64-bit boundary, then ASSERT().\r
   If StartBit is greater than 63, then ASSERT().\r
   If EndBit is greater than 63, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -2212,6 +2279,7 @@ MmioBitFieldWrite64 (
   are stripped.\r
 \r
   If 64-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 64-bit boundary, then ASSERT().\r
   If StartBit is greater than 63, then ASSERT().\r
   If EndBit is greater than 63, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -2247,6 +2315,7 @@ MmioBitFieldOr64 (
   stripped.\r
 \r
   If 64-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 64-bit boundary, then ASSERT().\r
   If StartBit is greater than 63, then ASSERT().\r
   If EndBit is greater than 63, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -2283,6 +2352,7 @@ MmioBitFieldAnd64 (
   serialized. Extra left bits in both AndData and OrData are stripped.\r
 \r
   If 64-bit MMIO register operations are not supported, then ASSERT().\r
+  If Address is not aligned on a 64-bit boundary, then ASSERT().\r
   If StartBit is greater than 63, then ASSERT().\r
   If EndBit is greater than 63, then ASSERT().\r
   If EndBit is less than StartBit, then ASSERT().\r
@@ -2308,4 +2378,241 @@ MmioBitFieldAndThenOr64 (
   IN      UINT64                    OrData\r
   );\r
 \r
+/**\r
+  Copy data from MMIO region to system memory by using 8-bit access.\r
+\r
+  Copy data from MMIO region specified by starting address StartAddress \r
+  to system memory specified by Buffer by using 8-bit access. The total \r
+  number of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied from.\r
+  @param  Length          The size, in bytes, of Buffer.\r
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT8 *\r
+EFIAPI\r
+MmioReadBuffer8 (\r
+  IN  UINTN       StartAddress,\r
+  IN  UINTN       Length,\r
+  OUT UINT8       *Buffer\r
+  );\r
+\r
+/**\r
+  Copy data from MMIO region to system memory by using 16-bit access.\r
+\r
+  Copy data from MMIO region specified by starting address StartAddress \r
+  to system memory specified by Buffer by using 16-bit access. The total \r
+  number of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If StartAddress is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied from.\r
+  @param  Length          The size, in bytes, of Buffer.\r
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT16 *\r
+EFIAPI\r
+MmioReadBuffer16 (\r
+  IN  UINTN       StartAddress,\r
+  IN  UINTN       Length,\r
+  OUT UINT16      *Buffer\r
+  );\r
+\r
+/**\r
+  Copy data from MMIO region to system memory by using 32-bit access.\r
+\r
+  Copy data from MMIO region specified by starting address StartAddress \r
+  to system memory specified by Buffer by using 32-bit access. The total \r
+  number of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If StartAddress is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied from.\r
+  @param  Length          The size, in bytes, of Buffer.\r
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT32 *\r
+EFIAPI\r
+MmioReadBuffer32 (\r
+  IN  UINTN       StartAddress,\r
+  IN  UINTN       Length,\r
+  OUT UINT32      *Buffer\r
+  );\r
+\r
+/**\r
+  Copy data from MMIO region to system memory by using 64-bit access.\r
+\r
+  Copy data from MMIO region specified by starting address StartAddress \r
+  to system memory specified by Buffer by using 64-bit access. The total \r
+  number of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If StartAddress is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied from.\r
+  @param  Length          The size, in bytes, of Buffer.\r
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT64 *\r
+EFIAPI\r
+MmioReadBuffer64 (\r
+  IN  UINTN       StartAddress,\r
+  IN  UINTN       Length,\r
+  OUT UINT64      *Buffer\r
+  );\r
+\r
+/**\r
+  Copy data from system memory to MMIO region by using 8-bit access.\r
+\r
+  Copy data from system memory specified by Buffer to MMIO region specified \r
+  by starting address StartAddress by using 8-bit access. The total number \r
+  of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
+\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied to.\r
+  @param  Length          The size, in bytes, of Buffer.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Size in bytes of the copy.\r
+\r
+**/\r
+UINT8 *\r
+EFIAPI\r
+MmioWriteBuffer8 (\r
+  IN  UINTN         StartAddress,\r
+  IN  UINTN         Length,\r
+  IN  CONST UINT8   *Buffer\r
+  );\r
+\r
+/**\r
+  Copy data from system memory to MMIO region by using 16-bit access.\r
+\r
+  Copy data from system memory specified by Buffer to MMIO region specified \r
+  by starting address StartAddress by using 16-bit access. The total number \r
+  of byte to be copied is specified by Length. Length is returned.\r
+  \r
+  If StartAddress is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied to.\r
+  @param  Length          The size, in bytes, of Buffer.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Size in bytes of the copy.\r
+\r
+**/\r
+UINT16 *\r
+EFIAPI\r
+MmioWriteBuffer16 (\r
+  IN  UINTN        StartAddress,\r
+  IN  UINTN        Length,\r
+  IN  CONST UINT16 *Buffer\r
+  );\r
+\r
+/**\r
+  Copy data from system memory to MMIO region by using 32-bit access.\r
+\r
+  Copy data from system memory specified by Buffer to MMIO region specified \r
+  by starting address StartAddress by using 32-bit access. The total number \r
+  of byte to be copied is specified by Length. Length is returned.\r
+  \r
+  If StartAddress is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied to.\r
+  @param  Length          The size, in bytes, of Buffer.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Size in bytes of the copy.\r
+\r
+**/\r
+UINT32 *\r
+EFIAPI\r
+MmioWriteBuffer32 (\r
+  IN  UINTN        StartAddress,\r
+  IN  UINTN        Length,\r
+  IN  CONST UINT32 *Buffer\r
+  );\r
+\r
+/**\r
+  Copy data from system memory to MMIO region by using 64-bit access.\r
+\r
+  Copy data from system memory specified by Buffer to MMIO region specified \r
+  by starting address StartAddress by using 64-bit access. The total number \r
+  of byte to be copied is specified by Length. Length is returned.\r
+  \r
+  If StartAddress is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied to.\r
+  @param  Length          The size, in bytes, of Buffer.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Size in bytes of the copy.\r
+\r
+**/\r
+UINT64 *\r
+EFIAPI\r
+MmioWriteBuffer64 (\r
+  IN  UINTN        StartAddress,\r
+  IN  UINTN        Length,\r
+  IN  CONST UINT64 *Buffer\r
+  );\r
+\r
+\r
 #endif\r
+\r