/** @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
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
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
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 MmioRead32 (Address);\r
+ return MmioRead32 (InternalGetMemoryMapAddress (Port));\r
}\r
\r
/**\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
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
IN UINT32 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 MmioWrite32 (Address, Data);\r
+ return MmioWrite32 (InternalGetMemoryMapAddress (Port), Data);\r
}\r
\r
/**\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
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
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
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
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
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