/** @file\r
Common I/O Library routines.\r
\r
- Copyright (c) 2006, Intel Corporation<BR>\r
+ Copyright (c) 2006 - 2007, 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
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: IoLibIpf.c\r
-\r
**/\r
\r
-#define BIT63 0x8000000000000000ULL\r
+//\r
+// Include common header file for this module.\r
+//\r
+#include "BaseIoLibIntrinsicInternal.h"\r
\r
#define MAP_PORT_BASE_TO_MEM(_Port) \\r
((((_Port) & 0xfffc) << 10) | ((_Port) & 0x0fff))\r
\r
+/**\r
+ Translates I/O port address to memory address.\r
+\r
+ This function translates I/O port address to memory address by adding the 64MB\r
+ aligned I/O Port space to the I/O address.\r
+ If I/O Port space base is not 64MB aligned, then ASSERT (). \r
+\r
+ @param Port The I/O port to read.\r
+\r
+ @return The memory address.\r
+\r
+**/\r
+UINTN\r
+InternalGetMemoryMapAddress (\r
+ IN UINTN Port\r
+ )\r
+{\r
+ UINTN Address;\r
+ UINTN IoBlockBaseAddress;\r
+\r
+ Address = MAP_PORT_BASE_TO_MEM (Port);\r
+ IoBlockBaseAddress = PcdGet64(PcdIoBlockBaseAddressForIpf);\r
+\r
+ //\r
+ // Make sure that the I/O Port space base is 64MB aligned.\r
+ // \r
+ ASSERT ((IoBlockBaseAddress & 0x3ffffff) == 0);\r
+ Address += IoBlockBaseAddress;\r
+\r
+ return Address;\r
+}\r
+\r
/**\r
Reads a 8-bit I/O port.\r
\r
\r
@param Port The I/O port to read.\r
\r
- @return The value read.\r
+ @return The value read from Port.\r
\r
**/\r
UINT8\r
IN UINT64 Port\r
)\r
{\r
- UINT64 Address;\r
-\r
- //\r
- // Add the 64MB aligned IO Port space to the IO address\r
- //\r
- Address = MAP_PORT_BASE_TO_MEM (Port);\r
- Address += PcdGet64(PcdIoBlockBaseAddressForIpf);\r
-\r
- return MmioRead8 (Address);\r
+ return MmioRead8 (InternalGetMemoryMapAddress (Port));\r
}\r
\r
/**\r
\r
@param Port The I/O port to read.\r
\r
- @return The value read.\r
+ @return The value read from Port.\r
\r
**/\r
UINT16\r
IN UINT64 Port\r
)\r
{\r
- UINT64 Address;\r
-\r
- //\r
- // Add the 64MB aligned IO Port space to the IO address\r
- //\r
- Address = MAP_PORT_BASE_TO_MEM (Port);\r
- Address += PcdGet64(PcdIoBlockBaseAddressForIpf);\r
-\r
- return MmioRead16 (Address);\r
+ return MmioRead16 (InternalGetMemoryMapAddress (Port));\r
}\r
\r
/**\r
\r
@param Port The I/O port to read.\r
\r
- @return The value read.\r
+ @return The value read from Port.\r
\r
**/\r
UINT32\r
IN UINT64 Port\r
)\r
{\r
- UINT64 Address;\r
+ return MmioRead32 (InternalGetMemoryMapAddress (Port));\r
+}\r
\r
- //\r
- // Add the 64MB aligned IO Port space to the IO address\r
- //\r
- Address = MAP_PORT_BASE_TO_MEM (Port);\r
- Address += PcdGet64(PcdIoBlockBaseAddressForIpf);\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 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 from Port.\r
\r
- return MmioRead32 (Address);\r
+**/\r
+UINT64\r
+EFIAPI\r
+IoRead64 (\r
+ IN UINTN Port\r
+ )\r
+{\r
+ ASSERT (FALSE);\r
+ return 0;\r
}\r
\r
/**\r
operations are serialized.\r
\r
@param Port The I/O port to write.\r
- @param Value The value to write to the I/O port.\r
+ @param Data The value to write to the I/O port.\r
\r
- @return The value written the I/O port.\r
+ @return The value written to the I/O port. It equals to the\r
+ input Value instead of the actual value read back from\r
+ the I/O port.\r
\r
**/\r
UINT8\r
IN UINT8 Data\r
)\r
{\r
- UINT64 Address;\r
-\r
- //\r
- // Add the 64MB aligned IO Port space to the IO address\r
- //\r
- Address = MAP_PORT_BASE_TO_MEM (Port);\r
- Address += PcdGet64(PcdIoBlockBaseAddressForIpf);\r
-\r
- return MmioWrite8 (Address, Data);\r
+ return MmioWrite8 (InternalGetMemoryMapAddress (Port), Data);\r
}\r
\r
/**\r
operations are serialized.\r
\r
@param Port The I/O port to write.\r
- @param Value The value to write to the I/O port.\r
+ @param Data The value to write to the I/O port.\r
\r
- @return The value written the I/O port.\r
+ @return The value written to the I/O port. It equals to the\r
+ input Value instead of the actual value read back from\r
+ the I/O port.\r
\r
**/\r
UINT16\r
IN UINT16 Data\r
)\r
{\r
- UINT64 Address;\r
-\r
- //\r
- // Add the 64MB aligned IO Port space to the IO address\r
- //\r
- Address = MAP_PORT_BASE_TO_MEM (Port);\r
- Address += PcdGet64(PcdIoBlockBaseAddressForIpf);\r
-\r
- return MmioWrite16 (Address, Data);\r
+ return MmioWrite16 (InternalGetMemoryMapAddress (Port), Data);\r
}\r
\r
/**\r
operations are serialized.\r
\r
@param Port The I/O port to write.\r
- @param Value The value to write to the I/O port.\r
+ @param Data The value to write to the I/O port.\r
\r
- @return The value written the I/O port.\r
+ @return The value written to the I/O port. It equals to the\r
+ input Value instead of the actual value read back from\r
+ the I/O port.\r
\r
**/\r
UINT32\r
IN UINT32 Data\r
)\r
{\r
- UINT64 Address;\r
+ return MmioWrite32 (InternalGetMemoryMapAddress (Port), Data);\r
+}\r
\r
- //\r
- // Add the 64MB aligned IO Port space to the IO address\r
- //\r
- Address = MAP_PORT_BASE_TO_MEM (Port);\r
- Address += PcdGet64(PcdIoBlockBaseAddressForIpf);\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 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 to the I/O port. It equals to the\r
+ input Value instead of the actual value read back from\r
+ the I/O port.\r
\r
- return MmioWrite32 (Address, Data);\r
+**/\r
+UINT64\r
+EFIAPI\r
+IoWrite64 (\r
+ IN UINTN Port,\r
+ IN UINT64 Value\r
+ )\r
+{\r
+ ASSERT (FALSE);\r
+ return 0;\r
}\r
\r
/**\r
\r
@param Address The MMIO register to read.\r
\r
- @return The value read.\r
+ @return The value read from Address.\r
\r
**/\r
UINT8\r
\r
@param Address The MMIO register to read.\r
\r
- @return The value read.\r
+ @return The value read from Address.\r
\r
**/\r
UINT16\r
{\r
UINT16 Data;\r
\r
+ //\r
+ // Make sure that Address is 16-bit aligned.\r
+ // \r
+ ASSERT ((Address & 1) == 0);\r
+\r
Address |= BIT63;\r
\r
MemoryFence ();\r
\r
@param Address The MMIO register to read.\r
\r
- @return The value read.\r
+ @return The value read from Address.\r
\r
**/\r
UINT32\r
{\r
UINT32 Data;\r
\r
+ //\r
+ // Make sure that Address is 32-bit aligned.\r
+ // \r
+ ASSERT ((Address & 3) == 0);\r
+\r
Address |= BIT63;\r
\r
MemoryFence ();\r
\r
@param Address The MMIO register to read.\r
\r
- @return The value read.\r
+ @return The value read from Address.\r
\r
**/\r
UINT64\r
{\r
UINT64 Data;\r
\r
+ //\r
+ // Make sure that Address is 64-bit aligned.\r
+ // \r
+ ASSERT ((Address & 7) == 0);\r
+\r
Address |= BIT63;\r
\r
MemoryFence ();\r
@param Address The MMIO register to write.\r
@param Data The value to write to the MMIO register.\r
\r
- @return The value written the memory address.\r
+ @return The value written to the Mmio. It equals to the\r
+ input Value instead of the actual value read back from\r
+ the Mmio.\r
\r
**/\r
UINT8\r
@param Address The MMIO register to write.\r
@param Data The value to write to the MMIO register.\r
\r
- @return The value written the memory address.\r
+ @return The value written to the Mmio. It equals to the\r
+ input Value instead of the actual value read back from\r
+ the Mmio.\r
\r
**/\r
UINT16\r
IN UINT16 Data\r
)\r
{\r
+ //\r
+ // Make sure that Address is 16-bit aligned.\r
+ // \r
+ ASSERT ((Address & 1) == 0);\r
+\r
Address |= BIT63;\r
\r
MemoryFence ();\r
@param Address The MMIO register to write.\r
@param Data The value to write to the MMIO register.\r
\r
- @return The value written the memory address.\r
+ @return The value written to the Mmio. It equals to the\r
+ input Value instead of the actual value read back from\r
+ the Mmio.\r
\r
**/\r
UINT32\r
IN UINT32 Data\r
)\r
{\r
+ //\r
+ // Make sure that Address is 32-bit aligned.\r
+ // \r
+ ASSERT ((Address & 3) == 0);\r
+\r
Address |= BIT63;\r
\r
MemoryFence ();\r
@param Address The MMIO register to write.\r
@param Data The value to write to the MMIO register.\r
\r
- @return The value written the memory address.\r
+ @return The value written to the Mmio. It equals to the\r
+ input Value instead of the actual value read back from\r
+ the Mmio.\r
\r
**/\r
UINT64\r
IN UINT64 Data\r
)\r
{\r
+ //\r
+ // Make sure that Address is 64-bit aligned.\r
+ // \r
+ ASSERT ((Address & 7) == 0);\r
+\r
Address |= BIT63;\r
\r
MemoryFence ();\r