/** @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
return 0;\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
+ 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
+ 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
+ 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
+ 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
+ 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
+ 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
+ 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
+ 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
+ FilterAfterMmIoWrite (FilterWidth64, Address, &Value);\r
+\r
+ return Value;\r
+}\r
+\r