]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Change SMM CPU I/O to SMM CPU I/O 2
authormdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 14 Jan 2010 04:20:04 +0000 (04:20 +0000)
committermdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 14 Jan 2010 04:20:04 +0000 (04:20 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9735 6f19259b-4bc3-4df7-8a09-765794883524

15 files changed:
MdePkg/Include/Pi/PiSmmCis.h
MdePkg/Include/Protocol/SmmCpuIo.h [deleted file]
MdePkg/Include/Protocol/SmmCpuIo2.h [new file with mode: 0644]
MdePkg/Library/SmmIoLibCpuIo/IoHighLevel.c [deleted file]
MdePkg/Library/SmmIoLibCpuIo/IoLib.c [deleted file]
MdePkg/Library/SmmIoLibCpuIo/IoLibMmioBuffer.c [deleted file]
MdePkg/Library/SmmIoLibCpuIo/SmmCpuIoLibInternal.h [deleted file]
MdePkg/Library/SmmIoLibCpuIo/SmmIoLibCpuIo.inf [deleted file]
MdePkg/Library/SmmIoLibSmmCpuIo2/IoHighLevel.c [new file with mode: 0644]
MdePkg/Library/SmmIoLibSmmCpuIo2/IoLib.c [new file with mode: 0644]
MdePkg/Library/SmmIoLibSmmCpuIo2/IoLibMmioBuffer.c [new file with mode: 0644]
MdePkg/Library/SmmIoLibSmmCpuIo2/SmmCpuIoLibInternal.h [new file with mode: 0644]
MdePkg/Library/SmmIoLibSmmCpuIo2/SmmIoLibSmmCpuIo2.inf [new file with mode: 0644]
MdePkg/MdePkg.dec
MdePkg/MdePkg.dsc

index 52eaea560db89d8e29807959c1e3fd044228155e..597eeb90869c2a1bdf65431178aaeddfb4d36f90 100644 (file)
@@ -2,7 +2,7 @@
   Common definitions in the Platform Initialization Specification version 1.2\r
   VOLUME 4 System Management Mode Core Interface version.\r
 \r
   Common definitions in the Platform Initialization Specification version 1.2\r
   VOLUME 4 System Management Mode Core Interface version.\r
 \r
-  Copyright (c) 2009, Intel Corporation\r
+  Copyright (c) 2009 - 2010, 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
   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
@@ -17,7 +17,7 @@
 #define _PI_SMMCIS_H_\r
 \r
 #include <Pi/PiMultiPhase.h>\r
 #define _PI_SMMCIS_H_\r
 \r
 #include <Pi/PiMultiPhase.h>\r
-#include <Protocol/SmmCpuIo.h>\r
+#include <Protocol/SmmCpuIo2.h>\r
 \r
 ///\r
 /// Note:\r
 \r
 ///\r
 /// Note:\r
@@ -280,7 +280,7 @@ struct _EFI_SMM_SYSTEM_TABLE2 {
   ///\r
   /// I/O Service\r
   ///\r
   ///\r
   /// I/O Service\r
   ///\r
-  EFI_SMM_CPU_IO_PROTOCOL              SmmIo;\r
+  EFI_SMM_CPU_IO2_PROTOCOL             SmmIo;\r
 \r
   ///\r
   /// Runtime memory services\r
 \r
   ///\r
   /// Runtime memory services\r
diff --git a/MdePkg/Include/Protocol/SmmCpuIo.h b/MdePkg/Include/Protocol/SmmCpuIo.h
deleted file mode 100644 (file)
index 3418d43..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-/** @file\r
-  SMM CPU I/O protocol as defined in the PI 1.2 specification.\r
-\r
-  This protocol provides CPU I/O and memory access within SMM.\r
-\r
-  Copyright (c) 2009, 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
-**/\r
-\r
-#ifndef _SMM_CPU_IO_H_\r
-#define _SMM_CPU_IO_H_\r
-\r
-///\r
-/// Note:\r
-///   To avoid name conflict between PI and Framework SMM spec, the following names defined\r
-///   in PI 1.2 SMM spec are renamed. These renamings are not yet in a public PI spec and errta.\r
-///\r
-///   EFI_SMM_CPU_IO    -> EFI_SMM_CPU_IO2\r
-///   EFI_SMM_IO_ACCESS -> EFI_SMM_IO_ACCESS2\r
-///\r
-\r
-#define EFI_SMM_CPU_IO_PROTOCOL_GUID \\r
-  { \\r
-    0x3242A9D8, 0xCE70, 0x4AA0, { 0x95, 0x5D, 0x5E, 0x7B, 0x14, 0x0D, 0xE4, 0xD2 } \\r
-  }\r
-\r
-typedef struct _EFI_SMM_CPU_IO_PROTOCOL  EFI_SMM_CPU_IO_PROTOCOL;\r
-\r
-///\r
-/// Width of the SMM CPU I/O operations\r
-///\r
-typedef enum {\r
-  SMM_IO_UINT8  = 0,\r
-  SMM_IO_UINT16 = 1,\r
-  SMM_IO_UINT32 = 2,\r
-  SMM_IO_UINT64 = 3\r
-} EFI_SMM_IO_WIDTH;\r
-\r
-/**\r
-  Provides the basic memory and I/O interfaces used toabstract accesses to devices.\r
-\r
-  The I/O operations are carried out exactly as requested.  The caller is responsible for any alignment \r
-  and I/O width issues that the bus, device, platform, or type of I/O might require.\r
-\r
-  @param[in]      This           The EFI_SMM_CPU_IO_PROTOCOL instance.\r
-  @param[in]      Width          Signifies the width of the I/O operations.\r
-  @param[in]      Address        The base address of the I/O operations.\r
-                                 The caller is responsible for aligning the Address if required. \r
-  @param[in]      Count          The number of I/O operations to perform.\r
-  @param[in,out]  Buffer         For read operations, the destination buffer to store the results.\r
-                                 For write operations, the source buffer from which to write data.\r
-\r
-  @retval EFI_SUCCESS            The data was read from or written to the device.\r
-  @retval EFI_UNSUPPORTED        The Address is not valid for this system.\r
-  @retval EFI_INVALID_PARAMETER  Width or Count, or both, were invalid.\r
-  @retval EFI_OUT_OF_RESOURCES   The request could not be completed due to a lack of resources.\r
-**/\r
-typedef\r
-EFI_STATUS\r
-(EFIAPI *EFI_SMM_CPU_IO2)(\r
-  IN CONST EFI_SMM_CPU_IO_PROTOCOL  *This,\r
-  IN EFI_SMM_IO_WIDTH               Width,\r
-  IN UINT64                         Address,\r
-  IN UINTN                          Count,\r
-  IN OUT VOID                       *Buffer\r
-  );\r
-\r
-typedef struct {\r
-  ///\r
-  /// This service provides the various modalities of memory and I/O read.\r
-  ///\r
-  EFI_SMM_CPU_IO2  Read;\r
-  ///\r
-  /// This service provides the various modalities of memory and I/O write.\r
-  ///\r
-  EFI_SMM_CPU_IO2  Write;\r
-} EFI_SMM_IO_ACCESS2;\r
-\r
-///\r
-/// SMM CPU I/O Protocol provides CPU I/O and memory access within SMM.\r
-///\r
-struct _EFI_SMM_CPU_IO_PROTOCOL {\r
-  EFI_SMM_IO_ACCESS2 Mem;  ///< Allows reads and writes to memory-mapped I/O space.\r
-  EFI_SMM_IO_ACCESS2 Io;   ///< Allows reads and writes to I/O space.\r
-};\r
-\r
-extern EFI_GUID gEfiSmmCpuIoProtocolGuid;\r
-\r
-#endif\r
diff --git a/MdePkg/Include/Protocol/SmmCpuIo2.h b/MdePkg/Include/Protocol/SmmCpuIo2.h
new file mode 100644 (file)
index 0000000..580a8b6
--- /dev/null
@@ -0,0 +1,105 @@
+/** @file\r
+  SMM CPU I/O 2 protocol as defined in the PI 1.2 specification.\r
+\r
+  This protocol provides CPU I/O and memory access within SMM.\r
+\r
+  Copyright (c) 2009 - 2010, 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
+**/\r
+\r
+#ifndef _SMM_CPU_IO2_H_\r
+#define _SMM_CPU_IO2_H_\r
+\r
+///\r
+/// Note:\r
+///   To avoid name conflict between PI and Framework SMM spec, the following names defined\r
+///   in PI 1.2 SMM spec are renamed.\r
+///\r
+///   *EFI_SMM_CPU_IO*    -> *EFI_SMM_CPU_IO2*\r
+///   *EFI_SMM_IO_ACCESS* -> *EFI_SMM_IO_ACCESS2*\r
+///\r
+\r
+#define EFI_SMM_CPU_IO2_PROTOCOL_GUID \\r
+  { \\r
+    0x3242A9D8, 0xCE70, 0x4AA0, { 0x95, 0x5D, 0x5E, 0x7B, 0x14, 0x0D, 0xE4, 0xD2 } \\r
+  }\r
+\r
+typedef struct _EFI_SMM_CPU_IO2_PROTOCOL  EFI_SMM_CPU_IO2_PROTOCOL;\r
+\r
+///\r
+/// Width of the SMM CPU I/O operations\r
+///\r
+typedef enum {\r
+  SMM_IO_UINT8  = 0,\r
+  SMM_IO_UINT16 = 1,\r
+  SMM_IO_UINT32 = 2,\r
+  SMM_IO_UINT64 = 3\r
+} EFI_SMM_IO_WIDTH;\r
+\r
+/**\r
+  Provides the basic memory and I/O interfaces used toabstract accesses to devices.\r
+\r
+  The I/O operations are carried out exactly as requested.  The caller is \r
+  responsible for any alignment and I/O width issues that the bus, device, \r
+  platform, or type of I/O might require.\r
+\r
+  @param[in]      This     The EFI_SMM_CPU_IO2_PROTOCOL instance.\r
+  @param[in]      Width    Signifies the width of the I/O operations.\r
+  @param[in]      Address  The base address of the I/O operations.  The caller is \r
+                           responsible for aligning the Address if required. \r
+  @param[in]      Count    The number of I/O operations to perform.\r
+  @param[in,out]  Buffer   For read operations, the destination buffer to store \r
+                           the results.  For write operations, the source buffer \r
+                           from which to write data.\r
+\r
+  @retval EFI_SUCCESS            The data was read from or written to the device.\r
+  @retval EFI_UNSUPPORTED        The Address is not valid for this system.\r
+  @retval EFI_INVALID_PARAMETER  Width or Count, or both, were invalid.\r
+  @retval EFI_OUT_OF_RESOURCES   The request could not be completed due to a lack\r
+                                 of resources.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EFI_SMM_CPU_IO2)(\r
+  IN     CONST EFI_SMM_CPU_IO2_PROTOCOL  *This,\r
+  IN     EFI_SMM_IO_WIDTH                Width,\r
+  IN     UINT64                          Address,\r
+  IN     UINTN                           Count,\r
+  IN OUT VOID                            *Buffer\r
+  );\r
+\r
+typedef struct {\r
+  ///\r
+  /// This service provides the various modalities of memory and I/O read.\r
+  ///\r
+  EFI_SMM_CPU_IO2  Read;\r
+  ///\r
+  /// This service provides the various modalities of memory and I/O write.\r
+  ///\r
+  EFI_SMM_CPU_IO2  Write;\r
+} EFI_SMM_IO_ACCESS2;\r
+\r
+///\r
+/// SMM CPU I/O Protocol provides CPU I/O and memory access within SMM.\r
+///\r
+struct _EFI_SMM_CPU_IO2_PROTOCOL {\r
+  ///\r
+  /// Allows reads and writes to memory-mapped I/O space.\r
+  ///\r
+  EFI_SMM_IO_ACCESS2 Mem;\r
+  ///\r
+  /// Allows reads and writes to I/O space.\r
+  ///\r
+  EFI_SMM_IO_ACCESS2 Io;\r
+};\r
+\r
+extern EFI_GUID gEfiSmmCpuIo2ProtocolGuid;\r
+\r
+#endif\r
diff --git a/MdePkg/Library/SmmIoLibCpuIo/IoHighLevel.c b/MdePkg/Library/SmmIoLibCpuIo/IoHighLevel.c
deleted file mode 100644 (file)
index 72ea425..0000000
+++ /dev/null
@@ -1,2275 +0,0 @@
-/** @file\r
-  High-level Io/Mmio functions.\r
-\r
-  All assertions for bit field operations are handled bit field functions in the\r
-  Base Library.\r
-\r
-  Copyright (c) 2009, Intel Corporation<BR>\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:  IoHighLevel.c\r
-\r
-  The following IoLib instances share the same version of this file:\r
-\r
-    BaseIoLibIntrinsic\r
-    DxeIoLibCpuIo\r
-    PeiIoLibCpuIo\r
-    SmmIoLibCpuIo\r
-**/\r
-\r
-\r
-#include "SmmCpuIoLibInternal.h"\r
-\r
-/**\r
-  Reads an 8-bit I/O port, performs a bitwise OR, and writes the\r
-  result back to the 8-bit I/O port.\r
-\r
-  Reads the 8-bit I/O port specified by Port, performs a bitwise OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 8-bit I/O port specified by Port. The value written to the I/O\r
-  port is returned. This function must guarantee that all I/O read and write\r
-  operations are serialized.\r
-\r
-  If 8-bit I/O port operations are not supported, 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
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoOr8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT8                     OrData\r
-  )\r
-{\r
-  return IoWrite8 (Port, (UINT8) (IoRead8 (Port) | OrData));\r
-}\r
-\r
-/**\r
-  Reads an 8-bit I/O port, performs a bitwise AND, and writes the result back\r
-  to the 8-bit I/O port.\r
-\r
-  Reads the 8-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, and writes the result to\r
-  the 8-bit I/O port specified by Port. The value written to the I/O port is\r
-  returned. This function must guarantee that all I/O read and write operations\r
-  are serialized.\r
-\r
-  If 8-bit I/O port operations are not supported, 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
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoAnd8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT8                     AndData\r
-  )\r
-{\r
-  return IoWrite8 (Port, (UINT8) (IoRead8 (Port) & AndData));\r
-}\r
-\r
-/**\r
-  Reads an 8-bit I/O port, performs a bitwise AND followed by a bitwise\r
-  inclusive OR, and writes the result back to the 8-bit I/O port.\r
-\r
-  Reads the 8-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, performs a bitwise OR\r
-  between the result of the AND operation and the value specified by OrData,\r
-  and writes the result to the 8-bit I/O port specified by Port. The value\r
-  written to the I/O port is returned. This function must guarantee that all\r
-  I/O read and write operations are serialized.\r
-\r
-  If 8-bit I/O port operations are not supported, 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
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoAndThenOr8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT8                     AndData,\r
-  IN      UINT8                     OrData\r
-  )\r
-{\r
-  return IoWrite8 (Port, (UINT8) ((IoRead8 (Port) & AndData) | OrData));\r
-}\r
-\r
-/**\r
-  Reads a bit field of an I/O register.\r
-\r
-  Reads the bit field in an 8-bit I/O register. The bit field is specified by\r
-  the StartBit and the EndBit. The value of the bit field is returned.\r
-\r
-  If 8-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoBitFieldRead8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  )\r
-{\r
-  return BitFieldRead8 (IoRead8 (Port), StartBit, EndBit);\r
-}\r
-\r
-/**\r
-  Writes a bit field to an I/O register.\r
-\r
-  Writes Value to the bit field of the I/O register. The bit field is specified\r
-  by the StartBit and the EndBit. All other bits in the destination I/O\r
-  register are preserved. The value written to the I/O port is returned. Extra\r
-  left bits in Value are stripped.\r
-\r
-  If 8-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoBitFieldWrite8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     Value\r
-  )\r
-{\r
-  return IoWrite8 (\r
-           Port,\r
-           BitFieldWrite8 (IoRead8 (Port), StartBit, EndBit, Value)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in an 8-bit port, performs a bitwise OR, and writes the\r
-  result back to the bit field in the 8-bit port.\r
-\r
-  Reads the 8-bit I/O port specified by Port, performs a bitwise OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 8-bit I/O port specified by Port. The value written to the I/O\r
-  port is returned. This function must guarantee that all I/O read and write\r
-  operations are serialized. Extra left bits in OrData are stripped.\r
-\r
-  If 8-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  OrData    The value to OR with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoBitFieldOr8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     OrData\r
-  )\r
-{\r
-  return IoWrite8 (\r
-           Port,\r
-           BitFieldOr8 (IoRead8 (Port), StartBit, EndBit, OrData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in an 8-bit port, performs a bitwise AND, and writes the\r
-  result back to the bit field in the 8-bit port.\r
-\r
-  Reads the 8-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, and writes the result to\r
-  the 8-bit I/O port specified by Port. The value written to the I/O port is\r
-  returned. This function must guarantee that all I/O read and write operations\r
-  are serialized. Extra left bits in AndData are stripped.\r
-\r
-  If 8-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  AndData   The value to AND with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoBitFieldAnd8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     AndData\r
-  )\r
-{\r
-  return IoWrite8 (\r
-           Port,\r
-           BitFieldAnd8 (IoRead8 (Port), StartBit, EndBit, AndData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in an 8-bit port, performs a bitwise AND followed by a\r
-  bitwise OR, and writes the result back to the bit field in the\r
-  8-bit port.\r
-\r
-  Reads the 8-bit I/O port specified by Port, performs a bitwise AND followed\r
-  by a bitwise OR between the read result and the value specified by\r
-  AndData, and writes the result to the 8-bit I/O port specified by Port. The\r
-  value written to the I/O port is returned. This function must guarantee that\r
-  all I/O read and write operations are serialized. Extra left bits in both\r
-  AndData and OrData are stripped.\r
-\r
-  If 8-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\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
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoBitFieldAndThenOr8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     AndData,\r
-  IN      UINT8                     OrData\r
-  )\r
-{\r
-  return IoWrite8 (\r
-           Port,\r
-           BitFieldAndThenOr8 (IoRead8 (Port), StartBit, EndBit, AndData, OrData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a 16-bit I/O port, performs a bitwise OR, and writes the\r
-  result back to the 16-bit I/O port.\r
-\r
-  Reads the 16-bit I/O port specified by Port, performs a bitwise OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 16-bit I/O port specified by Port. The value written to the I/O\r
-  port is returned. This function must guarantee that all I/O read and write\r
-  operations are serialized.\r
-\r
-  If 16-bit I/O port operations are not supported, 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
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoOr16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT16                    OrData\r
-  )\r
-{\r
-  return IoWrite16 (Port, (UINT16) (IoRead16 (Port) | OrData));\r
-}\r
-\r
-/**\r
-  Reads a 16-bit I/O port, performs a bitwise AND, and writes the result back\r
-  to the 16-bit I/O port.\r
-\r
-  Reads the 16-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, and writes the result to\r
-  the 16-bit I/O port specified by Port. The value written to the I/O port is\r
-  returned. This function must guarantee that all I/O read and write operations\r
-  are serialized.\r
-\r
-  If 16-bit I/O port operations are not supported, 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
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoAnd16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT16                    AndData\r
-  )\r
-{\r
-  return IoWrite16 (Port, (UINT16) (IoRead16 (Port) & AndData));\r
-}\r
-\r
-/**\r
-  Reads a 16-bit I/O port, performs a bitwise AND followed by a bitwise\r
-  inclusive OR, and writes the result back to the 16-bit I/O port.\r
-\r
-  Reads the 16-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, performs a bitwise OR\r
-  between the result of the AND operation and the value specified by OrData,\r
-  and writes the result to the 16-bit I/O port specified by Port. The value\r
-  written to the I/O port is returned. This function must guarantee that all\r
-  I/O read and write operations are serialized.\r
-\r
-  If 16-bit I/O port operations are not supported, 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
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoAndThenOr16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT16                    AndData,\r
-  IN      UINT16                    OrData\r
-  )\r
-{\r
-  return IoWrite16 (Port, (UINT16) ((IoRead16 (Port) & AndData) | OrData));\r
-}\r
-\r
-/**\r
-  Reads a bit field of an I/O register.\r
-\r
-  Reads the bit field in a 16-bit I/O register. The bit field is specified by\r
-  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 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
-\r
-  @param  Port      The I/O port to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoBitFieldRead16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  )\r
-{\r
-  return BitFieldRead16 (IoRead16 (Port), StartBit, EndBit);\r
-}\r
-\r
-/**\r
-  Writes a bit field to an I/O register.\r
-\r
-  Writes Value to the bit field of the I/O register. The bit field is specified\r
-  by the StartBit and the EndBit. All other bits in the destination I/O\r
-  register are preserved. The value written to the I/O port is returned. Extra\r
-  left bits in Value are stripped.\r
-\r
-  If 16-bit I/O port operations are not supported, 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
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoBitFieldWrite16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    Value\r
-  )\r
-{\r
-  return IoWrite16 (\r
-           Port,\r
-           BitFieldWrite16 (IoRead16 (Port), StartBit, EndBit, Value)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 16-bit port, performs a bitwise OR, and writes the\r
-  result back to the bit field in the 16-bit port.\r
-\r
-  Reads the 16-bit I/O port specified by Port, performs a bitwise OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 16-bit I/O port specified by Port. The value written to the I/O\r
-  port is returned. This function must guarantee that all I/O read and write\r
-  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 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
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  OrData    The value to OR with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoBitFieldOr16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    OrData\r
-  )\r
-{\r
-  return IoWrite16 (\r
-           Port,\r
-           BitFieldOr16 (IoRead16 (Port), StartBit, EndBit, OrData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 16-bit port, performs a bitwise AND, and writes the\r
-  result back to the bit field in the 16-bit port.\r
-\r
-  Reads the 16-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, and writes the result to\r
-  the 16-bit I/O port specified by Port. The value written to the I/O port is\r
-  returned. This function must guarantee that all I/O read and write operations\r
-  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 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
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  AndData   The value to AND with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoBitFieldAnd16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    AndData\r
-  )\r
-{\r
-  return IoWrite16 (\r
-           Port,\r
-           BitFieldAnd16 (IoRead16 (Port), StartBit, EndBit, AndData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 16-bit port, performs a bitwise AND followed by a\r
-  bitwise OR, and writes the result back to the bit field in the\r
-  16-bit port.\r
-\r
-  Reads the 16-bit I/O port specified by Port, performs a bitwise AND followed\r
-  by a bitwise OR between the read result and the value specified by\r
-  AndData, and writes the result to the 16-bit I/O port specified by Port. The\r
-  value written to the I/O port is returned. This function must guarantee that\r
-  all I/O read and write operations are serialized. Extra left bits in both\r
-  AndData and OrData are stripped.\r
-\r
-  If 16-bit I/O port operations are not supported, 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
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\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
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoBitFieldAndThenOr16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    AndData,\r
-  IN      UINT16                    OrData\r
-  )\r
-{\r
-  return IoWrite16 (\r
-           Port,\r
-           BitFieldAndThenOr16 (IoRead16 (Port), StartBit, EndBit, AndData, OrData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a 32-bit I/O port, performs a bitwise OR, and writes the\r
-  result back to the 32-bit I/O port.\r
-\r
-  Reads the 32-bit I/O port specified by Port, performs a bitwise OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 32-bit I/O port specified by Port. The value written to the I/O\r
-  port is returned. This function must guarantee that all I/O read and write\r
-  operations are serialized.\r
-\r
-  If 32-bit I/O port operations are not supported, 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
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoOr32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT32                    OrData\r
-  )\r
-{\r
-  return IoWrite32 (Port, IoRead32 (Port) | OrData);\r
-}\r
-\r
-/**\r
-  Reads a 32-bit I/O port, performs a bitwise AND, and writes the result back\r
-  to the 32-bit I/O port.\r
-\r
-  Reads the 32-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, and writes the result to\r
-  the 32-bit I/O port specified by Port. The value written to the I/O port is\r
-  returned. This function must guarantee that all I/O read and write operations\r
-  are serialized.\r
-\r
-  If 32-bit I/O port operations are not supported, 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
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoAnd32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT32                    AndData\r
-  )\r
-{\r
-  return IoWrite32 (Port, IoRead32 (Port) & AndData);\r
-}\r
-\r
-/**\r
-  Reads a 32-bit I/O port, performs a bitwise AND followed by a bitwise\r
-  inclusive OR, and writes the result back to the 32-bit I/O port.\r
-\r
-  Reads the 32-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, performs a bitwise OR\r
-  between the result of the AND operation and the value specified by OrData,\r
-  and writes the result to the 32-bit I/O port specified by Port. The value\r
-  written to the I/O port is returned. This function must guarantee that all\r
-  I/O read and write operations are serialized.\r
-\r
-  If 32-bit I/O port operations are not supported, 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
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoAndThenOr32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT32                    AndData,\r
-  IN      UINT32                    OrData\r
-  )\r
-{\r
-  return IoWrite32 (Port, (IoRead32 (Port) & AndData) | OrData);\r
-}\r
-\r
-/**\r
-  Reads a bit field of an I/O register.\r
-\r
-  Reads the bit field in a 32-bit I/O register. The bit field is specified by\r
-  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 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
-\r
-  @param  Port      The I/O port to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoBitFieldRead32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  )\r
-{\r
-  return BitFieldRead32 (IoRead32 (Port), StartBit, EndBit);\r
-}\r
-\r
-/**\r
-  Writes a bit field to an I/O register.\r
-\r
-  Writes Value to the bit field of the I/O register. The bit field is specified\r
-  by the StartBit and the EndBit. All other bits in the destination I/O\r
-  register are preserved. The value written to the I/O port is returned. Extra\r
-  left bits in Value are stripped.\r
-\r
-  If 32-bit I/O port operations are not supported, 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
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoBitFieldWrite32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    Value\r
-  )\r
-{\r
-  return IoWrite32 (\r
-           Port,\r
-           BitFieldWrite32 (IoRead32 (Port), StartBit, EndBit, Value)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 32-bit port, performs a bitwise OR, and writes the\r
-  result back to the bit field in the 32-bit port.\r
-\r
-  Reads the 32-bit I/O port specified by Port, performs a bitwise OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 32-bit I/O port specified by Port. The value written to the I/O\r
-  port is returned. This function must guarantee that all I/O read and write\r
-  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 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
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  OrData    The value to OR with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoBitFieldOr32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    OrData\r
-  )\r
-{\r
-  return IoWrite32 (\r
-           Port,\r
-           BitFieldOr32 (IoRead32 (Port), StartBit, EndBit, OrData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 32-bit port, performs a bitwise AND, and writes the\r
-  result back to the bit field in the 32-bit port.\r
-\r
-  Reads the 32-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, and writes the result to\r
-  the 32-bit I/O port specified by Port. The value written to the I/O port is\r
-  returned. This function must guarantee that all I/O read and write operations\r
-  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 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
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  AndData   The value to AND with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoBitFieldAnd32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    AndData\r
-  )\r
-{\r
-  return IoWrite32 (\r
-           Port,\r
-           BitFieldAnd32 (IoRead32 (Port), StartBit, EndBit, AndData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 32-bit port, performs a bitwise AND followed by a\r
-  bitwise OR, and writes the result back to the bit field in the\r
-  32-bit port.\r
-\r
-  Reads the 32-bit I/O port specified by Port, performs a bitwise AND followed\r
-  by a bitwise OR between the read result and the value specified by\r
-  AndData, and writes the result to the 32-bit I/O port specified by Port. The\r
-  value written to the I/O port is returned. This function must guarantee that\r
-  all I/O read and write operations are serialized. Extra left bits in both\r
-  AndData and OrData are stripped.\r
-\r
-  If 32-bit I/O port operations are not supported, 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
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\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
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoBitFieldAndThenOr32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    AndData,\r
-  IN      UINT32                    OrData\r
-  )\r
-{\r
-  return IoWrite32 (\r
-           Port,\r
-           BitFieldAndThenOr32 (IoRead32 (Port), StartBit, EndBit, AndData, OrData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a 64-bit I/O port, performs a bitwise OR, and writes the\r
-  result back to the 64-bit I/O port.\r
-\r
-  Reads the 64-bit I/O port specified by Port, performs a bitwise OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 64-bit I/O port specified by Port. The value written to the I/O\r
-  port is returned. This function must guarantee that all I/O read and write\r
-  operations are serialized.\r
-\r
-  If 64-bit I/O port operations are not supported, 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
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoOr64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT64                    OrData\r
-  )\r
-{\r
-  return IoWrite64 (Port, IoRead64 (Port) | OrData);\r
-}\r
-\r
-/**\r
-  Reads a 64-bit I/O port, performs a bitwise AND, and writes the result back\r
-  to the 64-bit I/O port.\r
-\r
-  Reads the 64-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, and writes the result to\r
-  the 64-bit I/O port specified by Port. The value written to the I/O port is\r
-  returned. This function must guarantee that all I/O read and write operations\r
-  are serialized.\r
-\r
-  If 64-bit I/O port operations are not supported, 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
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoAnd64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT64                    AndData\r
-  )\r
-{\r
-  return IoWrite64 (Port, IoRead64 (Port) & AndData);\r
-}\r
-\r
-/**\r
-  Reads a 64-bit I/O port, performs a bitwise AND followed by a bitwise\r
-  inclusive OR, and writes the result back to the 64-bit I/O port.\r
-\r
-  Reads the 64-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, performs a bitwise OR\r
-  between the result of the AND operation and the value specified by OrData,\r
-  and writes the result to the 64-bit I/O port specified by Port. The value\r
-  written to the I/O port is returned. This function must guarantee that all\r
-  I/O read and write operations are serialized.\r
-\r
-  If 64-bit I/O port operations are not supported, 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
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoAndThenOr64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT64                    AndData,\r
-  IN      UINT64                    OrData\r
-  )\r
-{\r
-  return IoWrite64 (Port, (IoRead64 (Port) & AndData) | OrData);\r
-}\r
-\r
-/**\r
-  Reads a bit field of an I/O register.\r
-\r
-  Reads the bit field in a 64-bit I/O register. The bit field is specified by\r
-  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 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
-\r
-  @param  Port      The I/O port to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoBitFieldRead64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  )\r
-{\r
-  return BitFieldRead64 (IoRead64 (Port), StartBit, EndBit);\r
-}\r
-\r
-/**\r
-  Writes a bit field to an I/O register.\r
-\r
-  Writes Value to the bit field of the I/O register. The bit field is specified\r
-  by the StartBit and the EndBit. All other bits in the destination I/O\r
-  register are preserved. The value written to the I/O port is returned. Extra\r
-  left bits in Value are stripped.\r
-\r
-  If 64-bit I/O port operations are not supported, 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
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoBitFieldWrite64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    Value\r
-  )\r
-{\r
-  return IoWrite64 (\r
-           Port,\r
-           BitFieldWrite64 (IoRead64 (Port), StartBit, EndBit, Value)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 64-bit port, performs a bitwise OR, and writes the\r
-  result back to the bit field in the 64-bit port.\r
-\r
-  Reads the 64-bit I/O port specified by Port, performs a bitwise OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 64-bit I/O port specified by Port. The value written to the I/O\r
-  port is returned. This function must guarantee that all I/O read and write\r
-  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 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
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  OrData    The value to OR with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoBitFieldOr64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    OrData\r
-  )\r
-{\r
-  return IoWrite64 (\r
-           Port,\r
-           BitFieldOr64 (IoRead64 (Port), StartBit, EndBit, OrData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 64-bit port, performs a bitwise AND, and writes the\r
-  result back to the bit field in the 64-bit port.\r
-\r
-  Reads the 64-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, and writes the result to\r
-  the 64-bit I/O port specified by Port. The value written to the I/O port is\r
-  returned. This function must guarantee that all I/O read and write operations\r
-  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 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
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  AndData   The value to AND with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoBitFieldAnd64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    AndData\r
-  )\r
-{\r
-  return IoWrite64 (\r
-           Port,\r
-           BitFieldAnd64 (IoRead64 (Port), StartBit, EndBit, AndData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 64-bit port, performs a bitwise AND followed by a\r
-  bitwise OR, and writes the result back to the bit field in the\r
-  64-bit port.\r
-\r
-  Reads the 64-bit I/O port specified by Port, performs a bitwise AND followed\r
-  by a bitwise OR between the read result and the value specified by\r
-  AndData, and writes the result to the 64-bit I/O port specified by Port. The\r
-  value written to the I/O port is returned. This function must guarantee that\r
-  all I/O read and write operations are serialized. Extra left bits in both\r
-  AndData and OrData are stripped.\r
-\r
-  If 64-bit I/O port operations are not supported, 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
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\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
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoBitFieldAndThenOr64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    AndData,\r
-  IN      UINT64                    OrData\r
-  )\r
-{\r
-  return IoWrite64 (\r
-           Port,\r
-           BitFieldAndThenOr64 (IoRead64 (Port), StartBit, EndBit, AndData, OrData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads an 8-bit MMIO register, performs a bitwise OR, and writes the\r
-  result back to the 8-bit MMIO register.\r
-\r
-  Reads the 8-bit MMIO register specified by Address, performs a bitwise\r
-  inclusive OR between the read result and the value specified by OrData, and\r
-  writes the result to the 8-bit MMIO register specified by Address. The value\r
-  written to the MMIO register is returned. This function must guarantee that\r
-  all MMIO read and write operations are serialized.\r
-\r
-  If 8-bit MMIO register operations are not supported, 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
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioOr8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT8                     OrData\r
-  )\r
-{\r
-  return MmioWrite8 (Address, (UINT8) (MmioRead8 (Address) | OrData));\r
-}\r
-\r
-/**\r
-  Reads an 8-bit MMIO register, performs a bitwise AND, and writes the result\r
-  back to the 8-bit MMIO register.\r
-\r
-  Reads the 8-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, and writes the\r
-  result to the 8-bit MMIO register specified by Address. The value written to\r
-  the MMIO register is returned. This function must guarantee that all MMIO\r
-  read and write operations are serialized.\r
-\r
-  If 8-bit MMIO register operations are not supported, 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
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioAnd8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT8                     AndData\r
-  )\r
-{\r
-  return MmioWrite8 (Address, (UINT8) (MmioRead8 (Address) & AndData));\r
-}\r
-\r
-/**\r
-  Reads an 8-bit MMIO register, performs a bitwise AND followed by a bitwise\r
-  inclusive OR, and writes the result back to the 8-bit MMIO register.\r
-\r
-  Reads the 8-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, performs a\r
-  bitwise OR between the result of the AND operation and the value specified by\r
-  OrData, and writes the result to the 8-bit MMIO register specified by\r
-  Address. The value written to the MMIO register is returned. This function\r
-  must guarantee that all MMIO read and write operations are serialized.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-\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
-  @param  OrData  The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioAndThenOr8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT8                     AndData,\r
-  IN      UINT8                     OrData\r
-  )\r
-{\r
-  return MmioWrite8 (Address, (UINT8) ((MmioRead8 (Address) & AndData) | OrData));\r
-}\r
-\r
-/**\r
-  Reads a bit field of a MMIO register.\r
-\r
-  Reads the bit field in an 8-bit MMIO register. The bit field is specified by\r
-  the StartBit and the EndBit. The value of the bit field is returned.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioBitFieldRead8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  )\r
-{\r
-  return BitFieldRead8 (MmioRead8 (Address), StartBit, EndBit);\r
-}\r
-\r
-/**\r
-  Writes a bit field to a MMIO register.\r
-\r
-  Writes Value to the bit field of the MMIO register. The bit field is\r
-  specified by the StartBit and the EndBit. All other bits in the destination\r
-  MMIO register are preserved. The new value of the 8-bit register is returned.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioBitFieldWrite8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     Value\r
-  )\r
-{\r
-  return MmioWrite8 (\r
-           Address,\r
-           BitFieldWrite8 (MmioRead8 (Address), StartBit, EndBit, Value)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in an 8-bit MMIO register, performs a bitwise OR, and\r
-  writes the result back to the bit field in the 8-bit MMIO register.\r
-\r
-  Reads the 8-bit MMIO register specified by Address, performs a bitwise\r
-  inclusive OR between the read result and the value specified by OrData, and\r
-  writes the result to the 8-bit MMIO register specified by Address. The value\r
-  written to the MMIO register is returned. This function must guarantee that\r
-  all MMIO read and write operations are serialized. Extra left bits in OrData\r
-  are stripped.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  OrData    The value to OR with read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioBitFieldOr8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     OrData\r
-  )\r
-{\r
-  return MmioWrite8 (\r
-           Address,\r
-           BitFieldOr8 (MmioRead8 (Address), StartBit, EndBit, OrData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in an 8-bit MMIO register, performs a bitwise AND, and\r
-  writes the result back to the bit field in the 8-bit MMIO register.\r
-\r
-  Reads the 8-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, and writes the\r
-  result to the 8-bit MMIO register specified by Address. The value written to\r
-  the MMIO register is returned. This function must guarantee that all MMIO\r
-  read and write operations are serialized. Extra left bits in AndData are\r
-  stripped.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  AndData   The value to AND with read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioBitFieldAnd8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     AndData\r
-  )\r
-{\r
-  return MmioWrite8 (\r
-           Address,\r
-           BitFieldAnd8 (MmioRead8 (Address), StartBit, EndBit, AndData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in an 8-bit MMIO register, performs a bitwise AND followed\r
-  by a bitwise OR, and writes the result back to the bit field in the\r
-  8-bit MMIO register.\r
-\r
-  Reads the 8-bit MMIO register specified by Address, performs a bitwise AND\r
-  followed by a bitwise OR between the read result and the value\r
-  specified by AndData, and writes the result to the 8-bit MMIO register\r
-  specified by Address. The value written to the MMIO register is returned.\r
-  This function must guarantee that all MMIO read and write operations are\r
-  serialized. Extra left bits in both AndData and OrData are stripped.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  AndData   The value to AND with read value from the MMIO register.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioBitFieldAndThenOr8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     AndData,\r
-  IN      UINT8                     OrData\r
-  )\r
-{\r
-  return MmioWrite8 (\r
-           Address,\r
-           BitFieldAndThenOr8 (MmioRead8 (Address), StartBit, EndBit, AndData, OrData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a 16-bit MMIO register, performs a bitwise OR, and writes the\r
-  result back to the 16-bit MMIO register.\r
-\r
-  Reads the 16-bit MMIO register specified by Address, performs a bitwise\r
-  inclusive OR between the read result and the value specified by OrData, and\r
-  writes the result to the 16-bit MMIO register specified by Address. The value\r
-  written to the MMIO register is returned. This function must guarantee that\r
-  all MMIO read and write operations are serialized.\r
-\r
-  If 16-bit MMIO register operations are not supported, 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
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioOr16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT16                    OrData\r
-  )\r
-{\r
-  return MmioWrite16 (Address, (UINT16) (MmioRead16 (Address) | OrData));\r
-}\r
-\r
-/**\r
-  Reads a 16-bit MMIO register, performs a bitwise AND, and writes the result\r
-  back to the 16-bit MMIO register.\r
-\r
-  Reads the 16-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, and writes the\r
-  result to the 16-bit MMIO register specified by Address. The value written to\r
-  the MMIO register is returned. This function must guarantee that all MMIO\r
-  read and write operations are serialized.\r
-\r
-  If 16-bit MMIO register operations are not supported, 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
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioAnd16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT16                    AndData\r
-  )\r
-{\r
-  return MmioWrite16 (Address, (UINT16) (MmioRead16 (Address) & AndData));\r
-}\r
-\r
-/**\r
-  Reads a 16-bit MMIO register, performs a bitwise AND followed by a bitwise\r
-  inclusive OR, and writes the result back to the 16-bit MMIO register.\r
-\r
-  Reads the 16-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, performs a\r
-  bitwise OR between the result of the AND operation and the value specified by\r
-  OrData, and writes the result to the 16-bit MMIO register specified by\r
-  Address. The value written to the MMIO register is returned. This function\r
-  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
-\r
-  @param  Address The MMIO register to write.\r
-  @param  AndData The value to AND with the read value from the MMIO register.\r
-  @param  OrData  The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioAndThenOr16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT16                    AndData,\r
-  IN      UINT16                    OrData\r
-  )\r
-{\r
-  return MmioWrite16 (Address, (UINT16) ((MmioRead16 (Address) & AndData) | OrData));\r
-}\r
-\r
-/**\r
-  Reads a bit field of a MMIO register.\r
-\r
-  Reads the bit field in a 16-bit MMIO register. The bit field is specified by\r
-  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 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
-\r
-  @param  Address   MMIO register to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioBitFieldRead16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  )\r
-{\r
-  return BitFieldRead16 (MmioRead16 (Address), StartBit, EndBit);\r
-}\r
-\r
-/**\r
-  Writes a bit field to a MMIO register.\r
-\r
-  Writes Value to the bit field of the MMIO register. The bit field is\r
-  specified by the StartBit and the EndBit. All other bits in the destination\r
-  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 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
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioBitFieldWrite16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    Value\r
-  )\r
-{\r
-  return MmioWrite16 (\r
-           Address,\r
-           BitFieldWrite16 (MmioRead16 (Address), StartBit, EndBit, Value)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 16-bit MMIO register, performs a bitwise OR, and\r
-  writes the result back to the bit field in the 16-bit MMIO register.\r
-\r
-  Reads the 16-bit MMIO register specified by Address, performs a bitwise\r
-  inclusive OR between the read result and the value specified by OrData, and\r
-  writes the result to the 16-bit MMIO register specified by Address. The value\r
-  written to the MMIO register is returned. This function must guarantee that\r
-  all MMIO read and write operations are serialized. Extra left bits in OrData\r
-  are stripped.\r
-\r
-  If 16-bit MMIO register operations are not supported, 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
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  OrData    The value to OR with read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioBitFieldOr16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    OrData\r
-  )\r
-{\r
-  return MmioWrite16 (\r
-           Address,\r
-           BitFieldOr16 (MmioRead16 (Address), StartBit, EndBit, OrData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 16-bit MMIO register, performs a bitwise AND, and\r
-  writes the result back to the bit field in the 16-bit MMIO register.\r
-\r
-  Reads the 16-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, and writes the\r
-  result to the 16-bit MMIO register specified by Address. The value written to\r
-  the MMIO register is returned. This function must guarantee that all MMIO\r
-  read and write operations are serialized. Extra left bits in AndData are\r
-  stripped.\r
-\r
-  If 16-bit MMIO register operations are not supported, 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
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  AndData   The value to AND with read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioBitFieldAnd16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    AndData\r
-  )\r
-{\r
-  return MmioWrite16 (\r
-           Address,\r
-           BitFieldAnd16 (MmioRead16 (Address), StartBit, EndBit, AndData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 16-bit MMIO register, performs a bitwise AND followed\r
-  by a bitwise OR, and writes the result back to the bit field in the\r
-  16-bit MMIO register.\r
-\r
-  Reads the 16-bit MMIO register specified by Address, performs a bitwise AND\r
-  followed by a bitwise OR between the read result and the value\r
-  specified by AndData, and writes the result to the 16-bit MMIO register\r
-  specified by Address. The value written to the MMIO register is returned.\r
-  This function must guarantee that all MMIO read and write operations are\r
-  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 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
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  AndData   The value to AND with read value from the MMIO register.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioBitFieldAndThenOr16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    AndData,\r
-  IN      UINT16                    OrData\r
-  )\r
-{\r
-  return MmioWrite16 (\r
-           Address,\r
-           BitFieldAndThenOr16 (MmioRead16 (Address), StartBit, EndBit, AndData, OrData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a 32-bit MMIO register, performs a bitwise OR, and writes the\r
-  result back to the 32-bit MMIO register.\r
-\r
-  Reads the 32-bit MMIO register specified by Address, performs a bitwise\r
-  inclusive OR between the read result and the value specified by OrData, and\r
-  writes the result to the 32-bit MMIO register specified by Address. The value\r
-  written to the MMIO register is returned. This function must guarantee that\r
-  all MMIO read and write operations are serialized.\r
-\r
-  If 32-bit MMIO register operations are not supported, 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
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioOr32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT32                    OrData\r
-  )\r
-{\r
-  return MmioWrite32 (Address, MmioRead32 (Address) | OrData);\r
-}\r
-\r
-/**\r
-  Reads a 32-bit MMIO register, performs a bitwise AND, and writes the result\r
-  back to the 32-bit MMIO register.\r
-\r
-  Reads the 32-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, and writes the\r
-  result to the 32-bit MMIO register specified by Address. The value written to\r
-  the MMIO register is returned. This function must guarantee that all MMIO\r
-  read and write operations are serialized.\r
-\r
-  If 32-bit MMIO register operations are not supported, 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
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioAnd32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT32                    AndData\r
-  )\r
-{\r
-  return MmioWrite32 (Address, MmioRead32 (Address) & AndData);\r
-}\r
-\r
-/**\r
-  Reads a 32-bit MMIO register, performs a bitwise AND followed by a bitwise\r
-  inclusive OR, and writes the result back to the 32-bit MMIO register.\r
-\r
-  Reads the 32-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, performs a\r
-  bitwise OR between the result of the AND operation and the value specified by\r
-  OrData, and writes the result to the 32-bit MMIO register specified by\r
-  Address. The value written to the MMIO register is returned. This function\r
-  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
-\r
-  @param  Address The MMIO register to write.\r
-  @param  AndData The value to AND with the read value from the MMIO register.\r
-  @param  OrData  The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioAndThenOr32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT32                    AndData,\r
-  IN      UINT32                    OrData\r
-  )\r
-{\r
-  return MmioWrite32 (Address, (MmioRead32 (Address) & AndData) | OrData);\r
-}\r
-\r
-/**\r
-  Reads a bit field of a MMIO register.\r
-\r
-  Reads the bit field in a 32-bit MMIO register. The bit field is specified by\r
-  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 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
-\r
-  @param  Address   MMIO register to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioBitFieldRead32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  )\r
-{\r
-  return BitFieldRead32 (MmioRead32 (Address), StartBit, EndBit);\r
-}\r
-\r
-/**\r
-  Writes a bit field to a MMIO register.\r
-\r
-  Writes Value to the bit field of the MMIO register. The bit field is\r
-  specified by the StartBit and the EndBit. All other bits in the destination\r
-  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 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
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioBitFieldWrite32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    Value\r
-  )\r
-{\r
-  return MmioWrite32 (\r
-           Address,\r
-           BitFieldWrite32 (MmioRead32 (Address), StartBit, EndBit, Value)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 32-bit MMIO register, performs a bitwise OR, and\r
-  writes the result back to the bit field in the 32-bit MMIO register.\r
-\r
-  Reads the 32-bit MMIO register specified by Address, performs a bitwise\r
-  inclusive OR between the read result and the value specified by OrData, and\r
-  writes the result to the 32-bit MMIO register specified by Address. The value\r
-  written to the MMIO register is returned. This function must guarantee that\r
-  all MMIO read and write operations are serialized. Extra left bits in OrData\r
-  are stripped.\r
-\r
-  If 32-bit MMIO register operations are not supported, 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
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  OrData    The value to OR with read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioBitFieldOr32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    OrData\r
-  )\r
-{\r
-  return MmioWrite32 (\r
-           Address,\r
-           BitFieldOr32 (MmioRead32 (Address), StartBit, EndBit, OrData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 32-bit MMIO register, performs a bitwise AND, and\r
-  writes the result back to the bit field in the 32-bit MMIO register.\r
-\r
-  Reads the 32-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, and writes the\r
-  result to the 32-bit MMIO register specified by Address. The value written to\r
-  the MMIO register is returned. This function must guarantee that all MMIO\r
-  read and write operations are serialized. Extra left bits in AndData are\r
-  stripped.\r
-\r
-  If 32-bit MMIO register operations are not supported, 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
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  AndData   The value to AND with read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioBitFieldAnd32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    AndData\r
-  )\r
-{\r
-  return MmioWrite32 (\r
-           Address,\r
-           BitFieldAnd32 (MmioRead32 (Address), StartBit, EndBit, AndData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 32-bit MMIO register, performs a bitwise AND followed\r
-  by a bitwise OR, and writes the result back to the bit field in the\r
-  32-bit MMIO register.\r
-\r
-  Reads the 32-bit MMIO register specified by Address, performs a bitwise AND\r
-  followed by a bitwise OR between the read result and the value\r
-  specified by AndData, and writes the result to the 32-bit MMIO register\r
-  specified by Address. The value written to the MMIO register is returned.\r
-  This function must guarantee that all MMIO read and write operations are\r
-  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 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
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  AndData   The value to AND with read value from the MMIO register.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioBitFieldAndThenOr32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    AndData,\r
-  IN      UINT32                    OrData\r
-  )\r
-{\r
-  return MmioWrite32 (\r
-           Address,\r
-           BitFieldAndThenOr32 (MmioRead32 (Address), StartBit, EndBit, AndData, OrData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a 64-bit MMIO register, performs a bitwise OR, and writes the\r
-  result back to the 64-bit MMIO register.\r
-\r
-  Reads the 64-bit MMIO register specified by Address, performs a bitwise\r
-  inclusive OR between the read result and the value specified by OrData, and\r
-  writes the result to the 64-bit MMIO register specified by Address. The value\r
-  written to the MMIO register is returned. This function must guarantee that\r
-  all MMIO read and write operations are serialized.\r
-\r
-  If 64-bit MMIO register operations are not supported, 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
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioOr64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT64                    OrData\r
-  )\r
-{\r
-  return MmioWrite64 (Address, MmioRead64 (Address) | OrData);\r
-}\r
-\r
-/**\r
-  Reads a 64-bit MMIO register, performs a bitwise AND, and writes the result\r
-  back to the 64-bit MMIO register.\r
-\r
-  Reads the 64-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, and writes the\r
-  result to the 64-bit MMIO register specified by Address. The value written to\r
-  the MMIO register is returned. This function must guarantee that all MMIO\r
-  read and write operations are serialized.\r
-\r
-  If 64-bit MMIO register operations are not supported, 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
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioAnd64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT64                    AndData\r
-  )\r
-{\r
-  return MmioWrite64 (Address, MmioRead64 (Address) & AndData);\r
-}\r
-\r
-/**\r
-  Reads a 64-bit MMIO register, performs a bitwise AND followed by a bitwise\r
-  inclusive OR, and writes the result back to the 64-bit MMIO register.\r
-\r
-  Reads the 64-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, performs a\r
-  bitwise OR between the result of the AND operation and the value specified by\r
-  OrData, and writes the result to the 64-bit MMIO register specified by\r
-  Address. The value written to the MMIO register is returned. This function\r
-  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
-\r
-  @param  Address The MMIO register to write.\r
-  @param  AndData The value to AND with the read value from the MMIO register.\r
-  @param  OrData  The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioAndThenOr64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT64                    AndData,\r
-  IN      UINT64                    OrData\r
-  )\r
-{\r
-  return MmioWrite64 (Address, (MmioRead64 (Address) & AndData) | OrData);\r
-}\r
-\r
-/**\r
-  Reads a bit field of a MMIO register.\r
-\r
-  Reads the bit field in a 64-bit MMIO register. The bit field is specified by\r
-  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 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
-\r
-  @param  Address   MMIO register to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioBitFieldRead64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  )\r
-{\r
-  return BitFieldRead64 (MmioRead64 (Address), StartBit, EndBit);\r
-}\r
-\r
-/**\r
-  Writes a bit field to a MMIO register.\r
-\r
-  Writes Value to the bit field of the MMIO register. The bit field is\r
-  specified by the StartBit and the EndBit. All other bits in the destination\r
-  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 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
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioBitFieldWrite64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    Value\r
-  )\r
-{\r
-  return MmioWrite64 (\r
-           Address,\r
-           BitFieldWrite64 (MmioRead64 (Address), StartBit, EndBit, Value)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 64-bit MMIO register, performs a bitwise OR, and\r
-  writes the result back to the bit field in the 64-bit MMIO register.\r
-\r
-  Reads the 64-bit MMIO register specified by Address, performs a bitwise\r
-  inclusive OR between the read result and the value specified by OrData, and\r
-  writes the result to the 64-bit MMIO register specified by Address. The value\r
-  written to the MMIO register is returned. This function must guarantee that\r
-  all MMIO read and write operations are serialized. Extra left bits in OrData\r
-  are stripped.\r
-\r
-  If 64-bit MMIO register operations are not supported, 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
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  OrData    The value to OR with read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioBitFieldOr64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    OrData\r
-  )\r
-{\r
-  return MmioWrite64 (\r
-           Address,\r
-           BitFieldOr64 (MmioRead64 (Address), StartBit, EndBit, OrData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 64-bit MMIO register, performs a bitwise AND, and\r
-  writes the result back to the bit field in the 64-bit MMIO register.\r
-\r
-  Reads the 64-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, and writes the\r
-  result to the 64-bit MMIO register specified by Address. The value written to\r
-  the MMIO register is returned. This function must guarantee that all MMIO\r
-  read and write operations are serialized. Extra left bits in AndData are\r
-  stripped.\r
-\r
-  If 64-bit MMIO register operations are not supported, 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
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  AndData   The value to AND with read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioBitFieldAnd64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    AndData\r
-  )\r
-{\r
-  return MmioWrite64 (\r
-           Address,\r
-           BitFieldAnd64 (MmioRead64 (Address), StartBit, EndBit, AndData)\r
-           );\r
-}\r
-\r
-/**\r
-  Reads a bit field in a 64-bit MMIO register, performs a bitwise AND followed\r
-  by a bitwise OR, and writes the result back to the bit field in the\r
-  64-bit MMIO register.\r
-\r
-  Reads the 64-bit MMIO register specified by Address, performs a bitwise AND\r
-  followed by a bitwise OR between the read result and the value\r
-  specified by AndData, and writes the result to the 64-bit MMIO register\r
-  specified by Address. The value written to the MMIO register is returned.\r
-  This function must guarantee that all MMIO read and write operations are\r
-  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 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
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  AndData   The value to AND with read value from the MMIO register.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioBitFieldAndThenOr64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    AndData,\r
-  IN      UINT64                    OrData\r
-  )\r
-{\r
-  return MmioWrite64 (\r
-           Address,\r
-           BitFieldAndThenOr64 (MmioRead64 (Address), StartBit, EndBit, AndData, OrData)\r
-           );\r
-}\r
diff --git a/MdePkg/Library/SmmIoLibCpuIo/IoLib.c b/MdePkg/Library/SmmIoLibCpuIo/IoLib.c
deleted file mode 100644 (file)
index 4b74e9c..0000000
+++ /dev/null
@@ -1,642 +0,0 @@
-/** @file\r
-  I/O Library.\r
-  The implementation of I/O operation for this library instance \r
-  are based on EFI_CPU_IO_PROTOCOL.\r
-  \r
-  Copyright (c) 2009, Intel Corporation<BR>\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.c\r
-\r
-**/\r
-\r
-\r
-#include "SmmCpuIoLibInternal.h"\r
-\r
-//\r
-// Globle varible to cache pointer to CpuIo protocol.\r
-//\r
-EFI_SMM_CPU_IO_PROTOCOL              *mCpuIo = NULL;\r
-EFI_SMM_PCI_ROOT_BRIDGE_IO_PROTOCOL  *mPciRootBridgeIo = NULL;\r
-\r
-/**\r
-  The constructor function caches the pointer to CpuIo protocol.\r
-\r
-  The constructor function locates CpuIo protocol from protocol database.\r
-  It will ASSERT() if that operation fails and it will always return EFI_SUCCESS.\r
-\r
-  @param  ImageHandle   The firmware allocated handle for the EFI image.\r
-  @param  SystemTable   A pointer to the EFI System Table.\r
-\r
-  @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IoLibConstructor (\r
-  IN      EFI_HANDLE                ImageHandle,\r
-  IN      EFI_SYSTEM_TABLE          *SystemTable\r
-  )\r
-{\r
-  EFI_STATUS                        Status;\r
-\r
-  Status = gSmst->SmmLocateProtocol (&gEfiSmmPciRootBridgeIoProtocolGuid, NULL, (VOID **) &mPciRootBridgeIo);\r
-  if (EFI_ERROR (Status)) {\r
-    Status = gSmst->SmmLocateProtocol (&gEfiSmmCpuIoProtocolGuid, NULL, (VOID **) &mCpuIo);\r
-  }\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Reads registers in the EFI CPU I/O space.\r
-\r
-  Reads the I/O port specified by Port with registers width specified by Width.\r
-  The read value is returned. If such operations are not supported, then ASSERT().\r
-  This function must guarantee that all I/O read and write operations are serialized.\r
-\r
-  @param  Port          The base address of the I/O operation.\r
-                        The caller is responsible for aligning the Address if required.\r
-  @param  Width         The width of the I/O operation.\r
-\r
-  @return Data read from registers in the EFI CPU I/O space.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoReadWorker (\r
-  IN      UINTN                     Port,\r
-  IN      EFI_SMM_IO_WIDTH          Width\r
-  )\r
-{\r
-  EFI_STATUS                        Status;\r
-  UINT64                            Data;\r
-\r
-  if (mPciRootBridgeIo != NULL) {\r
-    Status = mPciRootBridgeIo->Io.Read (mPciRootBridgeIo, (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width, Port, 1, &Data);\r
-  } else {\r
-    Status = mCpuIo->Io.Read (mCpuIo, Width, Port, 1, &Data);\r
-  }\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  return Data;\r
-}\r
-\r
-/**\r
-  Writes registers in the EFI CPU I/O space.\r
-\r
-  Writes the I/O port specified by Port with registers width and value specified by Width\r
-  and Data respectively.  Data is returned. If such operations are not supported, then ASSERT().\r
-  This function must guarantee that all I/O read and write operations are serialized.\r
-\r
-  @param  Port          The base address of the I/O operation.\r
-                        The caller is responsible for aligning the Address if required.\r
-  @param  Width         The width of the I/O operation.\r
-  @param  Data          The value to write to the I/O port.\r
-\r
-  @return The paramter of Data.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoWriteWorker (\r
-  IN      UINTN                     Port,\r
-  IN      EFI_SMM_IO_WIDTH          Width,\r
-  IN      UINT64                    Data\r
-  )\r
-{\r
-  EFI_STATUS                        Status;\r
-\r
-  if (mPciRootBridgeIo != NULL) {\r
-    Status = mPciRootBridgeIo->Io.Write (mPciRootBridgeIo, (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width, Port, 1, &Data);\r
-  } else {\r
-    Status = mCpuIo->Io.Write (mCpuIo, Width, Port, 1, &Data);\r
-  }\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  return Data;\r
-}\r
-\r
-/**\r
-  Reads memory-mapped registers in the EFI system memory space.\r
-\r
-  Reads the MMIO registers specified by Address with registers width specified by Width.\r
-  The read value is returned. If such operations are not supported, then ASSERT().\r
-  This function must guarantee that all MMIO read and write operations are serialized.\r
-\r
-  @param  Address       The MMIO register to read.\r
-                        The caller is responsible for aligning the Address if required.\r
-  @param  Width         The width of the I/O operation.\r
-\r
-  @return Data read from registers in the EFI system memory space.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioReadWorker (\r
-  IN      UINTN                     Address,\r
-  IN      EFI_SMM_IO_WIDTH          Width\r
-  )\r
-{\r
-  EFI_STATUS                        Status;\r
-  UINT64                            Data;\r
-\r
-  if (mPciRootBridgeIo != NULL) {\r
-    Status = mPciRootBridgeIo->Mem.Read (mPciRootBridgeIo, (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width, Address, 1, &Data);\r
-  } else {\r
-    Status = mCpuIo->Mem.Read (mCpuIo, Width, Address, 1, &Data);\r
-  }\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  return Data;\r
-}\r
-\r
-/**\r
-  Writes memory-mapped registers in the EFI system memory space.\r
-\r
-  Writes the MMIO registers specified by Address with registers width and value specified by Width\r
-  and Data respectively. Data is returned. If such operations are not supported, then ASSERT().\r
-  This function must guarantee that all MMIO read and write operations are serialized.\r
-\r
-  @param  Address       The MMIO register to read.\r
-                        The caller is responsible for aligning the Address if required.\r
-  @param  Width         The width of the I/O operation.\r
-  @param  Data          The value to write to the I/O port.\r
-  \r
-  @return Data read from registers in the EFI system memory space.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioWriteWorker (\r
-  IN      UINTN                     Address,\r
-  IN      EFI_SMM_IO_WIDTH          Width,\r
-  IN      UINT64                    Data\r
-  )\r
-{\r
-  EFI_STATUS                        Status;\r
-\r
-  if (mPciRootBridgeIo != NULL) {\r
-    Status = mPciRootBridgeIo->Mem.Write (mPciRootBridgeIo, (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width, Address, 1, &Data);\r
-  } else {\r
-    Status = mCpuIo->Mem.Write (mCpuIo, Width, Address, 1, &Data);\r
-  }\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  return Data;\r
-}\r
-\r
-/**\r
-  Reads an 8-bit I/O port.\r
-\r
-  Reads the 8-bit I/O port specified by Port. The 8-bit read value is returned.\r
-  This function must guarantee that all I/O read and write operations are\r
-  serialized.\r
-\r
-  If 8-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port  The I/O port to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoRead8 (\r
-  IN      UINTN                     Port\r
-  )\r
-{\r
-  return (UINT8)IoReadWorker (Port, SMM_IO_UINT8);\r
-}\r
-\r
-/**\r
-  Writes an 8-bit I/O port.\r
-\r
-  Writes the 8-bit I/O port specified by Port with the value specified by Value\r
-  and returns Value. This function must guarantee that all I/O read and write\r
-  operations are serialized.\r
-\r
-  If 8-bit I/O port operations are not supported, 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
-  @return The value written the I/O port.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoWrite8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT8                     Value\r
-  )\r
-{\r
-  return (UINT8)IoWriteWorker (Port, SMM_IO_UINT8, Value);\r
-}\r
-\r
-/**\r
-  Reads a 16-bit I/O port.\r
-\r
-  Reads the 16-bit I/O port specified by Port. The 16-bit read value is returned.\r
-  This function must guarantee that all I/O read and write operations are\r
-  serialized.\r
-\r
-  If Port is not aligned on a 16-bit boundary, then ASSERT().\r
\r
-  If 16-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port  The I/O port to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoRead16 (\r
-  IN      UINTN                     Port\r
-  )\r
-{\r
-  //\r
-  // Make sure Port is aligned on a 16-bit boundary.\r
-  //\r
-  ASSERT ((Port & 1) == 0);\r
-  return (UINT16)IoReadWorker (Port, SMM_IO_UINT16);\r
-}\r
-\r
-/**\r
-  Writes a 16-bit I/O port.\r
-\r
-  Writes the 16-bit I/O port specified by Port with the value specified by Value\r
-  and returns Value. This function must guarantee that all I/O read and write\r
-  operations are serialized.\r
-\r
-  If Port is not aligned on a 16-bit boundary, then ASSERT().\r
-\r
-  If 16-bit I/O port operations are not supported, 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
-  @return The value written the I/O port.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoWrite16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT16                    Value\r
-  )\r
-{\r
-  //\r
-  // Make sure Port is aligned on a 16-bit boundary.\r
-  //\r
-  ASSERT ((Port & 1) == 0);\r
-  return (UINT16)IoWriteWorker (Port, SMM_IO_UINT16, Value);\r
-}\r
-\r
-/**\r
-  Reads a 32-bit I/O port.\r
-\r
-  Reads the 32-bit I/O port specified by Port. The 32-bit read value is returned.\r
-  This function must guarantee that all I/O read and write operations are\r
-  serialized.\r
\r
-  If Port is not aligned on a 32-bit boundary, then ASSERT().\r
-\r
-  If 32-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port  The I/O port to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoRead32 (\r
-  IN      UINTN                     Port\r
-  )\r
-{\r
-  //\r
-  // Make sure Port is aligned on a 32-bit boundary.\r
-  //\r
-  ASSERT ((Port & 3) == 0);\r
-  return (UINT32)IoReadWorker (Port, SMM_IO_UINT32);\r
-}\r
-\r
-/**\r
-  Writes a 32-bit I/O port.\r
-\r
-  Writes the 32-bit I/O port specified by Port with the value specified by Value\r
-  and returns Value. This function must guarantee that all I/O read and write\r
-  operations are serialized.\r
-\r
-  If Port is not aligned on a 32-bit boundary, then ASSERT().\r
-\r
-  If 32-bit I/O port operations are not supported, 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
-  @return The value written the I/O port.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoWrite32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT32                    Value\r
-  )\r
-{\r
-  //\r
-  // Make sure Port is aligned on a 32-bit boundary.\r
-  //\r
-  ASSERT ((Port & 3) == 0);\r
-  return (UINT32)IoWriteWorker (Port, SMM_IO_UINT32, Value);\r
-}\r
-\r
-/**\r
-  Reads a 64-bit I/O port.\r
-\r
-  Reads the 64-bit I/O port specified by Port. The 64-bit read value is returned.\r
-  This function must guarantee that all I/O read and write operations are\r
-  serialized.\r
-\r
-  If Port is not aligned on a 64-bit boundary, then ASSERT().\r
-\r
-  If 64-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port  The I/O port to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoRead64 (\r
-  IN      UINTN                     Port\r
-  )\r
-{\r
-  //\r
-  // Make sure Port is aligned on a 64-bit boundary.\r
-  //\r
-  ASSERT ((Port & 7) == 0);\r
-  return IoReadWorker (Port, SMM_IO_UINT64);\r
-}\r
-\r
-/**\r
-  Writes a 64-bit I/O port.\r
-\r
-  Writes the 64-bit I/O port specified by Port with the value specified by Value\r
-  and returns Value. This function must guarantee that all I/O read and write\r
-  operations are serialized.\r
-\r
-  If Port is not aligned on a 64-bit boundary, then ASSERT().\r
\r
-  If 64-bit I/O port operations are not supported, 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
-  @return The value written the I/O port.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoWrite64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT64                    Value\r
-  )\r
-{\r
-  //\r
-  // Make sure Port is aligned on a 64-bit boundary.\r
-  //\r
-  ASSERT ((Port & 7) == 0);\r
-  return IoWriteWorker (Port, SMM_IO_UINT64, Value);\r
-}\r
-\r
-/**\r
-  Reads an 8-bit MMIO register.\r
-\r
-  Reads the 8-bit MMIO register specified by Address. The 8-bit read value is\r
-  returned. This function must guarantee that all MMIO read and write\r
-  operations are serialized.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioRead8 (\r
-  IN      UINTN                     Address\r
-  )\r
-{\r
-  return (UINT8)MmioReadWorker (Address, SMM_IO_UINT8);\r
-}\r
-\r
-/**\r
-  Writes an 8-bit MMIO register.\r
-\r
-  Writes the 8-bit MMIO register specified by Address with the value specified\r
-  by Value and returns Value. This function must guarantee that all MMIO read\r
-  and write operations are serialized.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  Value   The value to write to the MMIO register.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioWrite8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT8                     Value\r
-  )\r
-{\r
-  return (UINT8)MmioWriteWorker (Address, SMM_IO_UINT8, Value);\r
-}\r
-\r
-/**\r
-  Reads a 16-bit MMIO register.\r
-\r
-  Reads the 16-bit MMIO register specified by Address. The 16-bit read value is\r
-  returned. This function must guarantee that all MMIO read and write\r
-  operations are serialized.\r
-\r
-  If Address is not aligned on a 16-bit boundary, then ASSERT().\r
\r
-  If 16-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioRead16 (\r
-  IN      UINTN                     Address\r
-  )\r
-{\r
-  //\r
-  // Make sure Address is aligned on a 16-bit boundary.\r
-  //\r
-  ASSERT ((Address & 1) == 0);\r
-  return (UINT16)MmioReadWorker (Address, SMM_IO_UINT16);\r
-}\r
-\r
-/**\r
-  Writes a 16-bit MMIO register.\r
-\r
-  Writes the 16-bit MMIO register specified by Address with the value specified\r
-  by Value and returns Value. This function must guarantee that all MMIO read\r
-  and write operations are serialized.\r
-\r
-  If Address is not aligned on a 16-bit boundary, then ASSERT().\r
\r
-  If 16-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  Value   The value to write to the MMIO register.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioWrite16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT16                    Value\r
-  )\r
-{\r
-  //\r
-  // Make sure Address is aligned on a 16-bit boundary.\r
-  //\r
-  ASSERT ((Address & 1) == 0);\r
-  return (UINT16)MmioWriteWorker (Address, SMM_IO_UINT16, Value);\r
-}\r
-\r
-/**\r
-  Reads a 32-bit MMIO register.\r
-\r
-  Reads the 32-bit MMIO register specified by Address. The 32-bit read value is\r
-  returned. This function must guarantee that all MMIO read and write\r
-  operations are serialized.\r
-\r
-  If Address is not aligned on a 32-bit boundary, then ASSERT().\r
-  \r
-  If 32-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioRead32 (\r
-  IN      UINTN                     Address\r
-  )\r
-{\r
-  //\r
-  // Make sure Address is aligned on a 32-bit boundary.\r
-  //\r
-  ASSERT ((Address & 3) == 0);\r
-  return (UINT32)MmioReadWorker (Address, SMM_IO_UINT32);\r
-}\r
-\r
-/**\r
-  Writes a 32-bit MMIO register.\r
-\r
-  Writes the 32-bit MMIO register specified by Address with the value specified\r
-  by Value and returns Value. This function must guarantee that all MMIO read\r
-  and write operations are serialized.\r
-\r
-  If Address is not aligned on a 32-bit boundary, then ASSERT().\r
\r
-  If 32-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  Value   The value to write to the MMIO register.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioWrite32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT32                    Value\r
-  )\r
-{\r
-  //\r
-  // Make sure Address is aligned on a 32-bit boundary.\r
-  //\r
-  ASSERT ((Address & 3) == 0);\r
-  return (UINT32)MmioWriteWorker (Address, SMM_IO_UINT32, Value);\r
-}\r
-\r
-/**\r
-  Reads a 64-bit MMIO register.\r
-\r
-  Reads the 64-bit MMIO register specified by Address. The 64-bit read value is\r
-  returned. This function must guarantee that all MMIO read and write\r
-  operations are serialized.\r
-\r
-  If Address is not aligned on a 64-bit boundary, then ASSERT().\r
\r
-  If 64-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioRead64 (\r
-  IN      UINTN                     Address\r
-  )\r
-{\r
-  //\r
-  // Make sure Address is aligned on a 64-bit boundary.\r
-  //\r
-  ASSERT ((Address & 7) == 0);\r
-  return (UINT64)MmioReadWorker (Address, SMM_IO_UINT64);\r
-}\r
-\r
-/**\r
-  Writes a 64-bit MMIO register.\r
-\r
-  Writes the 64-bit MMIO register specified by Address with the value specified\r
-  by Value and returns Value. This function must guarantee that all MMIO read\r
-  and write operations are serialized.\r
-\r
-  If Address is not aligned on a 64-bit boundary, then ASSERT().\r
\r
-  If 64-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  Value   The value to write to the MMIO register.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioWrite64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT64                    Value\r
-  )\r
-{\r
-  //\r
-  // Make sure Address is aligned on a 64-bit boundary.\r
-  //\r
-  ASSERT ((Address & 7) == 0);\r
-  return (UINT64)MmioWriteWorker (Address, SMM_IO_UINT64, Value);\r
-}\r
diff --git a/MdePkg/Library/SmmIoLibCpuIo/IoLibMmioBuffer.c b/MdePkg/Library/SmmIoLibCpuIo/IoLibMmioBuffer.c
deleted file mode 100644 (file)
index e4effa9..0000000
+++ /dev/null
@@ -1,416 +0,0 @@
-/** @file\r
-  I/O Library MMIO Buffer Functions.\r
-\r
-  Copyright (c) 2009, Intel Corporation<BR>\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:  IoLibMmioBuffer.c\r
-\r
-**/\r
-\r
-\r
-#include "SmmCpuIoLibInternal.h"\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          Size in bytes of the copy.\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
-  UINT8   *ReturnBuffer;\r
-\r
-  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
-  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
-\r
-  ReturnBuffer = Buffer;\r
-\r
-  while (Length-- > 0) {\r
-    *(Buffer++) = MmioRead8 (StartAddress++);\r
-  }\r
-\r
-  return ReturnBuffer;\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
-  \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          Size in bytes of the copy.\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
-  UINT16    *ReturnBuffer;\r
-\r
-  ASSERT ((StartAddress & (sizeof (UINT16) - 1)) == 0);\r
-\r
-  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
-  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
-\r
-  ASSERT ((Length & (sizeof (UINT16) - 1)) == 0);\r
-  ASSERT (((UINTN) Buffer & (sizeof (UINT16) - 1)) == 0);\r
-\r
-  ReturnBuffer = Buffer;\r
-\r
-  while (Length > 0) {\r
-    *(Buffer++) = MmioRead16 (StartAddress);\r
-    StartAddress += sizeof (UINT16);\r
-    Length -= sizeof (UINT16);\r
-  }\r
-\r
-  return ReturnBuffer;\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          Size in bytes of the copy.\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
-  UINT32    *ReturnBuffer;\r
-\r
-  ASSERT ((StartAddress & (sizeof (UINT32) - 1)) == 0);\r
-\r
-  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
-  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
-\r
-  ASSERT ((Length & (sizeof (UINT32) - 1)) == 0);\r
-  ASSERT (((UINTN) Buffer & (sizeof (UINT32) - 1)) == 0);\r
-\r
-  ReturnBuffer = Buffer;\r
-\r
-  while (Length > 0) {\r
-    *(Buffer++) = MmioRead32 (StartAddress);\r
-    StartAddress += sizeof (UINT32);\r
-    Length -= sizeof (UINT32);\r
-  }\r
-\r
-  return ReturnBuffer;\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
\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          Size in bytes of the copy.\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
-  UINT64    *ReturnBuffer;\r
-\r
-  ASSERT ((StartAddress & (sizeof (UINT64) - 1)) == 0);\r
-\r
-  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
-  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
-\r
-  ASSERT ((Length & (sizeof (UINT64) - 1)) == 0);\r
-  ASSERT (((UINTN) Buffer & (sizeof (UINT64) - 1)) == 0);\r
-\r
-  ReturnBuffer = Buffer;\r
-\r
-  while (Length > 0) {\r
-    *(Buffer++) = MmioRead64 (StartAddress);\r
-    StartAddress += sizeof (UINT64);\r
-    Length -= sizeof (UINT64);\r
-  }\r
-\r
-  return ReturnBuffer;\r
-}\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     Size in bytes of the copy.\r
-  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
-\r
-  @return Buffer\r
-\r
-**/\r
-UINT8 *\r
-EFIAPI\r
-MmioWriteBuffer8 (\r
-  IN  UINTN         StartAddress,\r
-  IN  UINTN         Length,\r
-  IN  CONST UINT8   *Buffer\r
-  )\r
-{\r
-  VOID* ReturnBuffer;\r
-\r
-  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
-  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
-\r
-  ReturnBuffer = (UINT8 *) Buffer;\r
-\r
-  while (Length-- > 0) {\r
-     MmioWrite8 (StartAddress++, *(Buffer++));\r
-  }\r
-\r
-  return ReturnBuffer;\r
-\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. 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
-\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     Size in bytes of the copy.\r
-  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
-\r
-  @return Buffer\r
-\r
-**/\r
-UINT16 *\r
-EFIAPI\r
-MmioWriteBuffer16 (\r
-  IN  UINTN        StartAddress,\r
-  IN  UINTN        Length,\r
-  IN  CONST UINT16 *Buffer\r
-  )\r
-{\r
-  UINT16    *ReturnBuffer;\r
-\r
-  ASSERT ((StartAddress & (sizeof (UINT16) - 1)) == 0);\r
-\r
-  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
-  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
-\r
-  ASSERT ((Length & (sizeof (UINT16) - 1)) == 0);\r
-  ASSERT (((UINTN) Buffer & (sizeof (UINT16) - 1)) == 0);\r
-\r
-  ReturnBuffer = (UINT16 *) Buffer;\r
-\r
-  while (Length > 0) {\r
-    MmioWrite16 (StartAddress, *(Buffer++));\r
-\r
-    StartAddress += sizeof (UINT16);\r
-    Length -= sizeof (UINT16);\r
-  }\r
-\r
-  return ReturnBuffer;\r
-}\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. 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
-\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     Size in bytes of the copy.\r
-  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
-\r
-  @return Buffer\r
-\r
-**/\r
-UINT32 *\r
-EFIAPI\r
-MmioWriteBuffer32 (\r
-  IN  UINTN        StartAddress,\r
-  IN  UINTN        Length,\r
-  IN  CONST UINT32 *Buffer\r
-  )\r
-{\r
-  UINT32    *ReturnBuffer;\r
-\r
-  ASSERT ((StartAddress & (sizeof (UINT32) - 1)) == 0);\r
-\r
-  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
-  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
-\r
-  ASSERT ((Length & (sizeof (UINT32) - 1)) == 0);\r
-  ASSERT (((UINTN) Buffer & (sizeof (UINT32) - 1)) == 0);\r
-\r
-  ReturnBuffer = (UINT32 *) Buffer;\r
-\r
-  while (Length > 0) {\r
-    MmioWrite32 (StartAddress, *(Buffer++));\r
-\r
-    StartAddress += sizeof (UINT32);\r
-    Length -= sizeof (UINT32);\r
-  }\r
-\r
-  return ReturnBuffer;\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. 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
-\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     Size in bytes of the copy.\r
-  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
-\r
-  @return Buffer\r
-\r
-**/\r
-UINT64 *\r
-EFIAPI\r
-MmioWriteBuffer64 (\r
-  IN  UINTN        StartAddress,\r
-  IN  UINTN        Length,\r
-  IN  CONST UINT64 *Buffer\r
-  )\r
-{\r
-  UINT64    *ReturnBuffer;\r
-\r
-  ASSERT ((StartAddress & (sizeof (UINT64) - 1)) == 0);\r
-\r
-  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
-  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
-\r
-  ASSERT ((Length & (sizeof (UINT64) - 1)) == 0);\r
-  ASSERT (((UINTN) Buffer & (sizeof (UINT64) - 1)) == 0);\r
-\r
-  ReturnBuffer = (UINT64 *) Buffer;\r
-\r
-  while (Length > 0) {\r
-    MmioWrite64 (StartAddress, *(Buffer++));\r
-\r
-    StartAddress += sizeof (UINT64);\r
-    Length -= sizeof (UINT64);\r
-  }\r
-\r
-  return ReturnBuffer;\r
-}\r
-\r
diff --git a/MdePkg/Library/SmmIoLibCpuIo/SmmCpuIoLibInternal.h b/MdePkg/Library/SmmIoLibCpuIo/SmmCpuIoLibInternal.h
deleted file mode 100644 (file)
index e221bc8..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-/** @file\r
-  Internal include file of SMM CPU IO Library.\r
-  It includes all necessary protocol/library class's header file\r
-  for implementation of IoLib library instance. It is included \r
-  all source code of this library instance.\r
-  \r
-  Copyright (c) 2009, 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:  DxeCpuIoLibInternal.h\r
-\r
-**/\r
-\r
-#ifndef _SMM_CPUIO_LIB_INTERNAL_H_\r
-#define _SMM_CPUIO_LIB_INTERNAL_H_\r
-\r
-\r
-#include <PiSmm.h>\r
-#include <Protocol/SmmCpuIo.h>\r
-#include <Protocol/SmmPciRootBridgeIo.h>\r
-#include <Library/IoLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/SmmServicesTableLib.h>\r
-\r
-\r
-/**\r
-  Reads registers in the EFI CPU I/O space.\r
-\r
-  Reads the I/O port specified by Port with registers width specified by Width.\r
-  The read value is returned. If such operations are not supported, then ASSERT().\r
-  This function must guarantee that all I/O read and write operations are serialized.\r
-\r
-  @param  Port          The base address of the I/O operation.\r
-                        The caller is responsible for aligning the Address if required.\r
-  @param  Width         The width of the I/O operation.\r
-\r
-  @return Data read from registers in the EFI CPU I/O space.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoReadWorker (\r
-  IN      UINTN                     Port,\r
-  IN      EFI_SMM_IO_WIDTH          Width\r
-  );\r
-\r
-/**\r
-  Writes registers in the EFI CPU I/O space.\r
-\r
-  Writes the I/O port specified by Port with registers width and value specified by Width\r
-  and Data respectively.  Data is returned. If such operations are not supported, then ASSERT().\r
-  This function must guarantee that all I/O read and write operations are serialized.\r
-\r
-  @param  Port          The base address of the I/O operation.\r
-                        The caller is responsible for aligning the Address if required.\r
-  @param  Width         The width of the I/O operation.\r
-  @param  Data          The value to write to the I/O port.\r
-\r
-  @return The paramter of Data.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoWriteWorker (\r
-  IN      UINTN                     Port,\r
-  IN      EFI_SMM_IO_WIDTH          Width,\r
-  IN      UINT64                    Data\r
-  );\r
-\r
-/**\r
-  Reads memory-mapped registers in the EFI system memory space.\r
-\r
-  Reads the MMIO registers specified by Address with registers width specified by Width.\r
-  The read value is returned. If such operations are not supported, then ASSERT().\r
-  This function must guarantee that all MMIO read and write operations are serialized.\r
-\r
-  @param  Address       The MMIO register to read.\r
-                        The caller is responsible for aligning the Address if required.\r
-  @param  Width         The width of the I/O operation.\r
-\r
-  @return Data read from registers in the EFI system memory space.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioReadWorker (\r
-  IN      UINTN                     Address,\r
-  IN      EFI_SMM_IO_WIDTH          Width\r
-  );\r
-\r
-/**\r
-  Writes memory-mapped registers in the EFI system memory space.\r
-\r
-  Writes the MMIO registers specified by Address with registers width and value specified by Width\r
-  and Data respectively. Data is returned. If such operations are not supported, then ASSERT().\r
-  This function must guarantee that all MMIO read and write operations are serialized.\r
-\r
-  @param  Address       The MMIO register to read.\r
-                        The caller is responsible for aligning the Address if required.\r
-  @param  Width         The width of the I/O operation.\r
-  @param  Data          The value to write to the I/O port.\r
-  \r
-  @return Data read from registers in the EFI system memory space.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioWriteWorker (\r
-  IN      UINTN                     Address,\r
-  IN      EFI_SMM_IO_WIDTH          Width,\r
-  IN      UINT64                    Data\r
-  );\r
-\r
-#endif\r
diff --git a/MdePkg/Library/SmmIoLibCpuIo/SmmIoLibCpuIo.inf b/MdePkg/Library/SmmIoLibCpuIo/SmmIoLibCpuIo.inf
deleted file mode 100644 (file)
index 7be09dc..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-#/** @file\r
-# Component description file for Cpu Io SMM Io Library.\r
-#\r
-# I/O Library implementation that uses the CPU I/O Protocol for I/O\r
-#  and MMIO operations.\r
-# Copyright (c) 2009, Intel Corporation.\r
-#\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
-#  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
-\r
-[Defines]\r
-  INF_VERSION                    = 0x00010005\r
-  BASE_NAME                      = SmmIoLibCpuIo\r
-  FILE_GUID                      = DEEEA15E-4A77-4513-BA75-71D26FEF78A1\r
-  MODULE_TYPE                    = DXE_SMM_DRIVER\r
-  VERSION_STRING                 = 1.0\r
-  LIBRARY_CLASS                  = IoLib|DXE_SMM_DRIVER SMM_CORE\r
-  EFI_SPECIFICATION_VERSION      = 0x00020000\r
-  PI_SPECIFICATION_VERSION       = 0x0001000A\r
-  \r
-  CONSTRUCTOR                    = IoLibConstructor\r
-\r
-#\r
-# The following information is for reference only and not required by the build tools.\r
-#\r
-#  VALID_ARCHITECTURES           = IA32 X64\r
-#\r
-\r
-[Sources.common]\r
-  IoLibMmioBuffer.c\r
-  SmmCpuIoLibInternal.h\r
-  IoHighLevel.c\r
-  IoLib.c\r
-\r
-\r
-[Packages]\r
-  MdePkg/MdePkg.dec\r
-\r
-[LibraryClasses]\r
-  BaseLib\r
-  DebugLib\r
-  SmmServicesTableLib\r
-\r
-[Protocols]\r
-  gEfiSmmCpuIoProtocolGuid                         ## CONSUMES\r
-  gEfiSmmPciRootBridgeIoProtocolGuid               ## CONSUMES\r
-\r
-[Depex]\r
-  gEfiSmmCpuIoProtocolGuid OR gEfiSmmPciRootBridgeIoProtocolGuid      
\ No newline at end of file
diff --git a/MdePkg/Library/SmmIoLibSmmCpuIo2/IoHighLevel.c b/MdePkg/Library/SmmIoLibSmmCpuIo2/IoHighLevel.c
new file mode 100644 (file)
index 0000000..ae772b8
--- /dev/null
@@ -0,0 +1,2272 @@
+/** @file\r
+  High-level Io/Mmio functions.\r
+\r
+  All assertions for bit field operations are handled bit field functions in the\r
+  Base Library.\r
+\r
+  Copyright (c) 2009 - 2010, Intel Corporation<BR>\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
+  The following IoLib instances share the same version of this file:\r
+\r
+    BaseIoLibIntrinsic\r
+    DxeIoLibCpuIo\r
+    PeiIoLibCpuIo\r
+    SmmIoLibCpuIo\r
+**/\r
+\r
+#include "SmmCpuIoLibInternal.h"\r
+\r
+/**\r
+  Reads an 8-bit I/O port, performs a bitwise OR, and writes the\r
+  result back to the 8-bit I/O port.\r
+\r
+  Reads the 8-bit I/O port specified by Port, performs a bitwise OR\r
+  between the read result and the value specified by OrData, and writes the\r
+  result to the 8-bit I/O port specified by Port. The value written to the I/O\r
+  port is returned. This function must guarantee that all I/O read and write\r
+  operations are serialized.\r
+\r
+  If 8-bit I/O port operations are not supported, 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
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+IoOr8 (\r
+  IN      UINTN                     Port,\r
+  IN      UINT8                     OrData\r
+  )\r
+{\r
+  return IoWrite8 (Port, (UINT8) (IoRead8 (Port) | OrData));\r
+}\r
+\r
+/**\r
+  Reads an 8-bit I/O port, performs a bitwise AND, and writes the result back\r
+  to the 8-bit I/O port.\r
+\r
+  Reads the 8-bit I/O port specified by Port, performs a bitwise AND between\r
+  the read result and the value specified by AndData, and writes the result to\r
+  the 8-bit I/O port specified by Port. The value written to the I/O port is\r
+  returned. This function must guarantee that all I/O read and write operations\r
+  are serialized.\r
+\r
+  If 8-bit I/O port operations are not supported, 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
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+IoAnd8 (\r
+  IN      UINTN                     Port,\r
+  IN      UINT8                     AndData\r
+  )\r
+{\r
+  return IoWrite8 (Port, (UINT8) (IoRead8 (Port) & AndData));\r
+}\r
+\r
+/**\r
+  Reads an 8-bit I/O port, performs a bitwise AND followed by a bitwise\r
+  inclusive OR, and writes the result back to the 8-bit I/O port.\r
+\r
+  Reads the 8-bit I/O port specified by Port, performs a bitwise AND between\r
+  the read result and the value specified by AndData, performs a bitwise OR\r
+  between the result of the AND operation and the value specified by OrData,\r
+  and writes the result to the 8-bit I/O port specified by Port. The value\r
+  written to the I/O port is returned. This function must guarantee that all\r
+  I/O read and write operations are serialized.\r
+\r
+  If 8-bit I/O port operations are not supported, 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
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+IoAndThenOr8 (\r
+  IN      UINTN                     Port,\r
+  IN      UINT8                     AndData,\r
+  IN      UINT8                     OrData\r
+  )\r
+{\r
+  return IoWrite8 (Port, (UINT8) ((IoRead8 (Port) & AndData) | OrData));\r
+}\r
+\r
+/**\r
+  Reads a bit field of an I/O register.\r
+\r
+  Reads the bit field in an 8-bit I/O register. The bit field is specified by\r
+  the StartBit and the EndBit. The value of the bit field is returned.\r
+\r
+  If 8-bit I/O port operations are not supported, then ASSERT().\r
+  If StartBit is greater than 7, then ASSERT().\r
+  If EndBit is greater than 7, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+\r
+  @param  Port      The I/O port to read.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..7.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+IoBitFieldRead8 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit\r
+  )\r
+{\r
+  return BitFieldRead8 (IoRead8 (Port), StartBit, EndBit);\r
+}\r
+\r
+/**\r
+  Writes a bit field to an I/O register.\r
+\r
+  Writes Value to the bit field of the I/O register. The bit field is specified\r
+  by the StartBit and the EndBit. All other bits in the destination I/O\r
+  register are preserved. The value written to the I/O port is returned. Extra\r
+  left bits in Value are stripped.\r
+\r
+  If 8-bit I/O port operations are not supported, then ASSERT().\r
+  If StartBit is greater than 7, then ASSERT().\r
+  If EndBit is greater than 7, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+\r
+  @param  Port      The I/O port to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  Value     New value of the bit field.\r
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+IoBitFieldWrite8 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT8                     Value\r
+  )\r
+{\r
+  return IoWrite8 (\r
+           Port,\r
+           BitFieldWrite8 (IoRead8 (Port), StartBit, EndBit, Value)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in an 8-bit port, performs a bitwise OR, and writes the\r
+  result back to the bit field in the 8-bit port.\r
+\r
+  Reads the 8-bit I/O port specified by Port, performs a bitwise OR\r
+  between the read result and the value specified by OrData, and writes the\r
+  result to the 8-bit I/O port specified by Port. The value written to the I/O\r
+  port is returned. This function must guarantee that all I/O read and write\r
+  operations are serialized. Extra left bits in OrData are stripped.\r
+\r
+  If 8-bit I/O port operations are not supported, then ASSERT().\r
+  If StartBit is greater than 7, then ASSERT().\r
+  If EndBit is greater than 7, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+\r
+  @param  Port      The I/O port to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  OrData    The value to OR with the read value from the I/O port.\r
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+IoBitFieldOr8 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT8                     OrData\r
+  )\r
+{\r
+  return IoWrite8 (\r
+           Port,\r
+           BitFieldOr8 (IoRead8 (Port), StartBit, EndBit, OrData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in an 8-bit port, performs a bitwise AND, and writes the\r
+  result back to the bit field in the 8-bit port.\r
+\r
+  Reads the 8-bit I/O port specified by Port, performs a bitwise AND between\r
+  the read result and the value specified by AndData, and writes the result to\r
+  the 8-bit I/O port specified by Port. The value written to the I/O port is\r
+  returned. This function must guarantee that all I/O read and write operations\r
+  are serialized. Extra left bits in AndData are stripped.\r
+\r
+  If 8-bit I/O port operations are not supported, then ASSERT().\r
+  If StartBit is greater than 7, then ASSERT().\r
+  If EndBit is greater than 7, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+\r
+  @param  Port      The I/O port to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  AndData   The value to AND with the read value from the I/O port.\r
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+IoBitFieldAnd8 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT8                     AndData\r
+  )\r
+{\r
+  return IoWrite8 (\r
+           Port,\r
+           BitFieldAnd8 (IoRead8 (Port), StartBit, EndBit, AndData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in an 8-bit port, performs a bitwise AND followed by a\r
+  bitwise OR, and writes the result back to the bit field in the\r
+  8-bit port.\r
+\r
+  Reads the 8-bit I/O port specified by Port, performs a bitwise AND followed\r
+  by a bitwise OR between the read result and the value specified by\r
+  AndData, and writes the result to the 8-bit I/O port specified by Port. The\r
+  value written to the I/O port is returned. This function must guarantee that\r
+  all I/O read and write operations are serialized. Extra left bits in both\r
+  AndData and OrData are stripped.\r
+\r
+  If 8-bit I/O port operations are not supported, then ASSERT().\r
+  If StartBit is greater than 7, then ASSERT().\r
+  If EndBit is greater than 7, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+\r
+  @param  Port      The I/O port to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..7.\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
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+IoBitFieldAndThenOr8 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT8                     AndData,\r
+  IN      UINT8                     OrData\r
+  )\r
+{\r
+  return IoWrite8 (\r
+           Port,\r
+           BitFieldAndThenOr8 (IoRead8 (Port), StartBit, EndBit, AndData, OrData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a 16-bit I/O port, performs a bitwise OR, and writes the\r
+  result back to the 16-bit I/O port.\r
+\r
+  Reads the 16-bit I/O port specified by Port, performs a bitwise OR\r
+  between the read result and the value specified by OrData, and writes the\r
+  result to the 16-bit I/O port specified by Port. The value written to the I/O\r
+  port is returned. This function must guarantee that all I/O read and write\r
+  operations are serialized.\r
+\r
+  If 16-bit I/O port operations are not supported, 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
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+IoOr16 (\r
+  IN      UINTN                     Port,\r
+  IN      UINT16                    OrData\r
+  )\r
+{\r
+  return IoWrite16 (Port, (UINT16) (IoRead16 (Port) | OrData));\r
+}\r
+\r
+/**\r
+  Reads a 16-bit I/O port, performs a bitwise AND, and writes the result back\r
+  to the 16-bit I/O port.\r
+\r
+  Reads the 16-bit I/O port specified by Port, performs a bitwise AND between\r
+  the read result and the value specified by AndData, and writes the result to\r
+  the 16-bit I/O port specified by Port. The value written to the I/O port is\r
+  returned. This function must guarantee that all I/O read and write operations\r
+  are serialized.\r
+\r
+  If 16-bit I/O port operations are not supported, 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
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+IoAnd16 (\r
+  IN      UINTN                     Port,\r
+  IN      UINT16                    AndData\r
+  )\r
+{\r
+  return IoWrite16 (Port, (UINT16) (IoRead16 (Port) & AndData));\r
+}\r
+\r
+/**\r
+  Reads a 16-bit I/O port, performs a bitwise AND followed by a bitwise\r
+  inclusive OR, and writes the result back to the 16-bit I/O port.\r
+\r
+  Reads the 16-bit I/O port specified by Port, performs a bitwise AND between\r
+  the read result and the value specified by AndData, performs a bitwise OR\r
+  between the result of the AND operation and the value specified by OrData,\r
+  and writes the result to the 16-bit I/O port specified by Port. The value\r
+  written to the I/O port is returned. This function must guarantee that all\r
+  I/O read and write operations are serialized.\r
+\r
+  If 16-bit I/O port operations are not supported, 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
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+IoAndThenOr16 (\r
+  IN      UINTN                     Port,\r
+  IN      UINT16                    AndData,\r
+  IN      UINT16                    OrData\r
+  )\r
+{\r
+  return IoWrite16 (Port, (UINT16) ((IoRead16 (Port) & AndData) | OrData));\r
+}\r
+\r
+/**\r
+  Reads a bit field of an I/O register.\r
+\r
+  Reads the bit field in a 16-bit I/O register. The bit field is specified by\r
+  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 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
+\r
+  @param  Port      The I/O port to read.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..15.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+IoBitFieldRead16 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit\r
+  )\r
+{\r
+  return BitFieldRead16 (IoRead16 (Port), StartBit, EndBit);\r
+}\r
+\r
+/**\r
+  Writes a bit field to an I/O register.\r
+\r
+  Writes Value to the bit field of the I/O register. The bit field is specified\r
+  by the StartBit and the EndBit. All other bits in the destination I/O\r
+  register are preserved. The value written to the I/O port is returned. Extra\r
+  left bits in Value are stripped.\r
+\r
+  If 16-bit I/O port operations are not supported, 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
+\r
+  @param  Port      The I/O port to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  Value     New value of the bit field.\r
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+IoBitFieldWrite16 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT16                    Value\r
+  )\r
+{\r
+  return IoWrite16 (\r
+           Port,\r
+           BitFieldWrite16 (IoRead16 (Port), StartBit, EndBit, Value)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 16-bit port, performs a bitwise OR, and writes the\r
+  result back to the bit field in the 16-bit port.\r
+\r
+  Reads the 16-bit I/O port specified by Port, performs a bitwise OR\r
+  between the read result and the value specified by OrData, and writes the\r
+  result to the 16-bit I/O port specified by Port. The value written to the I/O\r
+  port is returned. This function must guarantee that all I/O read and write\r
+  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 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
+\r
+  @param  Port      The I/O port to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  OrData    The value to OR with the read value from the I/O port.\r
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+IoBitFieldOr16 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT16                    OrData\r
+  )\r
+{\r
+  return IoWrite16 (\r
+           Port,\r
+           BitFieldOr16 (IoRead16 (Port), StartBit, EndBit, OrData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 16-bit port, performs a bitwise AND, and writes the\r
+  result back to the bit field in the 16-bit port.\r
+\r
+  Reads the 16-bit I/O port specified by Port, performs a bitwise AND between\r
+  the read result and the value specified by AndData, and writes the result to\r
+  the 16-bit I/O port specified by Port. The value written to the I/O port is\r
+  returned. This function must guarantee that all I/O read and write operations\r
+  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 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
+\r
+  @param  Port      The I/O port to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  AndData   The value to AND with the read value from the I/O port.\r
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+IoBitFieldAnd16 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT16                    AndData\r
+  )\r
+{\r
+  return IoWrite16 (\r
+           Port,\r
+           BitFieldAnd16 (IoRead16 (Port), StartBit, EndBit, AndData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 16-bit port, performs a bitwise AND followed by a\r
+  bitwise OR, and writes the result back to the bit field in the\r
+  16-bit port.\r
+\r
+  Reads the 16-bit I/O port specified by Port, performs a bitwise AND followed\r
+  by a bitwise OR between the read result and the value specified by\r
+  AndData, and writes the result to the 16-bit I/O port specified by Port. The\r
+  value written to the I/O port is returned. This function must guarantee that\r
+  all I/O read and write operations are serialized. Extra left bits in both\r
+  AndData and OrData are stripped.\r
+\r
+  If 16-bit I/O port operations are not supported, 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
+\r
+  @param  Port      The I/O port to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..15.\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
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+IoBitFieldAndThenOr16 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT16                    AndData,\r
+  IN      UINT16                    OrData\r
+  )\r
+{\r
+  return IoWrite16 (\r
+           Port,\r
+           BitFieldAndThenOr16 (IoRead16 (Port), StartBit, EndBit, AndData, OrData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a 32-bit I/O port, performs a bitwise OR, and writes the\r
+  result back to the 32-bit I/O port.\r
+\r
+  Reads the 32-bit I/O port specified by Port, performs a bitwise OR\r
+  between the read result and the value specified by OrData, and writes the\r
+  result to the 32-bit I/O port specified by Port. The value written to the I/O\r
+  port is returned. This function must guarantee that all I/O read and write\r
+  operations are serialized.\r
+\r
+  If 32-bit I/O port operations are not supported, 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
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+IoOr32 (\r
+  IN      UINTN                     Port,\r
+  IN      UINT32                    OrData\r
+  )\r
+{\r
+  return IoWrite32 (Port, IoRead32 (Port) | OrData);\r
+}\r
+\r
+/**\r
+  Reads a 32-bit I/O port, performs a bitwise AND, and writes the result back\r
+  to the 32-bit I/O port.\r
+\r
+  Reads the 32-bit I/O port specified by Port, performs a bitwise AND between\r
+  the read result and the value specified by AndData, and writes the result to\r
+  the 32-bit I/O port specified by Port. The value written to the I/O port is\r
+  returned. This function must guarantee that all I/O read and write operations\r
+  are serialized.\r
+\r
+  If 32-bit I/O port operations are not supported, 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
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+IoAnd32 (\r
+  IN      UINTN                     Port,\r
+  IN      UINT32                    AndData\r
+  )\r
+{\r
+  return IoWrite32 (Port, IoRead32 (Port) & AndData);\r
+}\r
+\r
+/**\r
+  Reads a 32-bit I/O port, performs a bitwise AND followed by a bitwise\r
+  inclusive OR, and writes the result back to the 32-bit I/O port.\r
+\r
+  Reads the 32-bit I/O port specified by Port, performs a bitwise AND between\r
+  the read result and the value specified by AndData, performs a bitwise OR\r
+  between the result of the AND operation and the value specified by OrData,\r
+  and writes the result to the 32-bit I/O port specified by Port. The value\r
+  written to the I/O port is returned. This function must guarantee that all\r
+  I/O read and write operations are serialized.\r
+\r
+  If 32-bit I/O port operations are not supported, 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
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+IoAndThenOr32 (\r
+  IN      UINTN                     Port,\r
+  IN      UINT32                    AndData,\r
+  IN      UINT32                    OrData\r
+  )\r
+{\r
+  return IoWrite32 (Port, (IoRead32 (Port) & AndData) | OrData);\r
+}\r
+\r
+/**\r
+  Reads a bit field of an I/O register.\r
+\r
+  Reads the bit field in a 32-bit I/O register. The bit field is specified by\r
+  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 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
+\r
+  @param  Port      The I/O port to read.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+IoBitFieldRead32 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit\r
+  )\r
+{\r
+  return BitFieldRead32 (IoRead32 (Port), StartBit, EndBit);\r
+}\r
+\r
+/**\r
+  Writes a bit field to an I/O register.\r
+\r
+  Writes Value to the bit field of the I/O register. The bit field is specified\r
+  by the StartBit and the EndBit. All other bits in the destination I/O\r
+  register are preserved. The value written to the I/O port is returned. Extra\r
+  left bits in Value are stripped.\r
+\r
+  If 32-bit I/O port operations are not supported, 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
+\r
+  @param  Port      The I/O port to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  Value     New value of the bit field.\r
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+IoBitFieldWrite32 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT32                    Value\r
+  )\r
+{\r
+  return IoWrite32 (\r
+           Port,\r
+           BitFieldWrite32 (IoRead32 (Port), StartBit, EndBit, Value)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 32-bit port, performs a bitwise OR, and writes the\r
+  result back to the bit field in the 32-bit port.\r
+\r
+  Reads the 32-bit I/O port specified by Port, performs a bitwise OR\r
+  between the read result and the value specified by OrData, and writes the\r
+  result to the 32-bit I/O port specified by Port. The value written to the I/O\r
+  port is returned. This function must guarantee that all I/O read and write\r
+  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 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
+\r
+  @param  Port      The I/O port to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  OrData    The value to OR with the read value from the I/O port.\r
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+IoBitFieldOr32 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT32                    OrData\r
+  )\r
+{\r
+  return IoWrite32 (\r
+           Port,\r
+           BitFieldOr32 (IoRead32 (Port), StartBit, EndBit, OrData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 32-bit port, performs a bitwise AND, and writes the\r
+  result back to the bit field in the 32-bit port.\r
+\r
+  Reads the 32-bit I/O port specified by Port, performs a bitwise AND between\r
+  the read result and the value specified by AndData, and writes the result to\r
+  the 32-bit I/O port specified by Port. The value written to the I/O port is\r
+  returned. This function must guarantee that all I/O read and write operations\r
+  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 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
+\r
+  @param  Port      The I/O port to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  AndData   The value to AND with the read value from the I/O port.\r
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+IoBitFieldAnd32 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT32                    AndData\r
+  )\r
+{\r
+  return IoWrite32 (\r
+           Port,\r
+           BitFieldAnd32 (IoRead32 (Port), StartBit, EndBit, AndData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 32-bit port, performs a bitwise AND followed by a\r
+  bitwise OR, and writes the result back to the bit field in the\r
+  32-bit port.\r
+\r
+  Reads the 32-bit I/O port specified by Port, performs a bitwise AND followed\r
+  by a bitwise OR between the read result and the value specified by\r
+  AndData, and writes the result to the 32-bit I/O port specified by Port. The\r
+  value written to the I/O port is returned. This function must guarantee that\r
+  all I/O read and write operations are serialized. Extra left bits in both\r
+  AndData and OrData are stripped.\r
+\r
+  If 32-bit I/O port operations are not supported, 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
+\r
+  @param  Port      The I/O port to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\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
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+IoBitFieldAndThenOr32 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT32                    AndData,\r
+  IN      UINT32                    OrData\r
+  )\r
+{\r
+  return IoWrite32 (\r
+           Port,\r
+           BitFieldAndThenOr32 (IoRead32 (Port), StartBit, EndBit, AndData, OrData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a 64-bit I/O port, performs a bitwise OR, and writes the\r
+  result back to the 64-bit I/O port.\r
+\r
+  Reads the 64-bit I/O port specified by Port, performs a bitwise OR\r
+  between the read result and the value specified by OrData, and writes the\r
+  result to the 64-bit I/O port specified by Port. The value written to the I/O\r
+  port is returned. This function must guarantee that all I/O read and write\r
+  operations are serialized.\r
+\r
+  If 64-bit I/O port operations are not supported, 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
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+IoOr64 (\r
+  IN      UINTN                     Port,\r
+  IN      UINT64                    OrData\r
+  )\r
+{\r
+  return IoWrite64 (Port, IoRead64 (Port) | OrData);\r
+}\r
+\r
+/**\r
+  Reads a 64-bit I/O port, performs a bitwise AND, and writes the result back\r
+  to the 64-bit I/O port.\r
+\r
+  Reads the 64-bit I/O port specified by Port, performs a bitwise AND between\r
+  the read result and the value specified by AndData, and writes the result to\r
+  the 64-bit I/O port specified by Port. The value written to the I/O port is\r
+  returned. This function must guarantee that all I/O read and write operations\r
+  are serialized.\r
+\r
+  If 64-bit I/O port operations are not supported, 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
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+IoAnd64 (\r
+  IN      UINTN                     Port,\r
+  IN      UINT64                    AndData\r
+  )\r
+{\r
+  return IoWrite64 (Port, IoRead64 (Port) & AndData);\r
+}\r
+\r
+/**\r
+  Reads a 64-bit I/O port, performs a bitwise AND followed by a bitwise\r
+  inclusive OR, and writes the result back to the 64-bit I/O port.\r
+\r
+  Reads the 64-bit I/O port specified by Port, performs a bitwise AND between\r
+  the read result and the value specified by AndData, performs a bitwise OR\r
+  between the result of the AND operation and the value specified by OrData,\r
+  and writes the result to the 64-bit I/O port specified by Port. The value\r
+  written to the I/O port is returned. This function must guarantee that all\r
+  I/O read and write operations are serialized.\r
+\r
+  If 64-bit I/O port operations are not supported, 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
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+IoAndThenOr64 (\r
+  IN      UINTN                     Port,\r
+  IN      UINT64                    AndData,\r
+  IN      UINT64                    OrData\r
+  )\r
+{\r
+  return IoWrite64 (Port, (IoRead64 (Port) & AndData) | OrData);\r
+}\r
+\r
+/**\r
+  Reads a bit field of an I/O register.\r
+\r
+  Reads the bit field in a 64-bit I/O register. The bit field is specified by\r
+  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 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
+\r
+  @param  Port      The I/O port to read.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+IoBitFieldRead64 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit\r
+  )\r
+{\r
+  return BitFieldRead64 (IoRead64 (Port), StartBit, EndBit);\r
+}\r
+\r
+/**\r
+  Writes a bit field to an I/O register.\r
+\r
+  Writes Value to the bit field of the I/O register. The bit field is specified\r
+  by the StartBit and the EndBit. All other bits in the destination I/O\r
+  register are preserved. The value written to the I/O port is returned. Extra\r
+  left bits in Value are stripped.\r
+\r
+  If 64-bit I/O port operations are not supported, 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
+\r
+  @param  Port      The I/O port to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  Value     New value of the bit field.\r
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+IoBitFieldWrite64 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT64                    Value\r
+  )\r
+{\r
+  return IoWrite64 (\r
+           Port,\r
+           BitFieldWrite64 (IoRead64 (Port), StartBit, EndBit, Value)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 64-bit port, performs a bitwise OR, and writes the\r
+  result back to the bit field in the 64-bit port.\r
+\r
+  Reads the 64-bit I/O port specified by Port, performs a bitwise OR\r
+  between the read result and the value specified by OrData, and writes the\r
+  result to the 64-bit I/O port specified by Port. The value written to the I/O\r
+  port is returned. This function must guarantee that all I/O read and write\r
+  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 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
+\r
+  @param  Port      The I/O port to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  OrData    The value to OR with the read value from the I/O port.\r
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+IoBitFieldOr64 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT64                    OrData\r
+  )\r
+{\r
+  return IoWrite64 (\r
+           Port,\r
+           BitFieldOr64 (IoRead64 (Port), StartBit, EndBit, OrData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 64-bit port, performs a bitwise AND, and writes the\r
+  result back to the bit field in the 64-bit port.\r
+\r
+  Reads the 64-bit I/O port specified by Port, performs a bitwise AND between\r
+  the read result and the value specified by AndData, and writes the result to\r
+  the 64-bit I/O port specified by Port. The value written to the I/O port is\r
+  returned. This function must guarantee that all I/O read and write operations\r
+  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 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
+\r
+  @param  Port      The I/O port to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  AndData   The value to AND with the read value from the I/O port.\r
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+IoBitFieldAnd64 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT64                    AndData\r
+  )\r
+{\r
+  return IoWrite64 (\r
+           Port,\r
+           BitFieldAnd64 (IoRead64 (Port), StartBit, EndBit, AndData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 64-bit port, performs a bitwise AND followed by a\r
+  bitwise OR, and writes the result back to the bit field in the\r
+  64-bit port.\r
+\r
+  Reads the 64-bit I/O port specified by Port, performs a bitwise AND followed\r
+  by a bitwise OR between the read result and the value specified by\r
+  AndData, and writes the result to the 64-bit I/O port specified by Port. The\r
+  value written to the I/O port is returned. This function must guarantee that\r
+  all I/O read and write operations are serialized. Extra left bits in both\r
+  AndData and OrData are stripped.\r
+\r
+  If 64-bit I/O port operations are not supported, 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
+\r
+  @param  Port      The I/O port to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\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
+\r
+  @return The value written back to the I/O port.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+IoBitFieldAndThenOr64 (\r
+  IN      UINTN                     Port,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT64                    AndData,\r
+  IN      UINT64                    OrData\r
+  )\r
+{\r
+  return IoWrite64 (\r
+           Port,\r
+           BitFieldAndThenOr64 (IoRead64 (Port), StartBit, EndBit, AndData, OrData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads an 8-bit MMIO register, performs a bitwise OR, and writes the\r
+  result back to the 8-bit MMIO register.\r
+\r
+  Reads the 8-bit MMIO register specified by Address, performs a bitwise\r
+  inclusive OR between the read result and the value specified by OrData, and\r
+  writes the result to the 8-bit MMIO register specified by Address. The value\r
+  written to the MMIO register is returned. This function must guarantee that\r
+  all MMIO read and write operations are serialized.\r
+\r
+  If 8-bit MMIO register operations are not supported, 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
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+MmioOr8 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT8                     OrData\r
+  )\r
+{\r
+  return MmioWrite8 (Address, (UINT8) (MmioRead8 (Address) | OrData));\r
+}\r
+\r
+/**\r
+  Reads an 8-bit MMIO register, performs a bitwise AND, and writes the result\r
+  back to the 8-bit MMIO register.\r
+\r
+  Reads the 8-bit MMIO register specified by Address, performs a bitwise AND\r
+  between the read result and the value specified by AndData, and writes the\r
+  result to the 8-bit MMIO register specified by Address. The value written to\r
+  the MMIO register is returned. This function must guarantee that all MMIO\r
+  read and write operations are serialized.\r
+\r
+  If 8-bit MMIO register operations are not supported, 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
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+MmioAnd8 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT8                     AndData\r
+  )\r
+{\r
+  return MmioWrite8 (Address, (UINT8) (MmioRead8 (Address) & AndData));\r
+}\r
+\r
+/**\r
+  Reads an 8-bit MMIO register, performs a bitwise AND followed by a bitwise\r
+  inclusive OR, and writes the result back to the 8-bit MMIO register.\r
+\r
+  Reads the 8-bit MMIO register specified by Address, performs a bitwise AND\r
+  between the read result and the value specified by AndData, performs a\r
+  bitwise OR between the result of the AND operation and the value specified by\r
+  OrData, and writes the result to the 8-bit MMIO register specified by\r
+  Address. The value written to the MMIO register is returned. This function\r
+  must guarantee that all MMIO read and write operations are serialized.\r
+\r
+  If 8-bit MMIO register operations are not supported, then ASSERT().\r
+\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
+  @param  OrData  The value to OR with the result of the AND operation.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+MmioAndThenOr8 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT8                     AndData,\r
+  IN      UINT8                     OrData\r
+  )\r
+{\r
+  return MmioWrite8 (Address, (UINT8) ((MmioRead8 (Address) & AndData) | OrData));\r
+}\r
+\r
+/**\r
+  Reads a bit field of a MMIO register.\r
+\r
+  Reads the bit field in an 8-bit MMIO register. The bit field is specified by\r
+  the StartBit and the EndBit. The value of the bit field is returned.\r
+\r
+  If 8-bit MMIO register operations are not supported, then ASSERT().\r
+  If StartBit is greater than 7, then ASSERT().\r
+  If EndBit is greater than 7, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+\r
+  @param  Address   MMIO register to read.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..7.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+MmioBitFieldRead8 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit\r
+  )\r
+{\r
+  return BitFieldRead8 (MmioRead8 (Address), StartBit, EndBit);\r
+}\r
+\r
+/**\r
+  Writes a bit field to a MMIO register.\r
+\r
+  Writes Value to the bit field of the MMIO register. The bit field is\r
+  specified by the StartBit and the EndBit. All other bits in the destination\r
+  MMIO register are preserved. The new value of the 8-bit register is returned.\r
+\r
+  If 8-bit MMIO register operations are not supported, then ASSERT().\r
+  If StartBit is greater than 7, then ASSERT().\r
+  If EndBit is greater than 7, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+\r
+  @param  Address   MMIO register to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  Value     New value of the bit field.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+MmioBitFieldWrite8 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT8                     Value\r
+  )\r
+{\r
+  return MmioWrite8 (\r
+           Address,\r
+           BitFieldWrite8 (MmioRead8 (Address), StartBit, EndBit, Value)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in an 8-bit MMIO register, performs a bitwise OR, and\r
+  writes the result back to the bit field in the 8-bit MMIO register.\r
+\r
+  Reads the 8-bit MMIO register specified by Address, performs a bitwise\r
+  inclusive OR between the read result and the value specified by OrData, and\r
+  writes the result to the 8-bit MMIO register specified by Address. The value\r
+  written to the MMIO register is returned. This function must guarantee that\r
+  all MMIO read and write operations are serialized. Extra left bits in OrData\r
+  are stripped.\r
+\r
+  If 8-bit MMIO register operations are not supported, then ASSERT().\r
+  If StartBit is greater than 7, then ASSERT().\r
+  If EndBit is greater than 7, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+\r
+  @param  Address   MMIO register to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  OrData    The value to OR with read value from the MMIO register.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+MmioBitFieldOr8 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT8                     OrData\r
+  )\r
+{\r
+  return MmioWrite8 (\r
+           Address,\r
+           BitFieldOr8 (MmioRead8 (Address), StartBit, EndBit, OrData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in an 8-bit MMIO register, performs a bitwise AND, and\r
+  writes the result back to the bit field in the 8-bit MMIO register.\r
+\r
+  Reads the 8-bit MMIO register specified by Address, performs a bitwise AND\r
+  between the read result and the value specified by AndData, and writes the\r
+  result to the 8-bit MMIO register specified by Address. The value written to\r
+  the MMIO register is returned. This function must guarantee that all MMIO\r
+  read and write operations are serialized. Extra left bits in AndData are\r
+  stripped.\r
+\r
+  If 8-bit MMIO register operations are not supported, then ASSERT().\r
+  If StartBit is greater than 7, then ASSERT().\r
+  If EndBit is greater than 7, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+\r
+  @param  Address   MMIO register to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  AndData   The value to AND with read value from the MMIO register.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+MmioBitFieldAnd8 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT8                     AndData\r
+  )\r
+{\r
+  return MmioWrite8 (\r
+           Address,\r
+           BitFieldAnd8 (MmioRead8 (Address), StartBit, EndBit, AndData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in an 8-bit MMIO register, performs a bitwise AND followed\r
+  by a bitwise OR, and writes the result back to the bit field in the\r
+  8-bit MMIO register.\r
+\r
+  Reads the 8-bit MMIO register specified by Address, performs a bitwise AND\r
+  followed by a bitwise OR between the read result and the value\r
+  specified by AndData, and writes the result to the 8-bit MMIO register\r
+  specified by Address. The value written to the MMIO register is returned.\r
+  This function must guarantee that all MMIO read and write operations are\r
+  serialized. Extra left bits in both AndData and OrData are stripped.\r
+\r
+  If 8-bit MMIO register operations are not supported, then ASSERT().\r
+  If StartBit is greater than 7, then ASSERT().\r
+  If EndBit is greater than 7, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+\r
+  @param  Address   MMIO register to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  AndData   The value to AND with read value from the MMIO register.\r
+  @param  OrData    The value to OR with the result of the AND operation.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+MmioBitFieldAndThenOr8 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT8                     AndData,\r
+  IN      UINT8                     OrData\r
+  )\r
+{\r
+  return MmioWrite8 (\r
+           Address,\r
+           BitFieldAndThenOr8 (MmioRead8 (Address), StartBit, EndBit, AndData, OrData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a 16-bit MMIO register, performs a bitwise OR, and writes the\r
+  result back to the 16-bit MMIO register.\r
+\r
+  Reads the 16-bit MMIO register specified by Address, performs a bitwise\r
+  inclusive OR between the read result and the value specified by OrData, and\r
+  writes the result to the 16-bit MMIO register specified by Address. The value\r
+  written to the MMIO register is returned. This function must guarantee that\r
+  all MMIO read and write operations are serialized.\r
+\r
+  If 16-bit MMIO register operations are not supported, 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
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+MmioOr16 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT16                    OrData\r
+  )\r
+{\r
+  return MmioWrite16 (Address, (UINT16) (MmioRead16 (Address) | OrData));\r
+}\r
+\r
+/**\r
+  Reads a 16-bit MMIO register, performs a bitwise AND, and writes the result\r
+  back to the 16-bit MMIO register.\r
+\r
+  Reads the 16-bit MMIO register specified by Address, performs a bitwise AND\r
+  between the read result and the value specified by AndData, and writes the\r
+  result to the 16-bit MMIO register specified by Address. The value written to\r
+  the MMIO register is returned. This function must guarantee that all MMIO\r
+  read and write operations are serialized.\r
+\r
+  If 16-bit MMIO register operations are not supported, 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
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+MmioAnd16 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT16                    AndData\r
+  )\r
+{\r
+  return MmioWrite16 (Address, (UINT16) (MmioRead16 (Address) & AndData));\r
+}\r
+\r
+/**\r
+  Reads a 16-bit MMIO register, performs a bitwise AND followed by a bitwise\r
+  inclusive OR, and writes the result back to the 16-bit MMIO register.\r
+\r
+  Reads the 16-bit MMIO register specified by Address, performs a bitwise AND\r
+  between the read result and the value specified by AndData, performs a\r
+  bitwise OR between the result of the AND operation and the value specified by\r
+  OrData, and writes the result to the 16-bit MMIO register specified by\r
+  Address. The value written to the MMIO register is returned. This function\r
+  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
+\r
+  @param  Address The MMIO register to write.\r
+  @param  AndData The value to AND with the read value from the MMIO register.\r
+  @param  OrData  The value to OR with the result of the AND operation.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+MmioAndThenOr16 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT16                    AndData,\r
+  IN      UINT16                    OrData\r
+  )\r
+{\r
+  return MmioWrite16 (Address, (UINT16) ((MmioRead16 (Address) & AndData) | OrData));\r
+}\r
+\r
+/**\r
+  Reads a bit field of a MMIO register.\r
+\r
+  Reads the bit field in a 16-bit MMIO register. The bit field is specified by\r
+  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 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
+\r
+  @param  Address   MMIO register to read.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..15.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+MmioBitFieldRead16 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit\r
+  )\r
+{\r
+  return BitFieldRead16 (MmioRead16 (Address), StartBit, EndBit);\r
+}\r
+\r
+/**\r
+  Writes a bit field to a MMIO register.\r
+\r
+  Writes Value to the bit field of the MMIO register. The bit field is\r
+  specified by the StartBit and the EndBit. All other bits in the destination\r
+  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 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
+\r
+  @param  Address   MMIO register to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  Value     New value of the bit field.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+MmioBitFieldWrite16 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT16                    Value\r
+  )\r
+{\r
+  return MmioWrite16 (\r
+           Address,\r
+           BitFieldWrite16 (MmioRead16 (Address), StartBit, EndBit, Value)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 16-bit MMIO register, performs a bitwise OR, and\r
+  writes the result back to the bit field in the 16-bit MMIO register.\r
+\r
+  Reads the 16-bit MMIO register specified by Address, performs a bitwise\r
+  inclusive OR between the read result and the value specified by OrData, and\r
+  writes the result to the 16-bit MMIO register specified by Address. The value\r
+  written to the MMIO register is returned. This function must guarantee that\r
+  all MMIO read and write operations are serialized. Extra left bits in OrData\r
+  are stripped.\r
+\r
+  If 16-bit MMIO register operations are not supported, 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
+\r
+  @param  Address   MMIO register to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  OrData    The value to OR with read value from the MMIO register.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+MmioBitFieldOr16 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT16                    OrData\r
+  )\r
+{\r
+  return MmioWrite16 (\r
+           Address,\r
+           BitFieldOr16 (MmioRead16 (Address), StartBit, EndBit, OrData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 16-bit MMIO register, performs a bitwise AND, and\r
+  writes the result back to the bit field in the 16-bit MMIO register.\r
+\r
+  Reads the 16-bit MMIO register specified by Address, performs a bitwise AND\r
+  between the read result and the value specified by AndData, and writes the\r
+  result to the 16-bit MMIO register specified by Address. The value written to\r
+  the MMIO register is returned. This function must guarantee that all MMIO\r
+  read and write operations are serialized. Extra left bits in AndData are\r
+  stripped.\r
+\r
+  If 16-bit MMIO register operations are not supported, 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
+\r
+  @param  Address   MMIO register to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  AndData   The value to AND with read value from the MMIO register.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+MmioBitFieldAnd16 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT16                    AndData\r
+  )\r
+{\r
+  return MmioWrite16 (\r
+           Address,\r
+           BitFieldAnd16 (MmioRead16 (Address), StartBit, EndBit, AndData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 16-bit MMIO register, performs a bitwise AND followed\r
+  by a bitwise OR, and writes the result back to the bit field in the\r
+  16-bit MMIO register.\r
+\r
+  Reads the 16-bit MMIO register specified by Address, performs a bitwise AND\r
+  followed by a bitwise OR between the read result and the value\r
+  specified by AndData, and writes the result to the 16-bit MMIO register\r
+  specified by Address. The value written to the MMIO register is returned.\r
+  This function must guarantee that all MMIO read and write operations are\r
+  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 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
+\r
+  @param  Address   MMIO register to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  AndData   The value to AND with read value from the MMIO register.\r
+  @param  OrData    The value to OR with the result of the AND operation.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+MmioBitFieldAndThenOr16 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT16                    AndData,\r
+  IN      UINT16                    OrData\r
+  )\r
+{\r
+  return MmioWrite16 (\r
+           Address,\r
+           BitFieldAndThenOr16 (MmioRead16 (Address), StartBit, EndBit, AndData, OrData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a 32-bit MMIO register, performs a bitwise OR, and writes the\r
+  result back to the 32-bit MMIO register.\r
+\r
+  Reads the 32-bit MMIO register specified by Address, performs a bitwise\r
+  inclusive OR between the read result and the value specified by OrData, and\r
+  writes the result to the 32-bit MMIO register specified by Address. The value\r
+  written to the MMIO register is returned. This function must guarantee that\r
+  all MMIO read and write operations are serialized.\r
+\r
+  If 32-bit MMIO register operations are not supported, 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
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+MmioOr32 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT32                    OrData\r
+  )\r
+{\r
+  return MmioWrite32 (Address, MmioRead32 (Address) | OrData);\r
+}\r
+\r
+/**\r
+  Reads a 32-bit MMIO register, performs a bitwise AND, and writes the result\r
+  back to the 32-bit MMIO register.\r
+\r
+  Reads the 32-bit MMIO register specified by Address, performs a bitwise AND\r
+  between the read result and the value specified by AndData, and writes the\r
+  result to the 32-bit MMIO register specified by Address. The value written to\r
+  the MMIO register is returned. This function must guarantee that all MMIO\r
+  read and write operations are serialized.\r
+\r
+  If 32-bit MMIO register operations are not supported, 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
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+MmioAnd32 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT32                    AndData\r
+  )\r
+{\r
+  return MmioWrite32 (Address, MmioRead32 (Address) & AndData);\r
+}\r
+\r
+/**\r
+  Reads a 32-bit MMIO register, performs a bitwise AND followed by a bitwise\r
+  inclusive OR, and writes the result back to the 32-bit MMIO register.\r
+\r
+  Reads the 32-bit MMIO register specified by Address, performs a bitwise AND\r
+  between the read result and the value specified by AndData, performs a\r
+  bitwise OR between the result of the AND operation and the value specified by\r
+  OrData, and writes the result to the 32-bit MMIO register specified by\r
+  Address. The value written to the MMIO register is returned. This function\r
+  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
+\r
+  @param  Address The MMIO register to write.\r
+  @param  AndData The value to AND with the read value from the MMIO register.\r
+  @param  OrData  The value to OR with the result of the AND operation.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+MmioAndThenOr32 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT32                    AndData,\r
+  IN      UINT32                    OrData\r
+  )\r
+{\r
+  return MmioWrite32 (Address, (MmioRead32 (Address) & AndData) | OrData);\r
+}\r
+\r
+/**\r
+  Reads a bit field of a MMIO register.\r
+\r
+  Reads the bit field in a 32-bit MMIO register. The bit field is specified by\r
+  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 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
+\r
+  @param  Address   MMIO register to read.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+MmioBitFieldRead32 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit\r
+  )\r
+{\r
+  return BitFieldRead32 (MmioRead32 (Address), StartBit, EndBit);\r
+}\r
+\r
+/**\r
+  Writes a bit field to a MMIO register.\r
+\r
+  Writes Value to the bit field of the MMIO register. The bit field is\r
+  specified by the StartBit and the EndBit. All other bits in the destination\r
+  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 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
+\r
+  @param  Address   MMIO register to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  Value     New value of the bit field.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+MmioBitFieldWrite32 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT32                    Value\r
+  )\r
+{\r
+  return MmioWrite32 (\r
+           Address,\r
+           BitFieldWrite32 (MmioRead32 (Address), StartBit, EndBit, Value)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 32-bit MMIO register, performs a bitwise OR, and\r
+  writes the result back to the bit field in the 32-bit MMIO register.\r
+\r
+  Reads the 32-bit MMIO register specified by Address, performs a bitwise\r
+  inclusive OR between the read result and the value specified by OrData, and\r
+  writes the result to the 32-bit MMIO register specified by Address. The value\r
+  written to the MMIO register is returned. This function must guarantee that\r
+  all MMIO read and write operations are serialized. Extra left bits in OrData\r
+  are stripped.\r
+\r
+  If 32-bit MMIO register operations are not supported, 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
+\r
+  @param  Address   MMIO register to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  OrData    The value to OR with read value from the MMIO register.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+MmioBitFieldOr32 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT32                    OrData\r
+  )\r
+{\r
+  return MmioWrite32 (\r
+           Address,\r
+           BitFieldOr32 (MmioRead32 (Address), StartBit, EndBit, OrData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 32-bit MMIO register, performs a bitwise AND, and\r
+  writes the result back to the bit field in the 32-bit MMIO register.\r
+\r
+  Reads the 32-bit MMIO register specified by Address, performs a bitwise AND\r
+  between the read result and the value specified by AndData, and writes the\r
+  result to the 32-bit MMIO register specified by Address. The value written to\r
+  the MMIO register is returned. This function must guarantee that all MMIO\r
+  read and write operations are serialized. Extra left bits in AndData are\r
+  stripped.\r
+\r
+  If 32-bit MMIO register operations are not supported, 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
+\r
+  @param  Address   MMIO register to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  AndData   The value to AND with read value from the MMIO register.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+MmioBitFieldAnd32 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT32                    AndData\r
+  )\r
+{\r
+  return MmioWrite32 (\r
+           Address,\r
+           BitFieldAnd32 (MmioRead32 (Address), StartBit, EndBit, AndData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 32-bit MMIO register, performs a bitwise AND followed\r
+  by a bitwise OR, and writes the result back to the bit field in the\r
+  32-bit MMIO register.\r
+\r
+  Reads the 32-bit MMIO register specified by Address, performs a bitwise AND\r
+  followed by a bitwise OR between the read result and the value\r
+  specified by AndData, and writes the result to the 32-bit MMIO register\r
+  specified by Address. The value written to the MMIO register is returned.\r
+  This function must guarantee that all MMIO read and write operations are\r
+  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 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
+\r
+  @param  Address   MMIO register to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  AndData   The value to AND with read value from the MMIO register.\r
+  @param  OrData    The value to OR with the result of the AND operation.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+MmioBitFieldAndThenOr32 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT32                    AndData,\r
+  IN      UINT32                    OrData\r
+  )\r
+{\r
+  return MmioWrite32 (\r
+           Address,\r
+           BitFieldAndThenOr32 (MmioRead32 (Address), StartBit, EndBit, AndData, OrData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a 64-bit MMIO register, performs a bitwise OR, and writes the\r
+  result back to the 64-bit MMIO register.\r
+\r
+  Reads the 64-bit MMIO register specified by Address, performs a bitwise\r
+  inclusive OR between the read result and the value specified by OrData, and\r
+  writes the result to the 64-bit MMIO register specified by Address. The value\r
+  written to the MMIO register is returned. This function must guarantee that\r
+  all MMIO read and write operations are serialized.\r
+\r
+  If 64-bit MMIO register operations are not supported, 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
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioOr64 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT64                    OrData\r
+  )\r
+{\r
+  return MmioWrite64 (Address, MmioRead64 (Address) | OrData);\r
+}\r
+\r
+/**\r
+  Reads a 64-bit MMIO register, performs a bitwise AND, and writes the result\r
+  back to the 64-bit MMIO register.\r
+\r
+  Reads the 64-bit MMIO register specified by Address, performs a bitwise AND\r
+  between the read result and the value specified by AndData, and writes the\r
+  result to the 64-bit MMIO register specified by Address. The value written to\r
+  the MMIO register is returned. This function must guarantee that all MMIO\r
+  read and write operations are serialized.\r
+\r
+  If 64-bit MMIO register operations are not supported, 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
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioAnd64 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT64                    AndData\r
+  )\r
+{\r
+  return MmioWrite64 (Address, MmioRead64 (Address) & AndData);\r
+}\r
+\r
+/**\r
+  Reads a 64-bit MMIO register, performs a bitwise AND followed by a bitwise\r
+  inclusive OR, and writes the result back to the 64-bit MMIO register.\r
+\r
+  Reads the 64-bit MMIO register specified by Address, performs a bitwise AND\r
+  between the read result and the value specified by AndData, performs a\r
+  bitwise OR between the result of the AND operation and the value specified by\r
+  OrData, and writes the result to the 64-bit MMIO register specified by\r
+  Address. The value written to the MMIO register is returned. This function\r
+  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
+\r
+  @param  Address The MMIO register to write.\r
+  @param  AndData The value to AND with the read value from the MMIO register.\r
+  @param  OrData  The value to OR with the result of the AND operation.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioAndThenOr64 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT64                    AndData,\r
+  IN      UINT64                    OrData\r
+  )\r
+{\r
+  return MmioWrite64 (Address, (MmioRead64 (Address) & AndData) | OrData);\r
+}\r
+\r
+/**\r
+  Reads a bit field of a MMIO register.\r
+\r
+  Reads the bit field in a 64-bit MMIO register. The bit field is specified by\r
+  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 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
+\r
+  @param  Address   MMIO register to read.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioBitFieldRead64 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit\r
+  )\r
+{\r
+  return BitFieldRead64 (MmioRead64 (Address), StartBit, EndBit);\r
+}\r
+\r
+/**\r
+  Writes a bit field to a MMIO register.\r
+\r
+  Writes Value to the bit field of the MMIO register. The bit field is\r
+  specified by the StartBit and the EndBit. All other bits in the destination\r
+  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 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
+\r
+  @param  Address   MMIO register to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  Value     New value of the bit field.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioBitFieldWrite64 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT64                    Value\r
+  )\r
+{\r
+  return MmioWrite64 (\r
+           Address,\r
+           BitFieldWrite64 (MmioRead64 (Address), StartBit, EndBit, Value)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 64-bit MMIO register, performs a bitwise OR, and\r
+  writes the result back to the bit field in the 64-bit MMIO register.\r
+\r
+  Reads the 64-bit MMIO register specified by Address, performs a bitwise\r
+  inclusive OR between the read result and the value specified by OrData, and\r
+  writes the result to the 64-bit MMIO register specified by Address. The value\r
+  written to the MMIO register is returned. This function must guarantee that\r
+  all MMIO read and write operations are serialized. Extra left bits in OrData\r
+  are stripped.\r
+\r
+  If 64-bit MMIO register operations are not supported, 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
+\r
+  @param  Address   MMIO register to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  OrData    The value to OR with read value from the MMIO register.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioBitFieldOr64 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT64                    OrData\r
+  )\r
+{\r
+  return MmioWrite64 (\r
+           Address,\r
+           BitFieldOr64 (MmioRead64 (Address), StartBit, EndBit, OrData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 64-bit MMIO register, performs a bitwise AND, and\r
+  writes the result back to the bit field in the 64-bit MMIO register.\r
+\r
+  Reads the 64-bit MMIO register specified by Address, performs a bitwise AND\r
+  between the read result and the value specified by AndData, and writes the\r
+  result to the 64-bit MMIO register specified by Address. The value written to\r
+  the MMIO register is returned. This function must guarantee that all MMIO\r
+  read and write operations are serialized. Extra left bits in AndData are\r
+  stripped.\r
+\r
+  If 64-bit MMIO register operations are not supported, 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
+\r
+  @param  Address   MMIO register to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  AndData   The value to AND with read value from the MMIO register.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioBitFieldAnd64 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT64                    AndData\r
+  )\r
+{\r
+  return MmioWrite64 (\r
+           Address,\r
+           BitFieldAnd64 (MmioRead64 (Address), StartBit, EndBit, AndData)\r
+           );\r
+}\r
+\r
+/**\r
+  Reads a bit field in a 64-bit MMIO register, performs a bitwise AND followed\r
+  by a bitwise OR, and writes the result back to the bit field in the\r
+  64-bit MMIO register.\r
+\r
+  Reads the 64-bit MMIO register specified by Address, performs a bitwise AND\r
+  followed by a bitwise OR between the read result and the value\r
+  specified by AndData, and writes the result to the 64-bit MMIO register\r
+  specified by Address. The value written to the MMIO register is returned.\r
+  This function must guarantee that all MMIO read and write operations are\r
+  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 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
+\r
+  @param  Address   MMIO register to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  AndData   The value to AND with read value from the MMIO register.\r
+  @param  OrData    The value to OR with the result of the AND operation.\r
+\r
+  @return The value written back to the MMIO register.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioBitFieldAndThenOr64 (\r
+  IN      UINTN                     Address,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT64                    AndData,\r
+  IN      UINT64                    OrData\r
+  )\r
+{\r
+  return MmioWrite64 (\r
+           Address,\r
+           BitFieldAndThenOr64 (MmioRead64 (Address), StartBit, EndBit, AndData, OrData)\r
+           );\r
+}\r
diff --git a/MdePkg/Library/SmmIoLibSmmCpuIo2/IoLib.c b/MdePkg/Library/SmmIoLibSmmCpuIo2/IoLib.c
new file mode 100644 (file)
index 0000000..53003d1
--- /dev/null
@@ -0,0 +1,619 @@
+/** @file\r
+  I/O Library.\r
+  The implementation of I/O operation for this library instance \r
+  are based on EFI_CPU_IO_PROTOCOL.\r
+  \r
+  Copyright (c) 2009 - 2010, Intel Corporation<BR>\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
+**/\r
+\r
+#include "SmmCpuIoLibInternal.h"\r
+\r
+//\r
+// Globle varible to cache pointer to CpuIo protocol.\r
+//\r
+EFI_SMM_CPU_IO2_PROTOCOL  *mCpuIo2 = NULL;\r
+\r
+/**\r
+  The constructor function caches the pointer to CpuIo protocol.\r
+\r
+  The constructor function locates CpuIo protocol from protocol database.\r
+  It will ASSERT() if that operation fails and it will always return EFI_SUCCESS.\r
+\r
+  @param  ImageHandle   The firmware allocated handle for the EFI image.\r
+  @param  SystemTable   A pointer to the EFI System Table.\r
+\r
+  @retval EFI_SUCCESS   The constructor always returns EFI_SUCCESS.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+IoLibConstructor (\r
+  IN      EFI_HANDLE                ImageHandle,\r
+  IN      EFI_SYSTEM_TABLE          *SystemTable\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+\r
+  Status = gSmst->SmmLocateProtocol (&gEfiSmmCpuIo2ProtocolGuid, NULL, (VOID **) &mCpuIo2);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return Status;\r
+}\r
+\r
+/**\r
+  Reads registers in the EFI CPU I/O space.\r
+\r
+  Reads the I/O port specified by Port with registers width specified by Width.\r
+  The read value is returned. If such operations are not supported, then ASSERT().\r
+  This function must guarantee that all I/O read and write operations are serialized.\r
+\r
+  @param  Port          The base address of the I/O operation.\r
+                        The caller is responsible for aligning the Address if required.\r
+  @param  Width         The width of the I/O operation.\r
+\r
+  @return Data read from registers in the EFI CPU I/O space.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+IoReadWorker (\r
+  IN      UINTN                     Port,\r
+  IN      EFI_SMM_IO_WIDTH          Width\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+  UINT64                            Data;\r
+\r
+  Status = mCpuIo2->Io.Read (mCpuIo2, Width, Port, 1, &Data);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return Data;\r
+}\r
+\r
+/**\r
+  Writes registers in the EFI CPU I/O space.\r
+\r
+  Writes the I/O port specified by Port with registers width and value specified by Width\r
+  and Data respectively.  Data is returned. If such operations are not supported, then ASSERT().\r
+  This function must guarantee that all I/O read and write operations are serialized.\r
+\r
+  @param  Port          The base address of the I/O operation.\r
+                        The caller is responsible for aligning the Address if required.\r
+  @param  Width         The width of the I/O operation.\r
+  @param  Data          The value to write to the I/O port.\r
+\r
+  @return The paramter of Data.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+IoWriteWorker (\r
+  IN      UINTN                     Port,\r
+  IN      EFI_SMM_IO_WIDTH          Width,\r
+  IN      UINT64                    Data\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+\r
+  Status = mCpuIo2->Io.Write (mCpuIo2, Width, Port, 1, &Data);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return Data;\r
+}\r
+\r
+/**\r
+  Reads memory-mapped registers in the EFI system memory space.\r
+\r
+  Reads the MMIO registers specified by Address with registers width specified by Width.\r
+  The read value is returned. If such operations are not supported, then ASSERT().\r
+  This function must guarantee that all MMIO read and write operations are serialized.\r
+\r
+  @param  Address       The MMIO register to read.\r
+                        The caller is responsible for aligning the Address if required.\r
+  @param  Width         The width of the I/O operation.\r
+\r
+  @return Data read from registers in the EFI system memory space.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioReadWorker (\r
+  IN      UINTN                     Address,\r
+  IN      EFI_SMM_IO_WIDTH          Width\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+  UINT64                            Data;\r
+\r
+  Status = mCpuIo2->Mem.Read (mCpuIo2, Width, Address, 1, &Data);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return Data;\r
+}\r
+\r
+/**\r
+  Writes memory-mapped registers in the EFI system memory space.\r
+\r
+  Writes the MMIO registers specified by Address with registers width and value specified by Width\r
+  and Data respectively. Data is returned. If such operations are not supported, then ASSERT().\r
+  This function must guarantee that all MMIO read and write operations are serialized.\r
+\r
+  @param  Address       The MMIO register to read.\r
+                        The caller is responsible for aligning the Address if required.\r
+  @param  Width         The width of the I/O operation.\r
+  @param  Data          The value to write to the I/O port.\r
+  \r
+  @return Data read from registers in the EFI system memory space.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioWriteWorker (\r
+  IN      UINTN                     Address,\r
+  IN      EFI_SMM_IO_WIDTH          Width,\r
+  IN      UINT64                    Data\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+\r
+  Status = mCpuIo2->Mem.Write (mCpuIo2, Width, Address, 1, &Data);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return Data;\r
+}\r
+\r
+/**\r
+  Reads an 8-bit I/O port.\r
+\r
+  Reads the 8-bit I/O port specified by Port. The 8-bit read value is returned.\r
+  This function must guarantee that all I/O read and write operations are\r
+  serialized.\r
+\r
+  If 8-bit I/O port operations are not supported, then ASSERT().\r
+\r
+  @param  Port  The I/O port to read.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+IoRead8 (\r
+  IN      UINTN                     Port\r
+  )\r
+{\r
+  return (UINT8)IoReadWorker (Port, SMM_IO_UINT8);\r
+}\r
+\r
+/**\r
+  Writes an 8-bit I/O port.\r
+\r
+  Writes the 8-bit I/O port specified by Port with the value specified by Value\r
+  and returns Value. This function must guarantee that all I/O read and write\r
+  operations are serialized.\r
+\r
+  If 8-bit I/O port operations are not supported, 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
+  @return The value written the I/O port.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+IoWrite8 (\r
+  IN      UINTN                     Port,\r
+  IN      UINT8                     Value\r
+  )\r
+{\r
+  return (UINT8)IoWriteWorker (Port, SMM_IO_UINT8, Value);\r
+}\r
+\r
+/**\r
+  Reads a 16-bit I/O port.\r
+\r
+  Reads the 16-bit I/O port specified by Port. The 16-bit read value is returned.\r
+  This function must guarantee that all I/O read and write operations are\r
+  serialized.\r
+\r
+  If Port is not aligned on a 16-bit boundary, then ASSERT().\r
\r
+  If 16-bit I/O port operations are not supported, then ASSERT().\r
+\r
+  @param  Port  The I/O port to read.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+IoRead16 (\r
+  IN      UINTN                     Port\r
+  )\r
+{\r
+  //\r
+  // Make sure Port is aligned on a 16-bit boundary.\r
+  //\r
+  ASSERT ((Port & 1) == 0);\r
+  return (UINT16)IoReadWorker (Port, SMM_IO_UINT16);\r
+}\r
+\r
+/**\r
+  Writes a 16-bit I/O port.\r
+\r
+  Writes the 16-bit I/O port specified by Port with the value specified by Value\r
+  and returns Value. This function must guarantee that all I/O read and write\r
+  operations are serialized.\r
+\r
+  If Port is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  If 16-bit I/O port operations are not supported, 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
+  @return The value written the I/O port.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+IoWrite16 (\r
+  IN      UINTN                     Port,\r
+  IN      UINT16                    Value\r
+  )\r
+{\r
+  //\r
+  // Make sure Port is aligned on a 16-bit boundary.\r
+  //\r
+  ASSERT ((Port & 1) == 0);\r
+  return (UINT16)IoWriteWorker (Port, SMM_IO_UINT16, Value);\r
+}\r
+\r
+/**\r
+  Reads a 32-bit I/O port.\r
+\r
+  Reads the 32-bit I/O port specified by Port. The 32-bit read value is returned.\r
+  This function must guarantee that all I/O read and write operations are\r
+  serialized.\r
\r
+  If Port is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  If 32-bit I/O port operations are not supported, then ASSERT().\r
+\r
+  @param  Port  The I/O port to read.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+IoRead32 (\r
+  IN      UINTN                     Port\r
+  )\r
+{\r
+  //\r
+  // Make sure Port is aligned on a 32-bit boundary.\r
+  //\r
+  ASSERT ((Port & 3) == 0);\r
+  return (UINT32)IoReadWorker (Port, SMM_IO_UINT32);\r
+}\r
+\r
+/**\r
+  Writes a 32-bit I/O port.\r
+\r
+  Writes the 32-bit I/O port specified by Port with the value specified by Value\r
+  and returns Value. This function must guarantee that all I/O read and write\r
+  operations are serialized.\r
+\r
+  If Port is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  If 32-bit I/O port operations are not supported, 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
+  @return The value written the I/O port.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+IoWrite32 (\r
+  IN      UINTN                     Port,\r
+  IN      UINT32                    Value\r
+  )\r
+{\r
+  //\r
+  // Make sure Port is aligned on a 32-bit boundary.\r
+  //\r
+  ASSERT ((Port & 3) == 0);\r
+  return (UINT32)IoWriteWorker (Port, SMM_IO_UINT32, Value);\r
+}\r
+\r
+/**\r
+  Reads a 64-bit I/O port.\r
+\r
+  Reads the 64-bit I/O port specified by Port. The 64-bit read value is returned.\r
+  This function must guarantee that all I/O read and write operations are\r
+  serialized.\r
+\r
+  If Port is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  If 64-bit I/O port operations are not supported, then ASSERT().\r
+\r
+  @param  Port  The I/O port to read.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+IoRead64 (\r
+  IN      UINTN                     Port\r
+  )\r
+{\r
+  //\r
+  // Make sure Port is aligned on a 64-bit boundary.\r
+  //\r
+  ASSERT ((Port & 7) == 0);\r
+  return IoReadWorker (Port, SMM_IO_UINT64);\r
+}\r
+\r
+/**\r
+  Writes a 64-bit I/O port.\r
+\r
+  Writes the 64-bit I/O port specified by Port with the value specified by Value\r
+  and returns Value. This function must guarantee that all I/O read and write\r
+  operations are serialized.\r
+\r
+  If Port is not aligned on a 64-bit boundary, then ASSERT().\r
\r
+  If 64-bit I/O port operations are not supported, 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
+  @return The value written the I/O port.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+IoWrite64 (\r
+  IN      UINTN                     Port,\r
+  IN      UINT64                    Value\r
+  )\r
+{\r
+  //\r
+  // Make sure Port is aligned on a 64-bit boundary.\r
+  //\r
+  ASSERT ((Port & 7) == 0);\r
+  return IoWriteWorker (Port, SMM_IO_UINT64, Value);\r
+}\r
+\r
+/**\r
+  Reads an 8-bit MMIO register.\r
+\r
+  Reads the 8-bit MMIO register specified by Address. The 8-bit read value is\r
+  returned. This function must guarantee that all MMIO read and write\r
+  operations are serialized.\r
+\r
+  If 8-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to read.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+MmioRead8 (\r
+  IN      UINTN                     Address\r
+  )\r
+{\r
+  return (UINT8)MmioReadWorker (Address, SMM_IO_UINT8);\r
+}\r
+\r
+/**\r
+  Writes an 8-bit MMIO register.\r
+\r
+  Writes the 8-bit MMIO register specified by Address with the value specified\r
+  by Value and returns Value. This function must guarantee that all MMIO read\r
+  and write operations are serialized.\r
+\r
+  If 8-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to write.\r
+  @param  Value   The value to write to the MMIO register.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+MmioWrite8 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT8                     Value\r
+  )\r
+{\r
+  return (UINT8)MmioWriteWorker (Address, SMM_IO_UINT8, Value);\r
+}\r
+\r
+/**\r
+  Reads a 16-bit MMIO register.\r
+\r
+  Reads the 16-bit MMIO register specified by Address. The 16-bit read value is\r
+  returned. This function must guarantee that all MMIO read and write\r
+  operations are serialized.\r
+\r
+  If Address is not aligned on a 16-bit boundary, then ASSERT().\r
\r
+  If 16-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to read.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+MmioRead16 (\r
+  IN      UINTN                     Address\r
+  )\r
+{\r
+  //\r
+  // Make sure Address is aligned on a 16-bit boundary.\r
+  //\r
+  ASSERT ((Address & 1) == 0);\r
+  return (UINT16)MmioReadWorker (Address, SMM_IO_UINT16);\r
+}\r
+\r
+/**\r
+  Writes a 16-bit MMIO register.\r
+\r
+  Writes the 16-bit MMIO register specified by Address with the value specified\r
+  by Value and returns Value. This function must guarantee that all MMIO read\r
+  and write operations are serialized.\r
+\r
+  If Address is not aligned on a 16-bit boundary, then ASSERT().\r
\r
+  If 16-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to write.\r
+  @param  Value   The value to write to the MMIO register.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+MmioWrite16 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT16                    Value\r
+  )\r
+{\r
+  //\r
+  // Make sure Address is aligned on a 16-bit boundary.\r
+  //\r
+  ASSERT ((Address & 1) == 0);\r
+  return (UINT16)MmioWriteWorker (Address, SMM_IO_UINT16, Value);\r
+}\r
+\r
+/**\r
+  Reads a 32-bit MMIO register.\r
+\r
+  Reads the 32-bit MMIO register specified by Address. The 32-bit read value is\r
+  returned. This function must guarantee that all MMIO read and write\r
+  operations are serialized.\r
+\r
+  If Address is not aligned on a 32-bit boundary, then ASSERT().\r
+  \r
+  If 32-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to read.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+MmioRead32 (\r
+  IN      UINTN                     Address\r
+  )\r
+{\r
+  //\r
+  // Make sure Address is aligned on a 32-bit boundary.\r
+  //\r
+  ASSERT ((Address & 3) == 0);\r
+  return (UINT32)MmioReadWorker (Address, SMM_IO_UINT32);\r
+}\r
+\r
+/**\r
+  Writes a 32-bit MMIO register.\r
+\r
+  Writes the 32-bit MMIO register specified by Address with the value specified\r
+  by Value and returns Value. This function must guarantee that all MMIO read\r
+  and write operations are serialized.\r
+\r
+  If Address is not aligned on a 32-bit boundary, then ASSERT().\r
\r
+  If 32-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to write.\r
+  @param  Value   The value to write to the MMIO register.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+MmioWrite32 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT32                    Value\r
+  )\r
+{\r
+  //\r
+  // Make sure Address is aligned on a 32-bit boundary.\r
+  //\r
+  ASSERT ((Address & 3) == 0);\r
+  return (UINT32)MmioWriteWorker (Address, SMM_IO_UINT32, Value);\r
+}\r
+\r
+/**\r
+  Reads a 64-bit MMIO register.\r
+\r
+  Reads the 64-bit MMIO register specified by Address. The 64-bit read value is\r
+  returned. This function must guarantee that all MMIO read and write\r
+  operations are serialized.\r
+\r
+  If Address is not aligned on a 64-bit boundary, then ASSERT().\r
\r
+  If 64-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to read.\r
+\r
+  @return The value read.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioRead64 (\r
+  IN      UINTN                     Address\r
+  )\r
+{\r
+  //\r
+  // Make sure Address is aligned on a 64-bit boundary.\r
+  //\r
+  ASSERT ((Address & 7) == 0);\r
+  return (UINT64)MmioReadWorker (Address, SMM_IO_UINT64);\r
+}\r
+\r
+/**\r
+  Writes a 64-bit MMIO register.\r
+\r
+  Writes the 64-bit MMIO register specified by Address with the value specified\r
+  by Value and returns Value. This function must guarantee that all MMIO read\r
+  and write operations are serialized.\r
+\r
+  If Address is not aligned on a 64-bit boundary, then ASSERT().\r
\r
+  If 64-bit MMIO register operations are not supported, then ASSERT().\r
+\r
+  @param  Address The MMIO register to write.\r
+  @param  Value   The value to write to the MMIO register.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioWrite64 (\r
+  IN      UINTN                     Address,\r
+  IN      UINT64                    Value\r
+  )\r
+{\r
+  //\r
+  // Make sure Address is aligned on a 64-bit boundary.\r
+  //\r
+  ASSERT ((Address & 7) == 0);\r
+  return (UINT64)MmioWriteWorker (Address, SMM_IO_UINT64, Value);\r
+}\r
diff --git a/MdePkg/Library/SmmIoLibSmmCpuIo2/IoLibMmioBuffer.c b/MdePkg/Library/SmmIoLibSmmCpuIo2/IoLibMmioBuffer.c
new file mode 100644 (file)
index 0000000..35b6c0a
--- /dev/null
@@ -0,0 +1,413 @@
+/** @file\r
+  I/O Library MMIO Buffer Functions.\r
+\r
+  Copyright (c) 2009 - 2010, Intel Corporation<BR>\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
+**/\r
+\r
+#include "SmmCpuIoLibInternal.h"\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          Size in bytes of the copy.\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
+  UINT8   *ReturnBuffer;\r
+\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ReturnBuffer = Buffer;\r
+\r
+  while (Length-- > 0) {\r
+    *(Buffer++) = MmioRead8 (StartAddress++);\r
+  }\r
+\r
+  return ReturnBuffer;\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
+  \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          Size in bytes of the copy.\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
+  UINT16    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT16) - 1)) == 0);\r
+\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT16) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT16) - 1)) == 0);\r
+\r
+  ReturnBuffer = Buffer;\r
+\r
+  while (Length > 0) {\r
+    *(Buffer++) = MmioRead16 (StartAddress);\r
+    StartAddress += sizeof (UINT16);\r
+    Length -= sizeof (UINT16);\r
+  }\r
+\r
+  return ReturnBuffer;\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          Size in bytes of the copy.\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
+  UINT32    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT32) - 1)) == 0);\r
+\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT32) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT32) - 1)) == 0);\r
+\r
+  ReturnBuffer = Buffer;\r
+\r
+  while (Length > 0) {\r
+    *(Buffer++) = MmioRead32 (StartAddress);\r
+    StartAddress += sizeof (UINT32);\r
+    Length -= sizeof (UINT32);\r
+  }\r
+\r
+  return ReturnBuffer;\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
\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          Size in bytes of the copy.\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
+  UINT64    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT64) - 1)) == 0);\r
+\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT64) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT64) - 1)) == 0);\r
+\r
+  ReturnBuffer = Buffer;\r
+\r
+  while (Length > 0) {\r
+    *(Buffer++) = MmioRead64 (StartAddress);\r
+    StartAddress += sizeof (UINT64);\r
+    Length -= sizeof (UINT64);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\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     Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT8 *\r
+EFIAPI\r
+MmioWriteBuffer8 (\r
+  IN  UINTN         StartAddress,\r
+  IN  UINTN         Length,\r
+  IN  CONST UINT8   *Buffer\r
+  )\r
+{\r
+  VOID* ReturnBuffer;\r
+\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ReturnBuffer = (UINT8 *) Buffer;\r
+\r
+  while (Length-- > 0) {\r
+     MmioWrite8 (StartAddress++, *(Buffer++));\r
+  }\r
+\r
+  return ReturnBuffer;\r
+\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. 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
+\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     Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT16 *\r
+EFIAPI\r
+MmioWriteBuffer16 (\r
+  IN  UINTN        StartAddress,\r
+  IN  UINTN        Length,\r
+  IN  CONST UINT16 *Buffer\r
+  )\r
+{\r
+  UINT16    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT16) - 1)) == 0);\r
+\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT16) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT16) - 1)) == 0);\r
+\r
+  ReturnBuffer = (UINT16 *) Buffer;\r
+\r
+  while (Length > 0) {\r
+    MmioWrite16 (StartAddress, *(Buffer++));\r
+\r
+    StartAddress += sizeof (UINT16);\r
+    Length -= sizeof (UINT16);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\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. 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
+\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     Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT32 *\r
+EFIAPI\r
+MmioWriteBuffer32 (\r
+  IN  UINTN        StartAddress,\r
+  IN  UINTN        Length,\r
+  IN  CONST UINT32 *Buffer\r
+  )\r
+{\r
+  UINT32    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT32) - 1)) == 0);\r
+\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT32) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT32) - 1)) == 0);\r
+\r
+  ReturnBuffer = (UINT32 *) Buffer;\r
+\r
+  while (Length > 0) {\r
+    MmioWrite32 (StartAddress, *(Buffer++));\r
+\r
+    StartAddress += sizeof (UINT32);\r
+    Length -= sizeof (UINT32);\r
+  }\r
+\r
+  return ReturnBuffer;\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. 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
+\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     Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT64 *\r
+EFIAPI\r
+MmioWriteBuffer64 (\r
+  IN  UINTN        StartAddress,\r
+  IN  UINTN        Length,\r
+  IN  CONST UINT64 *Buffer\r
+  )\r
+{\r
+  UINT64    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT64) - 1)) == 0);\r
+\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT64) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT64) - 1)) == 0);\r
+\r
+  ReturnBuffer = (UINT64 *) Buffer;\r
+\r
+  while (Length > 0) {\r
+    MmioWrite64 (StartAddress, *(Buffer++));\r
+\r
+    StartAddress += sizeof (UINT64);\r
+    Length -= sizeof (UINT64);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
diff --git a/MdePkg/Library/SmmIoLibSmmCpuIo2/SmmCpuIoLibInternal.h b/MdePkg/Library/SmmIoLibSmmCpuIo2/SmmCpuIoLibInternal.h
new file mode 100644 (file)
index 0000000..70295af
--- /dev/null
@@ -0,0 +1,118 @@
+/** @file\r
+  Internal include file of SMM CPU IO Library.\r
+  It includes all necessary protocol/library class's header file\r
+  for implementation of IoLib library instance. It is included \r
+  all source code of this library instance.\r
+  \r
+  Copyright (c) 2009 - 2010, 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
+**/\r
+\r
+#ifndef _SMM_CPUIO_LIB_INTERNAL_H_\r
+#define _SMM_CPUIO_LIB_INTERNAL_H_\r
+\r
+#include <PiSmm.h>\r
+#include <Protocol/SmmCpuIo2.h>\r
+#include <Protocol/SmmPciRootBridgeIo.h>\r
+#include <Library/IoLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/SmmServicesTableLib.h>\r
+\r
+\r
+/**\r
+  Reads registers in the EFI CPU I/O space.\r
+\r
+  Reads the I/O port specified by Port with registers width specified by Width.\r
+  The read value is returned. If such operations are not supported, then ASSERT().\r
+  This function must guarantee that all I/O read and write operations are serialized.\r
+\r
+  @param  Port          The base address of the I/O operation.\r
+                        The caller is responsible for aligning the Address if required.\r
+  @param  Width         The width of the I/O operation.\r
+\r
+  @return Data read from registers in the EFI CPU I/O space.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+IoReadWorker (\r
+  IN      UINTN                     Port,\r
+  IN      EFI_SMM_IO_WIDTH          Width\r
+  );\r
+\r
+/**\r
+  Writes registers in the EFI CPU I/O space.\r
+\r
+  Writes the I/O port specified by Port with registers width and value specified by Width\r
+  and Data respectively.  Data is returned. If such operations are not supported, then ASSERT().\r
+  This function must guarantee that all I/O read and write operations are serialized.\r
+\r
+  @param  Port          The base address of the I/O operation.\r
+                        The caller is responsible for aligning the Address if required.\r
+  @param  Width         The width of the I/O operation.\r
+  @param  Data          The value to write to the I/O port.\r
+\r
+  @return The paramter of Data.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+IoWriteWorker (\r
+  IN      UINTN                     Port,\r
+  IN      EFI_SMM_IO_WIDTH          Width,\r
+  IN      UINT64                    Data\r
+  );\r
+\r
+/**\r
+  Reads memory-mapped registers in the EFI system memory space.\r
+\r
+  Reads the MMIO registers specified by Address with registers width specified by Width.\r
+  The read value is returned. If such operations are not supported, then ASSERT().\r
+  This function must guarantee that all MMIO read and write operations are serialized.\r
+\r
+  @param  Address       The MMIO register to read.\r
+                        The caller is responsible for aligning the Address if required.\r
+  @param  Width         The width of the I/O operation.\r
+\r
+  @return Data read from registers in the EFI system memory space.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioReadWorker (\r
+  IN      UINTN                     Address,\r
+  IN      EFI_SMM_IO_WIDTH          Width\r
+  );\r
+\r
+/**\r
+  Writes memory-mapped registers in the EFI system memory space.\r
+\r
+  Writes the MMIO registers specified by Address with registers width and value specified by Width\r
+  and Data respectively. Data is returned. If such operations are not supported, then ASSERT().\r
+  This function must guarantee that all MMIO read and write operations are serialized.\r
+\r
+  @param  Address       The MMIO register to read.\r
+                        The caller is responsible for aligning the Address if required.\r
+  @param  Width         The width of the I/O operation.\r
+  @param  Data          The value to write to the I/O port.\r
+  \r
+  @return Data read from registers in the EFI system memory space.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioWriteWorker (\r
+  IN      UINTN                     Address,\r
+  IN      EFI_SMM_IO_WIDTH          Width,\r
+  IN      UINT64                    Data\r
+  );\r
+\r
+#endif\r
diff --git a/MdePkg/Library/SmmIoLibSmmCpuIo2/SmmIoLibSmmCpuIo2.inf b/MdePkg/Library/SmmIoLibSmmCpuIo2/SmmIoLibSmmCpuIo2.inf
new file mode 100644 (file)
index 0000000..b9a34a4
--- /dev/null
@@ -0,0 +1,51 @@
+#/** @file\r
+# Component description file for Cpu Io SMM Io Library.\r
+#\r
+# I/O Library implementation that uses the CPU I/O Protocol for I/O\r
+#  and MMIO operations.\r
+# Copyright (c) 2009 - 2010, Intel Corporation.\r
+#\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
+#  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
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = SmmIoLibSmmCpuIo2\r
+  FILE_GUID                      = DEEEA15E-4A77-4513-BA75-71D26FEF78A1\r
+  MODULE_TYPE                    = DXE_SMM_DRIVER\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = IoLib|DXE_SMM_DRIVER SMM_CORE\r
+  PI_SPECIFICATION_VERSION       = 0x0001000A\r
+  CONSTRUCTOR                    = IoLibConstructor\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32 X64\r
+#\r
+\r
+[Sources]\r
+  IoLibMmioBuffer.c\r
+  SmmCpuIoLibInternal.h\r
+  IoHighLevel.c\r
+  IoLib.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+\r
+[LibraryClasses]\r
+  BaseLib\r
+  DebugLib\r
+  SmmServicesTableLib\r
+\r
+[Protocols]\r
+  gEfiSmmCpuIo2ProtocolGuid                         ## CONSUMES\r
+\r
+[Depex]\r
+  gEfiSmmCpuIo2ProtocolGuid
\ No newline at end of file
index 7fe6daa461989886ead267307f48b0b07d7efee3..683eefedfe90a20cc0a203ed0c721d8f6aab63f0 100644 (file)
@@ -5,7 +5,7 @@
 # It also provides the definitions(including PPIs/PROTOCOLs/GUIDs) of\r
 # EFI1.10/UEFI2.0/UEFI2.1/PI1.0 and some Industry Standards.\r
 #\r
 # It also provides the definitions(including PPIs/PROTOCOLs/GUIDs) of\r
 # EFI1.10/UEFI2.0/UEFI2.1/PI1.0 and some Industry Standards.\r
 #\r
-# Copyright (c) 2007 - 2009, Intel Corporation.<BR>\r
+# Copyright (c) 2007 - 2010, Intel Corporation.<BR>\r
 # Portions copyright (c) 2008-2009 Apple Inc. All rights reserved.<BR>\r
 #\r
 # All rights reserved.\r
 # Portions copyright (c) 2008-2009 Apple Inc. All rights reserved.<BR>\r
 #\r
 # All rights reserved.\r
   ## Include/Protocol/SuperIo.h\r
   gEfiSioProtocolGuid             = { 0x215fdd18, 0xbd50, 0x4feb, { 0x89, 0xb, 0x58, 0xca, 0xb, 0x47, 0x39, 0xe9 }}\r
 \r
   ## Include/Protocol/SuperIo.h\r
   gEfiSioProtocolGuid             = { 0x215fdd18, 0xbd50, 0x4feb, { 0x89, 0xb, 0x58, 0xca, 0xb, 0x47, 0x39, 0xe9 }}\r
 \r
-  ## Include/Protocol/SmmCpuIo.h\r
-  gEfiSmmCpuIoProtocolGuid        = { 0x3242a9d8, 0xce70, 0x4aa0, { 0x95, 0x5d, 0x5e, 0x7b, 0x14, 0x0d, 0xe4, 0xd2 }}\r
+  ## Include/Protocol/SmmCpuIo2.h\r
+  gEfiSmmCpuIo2ProtocolGuid        = { 0x3242a9d8, 0xce70, 0x4aa0, { 0x95, 0x5d, 0x5e, 0x7b, 0x14, 0x0d, 0xe4, 0xd2 }}\r
 \r
   ## Include/Protocol/SmmBase2.h\r
   gEfiSmmBase2ProtocolGuid        = { 0xf4ccbfb7, 0xf6e0, 0x47fd, { 0x9d, 0xd4, 0x10, 0xa8, 0xf1, 0x50, 0xc1, 0x91 }}\r
 \r
   ## Include/Protocol/SmmBase2.h\r
   gEfiSmmBase2ProtocolGuid        = { 0xf4ccbfb7, 0xf6e0, 0x47fd, { 0x9d, 0xd4, 0x10, 0xa8, 0xf1, 0x50, 0xc1, 0x91 }}\r
index 87f2ae2120dcd45b7256205d71e1dcdf00f7066c..30298803d93f151674d1fb6e043f0849c25db224 100644 (file)
   MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf\r
   MdePkg/Library/SecPeiDxeTimerLibCpu/SecPeiDxeTimerLibCpu.inf\r
   MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf\r
   MdePkg/Library/PeiServicesTablePointerLibIdt/PeiServicesTablePointerLibIdt.inf\r
   MdePkg/Library/SecPeiDxeTimerLibCpu/SecPeiDxeTimerLibCpu.inf\r
   MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf\r
-  MdePkg/Library/SmmIoLibCpuIo/SmmIoLibCpuIo.inf\r
+  MdePkg/Library/SmmIoLibSmmCpuIo2/SmmIoLibSmmCpuIo2.inf\r
   MdePkg/Library/SmmPciLibPciRootBridgeIo/SmmPciLibPciRootBridgeIo.inf\r
   MdePkg/Library/SmmServicesTableLib/SmmServicesTableLib.inf\r
 \r
   MdePkg/Library/SmmPciLibPciRootBridgeIo/SmmPciLibPciRootBridgeIo.inf\r
   MdePkg/Library/SmmServicesTableLib/SmmServicesTableLib.inf\r
 \r