]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BaseIoLibIntrinsic/IoLibMsc.c
Removed cross references from PciCf8Lib and PciExpressLib class to PciLib class.
[mirror_edk2.git] / MdePkg / Library / BaseIoLibIntrinsic / IoLibMsc.c
index 8bce7a5eb926309ca7a570f8bbf9c4ce114ac51b..cfe5ddff4394b4a6305825f049b56bba0ae413d0 100644 (file)
 //\r
 // Microsoft Visual Studio 7.1 Function Prototypes for I/O Intrinsics\r
 //\r
-int            _inp  (unsigned short port);\r
+int            _inp (unsigned short port);\r
 unsigned short _inpw (unsigned short port);\r
 unsigned long  _inpd (unsigned short port);\r
 int            _outp (unsigned short port, int databyte );\r
-unsigned short _outpw(unsigned short port, unsigned short dataword );\r
-unsigned long  _outpd(unsigned short port, unsigned long dataword );\r
+unsigned short _outpw (unsigned short port, unsigned short dataword );\r
+unsigned long  _outpd (unsigned short port, unsigned long dataword );\r
+void          _ReadWriteBarrier (void);\r
 \r
 #pragma intrinsic(_inp)\r
 #pragma intrinsic(_inpw)\r
@@ -40,7 +41,15 @@ unsigned long  _outpd(unsigned short port, unsigned long dataword );
 #pragma intrinsic(_outp)\r
 #pragma intrinsic(_outpw)\r
 #pragma intrinsic(_outpd)\r
+#pragma intrinsic(_ReadWriteBarrier)\r
 \r
+//\r
+// _ReadWriteBarrier() forces memory reads and writes to complete at the point\r
+// in the call. This is only a hint to the compiler and does emit code.\r
+// In past versions of the compiler, _ReadWriteBarrier was enforced only \r
+// locally and did not affect functions up the call tree. In Visual C++ \r
+// 2005, _ReadWriteBarrier is enforced all the way up the call tree.\r
+//\r
 \r
 /**\r
   Reads an 8-bit I/O port.\r
@@ -62,6 +71,7 @@ IoRead8 (
   IN      UINTN                     Port\r
   )\r
 {\r
+  _ReadWriteBarrier ();\r
   return (UINT8)_inp ((UINT16)Port);\r
 }\r
 \r
@@ -87,6 +97,7 @@ IoWrite8 (
   IN      UINT8                     Value\r
   )\r
 {\r
+  _ReadWriteBarrier ();\r
   return (UINT8)_outp ((UINT16)Port, Value);\r
 }\r
 \r
@@ -111,6 +122,7 @@ IoRead16 (
   )\r
 {\r
   ASSERT ((Port & 1) == 0);\r
+  _ReadWriteBarrier ();\r
   return _inpw((UINT16)Port);\r
 }\r
 \r
@@ -137,6 +149,7 @@ IoWrite16 (
   )\r
 {\r
   ASSERT ((Port & 1) == 0);\r
+  _ReadWriteBarrier ();\r
   return _outpw ((UINT16)Port, Value);\r
 }\r
 \r
@@ -161,6 +174,7 @@ IoRead32 (
   )\r
 {\r
   ASSERT ((Port & 3) == 0);\r
+  _ReadWriteBarrier ();\r
   return _inpd((UINT16)Port);\r
 }\r
 \r
@@ -187,7 +201,207 @@ IoWrite32 (
   )\r
 {\r
   ASSERT ((Port & 3) == 0);\r
+  _ReadWriteBarrier ();\r
   return _outpd ((UINT16)Port, Value);\r
 }\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
+  _ReadWriteBarrier ();\r
+  return *(volatile UINT8 *)Address;\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
+  _ReadWriteBarrier ();\r
+  return *(volatile UINT8 *)Address = 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 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
+  ASSERT ((Address & 1) == 0);\r
+  _ReadWriteBarrier ();\r
+  return *(volatile UINT16 *)Address;\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 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
+  ASSERT ((Address & 1) == 0);\r
+  _ReadWriteBarrier ();\r
+  return *(volatile UINT16 *)Address = 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 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
+  ASSERT ((Address & 3) == 0);\r
+  _ReadWriteBarrier ();\r
+  return *(volatile UINT32 *)Address;\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 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
+  ASSERT ((Address & 3) == 0);\r
+  _ReadWriteBarrier ();\r
+  return *(volatile UINT32 *)Address = 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 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
+  ASSERT ((Address & 7) == 0);\r
+  _ReadWriteBarrier ();\r
+  return *(volatile UINT64 *)Address;\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 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
+  ASSERT ((Address & 7) == 0);\r
+  _ReadWriteBarrier ();\r
+  return *(volatile UINT64 *)Address = Value;\r
+}\r
+\r
 #endif\r