]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Library/BaseIoLibIntrinsic/IoLib.c
MdePkg: Replace Opcode with the corresponding instructions.
[mirror_edk2.git] / MdePkg / Library / BaseIoLibIntrinsic / IoLib.c
index 86efa6db6a16038be309ff69f51fd90fcf174a36..9d42e21a691c6ee9719a6d1d2ab42d14ba07c8eb 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   Common I/O Library routines.\r
 \r
-  Copyright (c) 2006, 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
+  Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
   serialized.\r
 \r
   If 64-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 64-bit boundary, then ASSERT().\r
 \r
   @param  Port  The I/O port to read.\r
 \r
-  @return Always return zero.\r
+  @return The value read.\r
 \r
 **/\r
 UINT64\r
 EFIAPI\r
 IoRead64 (\r
-  IN      UINTN                     Port\r
+  IN      UINTN  Port\r
   )\r
 {\r
   ASSERT (FALSE);\r
@@ -46,21 +41,320 @@ IoRead64 (
   operations are serialized.\r
 \r
   If 64-bit I/O port operations are not supported, then ASSERT().\r
+  If Port is not aligned on a 64-bit boundary, then ASSERT().\r
 \r
   @param  Port  The I/O port to write.\r
   @param  Value The value to write to the I/O port.\r
 \r
-  @return Always return zero.\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
+  IN      UINTN   Port,\r
+  IN      UINT64  Value\r
   )\r
 {\r
   ASSERT (FALSE);\r
   return 0;\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
+  UINT8    Value;\r
+  BOOLEAN  Flag;\r
+\r
+  Flag = FilterBeforeMmIoRead (FilterWidth8, Address, &Value);\r
+  if (Flag) {\r
+    MemoryFence ();\r
+    Value = *(volatile UINT8 *)Address;\r
+    MemoryFence ();\r
+  }\r
+\r
+  FilterAfterMmIoRead (FilterWidth8, Address, &Value);\r
+\r
+  return Value;\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
+  @return Value.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+MmioWrite8 (\r
+  IN      UINTN  Address,\r
+  IN      UINT8  Value\r
+  )\r
+{\r
+  BOOLEAN  Flag;\r
+\r
+  Flag = FilterBeforeMmIoWrite (FilterWidth8, Address, &Value);\r
+  if (Flag) {\r
+    MemoryFence ();\r
+    *(volatile UINT8 *)Address = Value;\r
+    MemoryFence ();\r
+  }\r
+\r
+  FilterAfterMmIoWrite (FilterWidth8, Address, &Value);\r
+\r
+  return 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
+  If Address is not aligned on a 16-bit boundary, 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
+  UINT16   Value;\r
+  BOOLEAN  Flag;\r
+\r
+  ASSERT ((Address & 1) == 0);\r
+  Flag = FilterBeforeMmIoRead (FilterWidth16, Address, &Value);\r
+  if (Flag) {\r
+    MemoryFence ();\r
+    Value = *(volatile UINT16 *)Address;\r
+    MemoryFence ();\r
+  }\r
+\r
+  FilterAfterMmIoRead (FilterWidth16, Address, &Value);\r
+\r
+  return Value;\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
+  If Address is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  @param  Address The MMIO register to write.\r
+  @param  Value   The value to write to the MMIO register.\r
+\r
+  @return Value.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+MmioWrite16 (\r
+  IN      UINTN   Address,\r
+  IN      UINT16  Value\r
+  )\r
+{\r
+  BOOLEAN  Flag;\r
+\r
+  ASSERT ((Address & 1) == 0);\r
+\r
+  Flag = FilterBeforeMmIoWrite (FilterWidth16, Address, &Value);\r
+  if (Flag) {\r
+    MemoryFence ();\r
+    *(volatile UINT16 *)Address = Value;\r
+    MemoryFence ();\r
+  }\r
+\r
+  FilterAfterMmIoWrite (FilterWidth16, Address, &Value);\r
+\r
+  return 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
+  If Address is not aligned on a 32-bit boundary, 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
+  UINT32   Value;\r
+  BOOLEAN  Flag;\r
+\r
+  ASSERT ((Address & 3) == 0);\r
+\r
+  Flag = FilterBeforeMmIoRead (FilterWidth32, Address, &Value);\r
+  if (Flag) {\r
+    MemoryFence ();\r
+    Value = *(volatile UINT32 *)Address;\r
+    MemoryFence ();\r
+  }\r
+\r
+  FilterAfterMmIoRead (FilterWidth32, Address, &Value);\r
+\r
+  return Value;\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
+  If Address is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  @param  Address The MMIO register to write.\r
+  @param  Value   The value to write to the MMIO register.\r
+\r
+  @return Value.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+MmioWrite32 (\r
+  IN      UINTN   Address,\r
+  IN      UINT32  Value\r
+  )\r
+{\r
+  BOOLEAN  Flag;\r
+\r
+  ASSERT ((Address & 3) == 0);\r
+\r
+  Flag = FilterBeforeMmIoWrite (FilterWidth32, Address, &Value);\r
+  if (Flag) {\r
+    MemoryFence ();\r
+    *(volatile UINT32 *)Address = Value;\r
+    MemoryFence ();\r
+  }\r
+\r
+  FilterAfterMmIoWrite (FilterWidth32, Address, &Value);\r
+\r
+  return 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
+  If Address is not aligned on a 64-bit boundary, 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
+  UINT64   Value;\r
+  BOOLEAN  Flag;\r
+\r
+  ASSERT ((Address & 7) == 0);\r
+\r
+  Flag = FilterBeforeMmIoRead (FilterWidth64, Address, &Value);\r
+  if (Flag) {\r
+    MemoryFence ();\r
+    Value = *(volatile UINT64 *)Address;\r
+    MemoryFence ();\r
+  }\r
+\r
+  FilterAfterMmIoRead (FilterWidth64, Address, &Value);\r
+\r
+  return Value;\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
+  If Address is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  @param  Address The MMIO register to write.\r
+  @param  Value   The value to write to the MMIO register.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MmioWrite64 (\r
+  IN      UINTN   Address,\r
+  IN      UINT64  Value\r
+  )\r
+{\r
+  BOOLEAN  Flag;\r
+\r
+  ASSERT ((Address & 7) == 0);\r
+\r
+  Flag = FilterBeforeMmIoWrite (FilterWidth64, Address, &Value);\r
+  if (Flag) {\r
+    MemoryFence ();\r
+    *(volatile UINT64 *)Address = Value;\r
+    MemoryFence ();\r
+  }\r
+\r
+  FilterAfterMmIoWrite (FilterWidth64, Address, &Value);\r
+\r
+  return Value;\r
+}\r