+/**\r
+ Reads an 8-bit I/O port fifo into a block of memory.\r
+\r
+ Reads the 8-bit I/O fifo port specified by Port.\r
+ The port is read Count times, and the read data is\r
+ stored in the provided Buffer.\r
+\r
+ This function must guarantee that all I/O read and write operations are\r
+ serialized.\r
+\r
+ If 8-bit I/O port operations are not supported, then ASSERT().\r
+\r
+ @param Port The I/O port to read.\r
+ @param Count The number of times to read I/O port.\r
+ @param Buffer The buffer to store the read data into.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+IoReadFifo8 (\r
+ IN UINTN Port,\r
+ IN UINTN Count,\r
+ OUT VOID *Buffer\r
+ )\r
+{\r
+ UINT8 *Buffer8;\r
+\r
+ Buffer8 = (UINT8 *)Buffer;\r
+ while (Count--) {\r
+ *Buffer8++ = IoRead8 (Port);\r
+ }\r
+}\r
+\r
+/**\r
+ Writes a block of memory into an 8-bit I/O port fifo.\r
+\r
+ Writes the 8-bit I/O fifo port specified by Port.\r
+ The port is written Count times, and the write data is\r
+ retrieved from the provided Buffer.\r
+\r
+ This function must guarantee that all I/O write and write operations are\r
+ serialized.\r
+\r
+ If 8-bit I/O port operations are not supported, then ASSERT().\r
+\r
+ @param Port The I/O port to write.\r
+ @param Count The number of times to write I/O port.\r
+ @param Buffer The buffer to retrieve the write data from.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+IoWriteFifo8 (\r
+ IN UINTN Port,\r
+ IN UINTN Count,\r
+ IN VOID *Buffer\r
+ )\r
+{\r
+ UINT8 *Buffer8;\r
+\r
+ Buffer8 = (UINT8 *)Buffer;\r
+ while (Count--) {\r
+ IoWrite8 (Port, *Buffer8++);\r
+ }\r
+}\r
+\r
+/**\r
+ Reads a 16-bit I/O port fifo into a block of memory.\r
+\r
+ Reads the 16-bit I/O fifo port specified by Port.\r
+ The port is read Count times, and the read data is\r
+ stored in the provided Buffer.\r
+\r
+ This function must guarantee that all I/O read and write operations are\r
+ serialized.\r
+\r
+ If 16-bit I/O port operations are not supported, then ASSERT().\r
+\r
+ @param Port The I/O port to read.\r
+ @param Count The number of times to read I/O port.\r
+ @param Buffer The buffer to store the read data into.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+IoReadFifo16 (\r
+ IN UINTN Port,\r
+ IN UINTN Count,\r
+ OUT VOID *Buffer\r
+ )\r
+{\r
+ UINT16 *Buffer16;\r
+\r
+ //\r
+ // Make sure Port is aligned on a 16-bit boundary.\r
+ //\r
+ ASSERT ((Port & 1) == 0);\r
+ Buffer16 = (UINT16 *)Buffer;\r
+ while (Count--) {\r
+ *Buffer16++ = IoRead16 (Port);\r
+ }\r
+}\r
+\r
+/**\r
+ Writes a block of memory into a 16-bit I/O port fifo.\r
+\r
+ Writes the 16-bit I/O fifo port specified by Port.\r
+ The port is written Count times, and the write data is\r
+ retrieved from the provided Buffer.\r
+\r
+ This function must guarantee that all I/O write and write operations are\r
+ serialized.\r
+\r
+ If 16-bit I/O port operations are not supported, then ASSERT().\r
+\r
+ @param Port The I/O port to write.\r
+ @param Count The number of times to write I/O port.\r
+ @param Buffer The buffer to retrieve the write data from.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+IoWriteFifo16 (\r
+ IN UINTN Port,\r
+ IN UINTN Count,\r
+ IN VOID *Buffer\r
+ )\r
+{\r
+ UINT16 *Buffer16;\r
+\r
+ //\r
+ // Make sure Port is aligned on a 16-bit boundary.\r
+ //\r
+ ASSERT ((Port & 1) == 0);\r
+ Buffer16 = (UINT16 *)Buffer;\r
+ while (Count--) {\r
+ IoWrite16 (Port, *Buffer16++);\r
+ }\r
+}\r
+\r
+/**\r
+ Reads a 32-bit I/O port fifo into a block of memory.\r
+\r
+ Reads the 32-bit I/O fifo port specified by Port.\r
+ The port is read Count times, and the read data is\r
+ stored in the provided Buffer.\r
+\r
+ This function must guarantee that all I/O read and write operations are\r
+ serialized.\r
+\r
+ If 32-bit I/O port operations are not supported, then ASSERT().\r
+\r
+ @param Port The I/O port to read.\r
+ @param Count The number of times to read I/O port.\r
+ @param Buffer The buffer to store the read data into.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+IoReadFifo32 (\r
+ IN UINTN Port,\r
+ IN UINTN Count,\r
+ OUT VOID *Buffer\r
+ )\r
+{\r
+ UINT32 *Buffer32;\r
+\r
+ //\r
+ // Make sure Port is aligned on a 32-bit boundary.\r
+ //\r
+ ASSERT ((Port & 3) == 0);\r
+ Buffer32 = (UINT32 *)Buffer;\r
+ while (Count--) {\r
+ *Buffer32++ = IoRead32 (Port);\r
+ }\r
+}\r
+\r
+/**\r
+ Writes a block of memory into a 32-bit I/O port fifo.\r
+\r
+ Writes the 32-bit I/O fifo port specified by Port.\r
+ The port is written Count times, and the write data is\r
+ retrieved from the provided Buffer.\r
+\r
+ This function must guarantee that all I/O write and write operations are\r
+ serialized.\r
+\r
+ If 32-bit I/O port operations are not supported, then ASSERT().\r
+\r
+ @param Port The I/O port to write.\r
+ @param Count The number of times to write I/O port.\r
+ @param Buffer The buffer to retrieve the write data from.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+IoWriteFifo32 (\r
+ IN UINTN Port,\r
+ IN UINTN Count,\r
+ IN VOID *Buffer\r
+ )\r
+{\r
+ UINT32 *Buffer32;\r
+\r
+ //\r
+ // Make sure Port is aligned on a 32-bit boundary.\r
+ //\r
+ ASSERT ((Port & 3) == 0);\r
+ Buffer32 = (UINT32 *)Buffer;\r
+ while (Count--) {\r
+ IoWrite32 (Port, *Buffer32++);\r
+ }\r
+}\r
+\r