#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