\r
\r
/**\r
- Fast READ_BYTES_FUNCTION.\r
+ Transfer an array of bytes, or skip a number of bytes, using the DMA\r
+ interface.\r
+\r
+ @param[in] Size Size in bytes to transfer or skip.\r
+\r
+ @param[in,out] Buffer Buffer to read data into or write data from. Ignored,\r
+ and may be NULL, if Size is zero, or Control is\r
+ FW_CFG_DMA_CTL_SKIP.\r
+\r
+ @param[in] Control One of the following:\r
+ FW_CFG_DMA_CTL_WRITE - write to fw_cfg from Buffer.\r
+ FW_CFG_DMA_CTL_READ - read from fw_cfg into Buffer.\r
+ FW_CFG_DMA_CTL_SKIP - skip bytes in fw_cfg.\r
**/\r
STATIC\r
VOID\r
-EFIAPI\r
-DmaReadBytes (\r
- IN UINTN Size,\r
- IN VOID *Buffer OPTIONAL\r
+DmaTransferBytes (\r
+ IN UINTN Size,\r
+ IN OUT VOID *Buffer OPTIONAL,\r
+ IN UINT32 Control\r
)\r
{\r
volatile FW_CFG_DMA_ACCESS Access;\r
UINT32 Status;\r
\r
+ ASSERT (Control == FW_CFG_DMA_CTL_WRITE || Control == FW_CFG_DMA_CTL_READ ||\r
+ Control == FW_CFG_DMA_CTL_SKIP);\r
+\r
if (Size == 0) {\r
return;\r
}\r
\r
ASSERT (Size <= MAX_UINT32);\r
\r
- Access.Control = SwapBytes32 (FW_CFG_DMA_CTL_READ);\r
+ Access.Control = SwapBytes32 (Control);\r
Access.Length = SwapBytes32 ((UINT32)Size);\r
Access.Address = SwapBytes64 ((UINT64)(UINTN)Buffer);\r
\r
}\r
\r
\r
+/**\r
+ Fast READ_BYTES_FUNCTION.\r
+**/\r
+STATIC\r
+VOID\r
+EFIAPI\r
+DmaReadBytes (\r
+ IN UINTN Size,\r
+ IN VOID *Buffer OPTIONAL\r
+ )\r
+{\r
+ DmaTransferBytes (Size, Buffer, FW_CFG_DMA_CTL_READ);\r
+}\r
+\r
+\r
/**\r
Reads firmware configuration bytes into a buffer\r
\r