\r
Copyright (C) 2013 - 2014, Red Hat, Inc.\r
Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>\r
+ (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>\r
\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
**/\r
\r
#include <Protocol/FdtClient.h>\r
\r
-STATIC UINTN mFwCfgSelectorAddress;\r
-STATIC UINTN mFwCfgDataAddress;\r
-STATIC UINTN mFwCfgDmaAddress;\r
+STATIC UINTN mFwCfgSelectorAddress;\r
+STATIC UINTN mFwCfgDataAddress;\r
+STATIC UINTN mFwCfgDmaAddress;\r
\r
/**\r
Reads firmware configuration bytes into a buffer\r
\r
**/\r
typedef\r
-VOID (EFIAPI READ_BYTES_FUNCTION) (\r
+VOID(EFIAPI READ_BYTES_FUNCTION)(\r
IN UINTN Size,\r
IN VOID *Buffer OPTIONAL\r
);\r
\r
**/\r
typedef\r
-VOID (EFIAPI WRITE_BYTES_FUNCTION) (\r
+VOID(EFIAPI WRITE_BYTES_FUNCTION)(\r
IN UINTN Size,\r
IN VOID *Buffer OPTIONAL\r
);\r
\r
**/\r
typedef\r
-VOID (EFIAPI SKIP_BYTES_FUNCTION) (\r
+VOID(EFIAPI SKIP_BYTES_FUNCTION)(\r
IN UINTN Size\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 SKIP_BYTES_FUNCTION MmioSkipBytes;\r
-STATIC READ_BYTES_FUNCTION DmaReadBytes;\r
-STATIC WRITE_BYTES_FUNCTION DmaWriteBytes;\r
-STATIC SKIP_BYTES_FUNCTION DmaSkipBytes;\r
+STATIC READ_BYTES_FUNCTION MmioReadBytes;\r
+STATIC WRITE_BYTES_FUNCTION MmioWriteBytes;\r
+STATIC SKIP_BYTES_FUNCTION MmioSkipBytes;\r
+STATIC READ_BYTES_FUNCTION DmaReadBytes;\r
+STATIC WRITE_BYTES_FUNCTION DmaWriteBytes;\r
+STATIC SKIP_BYTES_FUNCTION DmaSkipBytes;\r
\r
//\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
-STATIC SKIP_BYTES_FUNCTION *InternalQemuFwCfgSkipBytes = MmioSkipBytes;\r
-\r
+STATIC READ_BYTES_FUNCTION *InternalQemuFwCfgReadBytes = MmioReadBytes;\r
+STATIC WRITE_BYTES_FUNCTION *InternalQemuFwCfgWriteBytes = MmioWriteBytes;\r
+STATIC SKIP_BYTES_FUNCTION *InternalQemuFwCfgSkipBytes = MmioSkipBytes;\r
\r
/**\r
Returns a boolean indicating if the firmware configuration interface\r
return (BOOLEAN)(mFwCfgSelectorAddress != 0 && mFwCfgDataAddress != 0);\r
}\r
\r
-\r
RETURN_STATUS\r
EFIAPI\r
QemuFwCfgInitialize (\r
VOID\r
)\r
{\r
- EFI_STATUS Status;\r
- FDT_CLIENT_PROTOCOL *FdtClient;\r
- CONST UINT64 *Reg;\r
- UINT32 RegSize;\r
- UINTN AddressCells, SizeCells;\r
- UINT64 FwCfgSelectorAddress;\r
- UINT64 FwCfgSelectorSize;\r
- UINT64 FwCfgDataAddress;\r
- UINT64 FwCfgDataSize;\r
- UINT64 FwCfgDmaAddress;\r
- UINT64 FwCfgDmaSize;\r
-\r
- Status = gBS->LocateProtocol (&gFdtClientProtocolGuid, NULL,\r
- (VOID **)&FdtClient);\r
+ EFI_STATUS Status;\r
+ FDT_CLIENT_PROTOCOL *FdtClient;\r
+ CONST UINT64 *Reg;\r
+ UINT32 RegSize;\r
+ UINTN AddressCells, SizeCells;\r
+ UINT64 FwCfgSelectorAddress;\r
+ UINT64 FwCfgSelectorSize;\r
+ UINT64 FwCfgDataAddress;\r
+ UINT64 FwCfgDataSize;\r
+ UINT64 FwCfgDmaAddress;\r
+ UINT64 FwCfgDmaSize;\r
+\r
+ Status = gBS->LocateProtocol (\r
+ &gFdtClientProtocolGuid,\r
+ NULL,\r
+ (VOID **)&FdtClient\r
+ );\r
ASSERT_EFI_ERROR (Status);\r
\r
- Status = FdtClient->FindCompatibleNodeReg (FdtClient, "qemu,fw-cfg-mmio",\r
- (CONST VOID **)&Reg, &AddressCells, &SizeCells,\r
- &RegSize);\r
+ Status = FdtClient->FindCompatibleNodeReg (\r
+ FdtClient,\r
+ "qemu,fw-cfg-mmio",\r
+ (CONST VOID **)&Reg,\r
+ &AddressCells,\r
+ &SizeCells,\r
+ &RegSize\r
+ );\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((EFI_D_WARN,\r
+ DEBUG ((\r
+ DEBUG_WARN,\r
"%a: No 'qemu,fw-cfg-mmio' compatible DT node found (Status == %r)\n",\r
- __FUNCTION__, Status));\r
+ __FUNCTION__,\r
+ Status\r
+ ));\r
return EFI_SUCCESS;\r
}\r
\r
mFwCfgSelectorAddress = FwCfgSelectorAddress;\r
mFwCfgDataAddress = FwCfgDataAddress;\r
\r
- DEBUG ((EFI_D_INFO, "Found FwCfg @ 0x%Lx/0x%Lx\n", FwCfgSelectorAddress,\r
- FwCfgDataAddress));\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "Found FwCfg @ 0x%Lx/0x%Lx\n",\r
+ FwCfgSelectorAddress,\r
+ FwCfgDataAddress\r
+ ));\r
\r
if (SwapBytes64 (Reg[1]) >= 0x18) {\r
FwCfgDmaAddress = FwCfgDataAddress + 0x10;\r
//\r
ASSERT (FwCfgDmaAddress <= MAX_UINTN - FwCfgDmaSize + 1);\r
\r
- DEBUG ((EFI_D_INFO, "Found FwCfg DMA @ 0x%Lx\n", FwCfgDmaAddress));\r
+ DEBUG ((DEBUG_INFO, "Found FwCfg DMA @ 0x%Lx\n", FwCfgDmaAddress));\r
} else {\r
FwCfgDmaAddress = 0;\r
}\r
\r
if (QemuFwCfgIsAvailable ()) {\r
- UINT32 Signature;\r
+ UINT32 Signature;\r
\r
QemuFwCfgSelectItem (QemuFwCfgItemSignature);\r
Signature = QemuFwCfgRead32 ();\r
// feature bitmap (which we read without DMA) to confirm the feature.\r
//\r
if (FwCfgDmaAddress != 0) {\r
- UINT32 Features;\r
+ UINT32 Features;\r
\r
QemuFwCfgSelectItem (QemuFwCfgItemInterfaceVersion);\r
Features = QemuFwCfgRead32 ();\r
if ((Features & FW_CFG_F_DMA) != 0) {\r
- mFwCfgDmaAddress = FwCfgDmaAddress;\r
- InternalQemuFwCfgReadBytes = DmaReadBytes;\r
+ mFwCfgDmaAddress = FwCfgDmaAddress;\r
+ InternalQemuFwCfgReadBytes = DmaReadBytes;\r
InternalQemuFwCfgWriteBytes = DmaWriteBytes;\r
- InternalQemuFwCfgSkipBytes = DmaSkipBytes;\r
+ InternalQemuFwCfgSkipBytes = DmaSkipBytes;\r
}\r
}\r
} else {\r
mFwCfgDataAddress = 0;\r
}\r
}\r
+\r
return RETURN_SUCCESS;\r
}\r
\r
-\r
/**\r
Selects a firmware configuration item for reading.\r
\r
VOID\r
EFIAPI\r
QemuFwCfgSelectItem (\r
- IN FIRMWARE_CONFIG_ITEM QemuFwCfgItem\r
+ IN FIRMWARE_CONFIG_ITEM QemuFwCfgItem\r
)\r
{\r
if (QemuFwCfgIsAvailable ()) {\r
}\r
}\r
\r
-\r
/**\r
Slow READ_BYTES_FUNCTION.\r
**/\r
VOID\r
EFIAPI\r
MmioReadBytes (\r
- IN UINTN Size,\r
- IN VOID *Buffer OPTIONAL\r
+ IN UINTN Size,\r
+ IN VOID *Buffer OPTIONAL\r
)\r
{\r
- UINTN Left;\r
- UINT8 *Ptr;\r
- UINT8 *End;\r
+ UINTN Left;\r
+ UINT8 *Ptr;\r
+ UINT8 *End;\r
\r
-#ifdef MDE_CPU_AARCH64\r
+ #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64)\r
Left = Size & 7;\r
-#else\r
+ #else\r
Left = Size & 3;\r
-#endif\r
+ #endif\r
\r
Size -= Left;\r
- Ptr = Buffer;\r
- End = Ptr + Size;\r
+ Ptr = Buffer;\r
+ End = Ptr + Size;\r
\r
-#ifdef MDE_CPU_AARCH64\r
+ #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64)\r
while (Ptr < End) {\r
*(UINT64 *)Ptr = MmioRead64 (mFwCfgDataAddress);\r
- Ptr += 8;\r
+ Ptr += 8;\r
}\r
+\r
if (Left & 4) {\r
*(UINT32 *)Ptr = MmioRead32 (mFwCfgDataAddress);\r
- Ptr += 4;\r
+ Ptr += 4;\r
}\r
-#else\r
+\r
+ #else\r
while (Ptr < End) {\r
*(UINT32 *)Ptr = MmioRead32 (mFwCfgDataAddress);\r
- Ptr += 4;\r
+ Ptr += 4;\r
}\r
-#endif\r
+\r
+ #endif\r
\r
if (Left & 2) {\r
*(UINT16 *)Ptr = MmioRead16 (mFwCfgDataAddress);\r
- Ptr += 2;\r
+ Ptr += 2;\r
}\r
+\r
if (Left & 1) {\r
*Ptr = MmioRead8 (mFwCfgDataAddress);\r
}\r
}\r
\r
-\r
/**\r
Transfer an array of bytes, or skip a number of bytes, using the DMA\r
interface.\r
STATIC\r
VOID\r
DmaTransferBytes (\r
- IN UINTN Size,\r
- IN OUT VOID *Buffer OPTIONAL,\r
- IN UINT32 Control\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
+ 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
+ ASSERT (\r
+ Control == FW_CFG_DMA_CTL_WRITE || Control == FW_CFG_DMA_CTL_READ ||\r
+ Control == FW_CFG_DMA_CTL_SKIP\r
+ );\r
\r
if (Size == 0) {\r
return;\r
//\r
// This will fire off the transfer.\r
//\r
-#ifdef MDE_CPU_AARCH64\r
+ #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64)\r
MmioWrite64 (mFwCfgDmaAddress, SwapBytes64 ((UINT64)&Access));\r
-#else\r
+ #else\r
MmioWrite32 ((UINT32)(mFwCfgDmaAddress + 4), SwapBytes32 ((UINT32)&Access));\r
-#endif\r
+ #endif\r
\r
//\r
// We shouldn't look at Access.Control before starting the transfer.\r
MemoryFence ();\r
}\r
\r
-\r
/**\r
Fast READ_BYTES_FUNCTION.\r
**/\r
VOID\r
EFIAPI\r
DmaReadBytes (\r
- IN UINTN Size,\r
- IN VOID *Buffer OPTIONAL\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
VOID\r
EFIAPI\r
QemuFwCfgReadBytes (\r
- IN UINTN Size,\r
- IN VOID *Buffer\r
+ IN UINTN Size,\r
+ IN VOID *Buffer\r
)\r
{\r
if (QemuFwCfgIsAvailable ()) {\r
}\r
}\r
\r
-\r
/**\r
Slow WRITE_BYTES_FUNCTION.\r
**/\r
VOID\r
EFIAPI\r
MmioWriteBytes (\r
- IN UINTN Size,\r
- IN VOID *Buffer OPTIONAL\r
+ IN UINTN Size,\r
+ IN VOID *Buffer OPTIONAL\r
)\r
{\r
- UINTN Idx;\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
VOID\r
EFIAPI\r
DmaWriteBytes (\r
- IN UINTN Size,\r
- IN VOID *Buffer OPTIONAL\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
VOID\r
EFIAPI\r
QemuFwCfgWriteBytes (\r
- IN UINTN Size,\r
- IN VOID *Buffer\r
+ IN UINTN Size,\r
+ IN VOID *Buffer\r
)\r
{\r
if (QemuFwCfgIsAvailable ()) {\r
}\r
}\r
\r
-\r
/**\r
Slow SKIP_BYTES_FUNCTION.\r
**/\r
VOID\r
EFIAPI\r
MmioSkipBytes (\r
- IN UINTN Size\r
+ IN UINTN Size\r
)\r
{\r
- UINTN ChunkSize;\r
- UINT8 SkipBuffer[256];\r
+ UINTN ChunkSize;\r
+ UINT8 SkipBuffer[256];\r
\r
//\r
// Emulate the skip by reading data in chunks, and throwing it away. The\r
}\r
}\r
\r
-\r
/**\r
Fast SKIP_BYTES_FUNCTION.\r
**/\r
VOID\r
EFIAPI\r
DmaSkipBytes (\r
- IN UINTN Size\r
+ IN UINTN Size\r
)\r
{\r
DmaTransferBytes (Size, NULL, FW_CFG_DMA_CTL_SKIP);\r
}\r
\r
-\r
/**\r
Skip bytes in the firmware configuration item.\r
\r
VOID\r
EFIAPI\r
QemuFwCfgSkipBytes (\r
- IN UINTN Size\r
+ IN UINTN Size\r
)\r
{\r
if (QemuFwCfgIsAvailable ()) {\r
}\r
}\r
\r
-\r
/**\r
Reads a UINT8 firmware configuration value\r
\r
VOID\r
)\r
{\r
- UINT8 Result;\r
+ UINT8 Result;\r
\r
QemuFwCfgReadBytes (sizeof Result, &Result);\r
return Result;\r
}\r
\r
-\r
/**\r
Reads a UINT16 firmware configuration value\r
\r
VOID\r
)\r
{\r
- UINT16 Result;\r
+ UINT16 Result;\r
\r
QemuFwCfgReadBytes (sizeof Result, &Result);\r
return Result;\r
}\r
\r
-\r
/**\r
Reads a UINT32 firmware configuration value\r
\r
VOID\r
)\r
{\r
- UINT32 Result;\r
+ UINT32 Result;\r
\r
QemuFwCfgReadBytes (sizeof Result, &Result);\r
return Result;\r
}\r
\r
-\r
/**\r
Reads a UINT64 firmware configuration value\r
\r
VOID\r
)\r
{\r
- UINT64 Result;\r
+ UINT64 Result;\r
\r
QemuFwCfgReadBytes (sizeof Result, &Result);\r
return Result;\r
}\r
\r
-\r
/**\r
Find the configuration item corresponding to the firmware configuration file.\r
\r
OUT UINTN *Size\r
)\r
{\r
- UINT32 Count;\r
- UINT32 Idx;\r
+ UINT32 Count;\r
+ UINT32 Idx;\r
\r
if (!QemuFwCfgIsAvailable ()) {\r
return RETURN_UNSUPPORTED;\r
Count = SwapBytes32 (QemuFwCfgRead32 ());\r
\r
for (Idx = 0; Idx < Count; ++Idx) {\r
- UINT32 FileSize;\r
- UINT16 FileSelect;\r
- CHAR8 FName[QEMU_FW_CFG_FNAME_SIZE];\r
+ UINT32 FileSize;\r
+ UINT16 FileSelect;\r
+ CHAR8 FName[QEMU_FW_CFG_FNAME_SIZE];\r
\r
FileSize = QemuFwCfgRead32 ();\r
FileSelect = QemuFwCfgRead16 ();\r
InternalQemuFwCfgReadBytes (sizeof (FName), FName);\r
\r
if (AsciiStrCmp (Name, FName) == 0) {\r
- *Item = (FIRMWARE_CONFIG_ITEM) SwapBytes16 (FileSelect);\r
+ *Item = (FIRMWARE_CONFIG_ITEM)SwapBytes16 (FileSelect);\r
*Size = SwapBytes32 (FileSize);\r
return RETURN_SUCCESS;\r
}\r