IN VOID *Buffer OPTIONAL\r
);\r
\r
+/**\r
+ Writes bytes from a buffer to firmware configuration\r
+\r
+ @param[in] Size Size in bytes to write\r
+ @param[in] Buffer Buffer to transfer data from (OPTIONAL if Size is 0)\r
+\r
+**/\r
+typedef\r
+VOID (EFIAPI WRITE_BYTES_FUNCTION) (\r
+ IN UINTN Size,\r
+ IN VOID *Buffer OPTIONAL\r
+ );\r
+\r
//\r
// Forward declaration of the two implementations we have.\r
//\r
STATIC READ_BYTES_FUNCTION MmioReadBytes;\r
+STATIC WRITE_BYTES_FUNCTION MmioWriteBytes;\r
STATIC READ_BYTES_FUNCTION DmaReadBytes;\r
+STATIC WRITE_BYTES_FUNCTION DmaWriteBytes;\r
\r
//\r
-// This points to the one we detect at runtime.\r
+// These correspond to the implementation we detect at runtime.\r
//\r
STATIC READ_BYTES_FUNCTION *InternalQemuFwCfgReadBytes = MmioReadBytes;\r
+STATIC WRITE_BYTES_FUNCTION *InternalQemuFwCfgWriteBytes = MmioWriteBytes;\r
\r
\r
/**\r
if ((Features & FW_CFG_F_DMA) != 0) {\r
mFwCfgDmaAddress = FwCfgDmaAddress;\r
InternalQemuFwCfgReadBytes = DmaReadBytes;\r
+ InternalQemuFwCfgWriteBytes = DmaWriteBytes;\r
}\r
}\r
} else {\r
}\r
}\r
\r
+\r
+/**\r
+ Slow WRITE_BYTES_FUNCTION.\r
+**/\r
+STATIC\r
+VOID\r
+EFIAPI\r
+MmioWriteBytes (\r
+ IN UINTN Size,\r
+ IN VOID *Buffer OPTIONAL\r
+ )\r
+{\r
+ UINTN Idx;\r
+\r
+ for (Idx = 0; Idx < Size; ++Idx) {\r
+ MmioWrite8 (mFwCfgDataAddress, ((UINT8 *)Buffer)[Idx]);\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ Fast WRITE_BYTES_FUNCTION.\r
+**/\r
+STATIC\r
+VOID\r
+EFIAPI\r
+DmaWriteBytes (\r
+ IN UINTN Size,\r
+ IN VOID *Buffer OPTIONAL\r
+ )\r
+{\r
+ DmaTransferBytes (Size, Buffer, FW_CFG_DMA_CTL_WRITE);\r
+}\r
+\r
+\r
/**\r
Write firmware configuration bytes from a buffer\r
\r
)\r
{\r
if (QemuFwCfgIsAvailable ()) {\r
- UINTN Idx;\r
-\r
- for (Idx = 0; Idx < Size; ++Idx) {\r
- MmioWrite8 (mFwCfgDataAddress, ((UINT8 *)Buffer)[Idx]);\r
- }\r
+ InternalQemuFwCfgWriteBytes (Size, Buffer);\r
}\r
}\r
\r