* [edk2-devel] [PATCH v3 0/7] Adjust the QemuFwCfgLibMmio and add PEI stage @ 2024-04-25 12:12 Chao Li 2024-04-25 12:12 ` [edk2-devel] [PATCH v3 1/7] OvmfPkg: Separate QemuFwCfgLibMmio.c into two files Chao Li ` (6 more replies) 0 siblings, 7 replies; 13+ messages in thread From: Chao Li @ 2024-04-25 12:12 UTC (permalink / raw) To: devel Cc: Ard Biesheuvel, Jiewen Yao, Gerd Hoffmann, Leif Lindholm, Sami Mujawar, Sunil V L, Andrei Warkentin Patch1: Added three PCDs for QemuFwCfgLibMmio Patch2: Sparate QemuFwCfgLibMmio.c into two files and default as DXE stage library. Patch3: Added QemuFwCfgMmiLib PEI version Patch4: Rename QemuFwCfgLibMmio.inf to QemuFwCfgMmioDxeLib.inf and enable it in AARCH64 and RISCV64. V1 -> V2: 1. Use HOBs instead of PCD. 2. The old patch2 is divided into two parts, one is code splitting, and the other is functional changes. 3. add two patches to keep the safe when change the platform DSC file. V2 -> V3: 1. Merge three HOBs into a single HOB. 2. Remove the dynamic global variables in PEI. BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4755 PR: https://github.com/tianocore/edk2/pull/5568 Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Leif Lindholm <quic_llindhol@quicinc.com> Cc: Sami Mujawar <sami.mujawar@arm.com> Cc: Sunil V L <sunilvl@ventanamicro.com> Cc: Andrei Warkentin <andrei.warkentin@intel.com> Chao Li (7): OvmfPkg: Separate QemuFwCfgLibMmio.c into two files OvmfPkg: Add the way of HOBs in QemuFwCfgLibMmio OvmfPkg: Add the QemuFwCfgMmioLib PEI stage version OvmfPkg: Copy the same new INF as QemuFwCfgLibMmio.inf ArmVirtPkg: Enable QemuFwCfgMmioDxeLib.inf OvmfPkg/RiscVVirt: Enable QemuFwCfgMmioDxeLib.inf OvmfPkg: Remove QemuFwCfgLibMmio.inf ArmVirtPkg/ArmVirtQemu.dsc | 2 +- ArmVirtPkg/ArmVirtQemuKernel.dsc | 2 +- .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.c | 249 +++++------------ .../QemuFwCfgLib/QemuFwCfgLibMmioInternal.h | 253 ++++++++++++++++++ .../Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c | 222 +++++++++++++++ ...CfgLibMmio.inf => QemuFwCfgMmioDxeLib.inf} | 5 +- .../Library/QemuFwCfgLib/QemuFwCfgMmioPei.c | 228 ++++++++++++++++ .../QemuFwCfgLib/QemuFwCfgMmioPeiLib.inf | 49 ++++ OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc | 2 +- 9 files changed, 822 insertions(+), 190 deletions(-) create mode 100644 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h create mode 100644 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c rename OvmfPkg/Library/QemuFwCfgLib/{QemuFwCfgLibMmio.inf => QemuFwCfgMmioDxeLib.inf} (81%) create mode 100644 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioPei.c create mode 100644 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioPeiLib.inf -- 2.27.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118291): https://edk2.groups.io/g/devel/message/118291 Mute This Topic: https://groups.io/mt/105728764/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply [flat|nested] 13+ messages in thread
* [edk2-devel] [PATCH v3 1/7] OvmfPkg: Separate QemuFwCfgLibMmio.c into two files 2024-04-25 12:12 [edk2-devel] [PATCH v3 0/7] Adjust the QemuFwCfgLibMmio and add PEI stage Chao Li @ 2024-04-25 12:12 ` Chao Li 2024-04-25 12:58 ` Ard Biesheuvel 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 2/7] OvmfPkg: Add the way of HOBs in QemuFwCfgLibMmio Chao Li ` (5 subsequent siblings) 6 siblings, 1 reply; 13+ messages in thread From: Chao Li @ 2024-04-25 12:12 UTC (permalink / raw) To: devel Cc: Ard Biesheuvel, Jiewen Yao, Gerd Hoffmann, Leif Lindholm, Sami Mujawar, Sunil V L, Andrei Warkentin Separate QemuFwCfgLibMmio.c into two files named QemuFwCfgLibMmio.c and QemuFwCfgLibMmioDxe.c, added a new header named QemuFwCfgLibMmioInternal.h for MMIO version. Build-tested only (with "ArmVirtQemu.dsc and RiscVVirtQemu.dsc"). BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4755 Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Leif Lindholm <quic_llindhol@quicinc.com> Cc: Sami Mujawar <sami.mujawar@arm.com> Cc: Sunil V L <sunilvl@ventanamicro.com> Cc: Andrei Warkentin <andrei.warkentin@intel.com> Signed-off-by: Chao Li <lichao@loongson.cn> --- .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.c | 194 +----------------- .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf | 4 +- .../QemuFwCfgLib/QemuFwCfgLibMmioInternal.h | 179 ++++++++++++++++ .../Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c | 153 ++++++++++++++ 4 files changed, 340 insertions(+), 190 deletions(-) create mode 100644 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h create mode 100644 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c index 115a210759..dc949c8e26 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c @@ -1,10 +1,9 @@ /** @file - Stateful and implicitly initialized fw_cfg library implementation. - Copyright (C) 2013 - 2014, Red Hat, Inc. Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR> (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR> + Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -20,63 +19,7 @@ #include <Protocol/FdtClient.h> -STATIC UINTN mFwCfgSelectorAddress; -STATIC UINTN mFwCfgDataAddress; -STATIC UINTN mFwCfgDmaAddress; - -/** - Reads firmware configuration bytes into a buffer - - @param[in] Size Size in bytes to read - @param[in] Buffer Buffer to store data into (OPTIONAL if Size is 0) - -**/ -typedef -VOID(EFIAPI READ_BYTES_FUNCTION)( - IN UINTN Size, - IN VOID *Buffer OPTIONAL - ); - -/** - Writes bytes from a buffer to firmware configuration - - @param[in] Size Size in bytes to write - @param[in] Buffer Buffer to transfer data from (OPTIONAL if Size is 0) - -**/ -typedef -VOID(EFIAPI WRITE_BYTES_FUNCTION)( - IN UINTN Size, - IN VOID *Buffer OPTIONAL - ); - -/** - Skips bytes in firmware configuration - - @param[in] Size Size in bytes to skip - -**/ -typedef -VOID(EFIAPI SKIP_BYTES_FUNCTION)( - IN UINTN Size - ); - -// -// Forward declaration of the two implementations we have. -// -STATIC READ_BYTES_FUNCTION MmioReadBytes; -STATIC WRITE_BYTES_FUNCTION MmioWriteBytes; -STATIC SKIP_BYTES_FUNCTION MmioSkipBytes; -STATIC READ_BYTES_FUNCTION DmaReadBytes; -STATIC WRITE_BYTES_FUNCTION DmaWriteBytes; -STATIC SKIP_BYTES_FUNCTION DmaSkipBytes; - -// -// These correspond to the implementation we detect at runtime. -// -STATIC READ_BYTES_FUNCTION *InternalQemuFwCfgReadBytes = MmioReadBytes; -STATIC WRITE_BYTES_FUNCTION *InternalQemuFwCfgWriteBytes = MmioWriteBytes; -STATIC SKIP_BYTES_FUNCTION *InternalQemuFwCfgSkipBytes = MmioSkipBytes; +#include "QemuFwCfgLibMmioInternal.h" /** Returns a boolean indicating if the firmware configuration interface @@ -97,126 +40,6 @@ QemuFwCfgIsAvailable ( return (BOOLEAN)(mFwCfgSelectorAddress != 0 && mFwCfgDataAddress != 0); } -RETURN_STATUS -EFIAPI -QemuFwCfgInitialize ( - VOID - ) -{ - EFI_STATUS Status; - FDT_CLIENT_PROTOCOL *FdtClient; - CONST UINT64 *Reg; - UINT32 RegSize; - UINTN AddressCells, SizeCells; - UINT64 FwCfgSelectorAddress; - UINT64 FwCfgSelectorSize; - UINT64 FwCfgDataAddress; - UINT64 FwCfgDataSize; - UINT64 FwCfgDmaAddress; - UINT64 FwCfgDmaSize; - - Status = gBS->LocateProtocol ( - &gFdtClientProtocolGuid, - NULL, - (VOID **)&FdtClient - ); - ASSERT_EFI_ERROR (Status); - - Status = FdtClient->FindCompatibleNodeReg ( - FdtClient, - "qemu,fw-cfg-mmio", - (CONST VOID **)&Reg, - &AddressCells, - &SizeCells, - &RegSize - ); - if (EFI_ERROR (Status)) { - DEBUG (( - DEBUG_WARN, - "%a: No 'qemu,fw-cfg-mmio' compatible DT node found (Status == %r)\n", - __func__, - Status - )); - return EFI_SUCCESS; - } - - ASSERT (AddressCells == 2); - ASSERT (SizeCells == 2); - ASSERT (RegSize == 2 * sizeof (UINT64)); - - FwCfgDataAddress = SwapBytes64 (Reg[0]); - FwCfgDataSize = 8; - FwCfgSelectorAddress = FwCfgDataAddress + FwCfgDataSize; - FwCfgSelectorSize = 2; - - // - // The following ASSERT()s express - // - // Address + Size - 1 <= MAX_UINTN - // - // for both registers, that is, that the last byte in each MMIO range is - // expressible as a MAX_UINTN. The form below is mathematically - // equivalent, and it also prevents any unsigned overflow before the - // comparison. - // - ASSERT (FwCfgSelectorAddress <= MAX_UINTN - FwCfgSelectorSize + 1); - ASSERT (FwCfgDataAddress <= MAX_UINTN - FwCfgDataSize + 1); - - mFwCfgSelectorAddress = FwCfgSelectorAddress; - mFwCfgDataAddress = FwCfgDataAddress; - - DEBUG (( - DEBUG_INFO, - "Found FwCfg @ 0x%Lx/0x%Lx\n", - FwCfgSelectorAddress, - FwCfgDataAddress - )); - - if (SwapBytes64 (Reg[1]) >= 0x18) { - FwCfgDmaAddress = FwCfgDataAddress + 0x10; - FwCfgDmaSize = 0x08; - - // - // See explanation above. - // - ASSERT (FwCfgDmaAddress <= MAX_UINTN - FwCfgDmaSize + 1); - - DEBUG ((DEBUG_INFO, "Found FwCfg DMA @ 0x%Lx\n", FwCfgDmaAddress)); - } else { - FwCfgDmaAddress = 0; - } - - if (QemuFwCfgIsAvailable ()) { - UINT32 Signature; - - QemuFwCfgSelectItem (QemuFwCfgItemSignature); - Signature = QemuFwCfgRead32 (); - if (Signature == SIGNATURE_32 ('Q', 'E', 'M', 'U')) { - // - // For DMA support, we require the DTB to advertise the register, and the - // feature bitmap (which we read without DMA) to confirm the feature. - // - if (FwCfgDmaAddress != 0) { - UINT32 Features; - - QemuFwCfgSelectItem (QemuFwCfgItemInterfaceVersion); - Features = QemuFwCfgRead32 (); - if ((Features & FW_CFG_F_DMA) != 0) { - mFwCfgDmaAddress = FwCfgDmaAddress; - InternalQemuFwCfgReadBytes = DmaReadBytes; - InternalQemuFwCfgWriteBytes = DmaWriteBytes; - InternalQemuFwCfgSkipBytes = DmaSkipBytes; - } - } - } else { - mFwCfgSelectorAddress = 0; - mFwCfgDataAddress = 0; - } - } - - return RETURN_SUCCESS; -} - /** Selects a firmware configuration item for reading. @@ -240,7 +63,6 @@ QemuFwCfgSelectItem ( /** Slow READ_BYTES_FUNCTION. **/ -STATIC VOID EFIAPI MmioReadBytes ( @@ -252,7 +74,7 @@ MmioReadBytes ( UINT8 *Ptr; UINT8 *End; - #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) + #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) Left = Size & 7; #else Left = Size & 3; @@ -262,7 +84,7 @@ MmioReadBytes ( Ptr = Buffer; End = Ptr + Size; - #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) + #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) while (Ptr < End) { *(UINT64 *)Ptr = MmioRead64 (mFwCfgDataAddress); Ptr += 8; @@ -306,7 +128,6 @@ MmioReadBytes ( FW_CFG_DMA_CTL_READ - read from fw_cfg into Buffer. FW_CFG_DMA_CTL_SKIP - skip bytes in fw_cfg. **/ -STATIC VOID DmaTransferBytes ( IN UINTN Size, @@ -340,7 +161,7 @@ DmaTransferBytes ( // // This will fire off the transfer. // - #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) + #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) MmioWrite64 (mFwCfgDmaAddress, SwapBytes64 ((UINT64)&Access)); #else MmioWrite32 ((UINT32)(mFwCfgDmaAddress + 4), SwapBytes32 ((UINT32)&Access)); @@ -365,7 +186,6 @@ DmaTransferBytes ( /** Fast READ_BYTES_FUNCTION. **/ -STATIC VOID EFIAPI DmaReadBytes ( @@ -403,7 +223,6 @@ QemuFwCfgReadBytes ( /** Slow WRITE_BYTES_FUNCTION. **/ -STATIC VOID EFIAPI MmioWriteBytes ( @@ -421,7 +240,6 @@ MmioWriteBytes ( /** Fast WRITE_BYTES_FUNCTION. **/ -STATIC VOID EFIAPI DmaWriteBytes ( @@ -457,7 +275,6 @@ QemuFwCfgWriteBytes ( /** Slow SKIP_BYTES_FUNCTION. **/ -STATIC VOID EFIAPI MmioSkipBytes ( @@ -484,7 +301,6 @@ MmioSkipBytes ( /** Fast SKIP_BYTES_FUNCTION. **/ -STATIC VOID EFIAPI DmaSkipBytes ( diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf index 4b0dfbcb0d..f2596f270e 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf @@ -4,6 +4,7 @@ # # Copyright (C) 2013 - 2014, Red Hat, Inc. # Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR> +# Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR> # # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -23,11 +24,12 @@ [Defines] # The following information is for reference only and not required by the build # tools. # -# VALID_ARCHITECTURES = ARM AARCH64 RISCV64 +# VALID_ARCHITECTURES = ARM AARCH64 RISCV64 LOONGARCH64 # [Sources] QemuFwCfgLibMmio.c + QemuFwCfgMmioDxe.c [Packages] MdePkg/MdePkg.dec diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h new file mode 100644 index 0000000000..d7d645f700 --- /dev/null +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h @@ -0,0 +1,179 @@ +/** @file + Internal interfaces specific to the QemuFwCfgLibMmio instances in OvmfPkg. + + Copyright (C) 2016, Red Hat, Inc. + Copyright (C) 2017, Advanced Micro Devices. All rights reserved + Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef QEMU_FW_CFG_LIB_MMIO_INTERNAL_H_ +#define QEMU_FW_CFG_LIB_MMIO_INTERNAL_H_ + +extern UINTN mFwCfgSelectorAddress; +extern UINTN mFwCfgDataAddress; +extern UINTN mFwCfgDmaAddress; + +/** + Reads firmware configuration bytes into a buffer + + @param[in] Size Size in bytes to read + @param[in] Buffer Buffer to store data into (OPTIONAL if Size is 0) + +**/ +typedef +VOID(EFIAPI READ_BYTES_FUNCTION)( + IN UINTN Size, + IN VOID *Buffer OPTIONAL + ); + +/** + Writes bytes from a buffer to firmware configuration + + @param[in] Size Size in bytes to write + @param[in] Buffer Buffer to transfer data from (OPTIONAL if Size is 0) + +**/ +typedef +VOID(EFIAPI WRITE_BYTES_FUNCTION)( + IN UINTN Size, + IN VOID *Buffer OPTIONAL + ); + +/** + Skips bytes in firmware configuration + + @param[in] Size Size in bytes to skip + +**/ +typedef +VOID(EFIAPI SKIP_BYTES_FUNCTION)( + IN UINTN Size + ); + +/** + Reads firmware configuration bytes into a buffer + + @param[in] Size Size in bytes to read + @param[in] Buffer Buffer to store data into (OPTIONAL if Size is 0) + +**/ +extern +VOID +EFIAPI +(*InternalQemuFwCfgReadBytes) ( + IN UINTN Size, + IN VOID *Buffer OPTIONAL + ); + +/** + Writes bytes from a buffer to firmware configuration + + @param[in] Size Size in bytes to write + @param[in] Buffer Buffer to transfer data from (OPTIONAL if Size is 0) + +**/ +extern +VOID +EFIAPI +(*InternalQemuFwCfgWriteBytes) ( + IN UINTN Size, + IN VOID *Buffer OPTIONAL + ); + +/** + Skips bytes in firmware configuration + + @param[in] Size Size in bytes to skip + +**/ +extern +VOID +EFIAPI +(*InternalQemuFwCfgSkipBytes) ( + IN UINTN Size + ); + +/** + Slow READ_BYTES_FUNCTION. +**/ +VOID +EFIAPI +MmioReadBytes ( + IN UINTN Size, + IN VOID *Buffer OPTIONAL + ); + +/** + Slow WRITE_BYTES_FUNCTION. +**/ +VOID +EFIAPI +MmioWriteBytes ( + IN UINTN Size, + IN VOID *Buffer OPTIONAL + ); + +/** + Slow SKIP_BYTES_FUNCTION. +**/ +VOID +EFIAPI +MmioSkipBytes ( + IN UINTN Size + ); + +/** + Fast READ_BYTES_FUNCTION. +**/ +VOID +EFIAPI +DmaReadBytes ( + IN UINTN Size, + IN VOID *Buffer OPTIONAL + ); + +/** + Fast WRITE_BYTES_FUNCTION. +**/ +VOID +EFIAPI +DmaWriteBytes ( + IN UINTN Size, + IN VOID *Buffer OPTIONAL + ); + +/** + Fast SKIP_BYTES_FUNCTION. +**/ +VOID +EFIAPI +DmaSkipBytes ( + IN UINTN Size + ); + +/** + Transfer an array of bytes, or skip a number of bytes, using the DMA + interface. + + @param[in] Size Size in bytes to transfer or skip. + + @param[in,out] Buffer Buffer to read data into or write data from. Ignored, + and may be NULL, if Size is zero, or Control is + FW_CFG_DMA_CTL_SKIP. + + @param[in] Control One of the following: + FW_CFG_DMA_CTL_WRITE - write to fw_cfg from Buffer. + FW_CFG_DMA_CTL_READ - read from fw_cfg into Buffer. + FW_CFG_DMA_CTL_SKIP - skip bytes in fw_cfg. +**/ +VOID +DmaTransferBytes ( + IN UINTN Size, + IN OUT VOID *Buffer OPTIONAL, + IN UINT32 Control + ); + +#endif diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c new file mode 100644 index 0000000000..4844a42a36 --- /dev/null +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c @@ -0,0 +1,153 @@ +/** @file + + Stateful and implicitly initialized fw_cfg library implementation. + + Copyright (C) 2013 - 2014, Red Hat, Inc. + Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR> + (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR> + Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include <Uefi.h> + +#include <Library/BaseLib.h> +#include <Library/DebugLib.h> +#include <Library/QemuFwCfgLib.h> +#include <Library/UefiBootServicesTableLib.h> + +#include <Protocol/FdtClient.h> + +#include "QemuFwCfgLibMmioInternal.h" + +UINTN mFwCfgSelectorAddress; +UINTN mFwCfgDataAddress; +UINTN mFwCfgDmaAddress; + +// +// These correspond to the implementation we detect at runtime. +// +READ_BYTES_FUNCTION *InternalQemuFwCfgReadBytes = MmioReadBytes; +WRITE_BYTES_FUNCTION *InternalQemuFwCfgWriteBytes = MmioWriteBytes; +SKIP_BYTES_FUNCTION *InternalQemuFwCfgSkipBytes = MmioSkipBytes; + +RETURN_STATUS +EFIAPI +QemuFwCfgInitialize ( + VOID + ) +{ + EFI_STATUS Status; + FDT_CLIENT_PROTOCOL *FdtClient; + CONST UINT64 *Reg; + UINT32 RegSize; + UINTN AddressCells, SizeCells; + UINT64 FwCfgSelectorAddress; + UINT64 FwCfgSelectorSize; + UINT64 FwCfgDataAddress; + UINT64 FwCfgDataSize; + UINT64 FwCfgDmaAddress; + UINT64 FwCfgDmaSize; + + Status = gBS->LocateProtocol ( + &gFdtClientProtocolGuid, + NULL, + (VOID **)&FdtClient + ); + ASSERT_EFI_ERROR (Status); + + Status = FdtClient->FindCompatibleNodeReg ( + FdtClient, + "qemu,fw-cfg-mmio", + (CONST VOID **)&Reg, + &AddressCells, + &SizeCells, + &RegSize + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_WARN, + "%a: No 'qemu,fw-cfg-mmio' compatible DT node found (Status == %r)\n", + __func__, + Status + )); + return EFI_SUCCESS; + } + + ASSERT (AddressCells == 2); + ASSERT (SizeCells == 2); + ASSERT (RegSize == 2 * sizeof (UINT64)); + + FwCfgDataAddress = SwapBytes64 (Reg[0]); + FwCfgDataSize = 8; + FwCfgSelectorAddress = FwCfgDataAddress + FwCfgDataSize; + FwCfgSelectorSize = 2; + + // + // The following ASSERT()s express + // + // Address + Size - 1 <= MAX_UINTN + // + // for both registers, that is, that the last byte in each MMIO range is + // expressible as a MAX_UINTN. The form below is mathematically + // equivalent, and it also prevents any unsigned overflow before the + // comparison. + // + ASSERT (FwCfgSelectorAddress <= MAX_UINTN - FwCfgSelectorSize + 1); + ASSERT (FwCfgDataAddress <= MAX_UINTN - FwCfgDataSize + 1); + + mFwCfgSelectorAddress = FwCfgSelectorAddress; + mFwCfgDataAddress = FwCfgDataAddress; + + DEBUG (( + DEBUG_INFO, + "Found FwCfg @ 0x%Lx/0x%Lx\n", + FwCfgSelectorAddress, + FwCfgDataAddress + )); + + if (SwapBytes64 (Reg[1]) >= 0x18) { + FwCfgDmaAddress = FwCfgDataAddress + 0x10; + FwCfgDmaSize = 0x08; + + // + // See explanation above. + // + ASSERT (FwCfgDmaAddress <= MAX_UINTN - FwCfgDmaSize + 1); + + DEBUG ((DEBUG_INFO, "Found FwCfg DMA @ 0x%Lx\n", FwCfgDmaAddress)); + } else { + FwCfgDmaAddress = 0; + } + + if (QemuFwCfgIsAvailable ()) { + UINT32 Signature; + + QemuFwCfgSelectItem (QemuFwCfgItemSignature); + Signature = QemuFwCfgRead32 (); + if (Signature == SIGNATURE_32 ('Q', 'E', 'M', 'U')) { + // + // For DMA support, we require the DTB to advertise the register, and the + // feature bitmap (which we read without DMA) to confirm the feature. + // + if (FwCfgDmaAddress != 0) { + UINT32 Features; + + QemuFwCfgSelectItem (QemuFwCfgItemInterfaceVersion); + Features = QemuFwCfgRead32 (); + if ((Features & FW_CFG_F_DMA) != 0) { + mFwCfgDmaAddress = FwCfgDmaAddress; + InternalQemuFwCfgReadBytes = DmaReadBytes; + InternalQemuFwCfgWriteBytes = DmaWriteBytes; + InternalQemuFwCfgSkipBytes = DmaSkipBytes; + } + } + } else { + mFwCfgSelectorAddress = 0; + mFwCfgDataAddress = 0; + } + } + + return RETURN_SUCCESS; +} -- 2.27.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118292): https://edk2.groups.io/g/devel/message/118292 Mute This Topic: https://groups.io/mt/105728766/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [edk2-devel] [PATCH v3 1/7] OvmfPkg: Separate QemuFwCfgLibMmio.c into two files 2024-04-25 12:12 ` [edk2-devel] [PATCH v3 1/7] OvmfPkg: Separate QemuFwCfgLibMmio.c into two files Chao Li @ 2024-04-25 12:58 ` Ard Biesheuvel 2024-04-26 1:12 ` Chao Li 0 siblings, 1 reply; 13+ messages in thread From: Ard Biesheuvel @ 2024-04-25 12:58 UTC (permalink / raw) To: Chao Li Cc: devel, Ard Biesheuvel, Jiewen Yao, Gerd Hoffmann, Leif Lindholm, Sami Mujawar, Sunil V L, Andrei Warkentin On Thu, 25 Apr 2024 at 14:13, Chao Li <lichao@loongson.cn> wrote: > > Separate QemuFwCfgLibMmio.c into two files named QemuFwCfgLibMmio.c and > QemuFwCfgLibMmioDxe.c, added a new header named > QemuFwCfgLibMmioInternal.h for MMIO version. > > Build-tested only (with "ArmVirtQemu.dsc and RiscVVirtQemu.dsc"). > > BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4755 > > Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> > Cc: Jiewen Yao <jiewen.yao@intel.com> > Cc: Gerd Hoffmann <kraxel@redhat.com> > Cc: Leif Lindholm <quic_llindhol@quicinc.com> > Cc: Sami Mujawar <sami.mujawar@arm.com> > Cc: Sunil V L <sunilvl@ventanamicro.com> > Cc: Andrei Warkentin <andrei.warkentin@intel.com> > Signed-off-by: Chao Li <lichao@loongson.cn> > --- > .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.c | 194 +----------------- > .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf | 4 +- > .../QemuFwCfgLib/QemuFwCfgLibMmioInternal.h | 179 ++++++++++++++++ > .../Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c | 153 ++++++++++++++ > 4 files changed, 340 insertions(+), 190 deletions(-) > create mode 100644 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h > create mode 100644 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c > > diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c > index 115a210759..dc949c8e26 100644 > --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c > +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c > @@ -1,10 +1,9 @@ > /** @file > > - Stateful and implicitly initialized fw_cfg library implementation. > - > Copyright (C) 2013 - 2014, Red Hat, Inc. > Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR> > (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR> > + Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR> > Please only claim copyright for code that you wrote, not for code that you just moved between files. > SPDX-License-Identifier: BSD-2-Clause-Patent > **/ > @@ -20,63 +19,7 @@ > > #include <Protocol/FdtClient.h> > > -STATIC UINTN mFwCfgSelectorAddress; > -STATIC UINTN mFwCfgDataAddress; > -STATIC UINTN mFwCfgDmaAddress; > - > -/** > - Reads firmware configuration bytes into a buffer > - > - @param[in] Size Size in bytes to read > - @param[in] Buffer Buffer to store data into (OPTIONAL if Size is 0) > - > -**/ > -typedef > -VOID(EFIAPI READ_BYTES_FUNCTION)( > - IN UINTN Size, > - IN VOID *Buffer OPTIONAL > - ); > - > -/** > - Writes bytes from a buffer to firmware configuration > - > - @param[in] Size Size in bytes to write > - @param[in] Buffer Buffer to transfer data from (OPTIONAL if Size is 0) > - > -**/ > -typedef > -VOID(EFIAPI WRITE_BYTES_FUNCTION)( > - IN UINTN Size, > - IN VOID *Buffer OPTIONAL > - ); > - > -/** > - Skips bytes in firmware configuration > - > - @param[in] Size Size in bytes to skip > - > -**/ > -typedef > -VOID(EFIAPI SKIP_BYTES_FUNCTION)( > - IN UINTN Size > - ); > - > -// > -// Forward declaration of the two implementations we have. > -// > -STATIC READ_BYTES_FUNCTION MmioReadBytes; > -STATIC WRITE_BYTES_FUNCTION MmioWriteBytes; > -STATIC SKIP_BYTES_FUNCTION MmioSkipBytes; > -STATIC READ_BYTES_FUNCTION DmaReadBytes; > -STATIC WRITE_BYTES_FUNCTION DmaWriteBytes; > -STATIC SKIP_BYTES_FUNCTION DmaSkipBytes; > - > -// > -// These correspond to the implementation we detect at runtime. > -// > -STATIC READ_BYTES_FUNCTION *InternalQemuFwCfgReadBytes = MmioReadBytes; > -STATIC WRITE_BYTES_FUNCTION *InternalQemuFwCfgWriteBytes = MmioWriteBytes; > -STATIC SKIP_BYTES_FUNCTION *InternalQemuFwCfgSkipBytes = MmioSkipBytes; > +#include "QemuFwCfgLibMmioInternal.h" > > /** > Returns a boolean indicating if the firmware configuration interface > @@ -97,126 +40,6 @@ QemuFwCfgIsAvailable ( > return (BOOLEAN)(mFwCfgSelectorAddress != 0 && mFwCfgDataAddress != 0); > } > > -RETURN_STATUS > -EFIAPI > -QemuFwCfgInitialize ( > - VOID > - ) > -{ > - EFI_STATUS Status; > - FDT_CLIENT_PROTOCOL *FdtClient; > - CONST UINT64 *Reg; > - UINT32 RegSize; > - UINTN AddressCells, SizeCells; > - UINT64 FwCfgSelectorAddress; > - UINT64 FwCfgSelectorSize; > - UINT64 FwCfgDataAddress; > - UINT64 FwCfgDataSize; > - UINT64 FwCfgDmaAddress; > - UINT64 FwCfgDmaSize; > - > - Status = gBS->LocateProtocol ( > - &gFdtClientProtocolGuid, > - NULL, > - (VOID **)&FdtClient > - ); > - ASSERT_EFI_ERROR (Status); > - > - Status = FdtClient->FindCompatibleNodeReg ( > - FdtClient, > - "qemu,fw-cfg-mmio", > - (CONST VOID **)&Reg, > - &AddressCells, > - &SizeCells, > - &RegSize > - ); > - if (EFI_ERROR (Status)) { > - DEBUG (( > - DEBUG_WARN, > - "%a: No 'qemu,fw-cfg-mmio' compatible DT node found (Status == %r)\n", > - __func__, > - Status > - )); > - return EFI_SUCCESS; > - } > - > - ASSERT (AddressCells == 2); > - ASSERT (SizeCells == 2); > - ASSERT (RegSize == 2 * sizeof (UINT64)); > - > - FwCfgDataAddress = SwapBytes64 (Reg[0]); > - FwCfgDataSize = 8; > - FwCfgSelectorAddress = FwCfgDataAddress + FwCfgDataSize; > - FwCfgSelectorSize = 2; > - > - // > - // The following ASSERT()s express > - // > - // Address + Size - 1 <= MAX_UINTN > - // > - // for both registers, that is, that the last byte in each MMIO range is > - // expressible as a MAX_UINTN. The form below is mathematically > - // equivalent, and it also prevents any unsigned overflow before the > - // comparison. > - // > - ASSERT (FwCfgSelectorAddress <= MAX_UINTN - FwCfgSelectorSize + 1); > - ASSERT (FwCfgDataAddress <= MAX_UINTN - FwCfgDataSize + 1); > - > - mFwCfgSelectorAddress = FwCfgSelectorAddress; > - mFwCfgDataAddress = FwCfgDataAddress; > - > - DEBUG (( > - DEBUG_INFO, > - "Found FwCfg @ 0x%Lx/0x%Lx\n", > - FwCfgSelectorAddress, > - FwCfgDataAddress > - )); > - > - if (SwapBytes64 (Reg[1]) >= 0x18) { > - FwCfgDmaAddress = FwCfgDataAddress + 0x10; > - FwCfgDmaSize = 0x08; > - > - // > - // See explanation above. > - // > - ASSERT (FwCfgDmaAddress <= MAX_UINTN - FwCfgDmaSize + 1); > - > - DEBUG ((DEBUG_INFO, "Found FwCfg DMA @ 0x%Lx\n", FwCfgDmaAddress)); > - } else { > - FwCfgDmaAddress = 0; > - } > - > - if (QemuFwCfgIsAvailable ()) { > - UINT32 Signature; > - > - QemuFwCfgSelectItem (QemuFwCfgItemSignature); > - Signature = QemuFwCfgRead32 (); > - if (Signature == SIGNATURE_32 ('Q', 'E', 'M', 'U')) { > - // > - // For DMA support, we require the DTB to advertise the register, and the > - // feature bitmap (which we read without DMA) to confirm the feature. > - // > - if (FwCfgDmaAddress != 0) { > - UINT32 Features; > - > - QemuFwCfgSelectItem (QemuFwCfgItemInterfaceVersion); > - Features = QemuFwCfgRead32 (); > - if ((Features & FW_CFG_F_DMA) != 0) { > - mFwCfgDmaAddress = FwCfgDmaAddress; > - InternalQemuFwCfgReadBytes = DmaReadBytes; > - InternalQemuFwCfgWriteBytes = DmaWriteBytes; > - InternalQemuFwCfgSkipBytes = DmaSkipBytes; > - } > - } > - } else { > - mFwCfgSelectorAddress = 0; > - mFwCfgDataAddress = 0; > - } > - } > - > - return RETURN_SUCCESS; > -} > - > /** > Selects a firmware configuration item for reading. > > @@ -240,7 +63,6 @@ QemuFwCfgSelectItem ( > /** > Slow READ_BYTES_FUNCTION. > **/ > -STATIC > VOID > EFIAPI > MmioReadBytes ( > @@ -252,7 +74,7 @@ MmioReadBytes ( > UINT8 *Ptr; > UINT8 *End; > > - #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) > + #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) > Left = Size & 7; > #else > Left = Size & 3; > @@ -262,7 +84,7 @@ MmioReadBytes ( > Ptr = Buffer; > End = Ptr + Size; > > - #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) > + #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) > while (Ptr < End) { > *(UINT64 *)Ptr = MmioRead64 (mFwCfgDataAddress); > Ptr += 8; > @@ -306,7 +128,6 @@ MmioReadBytes ( > FW_CFG_DMA_CTL_READ - read from fw_cfg into Buffer. > FW_CFG_DMA_CTL_SKIP - skip bytes in fw_cfg. > **/ > -STATIC > VOID > DmaTransferBytes ( > IN UINTN Size, > @@ -340,7 +161,7 @@ DmaTransferBytes ( > // > // This will fire off the transfer. > // > - #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) > + #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) > MmioWrite64 (mFwCfgDmaAddress, SwapBytes64 ((UINT64)&Access)); > #else > MmioWrite32 ((UINT32)(mFwCfgDmaAddress + 4), SwapBytes32 ((UINT32)&Access)); > @@ -365,7 +186,6 @@ DmaTransferBytes ( > /** > Fast READ_BYTES_FUNCTION. > **/ > -STATIC > VOID > EFIAPI > DmaReadBytes ( > @@ -403,7 +223,6 @@ QemuFwCfgReadBytes ( > /** > Slow WRITE_BYTES_FUNCTION. > **/ > -STATIC > VOID > EFIAPI > MmioWriteBytes ( > @@ -421,7 +240,6 @@ MmioWriteBytes ( > /** > Fast WRITE_BYTES_FUNCTION. > **/ > -STATIC > VOID > EFIAPI > DmaWriteBytes ( > @@ -457,7 +275,6 @@ QemuFwCfgWriteBytes ( > /** > Slow SKIP_BYTES_FUNCTION. > **/ > -STATIC > VOID > EFIAPI > MmioSkipBytes ( > @@ -484,7 +301,6 @@ MmioSkipBytes ( > /** > Fast SKIP_BYTES_FUNCTION. > **/ > -STATIC > VOID > EFIAPI > DmaSkipBytes ( > diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf > index 4b0dfbcb0d..f2596f270e 100644 > --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf > +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf > @@ -4,6 +4,7 @@ > # > # Copyright (C) 2013 - 2014, Red Hat, Inc. > # Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR> > +# Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR> > # > # SPDX-License-Identifier: BSD-2-Clause-Patent > # > @@ -23,11 +24,12 @@ [Defines] > # The following information is for reference only and not required by the build > # tools. > # > -# VALID_ARCHITECTURES = ARM AARCH64 RISCV64 > +# VALID_ARCHITECTURES = ARM AARCH64 RISCV64 LOONGARCH64 > # > > [Sources] > QemuFwCfgLibMmio.c > + QemuFwCfgMmioDxe.c > > [Packages] > MdePkg/MdePkg.dec > diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h > new file mode 100644 > index 0000000000..d7d645f700 > --- /dev/null > +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h > @@ -0,0 +1,179 @@ > +/** @file > + Internal interfaces specific to the QemuFwCfgLibMmio instances in OvmfPkg. > + > + Copyright (C) 2016, Red Hat, Inc. > + Copyright (C) 2017, Advanced Micro Devices. All rights reserved > + Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef QEMU_FW_CFG_LIB_MMIO_INTERNAL_H_ > +#define QEMU_FW_CFG_LIB_MMIO_INTERNAL_H_ > + > +extern UINTN mFwCfgSelectorAddress; > +extern UINTN mFwCfgDataAddress; > +extern UINTN mFwCfgDmaAddress; > + These can remain STATIC and live in the DXE version of the library, no? > +/** > + Reads firmware configuration bytes into a buffer > + > + @param[in] Size Size in bytes to read > + @param[in] Buffer Buffer to store data into (OPTIONAL if Size is 0) > + > +**/ > +typedef > +VOID(EFIAPI READ_BYTES_FUNCTION)( > + IN UINTN Size, > + IN VOID *Buffer OPTIONAL > + ); > + > +/** > + Writes bytes from a buffer to firmware configuration > + > + @param[in] Size Size in bytes to write > + @param[in] Buffer Buffer to transfer data from (OPTIONAL if Size is 0) > + > +**/ > +typedef > +VOID(EFIAPI WRITE_BYTES_FUNCTION)( > + IN UINTN Size, > + IN VOID *Buffer OPTIONAL > + ); > + > +/** > + Skips bytes in firmware configuration > + > + @param[in] Size Size in bytes to skip > + > +**/ > +typedef > +VOID(EFIAPI SKIP_BYTES_FUNCTION)( > + IN UINTN Size > + ); > + > +/** > + Reads firmware configuration bytes into a buffer > + > + @param[in] Size Size in bytes to read > + @param[in] Buffer Buffer to store data into (OPTIONAL if Size is 0) > + > +**/ > +extern > +VOID > +EFIAPI > +(*InternalQemuFwCfgReadBytes) ( > + IN UINTN Size, > + IN VOID *Buffer OPTIONAL > + ); > + > +/** > + Writes bytes from a buffer to firmware configuration > + > + @param[in] Size Size in bytes to write > + @param[in] Buffer Buffer to transfer data from (OPTIONAL if Size is 0) > + > +**/ > +extern > +VOID > +EFIAPI > +(*InternalQemuFwCfgWriteBytes) ( > + IN UINTN Size, > + IN VOID *Buffer OPTIONAL > + ); > + > +/** > + Skips bytes in firmware configuration > + > + @param[in] Size Size in bytes to skip > + > +**/ > +extern > +VOID > +EFIAPI > +(*InternalQemuFwCfgSkipBytes) ( > + IN UINTN Size > + ); > + > +/** > + Slow READ_BYTES_FUNCTION. > +**/ > +VOID > +EFIAPI > +MmioReadBytes ( > + IN UINTN Size, > + IN VOID *Buffer OPTIONAL > + ); > + > +/** > + Slow WRITE_BYTES_FUNCTION. > +**/ > +VOID > +EFIAPI > +MmioWriteBytes ( > + IN UINTN Size, > + IN VOID *Buffer OPTIONAL > + ); > + > +/** > + Slow SKIP_BYTES_FUNCTION. > +**/ > +VOID > +EFIAPI > +MmioSkipBytes ( > + IN UINTN Size > + ); > + > +/** > + Fast READ_BYTES_FUNCTION. > +**/ > +VOID > +EFIAPI > +DmaReadBytes ( > + IN UINTN Size, > + IN VOID *Buffer OPTIONAL > + ); > + > +/** > + Fast WRITE_BYTES_FUNCTION. > +**/ > +VOID > +EFIAPI > +DmaWriteBytes ( > + IN UINTN Size, > + IN VOID *Buffer OPTIONAL > + ); > + > +/** > + Fast SKIP_BYTES_FUNCTION. > +**/ > +VOID > +EFIAPI > +DmaSkipBytes ( > + IN UINTN Size > + ); > + > +/** > + Transfer an array of bytes, or skip a number of bytes, using the DMA > + interface. > + > + @param[in] Size Size in bytes to transfer or skip. > + > + @param[in,out] Buffer Buffer to read data into or write data from. Ignored, > + and may be NULL, if Size is zero, or Control is > + FW_CFG_DMA_CTL_SKIP. > + > + @param[in] Control One of the following: > + FW_CFG_DMA_CTL_WRITE - write to fw_cfg from Buffer. > + FW_CFG_DMA_CTL_READ - read from fw_cfg into Buffer. > + FW_CFG_DMA_CTL_SKIP - skip bytes in fw_cfg. > +**/ > +VOID > +DmaTransferBytes ( > + IN UINTN Size, > + IN OUT VOID *Buffer OPTIONAL, > + IN UINT32 Control > + ); > + > +#endif > diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c > new file mode 100644 > index 0000000000..4844a42a36 > --- /dev/null > +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c > @@ -0,0 +1,153 @@ > +/** @file > + > + Stateful and implicitly initialized fw_cfg library implementation. > + > + Copyright (C) 2013 - 2014, Red Hat, Inc. > + Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR> > + (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR> > + Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > +**/ > + > +#include <Uefi.h> > + > +#include <Library/BaseLib.h> > +#include <Library/DebugLib.h> > +#include <Library/QemuFwCfgLib.h> > +#include <Library/UefiBootServicesTableLib.h> > + > +#include <Protocol/FdtClient.h> > + > +#include "QemuFwCfgLibMmioInternal.h" > + > +UINTN mFwCfgSelectorAddress; > +UINTN mFwCfgDataAddress; > +UINTN mFwCfgDmaAddress; > + > +// > +// These correspond to the implementation we detect at runtime. > +// > +READ_BYTES_FUNCTION *InternalQemuFwCfgReadBytes = MmioReadBytes; > +WRITE_BYTES_FUNCTION *InternalQemuFwCfgWriteBytes = MmioWriteBytes; > +SKIP_BYTES_FUNCTION *InternalQemuFwCfgSkipBytes = MmioSkipBytes; > + These are duplicated later in the PEI version of the library, right? So they can live in the shared .c file > +RETURN_STATUS > +EFIAPI > +QemuFwCfgInitialize ( > + VOID > + ) > +{ > + EFI_STATUS Status; > + FDT_CLIENT_PROTOCOL *FdtClient; > + CONST UINT64 *Reg; > + UINT32 RegSize; > + UINTN AddressCells, SizeCells; > + UINT64 FwCfgSelectorAddress; > + UINT64 FwCfgSelectorSize; > + UINT64 FwCfgDataAddress; > + UINT64 FwCfgDataSize; > + UINT64 FwCfgDmaAddress; > + UINT64 FwCfgDmaSize; > + > + Status = gBS->LocateProtocol ( > + &gFdtClientProtocolGuid, > + NULL, > + (VOID **)&FdtClient > + ); > + ASSERT_EFI_ERROR (Status); > + > + Status = FdtClient->FindCompatibleNodeReg ( > + FdtClient, > + "qemu,fw-cfg-mmio", > + (CONST VOID **)&Reg, > + &AddressCells, > + &SizeCells, > + &RegSize > + ); > + if (EFI_ERROR (Status)) { > + DEBUG (( > + DEBUG_WARN, > + "%a: No 'qemu,fw-cfg-mmio' compatible DT node found (Status == %r)\n", > + __func__, > + Status > + )); > + return EFI_SUCCESS; > + } > + > + ASSERT (AddressCells == 2); > + ASSERT (SizeCells == 2); > + ASSERT (RegSize == 2 * sizeof (UINT64)); > + > + FwCfgDataAddress = SwapBytes64 (Reg[0]); > + FwCfgDataSize = 8; > + FwCfgSelectorAddress = FwCfgDataAddress + FwCfgDataSize; > + FwCfgSelectorSize = 2; > + > + // > + // The following ASSERT()s express > + // > + // Address + Size - 1 <= MAX_UINTN > + // > + // for both registers, that is, that the last byte in each MMIO range is > + // expressible as a MAX_UINTN. The form below is mathematically > + // equivalent, and it also prevents any unsigned overflow before the > + // comparison. > + // > + ASSERT (FwCfgSelectorAddress <= MAX_UINTN - FwCfgSelectorSize + 1); > + ASSERT (FwCfgDataAddress <= MAX_UINTN - FwCfgDataSize + 1); > + > + mFwCfgSelectorAddress = FwCfgSelectorAddress; > + mFwCfgDataAddress = FwCfgDataAddress; > + > + DEBUG (( > + DEBUG_INFO, > + "Found FwCfg @ 0x%Lx/0x%Lx\n", > + FwCfgSelectorAddress, > + FwCfgDataAddress > + )); > + > + if (SwapBytes64 (Reg[1]) >= 0x18) { > + FwCfgDmaAddress = FwCfgDataAddress + 0x10; > + FwCfgDmaSize = 0x08; > + > + // > + // See explanation above. > + // > + ASSERT (FwCfgDmaAddress <= MAX_UINTN - FwCfgDmaSize + 1); > + > + DEBUG ((DEBUG_INFO, "Found FwCfg DMA @ 0x%Lx\n", FwCfgDmaAddress)); > + } else { > + FwCfgDmaAddress = 0; > + } > + > + if (QemuFwCfgIsAvailable ()) { > + UINT32 Signature; > + > + QemuFwCfgSelectItem (QemuFwCfgItemSignature); > + Signature = QemuFwCfgRead32 (); > + if (Signature == SIGNATURE_32 ('Q', 'E', 'M', 'U')) { > + // > + // For DMA support, we require the DTB to advertise the register, and the > + // feature bitmap (which we read without DMA) to confirm the feature. > + // > + if (FwCfgDmaAddress != 0) { > + UINT32 Features; > + > + QemuFwCfgSelectItem (QemuFwCfgItemInterfaceVersion); > + Features = QemuFwCfgRead32 (); > + if ((Features & FW_CFG_F_DMA) != 0) { > + mFwCfgDmaAddress = FwCfgDmaAddress; > + InternalQemuFwCfgReadBytes = DmaReadBytes; > + InternalQemuFwCfgWriteBytes = DmaWriteBytes; > + InternalQemuFwCfgSkipBytes = DmaSkipBytes; > + } > + } > + } else { > + mFwCfgSelectorAddress = 0; > + mFwCfgDataAddress = 0; > + } > + } > + > + return RETURN_SUCCESS; > +} > -- > 2.27.0 > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118299): https://edk2.groups.io/g/devel/message/118299 Mute This Topic: https://groups.io/mt/105728766/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [edk2-devel] [PATCH v3 1/7] OvmfPkg: Separate QemuFwCfgLibMmio.c into two files 2024-04-25 12:58 ` Ard Biesheuvel @ 2024-04-26 1:12 ` Chao Li 0 siblings, 0 replies; 13+ messages in thread From: Chao Li @ 2024-04-26 1:12 UTC (permalink / raw) To: devel, ardb Cc: Ard Biesheuvel, Jiewen Yao, Gerd Hoffmann, Leif Lindholm, Sami Mujawar, Sunil V L, Andrei Warkentin [-- Attachment #1: Type: text/plain, Size: 22427 bytes --] Hi Ard, Thanks, Chao On 2024/4/25 20:58, Ard Biesheuvel wrote: > On Thu, 25 Apr 2024 at 14:13, Chao Li<lichao@loongson.cn> wrote: >> Separate QemuFwCfgLibMmio.c into two files named QemuFwCfgLibMmio.c and >> QemuFwCfgLibMmioDxe.c, added a new header named >> QemuFwCfgLibMmioInternal.h for MMIO version. >> >> Build-tested only (with "ArmVirtQemu.dsc and RiscVVirtQemu.dsc"). >> >> BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=4755 >> >> Cc: Ard Biesheuvel<ardb+tianocore@kernel.org> >> Cc: Jiewen Yao<jiewen.yao@intel.com> >> Cc: Gerd Hoffmann<kraxel@redhat.com> >> Cc: Leif Lindholm<quic_llindhol@quicinc.com> >> Cc: Sami Mujawar<sami.mujawar@arm.com> >> Cc: Sunil V L<sunilvl@ventanamicro.com> >> Cc: Andrei Warkentin<andrei.warkentin@intel.com> >> Signed-off-by: Chao Li<lichao@loongson.cn> >> --- >> .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.c | 194 +----------------- >> .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf | 4 +- >> .../QemuFwCfgLib/QemuFwCfgLibMmioInternal.h | 179 ++++++++++++++++ >> .../Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c | 153 ++++++++++++++ >> 4 files changed, 340 insertions(+), 190 deletions(-) >> create mode 100644 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h >> create mode 100644 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c >> >> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c >> index 115a210759..dc949c8e26 100644 >> --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c >> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c >> @@ -1,10 +1,9 @@ >> /** @file >> >> - Stateful and implicitly initialized fw_cfg library implementation. >> - >> Copyright (C) 2013 - 2014, Red Hat, Inc. >> Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR> >> (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR> >> + Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR> >> > Please only claim copyright for code that you wrote, not for code that > you just moved between files. OK, I will remove Loongson copyright in this patch and add it in patch 2 or 3. > >> SPDX-License-Identifier: BSD-2-Clause-Patent >> **/ >> @@ -20,63 +19,7 @@ >> >> #include <Protocol/FdtClient.h> >> >> -STATIC UINTN mFwCfgSelectorAddress; >> -STATIC UINTN mFwCfgDataAddress; >> -STATIC UINTN mFwCfgDmaAddress; >> - >> -/** >> - Reads firmware configuration bytes into a buffer >> - >> - @param[in] Size Size in bytes to read >> - @param[in] Buffer Buffer to store data into (OPTIONAL if Size is 0) >> - >> -**/ >> -typedef >> -VOID(EFIAPI READ_BYTES_FUNCTION)( >> - IN UINTN Size, >> - IN VOID *Buffer OPTIONAL >> - ); >> - >> -/** >> - Writes bytes from a buffer to firmware configuration >> - >> - @param[in] Size Size in bytes to write >> - @param[in] Buffer Buffer to transfer data from (OPTIONAL if Size is 0) >> - >> -**/ >> -typedef >> -VOID(EFIAPI WRITE_BYTES_FUNCTION)( >> - IN UINTN Size, >> - IN VOID *Buffer OPTIONAL >> - ); >> - >> -/** >> - Skips bytes in firmware configuration >> - >> - @param[in] Size Size in bytes to skip >> - >> -**/ >> -typedef >> -VOID(EFIAPI SKIP_BYTES_FUNCTION)( >> - IN UINTN Size >> - ); >> - >> -// >> -// Forward declaration of the two implementations we have. >> -// >> -STATIC READ_BYTES_FUNCTION MmioReadBytes; >> -STATIC WRITE_BYTES_FUNCTION MmioWriteBytes; >> -STATIC SKIP_BYTES_FUNCTION MmioSkipBytes; >> -STATIC READ_BYTES_FUNCTION DmaReadBytes; >> -STATIC WRITE_BYTES_FUNCTION DmaWriteBytes; >> -STATIC SKIP_BYTES_FUNCTION DmaSkipBytes; >> - >> -// >> -// These correspond to the implementation we detect at runtime. >> -// >> -STATIC READ_BYTES_FUNCTION *InternalQemuFwCfgReadBytes = MmioReadBytes; >> -STATIC WRITE_BYTES_FUNCTION *InternalQemuFwCfgWriteBytes = MmioWriteBytes; >> -STATIC SKIP_BYTES_FUNCTION *InternalQemuFwCfgSkipBytes = MmioSkipBytes; >> +#include "QemuFwCfgLibMmioInternal.h" >> >> /** >> Returns a boolean indicating if the firmware configuration interface >> @@ -97,126 +40,6 @@ QemuFwCfgIsAvailable ( >> return (BOOLEAN)(mFwCfgSelectorAddress != 0 && mFwCfgDataAddress != 0); >> } >> >> -RETURN_STATUS >> -EFIAPI >> -QemuFwCfgInitialize ( >> - VOID >> - ) >> -{ >> - EFI_STATUS Status; >> - FDT_CLIENT_PROTOCOL *FdtClient; >> - CONST UINT64 *Reg; >> - UINT32 RegSize; >> - UINTN AddressCells, SizeCells; >> - UINT64 FwCfgSelectorAddress; >> - UINT64 FwCfgSelectorSize; >> - UINT64 FwCfgDataAddress; >> - UINT64 FwCfgDataSize; >> - UINT64 FwCfgDmaAddress; >> - UINT64 FwCfgDmaSize; >> - >> - Status = gBS->LocateProtocol ( >> - &gFdtClientProtocolGuid, >> - NULL, >> - (VOID **)&FdtClient >> - ); >> - ASSERT_EFI_ERROR (Status); >> - >> - Status = FdtClient->FindCompatibleNodeReg ( >> - FdtClient, >> - "qemu,fw-cfg-mmio", >> - (CONST VOID **)&Reg, >> - &AddressCells, >> - &SizeCells, >> - &RegSize >> - ); >> - if (EFI_ERROR (Status)) { >> - DEBUG (( >> - DEBUG_WARN, >> - "%a: No 'qemu,fw-cfg-mmio' compatible DT node found (Status == %r)\n", >> - __func__, >> - Status >> - )); >> - return EFI_SUCCESS; >> - } >> - >> - ASSERT (AddressCells == 2); >> - ASSERT (SizeCells == 2); >> - ASSERT (RegSize == 2 * sizeof (UINT64)); >> - >> - FwCfgDataAddress = SwapBytes64 (Reg[0]); >> - FwCfgDataSize = 8; >> - FwCfgSelectorAddress = FwCfgDataAddress + FwCfgDataSize; >> - FwCfgSelectorSize = 2; >> - >> - // >> - // The following ASSERT()s express >> - // >> - // Address + Size - 1 <= MAX_UINTN >> - // >> - // for both registers, that is, that the last byte in each MMIO range is >> - // expressible as a MAX_UINTN. The form below is mathematically >> - // equivalent, and it also prevents any unsigned overflow before the >> - // comparison. >> - // >> - ASSERT (FwCfgSelectorAddress <= MAX_UINTN - FwCfgSelectorSize + 1); >> - ASSERT (FwCfgDataAddress <= MAX_UINTN - FwCfgDataSize + 1); >> - >> - mFwCfgSelectorAddress = FwCfgSelectorAddress; >> - mFwCfgDataAddress = FwCfgDataAddress; >> - >> - DEBUG (( >> - DEBUG_INFO, >> - "Found FwCfg @ 0x%Lx/0x%Lx\n", >> - FwCfgSelectorAddress, >> - FwCfgDataAddress >> - )); >> - >> - if (SwapBytes64 (Reg[1]) >= 0x18) { >> - FwCfgDmaAddress = FwCfgDataAddress + 0x10; >> - FwCfgDmaSize = 0x08; >> - >> - // >> - // See explanation above. >> - // >> - ASSERT (FwCfgDmaAddress <= MAX_UINTN - FwCfgDmaSize + 1); >> - >> - DEBUG ((DEBUG_INFO, "Found FwCfg DMA @ 0x%Lx\n", FwCfgDmaAddress)); >> - } else { >> - FwCfgDmaAddress = 0; >> - } >> - >> - if (QemuFwCfgIsAvailable ()) { >> - UINT32 Signature; >> - >> - QemuFwCfgSelectItem (QemuFwCfgItemSignature); >> - Signature = QemuFwCfgRead32 (); >> - if (Signature == SIGNATURE_32 ('Q', 'E', 'M', 'U')) { >> - // >> - // For DMA support, we require the DTB to advertise the register, and the >> - // feature bitmap (which we read without DMA) to confirm the feature. >> - // >> - if (FwCfgDmaAddress != 0) { >> - UINT32 Features; >> - >> - QemuFwCfgSelectItem (QemuFwCfgItemInterfaceVersion); >> - Features = QemuFwCfgRead32 (); >> - if ((Features & FW_CFG_F_DMA) != 0) { >> - mFwCfgDmaAddress = FwCfgDmaAddress; >> - InternalQemuFwCfgReadBytes = DmaReadBytes; >> - InternalQemuFwCfgWriteBytes = DmaWriteBytes; >> - InternalQemuFwCfgSkipBytes = DmaSkipBytes; >> - } >> - } >> - } else { >> - mFwCfgSelectorAddress = 0; >> - mFwCfgDataAddress = 0; >> - } >> - } >> - >> - return RETURN_SUCCESS; >> -} >> - >> /** >> Selects a firmware configuration item for reading. >> >> @@ -240,7 +63,6 @@ QemuFwCfgSelectItem ( >> /** >> Slow READ_BYTES_FUNCTION. >> **/ >> -STATIC >> VOID >> EFIAPI >> MmioReadBytes ( >> @@ -252,7 +74,7 @@ MmioReadBytes ( >> UINT8 *Ptr; >> UINT8 *End; >> >> - #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) >> + #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) >> Left = Size & 7; >> #else >> Left = Size & 3; >> @@ -262,7 +84,7 @@ MmioReadBytes ( >> Ptr = Buffer; >> End = Ptr + Size; >> >> - #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) >> + #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) >> while (Ptr < End) { >> *(UINT64 *)Ptr = MmioRead64 (mFwCfgDataAddress); >> Ptr += 8; >> @@ -306,7 +128,6 @@ MmioReadBytes ( >> FW_CFG_DMA_CTL_READ - read from fw_cfg into Buffer. >> FW_CFG_DMA_CTL_SKIP - skip bytes in fw_cfg. >> **/ >> -STATIC >> VOID >> DmaTransferBytes ( >> IN UINTN Size, >> @@ -340,7 +161,7 @@ DmaTransferBytes ( >> // >> // This will fire off the transfer. >> // >> - #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) >> + #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) >> MmioWrite64 (mFwCfgDmaAddress, SwapBytes64 ((UINT64)&Access)); >> #else >> MmioWrite32 ((UINT32)(mFwCfgDmaAddress + 4), SwapBytes32 ((UINT32)&Access)); >> @@ -365,7 +186,6 @@ DmaTransferBytes ( >> /** >> Fast READ_BYTES_FUNCTION. >> **/ >> -STATIC >> VOID >> EFIAPI >> DmaReadBytes ( >> @@ -403,7 +223,6 @@ QemuFwCfgReadBytes ( >> /** >> Slow WRITE_BYTES_FUNCTION. >> **/ >> -STATIC >> VOID >> EFIAPI >> MmioWriteBytes ( >> @@ -421,7 +240,6 @@ MmioWriteBytes ( >> /** >> Fast WRITE_BYTES_FUNCTION. >> **/ >> -STATIC >> VOID >> EFIAPI >> DmaWriteBytes ( >> @@ -457,7 +275,6 @@ QemuFwCfgWriteBytes ( >> /** >> Slow SKIP_BYTES_FUNCTION. >> **/ >> -STATIC >> VOID >> EFIAPI >> MmioSkipBytes ( >> @@ -484,7 +301,6 @@ MmioSkipBytes ( >> /** >> Fast SKIP_BYTES_FUNCTION. >> **/ >> -STATIC >> VOID >> EFIAPI >> DmaSkipBytes ( >> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf >> index 4b0dfbcb0d..f2596f270e 100644 >> --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf >> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf >> @@ -4,6 +4,7 @@ >> # >> # Copyright (C) 2013 - 2014, Red Hat, Inc. >> # Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR> >> +# Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR> >> # >> # SPDX-License-Identifier: BSD-2-Clause-Patent >> # >> @@ -23,11 +24,12 @@ [Defines] >> # The following information is for reference only and not required by the build >> # tools. >> # >> -# VALID_ARCHITECTURES = ARM AARCH64 RISCV64 >> +# VALID_ARCHITECTURES = ARM AARCH64 RISCV64 LOONGARCH64 >> # >> >> [Sources] >> QemuFwCfgLibMmio.c >> + QemuFwCfgMmioDxe.c >> >> [Packages] >> MdePkg/MdePkg.dec >> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h >> new file mode 100644 >> index 0000000000..d7d645f700 >> --- /dev/null >> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h >> @@ -0,0 +1,179 @@ >> +/** @file >> + Internal interfaces specific to the QemuFwCfgLibMmio instances in OvmfPkg. >> + >> + Copyright (C) 2016, Red Hat, Inc. >> + Copyright (C) 2017, Advanced Micro Devices. All rights reserved >> + Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR> >> + >> + SPDX-License-Identifier: BSD-2-Clause-Patent >> + >> +**/ >> + >> +#ifndef QEMU_FW_CFG_LIB_MMIO_INTERNAL_H_ >> +#define QEMU_FW_CFG_LIB_MMIO_INTERNAL_H_ >> + >> +extern UINTN mFwCfgSelectorAddress; >> +extern UINTN mFwCfgDataAddress; >> +extern UINTN mFwCfgDmaAddress; >> + > These can remain STATIC and live in the DXE version of the library, no? OK, the DXE version will keep it be STATIC, I will fix it on my next commit. > >> +/** >> + Reads firmware configuration bytes into a buffer >> + >> + @param[in] Size Size in bytes to read >> + @param[in] Buffer Buffer to store data into (OPTIONAL if Size is 0) >> + >> +**/ >> +typedef >> +VOID(EFIAPI READ_BYTES_FUNCTION)( >> + IN UINTN Size, >> + IN VOID *Buffer OPTIONAL >> + ); >> + >> +/** >> + Writes bytes from a buffer to firmware configuration >> + >> + @param[in] Size Size in bytes to write >> + @param[in] Buffer Buffer to transfer data from (OPTIONAL if Size is 0) >> + >> +**/ >> +typedef >> +VOID(EFIAPI WRITE_BYTES_FUNCTION)( >> + IN UINTN Size, >> + IN VOID *Buffer OPTIONAL >> + ); >> + >> +/** >> + Skips bytes in firmware configuration >> + >> + @param[in] Size Size in bytes to skip >> + >> +**/ >> +typedef >> +VOID(EFIAPI SKIP_BYTES_FUNCTION)( >> + IN UINTN Size >> + ); >> + >> +/** >> + Reads firmware configuration bytes into a buffer >> + >> + @param[in] Size Size in bytes to read >> + @param[in] Buffer Buffer to store data into (OPTIONAL if Size is 0) >> + >> +**/ >> +extern >> +VOID >> +EFIAPI >> +(*InternalQemuFwCfgReadBytes) ( >> + IN UINTN Size, >> + IN VOID *Buffer OPTIONAL >> + ); >> + >> +/** >> + Writes bytes from a buffer to firmware configuration >> + >> + @param[in] Size Size in bytes to write >> + @param[in] Buffer Buffer to transfer data from (OPTIONAL if Size is 0) >> + >> +**/ >> +extern >> +VOID >> +EFIAPI >> +(*InternalQemuFwCfgWriteBytes) ( >> + IN UINTN Size, >> + IN VOID *Buffer OPTIONAL >> + ); >> + >> +/** >> + Skips bytes in firmware configuration >> + >> + @param[in] Size Size in bytes to skip >> + >> +**/ >> +extern >> +VOID >> +EFIAPI >> +(*InternalQemuFwCfgSkipBytes) ( >> + IN UINTN Size >> + ); >> + >> +/** >> + Slow READ_BYTES_FUNCTION. >> +**/ >> +VOID >> +EFIAPI >> +MmioReadBytes ( >> + IN UINTN Size, >> + IN VOID *Buffer OPTIONAL >> + ); >> + >> +/** >> + Slow WRITE_BYTES_FUNCTION. >> +**/ >> +VOID >> +EFIAPI >> +MmioWriteBytes ( >> + IN UINTN Size, >> + IN VOID *Buffer OPTIONAL >> + ); >> + >> +/** >> + Slow SKIP_BYTES_FUNCTION. >> +**/ >> +VOID >> +EFIAPI >> +MmioSkipBytes ( >> + IN UINTN Size >> + ); >> + >> +/** >> + Fast READ_BYTES_FUNCTION. >> +**/ >> +VOID >> +EFIAPI >> +DmaReadBytes ( >> + IN UINTN Size, >> + IN VOID *Buffer OPTIONAL >> + ); >> + >> +/** >> + Fast WRITE_BYTES_FUNCTION. >> +**/ >> +VOID >> +EFIAPI >> +DmaWriteBytes ( >> + IN UINTN Size, >> + IN VOID *Buffer OPTIONAL >> + ); >> + >> +/** >> + Fast SKIP_BYTES_FUNCTION. >> +**/ >> +VOID >> +EFIAPI >> +DmaSkipBytes ( >> + IN UINTN Size >> + ); >> + >> +/** >> + Transfer an array of bytes, or skip a number of bytes, using the DMA >> + interface. >> + >> + @param[in] Size Size in bytes to transfer or skip. >> + >> + @param[in,out] Buffer Buffer to read data into or write data from. Ignored, >> + and may be NULL, if Size is zero, or Control is >> + FW_CFG_DMA_CTL_SKIP. >> + >> + @param[in] Control One of the following: >> + FW_CFG_DMA_CTL_WRITE - write to fw_cfg from Buffer. >> + FW_CFG_DMA_CTL_READ - read from fw_cfg into Buffer. >> + FW_CFG_DMA_CTL_SKIP - skip bytes in fw_cfg. >> +**/ >> +VOID >> +DmaTransferBytes ( >> + IN UINTN Size, >> + IN OUT VOID *Buffer OPTIONAL, >> + IN UINT32 Control >> + ); >> + >> +#endif >> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c >> new file mode 100644 >> index 0000000000..4844a42a36 >> --- /dev/null >> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c >> @@ -0,0 +1,153 @@ >> +/** @file >> + >> + Stateful and implicitly initialized fw_cfg library implementation. >> + >> + Copyright (C) 2013 - 2014, Red Hat, Inc. >> + Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR> >> + (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR> >> + Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR> >> + >> + SPDX-License-Identifier: BSD-2-Clause-Patent >> +**/ >> + >> +#include <Uefi.h> >> + >> +#include <Library/BaseLib.h> >> +#include <Library/DebugLib.h> >> +#include <Library/QemuFwCfgLib.h> >> +#include <Library/UefiBootServicesTableLib.h> >> + >> +#include <Protocol/FdtClient.h> >> + >> +#include "QemuFwCfgLibMmioInternal.h" >> + >> +UINTN mFwCfgSelectorAddress; >> +UINTN mFwCfgDataAddress; >> +UINTN mFwCfgDmaAddress; >> + >> +// >> +// These correspond to the implementation we detect at runtime. >> +// >> +READ_BYTES_FUNCTION *InternalQemuFwCfgReadBytes = MmioReadBytes; >> +WRITE_BYTES_FUNCTION *InternalQemuFwCfgWriteBytes = MmioWriteBytes; >> +SKIP_BYTES_FUNCTION *InternalQemuFwCfgSkipBytes = MmioSkipBytes; >> + > These are duplicated later in the PEI version of the library, right? > So they can live in the shared .c file Yes, them should be in the shared.c file, let me try. > >> +RETURN_STATUS >> +EFIAPI >> +QemuFwCfgInitialize ( >> + VOID >> + ) >> +{ >> + EFI_STATUS Status; >> + FDT_CLIENT_PROTOCOL *FdtClient; >> + CONST UINT64 *Reg; >> + UINT32 RegSize; >> + UINTN AddressCells, SizeCells; >> + UINT64 FwCfgSelectorAddress; >> + UINT64 FwCfgSelectorSize; >> + UINT64 FwCfgDataAddress; >> + UINT64 FwCfgDataSize; >> + UINT64 FwCfgDmaAddress; >> + UINT64 FwCfgDmaSize; >> + >> + Status = gBS->LocateProtocol ( >> + &gFdtClientProtocolGuid, >> + NULL, >> + (VOID **)&FdtClient >> + ); >> + ASSERT_EFI_ERROR (Status); >> + >> + Status = FdtClient->FindCompatibleNodeReg ( >> + FdtClient, >> + "qemu,fw-cfg-mmio", >> + (CONST VOID **)&Reg, >> + &AddressCells, >> + &SizeCells, >> + &RegSize >> + ); >> + if (EFI_ERROR (Status)) { >> + DEBUG (( >> + DEBUG_WARN, >> + "%a: No 'qemu,fw-cfg-mmio' compatible DT node found (Status == %r)\n", >> + __func__, >> + Status >> + )); >> + return EFI_SUCCESS; >> + } >> + >> + ASSERT (AddressCells == 2); >> + ASSERT (SizeCells == 2); >> + ASSERT (RegSize == 2 * sizeof (UINT64)); >> + >> + FwCfgDataAddress = SwapBytes64 (Reg[0]); >> + FwCfgDataSize = 8; >> + FwCfgSelectorAddress = FwCfgDataAddress + FwCfgDataSize; >> + FwCfgSelectorSize = 2; >> + >> + // >> + // The following ASSERT()s express >> + // >> + // Address + Size - 1 <= MAX_UINTN >> + // >> + // for both registers, that is, that the last byte in each MMIO range is >> + // expressible as a MAX_UINTN. The form below is mathematically >> + // equivalent, and it also prevents any unsigned overflow before the >> + // comparison. >> + // >> + ASSERT (FwCfgSelectorAddress <= MAX_UINTN - FwCfgSelectorSize + 1); >> + ASSERT (FwCfgDataAddress <= MAX_UINTN - FwCfgDataSize + 1); >> + >> + mFwCfgSelectorAddress = FwCfgSelectorAddress; >> + mFwCfgDataAddress = FwCfgDataAddress; >> + >> + DEBUG (( >> + DEBUG_INFO, >> + "Found FwCfg @ 0x%Lx/0x%Lx\n", >> + FwCfgSelectorAddress, >> + FwCfgDataAddress >> + )); >> + >> + if (SwapBytes64 (Reg[1]) >= 0x18) { >> + FwCfgDmaAddress = FwCfgDataAddress + 0x10; >> + FwCfgDmaSize = 0x08; >> + >> + // >> + // See explanation above. >> + // >> + ASSERT (FwCfgDmaAddress <= MAX_UINTN - FwCfgDmaSize + 1); >> + >> + DEBUG ((DEBUG_INFO, "Found FwCfg DMA @ 0x%Lx\n", FwCfgDmaAddress)); >> + } else { >> + FwCfgDmaAddress = 0; >> + } >> + >> + if (QemuFwCfgIsAvailable ()) { >> + UINT32 Signature; >> + >> + QemuFwCfgSelectItem (QemuFwCfgItemSignature); >> + Signature = QemuFwCfgRead32 (); >> + if (Signature == SIGNATURE_32 ('Q', 'E', 'M', 'U')) { >> + // >> + // For DMA support, we require the DTB to advertise the register, and the >> + // feature bitmap (which we read without DMA) to confirm the feature. >> + // >> + if (FwCfgDmaAddress != 0) { >> + UINT32 Features; >> + >> + QemuFwCfgSelectItem (QemuFwCfgItemInterfaceVersion); >> + Features = QemuFwCfgRead32 (); >> + if ((Features & FW_CFG_F_DMA) != 0) { >> + mFwCfgDmaAddress = FwCfgDmaAddress; >> + InternalQemuFwCfgReadBytes = DmaReadBytes; >> + InternalQemuFwCfgWriteBytes = DmaWriteBytes; >> + InternalQemuFwCfgSkipBytes = DmaSkipBytes; >> + } >> + } >> + } else { >> + mFwCfgSelectorAddress = 0; >> + mFwCfgDataAddress = 0; >> + } >> + } >> + >> + return RETURN_SUCCESS; >> +} >> -- >> 2.27.0 >> > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118306): https://edk2.groups.io/g/devel/message/118306 Mute This Topic: https://groups.io/mt/105728766/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- [-- Attachment #2: Type: text/html, Size: 23607 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* [edk2-devel] [PATCH v3 2/7] OvmfPkg: Add the way of HOBs in QemuFwCfgLibMmio 2024-04-25 12:12 [edk2-devel] [PATCH v3 0/7] Adjust the QemuFwCfgLibMmio and add PEI stage Chao Li 2024-04-25 12:12 ` [edk2-devel] [PATCH v3 1/7] OvmfPkg: Separate QemuFwCfgLibMmio.c into two files Chao Li @ 2024-04-25 12:13 ` Chao Li 2024-04-25 13:02 ` Ard Biesheuvel 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 3/7] OvmfPkg: Add the QemuFwCfgMmioLib PEI stage version Chao Li ` (4 subsequent siblings) 6 siblings, 1 reply; 13+ messages in thread From: Chao Li @ 2024-04-25 12:13 UTC (permalink / raw) To: devel Cc: Ard Biesheuvel, Jiewen Yao, Gerd Hoffmann, Leif Lindholm, Sami Mujawar, Sunil V L, Andrei Warkentin Added the HOB methods to load and store the QEMU firmware configure address, data address and DMA address, which are not enabled during the DXE stage. Build-tested only (with "ArmVirtQemu.dsc and RiscVVirtQemu.dsc"). BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4755 Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Leif Lindholm <quic_llindhol@quicinc.com> Cc: Sami Mujawar <sami.mujawar@arm.com> Cc: Sunil V L <sunilvl@ventanamicro.com> Cc: Andrei Warkentin <andrei.warkentin@intel.com> Signed-off-by: Chao Li <lichao@loongson.cn> --- .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.c | 81 +++++++++++++++-- .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf | 1 + .../QemuFwCfgLib/QemuFwCfgLibMmioInternal.h | 74 +++++++++++++++ .../Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c | 91 ++++++++++++++++--- 4 files changed, 226 insertions(+), 21 deletions(-) diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c index dc949c8e26..b5dbc5e4b5 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c @@ -8,11 +8,16 @@ SPDX-License-Identifier: BSD-2-Clause-Patent **/ +#include <Base.h> #include <Uefi.h> +#include <Pi/PiBootMode.h> +#include <Pi/PiHob.h> + #include <Library/BaseLib.h> #include <Library/BaseMemoryLib.h> #include <Library/DebugLib.h> +#include <Library/HobLib.h> #include <Library/IoLib.h> #include <Library/QemuFwCfgLib.h> #include <Library/UefiBootServicesTableLib.h> @@ -21,6 +26,62 @@ #include "QemuFwCfgLibMmioInternal.h" +EFI_GUID mFwCfgResourceGuid = FW_CONFIG_RESOURCE_HOB_GUID; + +/** + Build firmware configure resource address HOB. + + @param[in] FwCfgResource A pointer to firmware configure resource. + + @retval NULL +**/ +VOID +QemuBuildFwCfgResourceHob ( + IN QEMU_FW_CFG_RESOURCE *FwCfgResource + ) +{ + UINT64 Data64; + + Data64 = (UINT64)(UINTN)FwCfgResource; + + BuildGuidDataHob ( + &mFwCfgResourceGuid, + (VOID *)&Data64, + sizeof (QEMU_FW_CFG_RESOURCE) + ); +} + +/** + Get firmware configure resource in HOB. + + @param VOID + + @retval FwCfgResource The firmware configure resouce in HOB. + NULL The firmware configure resouce not found. +**/ +QEMU_FW_CFG_RESOURCE * +QemuGetFwCfgResourceHob ( + VOID + ) +{ + EFI_HOB_GUID_TYPE *GuidHob; + VOID *DataInHob; + QEMU_FW_CFG_RESOURCE *FwCfgResource; + + GuidHob = NULL; + DataInHob = NULL; + + GuidHob = GetFirstGuidHob (&mFwCfgResourceGuid); + if (GuidHob == NULL) { + return NULL; + } + + DataInHob = GET_GUID_HOB_DATA (GuidHob); + FwCfgResource = (QEMU_FW_CFG_RESOURCE *)(*(UINTN *)DataInHob); + + return FwCfgResource; +} + /** Returns a boolean indicating if the firmware configuration interface is available or not. @@ -37,7 +98,7 @@ QemuFwCfgIsAvailable ( VOID ) { - return (BOOLEAN)(mFwCfgSelectorAddress != 0 && mFwCfgDataAddress != 0); + return (BOOLEAN)(QemuGetFwCfgSelectorAddress () != 0 && QemuGetFwCfgDataAddress () != 0); } /** @@ -56,7 +117,7 @@ QemuFwCfgSelectItem ( ) { if (QemuFwCfgIsAvailable ()) { - MmioWrite16 (mFwCfgSelectorAddress, SwapBytes16 ((UINT16)QemuFwCfgItem)); + MmioWrite16 (QemuGetFwCfgSelectorAddress (), SwapBytes16 ((UINT16)QemuFwCfgItem)); } } @@ -86,30 +147,30 @@ MmioReadBytes ( #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) while (Ptr < End) { - *(UINT64 *)Ptr = MmioRead64 (mFwCfgDataAddress); + *(UINT64 *)Ptr = MmioRead64 (QemuGetFwCfgDataAddress ()); Ptr += 8; } if (Left & 4) { - *(UINT32 *)Ptr = MmioRead32 (mFwCfgDataAddress); + *(UINT32 *)Ptr = MmioRead32 (QemuGetFwCfgDataAddress ()); Ptr += 4; } #else while (Ptr < End) { - *(UINT32 *)Ptr = MmioRead32 (mFwCfgDataAddress); + *(UINT32 *)Ptr = MmioRead32 (QemuGetFwCfgDataAddress ()); Ptr += 4; } #endif if (Left & 2) { - *(UINT16 *)Ptr = MmioRead16 (mFwCfgDataAddress); + *(UINT16 *)Ptr = MmioRead16 (QemuGetFwCfgDataAddress ()); Ptr += 2; } if (Left & 1) { - *Ptr = MmioRead8 (mFwCfgDataAddress); + *Ptr = MmioRead8 (QemuGetFwCfgDataAddress ()); } } @@ -162,9 +223,9 @@ DmaTransferBytes ( // This will fire off the transfer. // #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) - MmioWrite64 (mFwCfgDmaAddress, SwapBytes64 ((UINT64)&Access)); + MmioWrite64 (QemuGetFwCfgDmaAddress (), SwapBytes64 ((UINT64)&Access)); #else - MmioWrite32 ((UINT32)(mFwCfgDmaAddress + 4), SwapBytes32 ((UINT32)&Access)); + MmioWrite32 ((UINT32)(QemuGetFwCfgDmaAddress () + 4), SwapBytes32 ((UINT32)&Access)); #endif // @@ -233,7 +294,7 @@ MmioWriteBytes ( UINTN Idx; for (Idx = 0; Idx < Size; ++Idx) { - MmioWrite8 (mFwCfgDataAddress, ((UINT8 *)Buffer)[Idx]); + MmioWrite8 (QemuGetFwCfgDataAddress (), ((UINT8 *)Buffer)[Idx]); } } diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf index f2596f270e..8e191f2d22 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf @@ -40,6 +40,7 @@ [LibraryClasses] BaseLib BaseMemoryLib DebugLib + HobLib IoLib UefiBootServicesTableLib diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h index d7d645f700..6101e15b21 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h @@ -16,6 +16,17 @@ extern UINTN mFwCfgSelectorAddress; extern UINTN mFwCfgDataAddress; extern UINTN mFwCfgDmaAddress; +#define FW_CONFIG_RESOURCE_HOB_GUID \ + { \ + 0x3cc47b04, 0x0d3e, 0xaa64, { 0x06, 0xa6, 0x4b, 0xdc, 0x9a, 0x2c, 0x61, 0x19 } \ + } + +typedef struct { + UINTN FwCfgSelectorAddress; + UINTN FwCfgDataAddress; + UINTN FwCfgDmaAddress; +} QEMU_FW_CFG_RESOURCE; + /** Reads firmware configuration bytes into a buffer @@ -96,6 +107,69 @@ EFIAPI IN UINTN Size ); +/** + Build firmware configure resource HOB. + + @param[in] FwCfgResource A pointer to firmware configure resource. + + @retval NULL +**/ +VOID +QemuBuildFwCfgResourceHob ( + IN QEMU_FW_CFG_RESOURCE *FwCfgResource + ); + +/** + Get firmware configure resource HOB. + + @param VOID + + @retval FwCfgResource The firmware configure resouce in HOB. +**/ +QEMU_FW_CFG_RESOURCE * +QemuGetFwCfgResourceHob ( + VOID + ); + +/** + To get firmware configure selector address. + + @param VOID + + @retval firmware configure selector address +**/ +UINTN +EFIAPI +QemuGetFwCfgSelectorAddress ( + VOID + ); + +/** + To get firmware configure Data address. + + @param VOID + + @retval firmware configure data address +**/ +UINTN +EFIAPI +QemuGetFwCfgDataAddress ( + VOID + ); + +/** + To get firmware DMA address. + + @param VOID + + @retval firmware DMA address +**/ +UINTN +EFIAPI +QemuGetFwCfgDmaAddress ( + VOID + ); + /** Slow READ_BYTES_FUNCTION. **/ diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c index 4844a42a36..2d5055a76e 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c @@ -32,23 +32,92 @@ READ_BYTES_FUNCTION *InternalQemuFwCfgReadBytes = MmioReadBytes; WRITE_BYTES_FUNCTION *InternalQemuFwCfgWriteBytes = MmioWriteBytes; SKIP_BYTES_FUNCTION *InternalQemuFwCfgSkipBytes = MmioSkipBytes; +/** + To get firmware configure selector address. + + @param VOID + + @retval firmware configure selector address +**/ +UINTN +EFIAPI +QemuGetFwCfgSelectorAddress ( + VOID + ) +{ + return mFwCfgSelectorAddress; +} + +/** + To get firmware configure Data address. + + @param VOID + + @retval firmware configure data address +**/ +UINTN +EFIAPI +QemuGetFwCfgDataAddress ( + VOID + ) +{ + return mFwCfgDataAddress; +} + +/** + To get firmware DMA address. + + @param VOID + + @retval firmware DMA address +**/ +UINTN +EFIAPI +QemuGetFwCfgDmaAddress ( + VOID + ) +{ + return mFwCfgDmaAddress; +} + + RETURN_STATUS EFIAPI QemuFwCfgInitialize ( VOID ) { - EFI_STATUS Status; - FDT_CLIENT_PROTOCOL *FdtClient; - CONST UINT64 *Reg; - UINT32 RegSize; - UINTN AddressCells, SizeCells; - UINT64 FwCfgSelectorAddress; - UINT64 FwCfgSelectorSize; - UINT64 FwCfgDataAddress; - UINT64 FwCfgDataSize; - UINT64 FwCfgDmaAddress; - UINT64 FwCfgDmaSize; + EFI_STATUS Status; + FDT_CLIENT_PROTOCOL *FdtClient; + CONST UINT64 *Reg; + UINT32 RegSize; + UINTN AddressCells, SizeCells; + UINT64 FwCfgSelectorAddress; + UINT64 FwCfgSelectorSize; + UINT64 FwCfgDataAddress; + UINT64 FwCfgDataSize; + UINT64 FwCfgDmaAddress; + UINT64 FwCfgDmaSize; + QEMU_FW_CFG_RESOURCE *FwCfgResource; + + // + // Check whether the Qemu firmware configure resources HOB has been created, + // if so use the resources in the HOB. + // + FwCfgResource = QemuGetFwCfgResourceHob (); + if (FwCfgResource != NULL) { + mFwCfgSelectorAddress = FwCfgResource->FwCfgSelectorAddress; + mFwCfgDataAddress = FwCfgResource->FwCfgDataAddress; + mFwCfgDmaAddress = FwCfgResource->FwCfgDmaAddress; + + if (mFwCfgDmaAddress != 0) { + InternalQemuFwCfgReadBytes = DmaReadBytes; + InternalQemuFwCfgWriteBytes = DmaWriteBytes; + InternalQemuFwCfgSkipBytes = DmaSkipBytes; + } + + return RETURN_SUCCESS; + } Status = gBS->LocateProtocol ( &gFdtClientProtocolGuid, -- 2.27.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118293): https://edk2.groups.io/g/devel/message/118293 Mute This Topic: https://groups.io/mt/105728768/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [edk2-devel] [PATCH v3 2/7] OvmfPkg: Add the way of HOBs in QemuFwCfgLibMmio 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 2/7] OvmfPkg: Add the way of HOBs in QemuFwCfgLibMmio Chao Li @ 2024-04-25 13:02 ` Ard Biesheuvel 2024-04-26 1:20 ` Chao Li [not found] ` <17C9AFCE49F3CEE8.6322@groups.io> 0 siblings, 2 replies; 13+ messages in thread From: Ard Biesheuvel @ 2024-04-25 13:02 UTC (permalink / raw) To: devel, lichao Cc: Ard Biesheuvel, Jiewen Yao, Gerd Hoffmann, Leif Lindholm, Sami Mujawar, Sunil V L, Andrei Warkentin On Thu, 25 Apr 2024 at 14:13, Chao Li <lichao@loongson.cn> wrote: > > Added the HOB methods to load and store the QEMU firmware configure > address, data address and DMA address, which are not enabled during the > DXE stage. > > Build-tested only (with "ArmVirtQemu.dsc and RiscVVirtQemu.dsc"). > > BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4755 > > Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> > Cc: Jiewen Yao <jiewen.yao@intel.com> > Cc: Gerd Hoffmann <kraxel@redhat.com> > Cc: Leif Lindholm <quic_llindhol@quicinc.com> > Cc: Sami Mujawar <sami.mujawar@arm.com> > Cc: Sunil V L <sunilvl@ventanamicro.com> > Cc: Andrei Warkentin <andrei.warkentin@intel.com> > Signed-off-by: Chao Li <lichao@loongson.cn> > --- > .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.c | 81 +++++++++++++++-- > .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf | 1 + > .../QemuFwCfgLib/QemuFwCfgLibMmioInternal.h | 74 +++++++++++++++ > .../Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c | 91 ++++++++++++++++--- > 4 files changed, 226 insertions(+), 21 deletions(-) > > diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c > index dc949c8e26..b5dbc5e4b5 100644 > --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c > +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c > @@ -8,11 +8,16 @@ > SPDX-License-Identifier: BSD-2-Clause-Patent > **/ > > +#include <Base.h> > #include <Uefi.h> > > +#include <Pi/PiBootMode.h> > +#include <Pi/PiHob.h> > + > #include <Library/BaseLib.h> > #include <Library/BaseMemoryLib.h> > #include <Library/DebugLib.h> > +#include <Library/HobLib.h> > #include <Library/IoLib.h> > #include <Library/QemuFwCfgLib.h> > #include <Library/UefiBootServicesTableLib.h> > @@ -21,6 +26,62 @@ > > #include "QemuFwCfgLibMmioInternal.h" > > +EFI_GUID mFwCfgResourceGuid = FW_CONFIG_RESOURCE_HOB_GUID; > + > +/** > + Build firmware configure resource address HOB. > + > + @param[in] FwCfgResource A pointer to firmware configure resource. > + > + @retval NULL > +**/ > +VOID > +QemuBuildFwCfgResourceHob ( > + IN QEMU_FW_CFG_RESOURCE *FwCfgResource > + ) > +{ > + UINT64 Data64; > + > + Data64 = (UINT64)(UINTN)FwCfgResource; > + > + BuildGuidDataHob ( > + &mFwCfgResourceGuid, > + (VOID *)&Data64, This looks wrong: why are you taking the address of the stack variable rather than the address of the resource descriptor? > + sizeof (QEMU_FW_CFG_RESOURCE) > + ); > +} > + > +/** > + Get firmware configure resource in HOB. > + > + @param VOID > + > + @retval FwCfgResource The firmware configure resouce in HOB. resource > + NULL The firmware configure resouce not found. > +**/ > +QEMU_FW_CFG_RESOURCE * > +QemuGetFwCfgResourceHob ( > + VOID > + ) > +{ > + EFI_HOB_GUID_TYPE *GuidHob; > + VOID *DataInHob; > + QEMU_FW_CFG_RESOURCE *FwCfgResource; > + > + GuidHob = NULL; > + DataInHob = NULL; > + > + GuidHob = GetFirstGuidHob (&mFwCfgResourceGuid); Please define this GUID in the package .DEC file and add it to the [Guids] section in the .INF so that you can refer to its name directly. > + if (GuidHob == NULL) { > + return NULL; > + } > + > + DataInHob = GET_GUID_HOB_DATA (GuidHob); > + FwCfgResource = (QEMU_FW_CFG_RESOURCE *)(*(UINTN *)DataInHob); > + > + return FwCfgResource; > +} > + > /** > Returns a boolean indicating if the firmware configuration interface > is available or not. > @@ -37,7 +98,7 @@ QemuFwCfgIsAvailable ( > VOID > ) > { > - return (BOOLEAN)(mFwCfgSelectorAddress != 0 && mFwCfgDataAddress != 0); > + return (BOOLEAN)(QemuGetFwCfgSelectorAddress () != 0 && QemuGetFwCfgDataAddress () != 0); > } > > /** > @@ -56,7 +117,7 @@ QemuFwCfgSelectItem ( > ) > { > if (QemuFwCfgIsAvailable ()) { > - MmioWrite16 (mFwCfgSelectorAddress, SwapBytes16 ((UINT16)QemuFwCfgItem)); > + MmioWrite16 (QemuGetFwCfgSelectorAddress (), SwapBytes16 ((UINT16)QemuFwCfgItem)); > } > } > > @@ -86,30 +147,30 @@ MmioReadBytes ( > > #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) > while (Ptr < End) { > - *(UINT64 *)Ptr = MmioRead64 (mFwCfgDataAddress); > + *(UINT64 *)Ptr = MmioRead64 (QemuGetFwCfgDataAddress ()); > Ptr += 8; > } > > if (Left & 4) { > - *(UINT32 *)Ptr = MmioRead32 (mFwCfgDataAddress); > + *(UINT32 *)Ptr = MmioRead32 (QemuGetFwCfgDataAddress ()); > Ptr += 4; > } > > #else > while (Ptr < End) { > - *(UINT32 *)Ptr = MmioRead32 (mFwCfgDataAddress); > + *(UINT32 *)Ptr = MmioRead32 (QemuGetFwCfgDataAddress ()); > Ptr += 4; > } > > #endif > > if (Left & 2) { > - *(UINT16 *)Ptr = MmioRead16 (mFwCfgDataAddress); > + *(UINT16 *)Ptr = MmioRead16 (QemuGetFwCfgDataAddress ()); > Ptr += 2; > } > > if (Left & 1) { > - *Ptr = MmioRead8 (mFwCfgDataAddress); > + *Ptr = MmioRead8 (QemuGetFwCfgDataAddress ()); > } > } > > @@ -162,9 +223,9 @@ DmaTransferBytes ( > // This will fire off the transfer. > // > #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) > - MmioWrite64 (mFwCfgDmaAddress, SwapBytes64 ((UINT64)&Access)); > + MmioWrite64 (QemuGetFwCfgDmaAddress (), SwapBytes64 ((UINT64)&Access)); > #else > - MmioWrite32 ((UINT32)(mFwCfgDmaAddress + 4), SwapBytes32 ((UINT32)&Access)); > + MmioWrite32 ((UINT32)(QemuGetFwCfgDmaAddress () + 4), SwapBytes32 ((UINT32)&Access)); > #endif > > // > @@ -233,7 +294,7 @@ MmioWriteBytes ( > UINTN Idx; > > for (Idx = 0; Idx < Size; ++Idx) { > - MmioWrite8 (mFwCfgDataAddress, ((UINT8 *)Buffer)[Idx]); > + MmioWrite8 (QemuGetFwCfgDataAddress (), ((UINT8 *)Buffer)[Idx]); > } > } > > diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf > index f2596f270e..8e191f2d22 100644 > --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf > +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf > @@ -40,6 +40,7 @@ [LibraryClasses] > BaseLib > BaseMemoryLib > DebugLib > + HobLib > IoLib > UefiBootServicesTableLib > > diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h > index d7d645f700..6101e15b21 100644 > --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h > +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h > @@ -16,6 +16,17 @@ extern UINTN mFwCfgSelectorAddress; > extern UINTN mFwCfgDataAddress; > extern UINTN mFwCfgDmaAddress; > > +#define FW_CONFIG_RESOURCE_HOB_GUID \ > + { \ > + 0x3cc47b04, 0x0d3e, 0xaa64, { 0x06, 0xa6, 0x4b, 0xdc, 0x9a, 0x2c, 0x61, 0x19 } \ > + } > + > +typedef struct { > + UINTN FwCfgSelectorAddress; > + UINTN FwCfgDataAddress; > + UINTN FwCfgDmaAddress; > +} QEMU_FW_CFG_RESOURCE; > + > /** > Reads firmware configuration bytes into a buffer > > @@ -96,6 +107,69 @@ EFIAPI > IN UINTN Size > ); > > +/** > + Build firmware configure resource HOB. > + > + @param[in] FwCfgResource A pointer to firmware configure resource. > + > + @retval NULL > +**/ > +VOID > +QemuBuildFwCfgResourceHob ( > + IN QEMU_FW_CFG_RESOURCE *FwCfgResource > + ); > + > +/** > + Get firmware configure resource HOB. > + > + @param VOID > + > + @retval FwCfgResource The firmware configure resouce in HOB. > +**/ > +QEMU_FW_CFG_RESOURCE * > +QemuGetFwCfgResourceHob ( > + VOID > + ); > + > +/** > + To get firmware configure selector address. > + > + @param VOID > + > + @retval firmware configure selector address > +**/ > +UINTN > +EFIAPI > +QemuGetFwCfgSelectorAddress ( > + VOID > + ); > + > +/** > + To get firmware configure Data address. > + > + @param VOID > + > + @retval firmware configure data address > +**/ > +UINTN > +EFIAPI > +QemuGetFwCfgDataAddress ( > + VOID > + ); > + > +/** > + To get firmware DMA address. > + > + @param VOID > + > + @retval firmware DMA address > +**/ > +UINTN > +EFIAPI > +QemuGetFwCfgDmaAddress ( > + VOID > + ); > + > /** > Slow READ_BYTES_FUNCTION. > **/ > diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c > index 4844a42a36..2d5055a76e 100644 > --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c > +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c > @@ -32,23 +32,92 @@ READ_BYTES_FUNCTION *InternalQemuFwCfgReadBytes = MmioReadBytes; > WRITE_BYTES_FUNCTION *InternalQemuFwCfgWriteBytes = MmioWriteBytes; > SKIP_BYTES_FUNCTION *InternalQemuFwCfgSkipBytes = MmioSkipBytes; > > +/** > + To get firmware configure selector address. > + > + @param VOID > + > + @retval firmware configure selector address > +**/ > +UINTN > +EFIAPI > +QemuGetFwCfgSelectorAddress ( > + VOID > + ) > +{ > + return mFwCfgSelectorAddress; > +} > + > +/** > + To get firmware configure Data address. > + > + @param VOID > + > + @retval firmware configure data address > +**/ > +UINTN > +EFIAPI > +QemuGetFwCfgDataAddress ( > + VOID > + ) > +{ > + return mFwCfgDataAddress; > +} > + > +/** > + To get firmware DMA address. > + > + @param VOID > + > + @retval firmware DMA address > +**/ > +UINTN > +EFIAPI > +QemuGetFwCfgDmaAddress ( > + VOID > + ) > +{ > + return mFwCfgDmaAddress; > +} > + > + > RETURN_STATUS > EFIAPI > QemuFwCfgInitialize ( > VOID > ) > { > - EFI_STATUS Status; > - FDT_CLIENT_PROTOCOL *FdtClient; > - CONST UINT64 *Reg; > - UINT32 RegSize; > - UINTN AddressCells, SizeCells; > - UINT64 FwCfgSelectorAddress; > - UINT64 FwCfgSelectorSize; > - UINT64 FwCfgDataAddress; > - UINT64 FwCfgDataSize; > - UINT64 FwCfgDmaAddress; > - UINT64 FwCfgDmaSize; > + EFI_STATUS Status; > + FDT_CLIENT_PROTOCOL *FdtClient; > + CONST UINT64 *Reg; > + UINT32 RegSize; > + UINTN AddressCells, SizeCells; > + UINT64 FwCfgSelectorAddress; > + UINT64 FwCfgSelectorSize; > + UINT64 FwCfgDataAddress; > + UINT64 FwCfgDataSize; > + UINT64 FwCfgDmaAddress; > + UINT64 FwCfgDmaSize; > + QEMU_FW_CFG_RESOURCE *FwCfgResource; > + > + // > + // Check whether the Qemu firmware configure resources HOB has been created, > + // if so use the resources in the HOB. > + // > + FwCfgResource = QemuGetFwCfgResourceHob (); > + if (FwCfgResource != NULL) { > + mFwCfgSelectorAddress = FwCfgResource->FwCfgSelectorAddress; > + mFwCfgDataAddress = FwCfgResource->FwCfgDataAddress; > + mFwCfgDmaAddress = FwCfgResource->FwCfgDmaAddress; > + > + if (mFwCfgDmaAddress != 0) { > + InternalQemuFwCfgReadBytes = DmaReadBytes; > + InternalQemuFwCfgWriteBytes = DmaWriteBytes; > + InternalQemuFwCfgSkipBytes = DmaSkipBytes; > + } > + > + return RETURN_SUCCESS; > + } > > Status = gBS->LocateProtocol ( > &gFdtClientProtocolGuid, > -- > 2.27.0 > > > > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118300): https://edk2.groups.io/g/devel/message/118300 Mute This Topic: https://groups.io/mt/105728768/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [edk2-devel] [PATCH v3 2/7] OvmfPkg: Add the way of HOBs in QemuFwCfgLibMmio 2024-04-25 13:02 ` Ard Biesheuvel @ 2024-04-26 1:20 ` Chao Li [not found] ` <17C9AFCE49F3CEE8.6322@groups.io> 1 sibling, 0 replies; 13+ messages in thread From: Chao Li @ 2024-04-26 1:20 UTC (permalink / raw) To: devel, ardb Cc: Ard Biesheuvel, Jiewen Yao, Gerd Hoffmann, Leif Lindholm, Sami Mujawar, Sunil V L, Andrei Warkentin [-- Attachment #1: Type: text/plain, Size: 12402 bytes --] Hi Ard, Thanks, Chao On 2024/4/25 21:02, Ard Biesheuvel wrote: > On Thu, 25 Apr 2024 at 14:13, Chao Li<lichao@loongson.cn> wrote: >> Added the HOB methods to load and store the QEMU firmware configure >> address, data address and DMA address, which are not enabled during the >> DXE stage. >> >> Build-tested only (with "ArmVirtQemu.dsc and RiscVVirtQemu.dsc"). >> >> BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=4755 >> >> Cc: Ard Biesheuvel<ardb+tianocore@kernel.org> >> Cc: Jiewen Yao<jiewen.yao@intel.com> >> Cc: Gerd Hoffmann<kraxel@redhat.com> >> Cc: Leif Lindholm<quic_llindhol@quicinc.com> >> Cc: Sami Mujawar<sami.mujawar@arm.com> >> Cc: Sunil V L<sunilvl@ventanamicro.com> >> Cc: Andrei Warkentin<andrei.warkentin@intel.com> >> Signed-off-by: Chao Li<lichao@loongson.cn> >> --- >> .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.c | 81 +++++++++++++++-- >> .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf | 1 + >> .../QemuFwCfgLib/QemuFwCfgLibMmioInternal.h | 74 +++++++++++++++ >> .../Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c | 91 ++++++++++++++++--- >> 4 files changed, 226 insertions(+), 21 deletions(-) >> >> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c >> index dc949c8e26..b5dbc5e4b5 100644 >> --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c >> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c >> @@ -8,11 +8,16 @@ >> SPDX-License-Identifier: BSD-2-Clause-Patent >> **/ >> >> +#include <Base.h> >> #include <Uefi.h> >> >> +#include <Pi/PiBootMode.h> >> +#include <Pi/PiHob.h> >> + >> #include <Library/BaseLib.h> >> #include <Library/BaseMemoryLib.h> >> #include <Library/DebugLib.h> >> +#include <Library/HobLib.h> >> #include <Library/IoLib.h> >> #include <Library/QemuFwCfgLib.h> >> #include <Library/UefiBootServicesTableLib.h> >> @@ -21,6 +26,62 @@ >> >> #include "QemuFwCfgLibMmioInternal.h" >> >> +EFI_GUID mFwCfgResourceGuid = FW_CONFIG_RESOURCE_HOB_GUID; >> + >> +/** >> + Build firmware configure resource address HOB. >> + >> + @param[in] FwCfgResource A pointer to firmware configure resource. >> + >> + @retval NULL >> +**/ >> +VOID >> +QemuBuildFwCfgResourceHob ( >> + IN QEMU_FW_CFG_RESOURCE *FwCfgResource >> + ) >> +{ >> + UINT64 Data64; >> + >> + Data64 = (UINT64)(UINTN)FwCfgResource; >> + >> + BuildGuidDataHob ( >> + &mFwCfgResourceGuid, >> + (VOID *)&Data64, > This looks wrong: why are you taking the address of the stack variable > rather than the address of the resource descriptor? It only saves the pointer of FwCfgResource, and the memory space has been created in the PEI constructor. Do you mean saving all contents of FwCfgResource in the HOB? The following line is indeed wrong. if only save the pointer, the size should be "sizeof (UINT64)". > >> + sizeof (QEMU_FW_CFG_RESOURCE) >> + ); >> +} >> + >> +/** >> + Get firmware configure resource in HOB. >> + >> + @param VOID >> + >> + @retval FwCfgResource The firmware configure resouce in HOB. > resource All right. > >> + NULL The firmware configure resouce not found. >> +**/ >> +QEMU_FW_CFG_RESOURCE * >> +QemuGetFwCfgResourceHob ( >> + VOID >> + ) >> +{ >> + EFI_HOB_GUID_TYPE *GuidHob; >> + VOID *DataInHob; >> + QEMU_FW_CFG_RESOURCE *FwCfgResource; >> + >> + GuidHob = NULL; >> + DataInHob = NULL; >> + >> + GuidHob = GetFirstGuidHob (&mFwCfgResourceGuid); > Please define this GUID in the package .DEC file and add it to the > [Guids] section in the .INF so that you can refer to its name > directly. OK. > >> + if (GuidHob == NULL) { >> + return NULL; >> + } >> + >> + DataInHob = GET_GUID_HOB_DATA (GuidHob); >> + FwCfgResource = (QEMU_FW_CFG_RESOURCE *)(*(UINTN *)DataInHob); >> + >> + return FwCfgResource; >> +} >> + >> /** >> Returns a boolean indicating if the firmware configuration interface >> is available or not. >> @@ -37,7 +98,7 @@ QemuFwCfgIsAvailable ( >> VOID >> ) >> { >> - return (BOOLEAN)(mFwCfgSelectorAddress != 0 && mFwCfgDataAddress != 0); >> + return (BOOLEAN)(QemuGetFwCfgSelectorAddress () != 0 && QemuGetFwCfgDataAddress () != 0); >> } >> >> /** >> @@ -56,7 +117,7 @@ QemuFwCfgSelectItem ( >> ) >> { >> if (QemuFwCfgIsAvailable ()) { >> - MmioWrite16 (mFwCfgSelectorAddress, SwapBytes16 ((UINT16)QemuFwCfgItem)); >> + MmioWrite16 (QemuGetFwCfgSelectorAddress (), SwapBytes16 ((UINT16)QemuFwCfgItem)); >> } >> } >> >> @@ -86,30 +147,30 @@ MmioReadBytes ( >> >> #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) >> while (Ptr < End) { >> - *(UINT64 *)Ptr = MmioRead64 (mFwCfgDataAddress); >> + *(UINT64 *)Ptr = MmioRead64 (QemuGetFwCfgDataAddress ()); >> Ptr += 8; >> } >> >> if (Left & 4) { >> - *(UINT32 *)Ptr = MmioRead32 (mFwCfgDataAddress); >> + *(UINT32 *)Ptr = MmioRead32 (QemuGetFwCfgDataAddress ()); >> Ptr += 4; >> } >> >> #else >> while (Ptr < End) { >> - *(UINT32 *)Ptr = MmioRead32 (mFwCfgDataAddress); >> + *(UINT32 *)Ptr = MmioRead32 (QemuGetFwCfgDataAddress ()); >> Ptr += 4; >> } >> >> #endif >> >> if (Left & 2) { >> - *(UINT16 *)Ptr = MmioRead16 (mFwCfgDataAddress); >> + *(UINT16 *)Ptr = MmioRead16 (QemuGetFwCfgDataAddress ()); >> Ptr += 2; >> } >> >> if (Left & 1) { >> - *Ptr = MmioRead8 (mFwCfgDataAddress); >> + *Ptr = MmioRead8 (QemuGetFwCfgDataAddress ()); >> } >> } >> >> @@ -162,9 +223,9 @@ DmaTransferBytes ( >> // This will fire off the transfer. >> // >> #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) >> - MmioWrite64 (mFwCfgDmaAddress, SwapBytes64 ((UINT64)&Access)); >> + MmioWrite64 (QemuGetFwCfgDmaAddress (), SwapBytes64 ((UINT64)&Access)); >> #else >> - MmioWrite32 ((UINT32)(mFwCfgDmaAddress + 4), SwapBytes32 ((UINT32)&Access)); >> + MmioWrite32 ((UINT32)(QemuGetFwCfgDmaAddress () + 4), SwapBytes32 ((UINT32)&Access)); >> #endif >> >> // >> @@ -233,7 +294,7 @@ MmioWriteBytes ( >> UINTN Idx; >> >> for (Idx = 0; Idx < Size; ++Idx) { >> - MmioWrite8 (mFwCfgDataAddress, ((UINT8 *)Buffer)[Idx]); >> + MmioWrite8 (QemuGetFwCfgDataAddress (), ((UINT8 *)Buffer)[Idx]); >> } >> } >> >> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf >> index f2596f270e..8e191f2d22 100644 >> --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf >> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf >> @@ -40,6 +40,7 @@ [LibraryClasses] >> BaseLib >> BaseMemoryLib >> DebugLib >> + HobLib >> IoLib >> UefiBootServicesTableLib >> >> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h >> index d7d645f700..6101e15b21 100644 >> --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h >> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h >> @@ -16,6 +16,17 @@ extern UINTN mFwCfgSelectorAddress; >> extern UINTN mFwCfgDataAddress; >> extern UINTN mFwCfgDmaAddress; >> >> +#define FW_CONFIG_RESOURCE_HOB_GUID \ >> + { \ >> + 0x3cc47b04, 0x0d3e, 0xaa64, { 0x06, 0xa6, 0x4b, 0xdc, 0x9a, 0x2c, 0x61, 0x19 } \ >> + } >> + >> +typedef struct { >> + UINTN FwCfgSelectorAddress; >> + UINTN FwCfgDataAddress; >> + UINTN FwCfgDmaAddress; >> +} QEMU_FW_CFG_RESOURCE; >> + >> /** >> Reads firmware configuration bytes into a buffer >> >> @@ -96,6 +107,69 @@ EFIAPI >> IN UINTN Size >> ); >> >> +/** >> + Build firmware configure resource HOB. >> + >> + @param[in] FwCfgResource A pointer to firmware configure resource. >> + >> + @retval NULL >> +**/ >> +VOID >> +QemuBuildFwCfgResourceHob ( >> + IN QEMU_FW_CFG_RESOURCE *FwCfgResource >> + ); >> + >> +/** >> + Get firmware configure resource HOB. >> + >> + @param VOID >> + >> + @retval FwCfgResource The firmware configure resouce in HOB. >> +**/ >> +QEMU_FW_CFG_RESOURCE * >> +QemuGetFwCfgResourceHob ( >> + VOID >> + ); >> + >> +/** >> + To get firmware configure selector address. >> + >> + @param VOID >> + >> + @retval firmware configure selector address >> +**/ >> +UINTN >> +EFIAPI >> +QemuGetFwCfgSelectorAddress ( >> + VOID >> + ); >> + >> +/** >> + To get firmware configure Data address. >> + >> + @param VOID >> + >> + @retval firmware configure data address >> +**/ >> +UINTN >> +EFIAPI >> +QemuGetFwCfgDataAddress ( >> + VOID >> + ); >> + >> +/** >> + To get firmware DMA address. >> + >> + @param VOID >> + >> + @retval firmware DMA address >> +**/ >> +UINTN >> +EFIAPI >> +QemuGetFwCfgDmaAddress ( >> + VOID >> + ); >> + >> /** >> Slow READ_BYTES_FUNCTION. >> **/ >> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c >> index 4844a42a36..2d5055a76e 100644 >> --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c >> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c >> @@ -32,23 +32,92 @@ READ_BYTES_FUNCTION *InternalQemuFwCfgReadBytes = MmioReadBytes; >> WRITE_BYTES_FUNCTION *InternalQemuFwCfgWriteBytes = MmioWriteBytes; >> SKIP_BYTES_FUNCTION *InternalQemuFwCfgSkipBytes = MmioSkipBytes; >> >> +/** >> + To get firmware configure selector address. >> + >> + @param VOID >> + >> + @retval firmware configure selector address >> +**/ >> +UINTN >> +EFIAPI >> +QemuGetFwCfgSelectorAddress ( >> + VOID >> + ) >> +{ >> + return mFwCfgSelectorAddress; >> +} >> + >> +/** >> + To get firmware configure Data address. >> + >> + @param VOID >> + >> + @retval firmware configure data address >> +**/ >> +UINTN >> +EFIAPI >> +QemuGetFwCfgDataAddress ( >> + VOID >> + ) >> +{ >> + return mFwCfgDataAddress; >> +} >> + >> +/** >> + To get firmware DMA address. >> + >> + @param VOID >> + >> + @retval firmware DMA address >> +**/ >> +UINTN >> +EFIAPI >> +QemuGetFwCfgDmaAddress ( >> + VOID >> + ) >> +{ >> + return mFwCfgDmaAddress; >> +} >> + >> + >> RETURN_STATUS >> EFIAPI >> QemuFwCfgInitialize ( >> VOID >> ) >> { >> - EFI_STATUS Status; >> - FDT_CLIENT_PROTOCOL *FdtClient; >> - CONST UINT64 *Reg; >> - UINT32 RegSize; >> - UINTN AddressCells, SizeCells; >> - UINT64 FwCfgSelectorAddress; >> - UINT64 FwCfgSelectorSize; >> - UINT64 FwCfgDataAddress; >> - UINT64 FwCfgDataSize; >> - UINT64 FwCfgDmaAddress; >> - UINT64 FwCfgDmaSize; >> + EFI_STATUS Status; >> + FDT_CLIENT_PROTOCOL *FdtClient; >> + CONST UINT64 *Reg; >> + UINT32 RegSize; >> + UINTN AddressCells, SizeCells; >> + UINT64 FwCfgSelectorAddress; >> + UINT64 FwCfgSelectorSize; >> + UINT64 FwCfgDataAddress; >> + UINT64 FwCfgDataSize; >> + UINT64 FwCfgDmaAddress; >> + UINT64 FwCfgDmaSize; >> + QEMU_FW_CFG_RESOURCE *FwCfgResource; >> + >> + // >> + // Check whether the Qemu firmware configure resources HOB has been created, >> + // if so use the resources in the HOB. >> + // >> + FwCfgResource = QemuGetFwCfgResourceHob (); >> + if (FwCfgResource != NULL) { >> + mFwCfgSelectorAddress = FwCfgResource->FwCfgSelectorAddress; >> + mFwCfgDataAddress = FwCfgResource->FwCfgDataAddress; >> + mFwCfgDmaAddress = FwCfgResource->FwCfgDmaAddress; >> + >> + if (mFwCfgDmaAddress != 0) { >> + InternalQemuFwCfgReadBytes = DmaReadBytes; >> + InternalQemuFwCfgWriteBytes = DmaWriteBytes; >> + InternalQemuFwCfgSkipBytes = DmaSkipBytes; >> + } >> + >> + return RETURN_SUCCESS; >> + } >> >> Status = gBS->LocateProtocol ( >> &gFdtClientProtocolGuid, >> -- >> 2.27.0 >> >> >> >> >> >> > > > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118307): https://edk2.groups.io/g/devel/message/118307 Mute This Topic: https://groups.io/mt/105728768/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- [-- Attachment #2: Type: text/html, Size: 14340 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
[parent not found: <17C9AFCE49F3CEE8.6322@groups.io>]
* Re: [edk2-devel] [PATCH v3 2/7] OvmfPkg: Add the way of HOBs in QemuFwCfgLibMmio [not found] ` <17C9AFCE49F3CEE8.6322@groups.io> @ 2024-04-26 4:22 ` Chao Li 0 siblings, 0 replies; 13+ messages in thread From: Chao Li @ 2024-04-26 4:22 UTC (permalink / raw) To: devel, ardb Cc: Ard Biesheuvel, Jiewen Yao, Gerd Hoffmann, Leif Lindholm, Sami Mujawar, Sunil V L, Andrei Warkentin [-- Attachment #1: Type: text/plain, Size: 12922 bytes --] Hi Ard, Thanks, Chao On 2024/4/26 09:20, Chao Li wrote: > > Hi Ard, > > On 2024/4/25 21:02, Ard Biesheuvel wrote: >> On Thu, 25 Apr 2024 at 14:13, Chao Li<lichao@loongson.cn> wrote: >>> Added the HOB methods to load and store the QEMU firmware configure >>> address, data address and DMA address, which are not enabled during the >>> DXE stage. >>> >>> Build-tested only (with "ArmVirtQemu.dsc and RiscVVirtQemu.dsc"). >>> >>> BZ:https://bugzilla.tianocore.org/show_bug.cgi?id=4755 >>> >>> Cc: Ard Biesheuvel<ardb+tianocore@kernel.org> >>> Cc: Jiewen Yao<jiewen.yao@intel.com> >>> Cc: Gerd Hoffmann<kraxel@redhat.com> >>> Cc: Leif Lindholm<quic_llindhol@quicinc.com> >>> Cc: Sami Mujawar<sami.mujawar@arm.com> >>> Cc: Sunil V L<sunilvl@ventanamicro.com> >>> Cc: Andrei Warkentin<andrei.warkentin@intel.com> >>> Signed-off-by: Chao Li<lichao@loongson.cn> >>> --- >>> .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.c | 81 +++++++++++++++-- >>> .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf | 1 + >>> .../QemuFwCfgLib/QemuFwCfgLibMmioInternal.h | 74 +++++++++++++++ >>> .../Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c | 91 ++++++++++++++++--- >>> 4 files changed, 226 insertions(+), 21 deletions(-) >>> >>> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c >>> index dc949c8e26..b5dbc5e4b5 100644 >>> --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c >>> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c >>> @@ -8,11 +8,16 @@ >>> SPDX-License-Identifier: BSD-2-Clause-Patent >>> **/ >>> >>> +#include <Base.h> >>> #include <Uefi.h> >>> >>> +#include <Pi/PiBootMode.h> >>> +#include <Pi/PiHob.h> >>> + >>> #include <Library/BaseLib.h> >>> #include <Library/BaseMemoryLib.h> >>> #include <Library/DebugLib.h> >>> +#include <Library/HobLib.h> >>> #include <Library/IoLib.h> >>> #include <Library/QemuFwCfgLib.h> >>> #include <Library/UefiBootServicesTableLib.h> >>> @@ -21,6 +26,62 @@ >>> >>> #include "QemuFwCfgLibMmioInternal.h" >>> >>> +EFI_GUID mFwCfgResourceGuid = FW_CONFIG_RESOURCE_HOB_GUID; >>> + >>> +/** >>> + Build firmware configure resource address HOB. >>> + >>> + @param[in] FwCfgResource A pointer to firmware configure resource. >>> + >>> + @retval NULL >>> +**/ >>> +VOID >>> +QemuBuildFwCfgResourceHob ( >>> + IN QEMU_FW_CFG_RESOURCE *FwCfgResource >>> + ) >>> +{ >>> + UINT64 Data64; >>> + >>> + Data64 = (UINT64)(UINTN)FwCfgResource; >>> + >>> + BuildGuidDataHob ( >>> + &mFwCfgResourceGuid, >>> + (VOID *)&Data64, >> This looks wrong: why are you taking the address of the stack variable >> rather than the address of the resource descriptor? > > It only saves the pointer of FwCfgResource, and the memory space has > been created in the PEI constructor. Do you mean saving all contents > of FwCfgResource in the HOB? > > The following line is indeed wrong. if only save the pointer, the size > should be "sizeof (UINT64)". > I will save the real HOB data in the next version. > >>> + sizeof (QEMU_FW_CFG_RESOURCE) >>> + ); >>> +} >>> + >>> +/** >>> + Get firmware configure resource in HOB. >>> + >>> + @param VOID >>> + >>> + @retval FwCfgResource The firmware configure resouce in HOB. >> resource > All right. >>> + NULL The firmware configure resouce not found. >>> +**/ >>> +QEMU_FW_CFG_RESOURCE * >>> +QemuGetFwCfgResourceHob ( >>> + VOID >>> + ) >>> +{ >>> + EFI_HOB_GUID_TYPE *GuidHob; >>> + VOID *DataInHob; >>> + QEMU_FW_CFG_RESOURCE *FwCfgResource; >>> + >>> + GuidHob = NULL; >>> + DataInHob = NULL; >>> + >>> + GuidHob = GetFirstGuidHob (&mFwCfgResourceGuid); >> Please define this GUID in the package .DEC file and add it to the >> [Guids] section in the .INF so that you can refer to its name >> directly. > OK. >>> + if (GuidHob == NULL) { >>> + return NULL; >>> + } >>> + >>> + DataInHob = GET_GUID_HOB_DATA (GuidHob); >>> + FwCfgResource = (QEMU_FW_CFG_RESOURCE *)(*(UINTN *)DataInHob); >>> + >>> + return FwCfgResource; >>> +} >>> + >>> /** >>> Returns a boolean indicating if the firmware configuration interface >>> is available or not. >>> @@ -37,7 +98,7 @@ QemuFwCfgIsAvailable ( >>> VOID >>> ) >>> { >>> - return (BOOLEAN)(mFwCfgSelectorAddress != 0 && mFwCfgDataAddress != 0); >>> + return (BOOLEAN)(QemuGetFwCfgSelectorAddress () != 0 && QemuGetFwCfgDataAddress () != 0); >>> } >>> >>> /** >>> @@ -56,7 +117,7 @@ QemuFwCfgSelectItem ( >>> ) >>> { >>> if (QemuFwCfgIsAvailable ()) { >>> - MmioWrite16 (mFwCfgSelectorAddress, SwapBytes16 ((UINT16)QemuFwCfgItem)); >>> + MmioWrite16 (QemuGetFwCfgSelectorAddress (), SwapBytes16 ((UINT16)QemuFwCfgItem)); >>> } >>> } >>> >>> @@ -86,30 +147,30 @@ MmioReadBytes ( >>> >>> #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) >>> while (Ptr < End) { >>> - *(UINT64 *)Ptr = MmioRead64 (mFwCfgDataAddress); >>> + *(UINT64 *)Ptr = MmioRead64 (QemuGetFwCfgDataAddress ()); >>> Ptr += 8; >>> } >>> >>> if (Left & 4) { >>> - *(UINT32 *)Ptr = MmioRead32 (mFwCfgDataAddress); >>> + *(UINT32 *)Ptr = MmioRead32 (QemuGetFwCfgDataAddress ()); >>> Ptr += 4; >>> } >>> >>> #else >>> while (Ptr < End) { >>> - *(UINT32 *)Ptr = MmioRead32 (mFwCfgDataAddress); >>> + *(UINT32 *)Ptr = MmioRead32 (QemuGetFwCfgDataAddress ()); >>> Ptr += 4; >>> } >>> >>> #endif >>> >>> if (Left & 2) { >>> - *(UINT16 *)Ptr = MmioRead16 (mFwCfgDataAddress); >>> + *(UINT16 *)Ptr = MmioRead16 (QemuGetFwCfgDataAddress ()); >>> Ptr += 2; >>> } >>> >>> if (Left & 1) { >>> - *Ptr = MmioRead8 (mFwCfgDataAddress); >>> + *Ptr = MmioRead8 (QemuGetFwCfgDataAddress ()); >>> } >>> } >>> >>> @@ -162,9 +223,9 @@ DmaTransferBytes ( >>> // This will fire off the transfer. >>> // >>> #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MDE_CPU_LOONGARCH64) >>> - MmioWrite64 (mFwCfgDmaAddress, SwapBytes64 ((UINT64)&Access)); >>> + MmioWrite64 (QemuGetFwCfgDmaAddress (), SwapBytes64 ((UINT64)&Access)); >>> #else >>> - MmioWrite32 ((UINT32)(mFwCfgDmaAddress + 4), SwapBytes32 ((UINT32)&Access)); >>> + MmioWrite32 ((UINT32)(QemuGetFwCfgDmaAddress () + 4), SwapBytes32 ((UINT32)&Access)); >>> #endif >>> >>> // >>> @@ -233,7 +294,7 @@ MmioWriteBytes ( >>> UINTN Idx; >>> >>> for (Idx = 0; Idx < Size; ++Idx) { >>> - MmioWrite8 (mFwCfgDataAddress, ((UINT8 *)Buffer)[Idx]); >>> + MmioWrite8 (QemuGetFwCfgDataAddress (), ((UINT8 *)Buffer)[Idx]); >>> } >>> } >>> >>> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf >>> index f2596f270e..8e191f2d22 100644 >>> --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf >>> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf >>> @@ -40,6 +40,7 @@ [LibraryClasses] >>> BaseLib >>> BaseMemoryLib >>> DebugLib >>> + HobLib >>> IoLib >>> UefiBootServicesTableLib >>> >>> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h >>> index d7d645f700..6101e15b21 100644 >>> --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h >>> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h >>> @@ -16,6 +16,17 @@ extern UINTN mFwCfgSelectorAddress; >>> extern UINTN mFwCfgDataAddress; >>> extern UINTN mFwCfgDmaAddress; >>> >>> +#define FW_CONFIG_RESOURCE_HOB_GUID \ >>> + { \ >>> + 0x3cc47b04, 0x0d3e, 0xaa64, { 0x06, 0xa6, 0x4b, 0xdc, 0x9a, 0x2c, 0x61, 0x19 } \ >>> + } >>> + >>> +typedef struct { >>> + UINTN FwCfgSelectorAddress; >>> + UINTN FwCfgDataAddress; >>> + UINTN FwCfgDmaAddress; >>> +} QEMU_FW_CFG_RESOURCE; >>> + >>> /** >>> Reads firmware configuration bytes into a buffer >>> >>> @@ -96,6 +107,69 @@ EFIAPI >>> IN UINTN Size >>> ); >>> >>> +/** >>> + Build firmware configure resource HOB. >>> + >>> + @param[in] FwCfgResource A pointer to firmware configure resource. >>> + >>> + @retval NULL >>> +**/ >>> +VOID >>> +QemuBuildFwCfgResourceHob ( >>> + IN QEMU_FW_CFG_RESOURCE *FwCfgResource >>> + ); >>> + >>> +/** >>> + Get firmware configure resource HOB. >>> + >>> + @param VOID >>> + >>> + @retval FwCfgResource The firmware configure resouce in HOB. >>> +**/ >>> +QEMU_FW_CFG_RESOURCE * >>> +QemuGetFwCfgResourceHob ( >>> + VOID >>> + ); >>> + >>> +/** >>> + To get firmware configure selector address. >>> + >>> + @param VOID >>> + >>> + @retval firmware configure selector address >>> +**/ >>> +UINTN >>> +EFIAPI >>> +QemuGetFwCfgSelectorAddress ( >>> + VOID >>> + ); >>> + >>> +/** >>> + To get firmware configure Data address. >>> + >>> + @param VOID >>> + >>> + @retval firmware configure data address >>> +**/ >>> +UINTN >>> +EFIAPI >>> +QemuGetFwCfgDataAddress ( >>> + VOID >>> + ); >>> + >>> +/** >>> + To get firmware DMA address. >>> + >>> + @param VOID >>> + >>> + @retval firmware DMA address >>> +**/ >>> +UINTN >>> +EFIAPI >>> +QemuGetFwCfgDmaAddress ( >>> + VOID >>> + ); >>> + >>> /** >>> Slow READ_BYTES_FUNCTION. >>> **/ >>> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c >>> index 4844a42a36..2d5055a76e 100644 >>> --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c >>> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c >>> @@ -32,23 +32,92 @@ READ_BYTES_FUNCTION *InternalQemuFwCfgReadBytes = MmioReadBytes; >>> WRITE_BYTES_FUNCTION *InternalQemuFwCfgWriteBytes = MmioWriteBytes; >>> SKIP_BYTES_FUNCTION *InternalQemuFwCfgSkipBytes = MmioSkipBytes; >>> >>> +/** >>> + To get firmware configure selector address. >>> + >>> + @param VOID >>> + >>> + @retval firmware configure selector address >>> +**/ >>> +UINTN >>> +EFIAPI >>> +QemuGetFwCfgSelectorAddress ( >>> + VOID >>> + ) >>> +{ >>> + return mFwCfgSelectorAddress; >>> +} >>> + >>> +/** >>> + To get firmware configure Data address. >>> + >>> + @param VOID >>> + >>> + @retval firmware configure data address >>> +**/ >>> +UINTN >>> +EFIAPI >>> +QemuGetFwCfgDataAddress ( >>> + VOID >>> + ) >>> +{ >>> + return mFwCfgDataAddress; >>> +} >>> + >>> +/** >>> + To get firmware DMA address. >>> + >>> + @param VOID >>> + >>> + @retval firmware DMA address >>> +**/ >>> +UINTN >>> +EFIAPI >>> +QemuGetFwCfgDmaAddress ( >>> + VOID >>> + ) >>> +{ >>> + return mFwCfgDmaAddress; >>> +} >>> + >>> + >>> RETURN_STATUS >>> EFIAPI >>> QemuFwCfgInitialize ( >>> VOID >>> ) >>> { >>> - EFI_STATUS Status; >>> - FDT_CLIENT_PROTOCOL *FdtClient; >>> - CONST UINT64 *Reg; >>> - UINT32 RegSize; >>> - UINTN AddressCells, SizeCells; >>> - UINT64 FwCfgSelectorAddress; >>> - UINT64 FwCfgSelectorSize; >>> - UINT64 FwCfgDataAddress; >>> - UINT64 FwCfgDataSize; >>> - UINT64 FwCfgDmaAddress; >>> - UINT64 FwCfgDmaSize; >>> + EFI_STATUS Status; >>> + FDT_CLIENT_PROTOCOL *FdtClient; >>> + CONST UINT64 *Reg; >>> + UINT32 RegSize; >>> + UINTN AddressCells, SizeCells; >>> + UINT64 FwCfgSelectorAddress; >>> + UINT64 FwCfgSelectorSize; >>> + UINT64 FwCfgDataAddress; >>> + UINT64 FwCfgDataSize; >>> + UINT64 FwCfgDmaAddress; >>> + UINT64 FwCfgDmaSize; >>> + QEMU_FW_CFG_RESOURCE *FwCfgResource; >>> + >>> + // >>> + // Check whether the Qemu firmware configure resources HOB has been created, >>> + // if so use the resources in the HOB. >>> + // >>> + FwCfgResource = QemuGetFwCfgResourceHob (); >>> + if (FwCfgResource != NULL) { >>> + mFwCfgSelectorAddress = FwCfgResource->FwCfgSelectorAddress; >>> + mFwCfgDataAddress = FwCfgResource->FwCfgDataAddress; >>> + mFwCfgDmaAddress = FwCfgResource->FwCfgDmaAddress; >>> + >>> + if (mFwCfgDmaAddress != 0) { >>> + InternalQemuFwCfgReadBytes = DmaReadBytes; >>> + InternalQemuFwCfgWriteBytes = DmaWriteBytes; >>> + InternalQemuFwCfgSkipBytes = DmaSkipBytes; >>> + } >>> + >>> + return RETURN_SUCCESS; >>> + } >>> >>> Status = gBS->LocateProtocol ( >>> &gFdtClientProtocolGuid, >>> -- >>> 2.27.0 >>> >>> >>> >>> >>> >>> > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118309): https://edk2.groups.io/g/devel/message/118309 Mute This Topic: https://groups.io/mt/105728768/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- [-- Attachment #2: Type: text/html, Size: 15032 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* [edk2-devel] [PATCH v3 3/7] OvmfPkg: Add the QemuFwCfgMmioLib PEI stage version 2024-04-25 12:12 [edk2-devel] [PATCH v3 0/7] Adjust the QemuFwCfgLibMmio and add PEI stage Chao Li 2024-04-25 12:12 ` [edk2-devel] [PATCH v3 1/7] OvmfPkg: Separate QemuFwCfgLibMmio.c into two files Chao Li 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 2/7] OvmfPkg: Add the way of HOBs in QemuFwCfgLibMmio Chao Li @ 2024-04-25 12:13 ` Chao Li 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 4/7] OvmfPkg: Copy the same new INF as QemuFwCfgLibMmio.inf Chao Li ` (3 subsequent siblings) 6 siblings, 0 replies; 13+ messages in thread From: Chao Li @ 2024-04-25 12:13 UTC (permalink / raw) To: devel; +Cc: Ard Biesheuvel, Jiewen Yao, Gerd Hoffmann, Xianglai Li Added the PEI stage library for QemuFwCfgMmioLib, which uses the FDT to find the fw_cfg and parse it. BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4755 Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Co-authored-by: Xianglai Li <lixianglai@loongson.cn> Signed-off-by: Chao Li <lichao@loongson.cn> --- .../Library/QemuFwCfgLib/QemuFwCfgMmioPei.c | 228 ++++++++++++++++++ .../QemuFwCfgLib/QemuFwCfgMmioPeiLib.inf | 49 ++++ 2 files changed, 277 insertions(+) create mode 100644 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioPei.c create mode 100644 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioPeiLib.inf diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioPei.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioPei.c new file mode 100644 index 0000000000..fa6f531e3a --- /dev/null +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioPei.c @@ -0,0 +1,228 @@ +/** @file + + Stateful and implicitly initialized fw_cfg library implementation. + + Copyright (C) 2013 - 2014, Red Hat, Inc. + Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR> + (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR> + Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include <Uefi.h> + +#include <Library/BaseLib.h> +#include <Library/DebugLib.h> +#include <Library/MemoryAllocationLib.h> +#include <Library/QemuFwCfgLib.h> + +#include <libfdt.h> + +#include "QemuFwCfgLibMmioInternal.h" + +// +// These correspond to the implementation we detect at runtime. +// +READ_BYTES_FUNCTION *InternalQemuFwCfgReadBytes = MmioReadBytes; +WRITE_BYTES_FUNCTION *InternalQemuFwCfgWriteBytes = MmioWriteBytes; +SKIP_BYTES_FUNCTION *InternalQemuFwCfgSkipBytes = MmioSkipBytes; + +/** + To get firmware configure selector address. + + @param VOID + + @retval firmware configure selector address +**/ +UINTN +EFIAPI +QemuGetFwCfgSelectorAddress ( + VOID + ) +{ + QEMU_FW_CFG_RESOURCE *FwCfgResource; + + FwCfgResource = QemuGetFwCfgResourceHob (); + ASSERT (FwCfgResource != NULL); + + return FwCfgResource->FwCfgSelectorAddress; +} + +/** + To get firmware configure Data address. + + @param VOID + + @retval firmware configure data address +**/ +UINTN +EFIAPI +QemuGetFwCfgDataAddress ( + VOID + ) +{ + QEMU_FW_CFG_RESOURCE *FwCfgResource; + + FwCfgResource = QemuGetFwCfgResourceHob (); + ASSERT (FwCfgResource != NULL); + + return FwCfgResource->FwCfgDataAddress; +} + +/** + To get firmware DMA address. + + @param VOID + + @retval firmware DMA address +**/ +UINTN +EFIAPI +QemuGetFwCfgDmaAddress ( + VOID + ) +{ + QEMU_FW_CFG_RESOURCE *FwCfgResource; + + FwCfgResource = QemuGetFwCfgResourceHob (); + ASSERT (FwCfgResource != NULL); + + return FwCfgResource->FwCfgDmaAddress; +} + +RETURN_STATUS +EFIAPI +QemuFwCfgInitialize ( + VOID + ) +{ + VOID *DeviceTreeBase; + INT32 Node; + INT32 Prev; + CONST CHAR8 *Type; + INT32 Len; + CONST UINT64 *Reg; + UINT64 FwCfgSelectorAddress; + UINT64 FwCfgSelectorSize; + UINT64 FwCfgDataAddress; + UINT64 FwCfgDataSize; + UINT64 FwCfgDmaAddress; + UINT64 FwCfgDmaSize; + QEMU_FW_CFG_RESOURCE *FwCfgResource; + VOID *Buffer; + + // + // Check whether the Qemu firmware configure resources HOB has been created, + // if so use the resources in the HOB. + // + FwCfgResource = QemuGetFwCfgResourceHob (); + if (FwCfgResource != NULL) { + return RETURN_SUCCESS; + } + + DeviceTreeBase = (VOID *)(UINTN)PcdGet64 (PcdDeviceTreeInitialBaseAddress); + ASSERT (DeviceTreeBase != NULL); + // + // Make sure we have a valid device tree blob + // + ASSERT (fdt_check_header (DeviceTreeBase) == 0); + + // + // Create resouce memory + // + Buffer = AllocatePages(EFI_SIZE_TO_PAGES (sizeof (QEMU_FW_CFG_RESOURCE))); + ASSERT (Buffer != NULL); + ZeroMem (Buffer, sizeof (QEMU_FW_CFG_RESOURCE)); + + FwCfgResource = (QEMU_FW_CFG_RESOURCE *)Buffer; + + for (Prev = 0; ; Prev = Node) { + Node = fdt_next_node (DeviceTreeBase, Prev, NULL); + if (Node < 0) { + break; + } + + // + // Check for memory node + // + Type = fdt_getprop (DeviceTreeBase, Node, "compatible", &Len); + if ((Type) && + (AsciiStrnCmp (Type, "qemu,fw-cfg-mmio", Len) == 0)) + { + // + // Get the 'reg' property of this node. For now, we will assume + // two 8 byte quantities for base and size, respectively. + // + Reg = fdt_getprop (DeviceTreeBase, Node, "reg", &Len); + if ((Reg != 0) && (Len == (2 * sizeof (UINT64)))) { + FwCfgDataAddress = SwapBytes64 (Reg[0]); + FwCfgDataSize = 8; + FwCfgSelectorAddress = FwCfgDataAddress + FwCfgDataSize; + FwCfgSelectorSize = 2; + + // + // The following ASSERT()s express + // + // Address + Size - 1 <= MAX_UINTN + // + // for both registers, that is, that the last byte in each MMIO range is + // expressible as a MAX_UINTN. The form below is mathematically + // equivalent, and it also prevents any unsigned overflow before the + // comparison. + // + ASSERT (FwCfgSelectorAddress <= MAX_UINTN - FwCfgSelectorSize + 1); + ASSERT (FwCfgDataAddress <= MAX_UINTN - FwCfgDataSize + 1); + + FwCfgResource->FwCfgSelectorAddress = FwCfgSelectorAddress; + FwCfgResource->FwCfgDataAddress = FwCfgDataAddress; + QemuBuildFwCfgResourceHob (FwCfgResource); + + DEBUG (( + DEBUG_INFO, + "Found FwCfg @ 0x%Lx/0x%Lx\n", + FwCfgSelectorAddress, + FwCfgDataAddress + )); + + if (SwapBytes64 (Reg[1]) >= 0x18) { + FwCfgDmaAddress = FwCfgDataAddress + 0x10; + FwCfgDmaSize = 0x08; + + // + // See explanation above. + // + ASSERT (FwCfgDmaAddress <= MAX_UINTN - FwCfgDmaSize + 1); + + DEBUG ((DEBUG_INFO, "Found FwCfg DMA @ 0x%Lx\n", FwCfgDmaAddress)); + } else { + FwCfgDmaAddress = 0; + } + + if (QemuFwCfgIsAvailable ()) { + UINT32 Signature; + + QemuFwCfgSelectItem (QemuFwCfgItemSignature); + Signature = QemuFwCfgRead32 (); + if (Signature != SIGNATURE_32 ('Q', 'E', 'M', 'U')) { + FwCfgResource->FwCfgDataAddress = 0; + FwCfgResource->FwCfgSelectorAddress = 0; + FwCfgResource->FwCfgDmaAddress = 0; + QemuBuildFwCfgResourceHob (FwCfgResource); + } + } + + break; + } else { + DEBUG (( + DEBUG_ERROR, + "%a: Failed to parse FDT QemuCfg node\n", + __func__ + )); + break; + } + } + } + + return RETURN_SUCCESS; +} diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioPeiLib.inf b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioPeiLib.inf new file mode 100644 index 0000000000..d2ced0771d --- /dev/null +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioPeiLib.inf @@ -0,0 +1,49 @@ +## @file +# +# Stateful, implicitly initialized fw_cfg library. +# +# Copyright (C) 2013 - 2014, Red Hat, Inc. +# Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR> +# Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 1.29 + BASE_NAME = QemuFwCfgPeiLib + FILE_GUID = CDF9A9D5-7422-4DCB-B41D-607151AD320B + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = QemuFwCfgLib|PEIM + + CONSTRUCTOR = QemuFwCfgInitialize + +# +# The following information is for reference only and not required by the build +# tools. +# +# VALID_ARCHITECTURES = LOONGARCH64 +# + +[Sources] + QemuFwCfgLibMmio.c + QemuFwCfgMmioPei.c + +[Packages] + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + HobLib + IoLib + MemoryAllocationLib + PcdLib + +[Pcd] + gUefiOvmfPkgTokenSpaceGuid.PcdDeviceTreeInitialBaseAddress -- 2.27.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118294): https://edk2.groups.io/g/devel/message/118294 Mute This Topic: https://groups.io/mt/105728770/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [edk2-devel] [PATCH v3 4/7] OvmfPkg: Copy the same new INF as QemuFwCfgLibMmio.inf 2024-04-25 12:12 [edk2-devel] [PATCH v3 0/7] Adjust the QemuFwCfgLibMmio and add PEI stage Chao Li ` (2 preceding siblings ...) 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 3/7] OvmfPkg: Add the QemuFwCfgMmioLib PEI stage version Chao Li @ 2024-04-25 12:13 ` Chao Li 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 5/7] ArmVirtPkg: Enable QemuFwCfgMmioDxeLib.inf Chao Li ` (2 subsequent siblings) 6 siblings, 0 replies; 13+ messages in thread From: Chao Li @ 2024-04-25 12:13 UTC (permalink / raw) To: devel; +Cc: Ard Biesheuvel, Jiewen Yao, Gerd Hoffmann Copy QemuFwCfgLibMmio.inf to QemuFwCfgMmioDxeLib.inf, QemuFwCfgLibMmio.inf will be deleted when all platforms switching is completed. BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4755 Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Chao Li <lichao@loongson.cn> --- .../QemuFwCfgLib/QemuFwCfgMmioDxeLib.inf | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxeLib.inf diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxeLib.inf b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxeLib.inf new file mode 100644 index 0000000000..8e191f2d22 --- /dev/null +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxeLib.inf @@ -0,0 +1,51 @@ +## @file +# +# Stateful, implicitly initialized fw_cfg library. +# +# Copyright (C) 2013 - 2014, Red Hat, Inc. +# Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR> +# Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = QemuFwCfgLib + FILE_GUID = B271F41F-B841-48A9-BA8D-545B4BC2E2BF + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = QemuFwCfgLib|DXE_DRIVER UEFI_DRIVER + + CONSTRUCTOR = QemuFwCfgInitialize + +# +# The following information is for reference only and not required by the build +# tools. +# +# VALID_ARCHITECTURES = ARM AARCH64 RISCV64 LOONGARCH64 +# + +[Sources] + QemuFwCfgLibMmio.c + QemuFwCfgMmioDxe.c + +[Packages] + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + HobLib + IoLib + UefiBootServicesTableLib + +[Protocols] + gFdtClientProtocolGuid ## CONSUMES + +[Depex] + gFdtClientProtocolGuid -- 2.27.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118295): https://edk2.groups.io/g/devel/message/118295 Mute This Topic: https://groups.io/mt/105728771/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [edk2-devel] [PATCH v3 5/7] ArmVirtPkg: Enable QemuFwCfgMmioDxeLib.inf 2024-04-25 12:12 [edk2-devel] [PATCH v3 0/7] Adjust the QemuFwCfgLibMmio and add PEI stage Chao Li ` (3 preceding siblings ...) 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 4/7] OvmfPkg: Copy the same new INF as QemuFwCfgLibMmio.inf Chao Li @ 2024-04-25 12:13 ` Chao Li 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 6/7] OvmfPkg/RiscVVirt: " Chao Li 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 7/7] OvmfPkg: Remove QemuFwCfgLibMmio.inf Chao Li 6 siblings, 0 replies; 13+ messages in thread From: Chao Li @ 2024-04-25 12:13 UTC (permalink / raw) To: devel Cc: Ard Biesheuvel, Jiewen Yao, Gerd Hoffmann, Leif Lindholm, Sami Mujawar Enable QemuFwCfgMmioDxeLib.inf in ArmVirtQemu.dsc and ArmVirtQemuKernel.dsc. Build-tested only (with "ArmVirtQemu.dsc"). BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4755 Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Leif Lindholm <quic_llindhol@quicinc.com> Cc: Sami Mujawar <sami.mujawar@arm.com> Signed-off-by: Chao Li <lichao@loongson.cn> --- ArmVirtPkg/ArmVirtQemu.dsc | 2 +- ArmVirtPkg/ArmVirtQemuKernel.dsc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index e48c75b5e9..987b8bb238 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -60,7 +60,7 @@ [LibraryClasses.common] # Virtio Support VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf VirtioMmioDeviceLib|OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceLib.inf - QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf + QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxeLib.inf QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/BaseQemuFwCfgS3LibNull.inf QemuFwCfgSimpleParserLib|OvmfPkg/Library/QemuFwCfgSimpleParserLib/QemuFwCfgSimpleParserLib.inf QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.inf diff --git a/ArmVirtPkg/ArmVirtQemuKernel.dsc b/ArmVirtPkg/ArmVirtQemuKernel.dsc index 668a65ba64..efe2df97bd 100644 --- a/ArmVirtPkg/ArmVirtQemuKernel.dsc +++ b/ArmVirtPkg/ArmVirtQemuKernel.dsc @@ -57,7 +57,7 @@ [LibraryClasses.common] # Virtio Support VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf VirtioMmioDeviceLib|OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceLib.inf - QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf + QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxeLib.inf QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/BaseQemuFwCfgS3LibNull.inf QemuFwCfgSimpleParserLib|OvmfPkg/Library/QemuFwCfgSimpleParserLib/QemuFwCfgSimpleParserLib.inf QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.inf -- 2.27.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118296): https://edk2.groups.io/g/devel/message/118296 Mute This Topic: https://groups.io/mt/105728772/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [edk2-devel] [PATCH v3 6/7] OvmfPkg/RiscVVirt: Enable QemuFwCfgMmioDxeLib.inf 2024-04-25 12:12 [edk2-devel] [PATCH v3 0/7] Adjust the QemuFwCfgLibMmio and add PEI stage Chao Li ` (4 preceding siblings ...) 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 5/7] ArmVirtPkg: Enable QemuFwCfgMmioDxeLib.inf Chao Li @ 2024-04-25 12:13 ` Chao Li 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 7/7] OvmfPkg: Remove QemuFwCfgLibMmio.inf Chao Li 6 siblings, 0 replies; 13+ messages in thread From: Chao Li @ 2024-04-25 12:13 UTC (permalink / raw) To: devel Cc: Ard Biesheuvel, Jiewen Yao, Gerd Hoffmann, Sunil V L, Andrei Warkentin Enable QemuFwCfgMmioDxeLib.inf in RiscVVirtQemu.dsc Build-tested only (with "RiscVVirtQemu.dsc"). BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4755 Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Sunil V L <sunilvl@ventanamicro.com> Cc: Andrei Warkentin <andrei.warkentin@intel.com> Signed-off-by: Chao Li <lichao@loongson.cn> --- OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc index 27f24648e8..e0ed6fb9bc 100644 --- a/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc +++ b/OvmfPkg/RiscVVirt/RiscVVirtQemu.dsc @@ -78,7 +78,7 @@ [LibraryClasses.common] # Virtio Support VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf VirtioMmioDeviceLib|OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceLib.inf - QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf + QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxeLib.inf QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/BaseQemuFwCfgS3LibNull.inf QemuFwCfgSimpleParserLib|OvmfPkg/Library/QemuFwCfgSimpleParserLib/QemuFwCfgSimpleParserLib.inf QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoadImageLib.inf -- 2.27.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118297): https://edk2.groups.io/g/devel/message/118297 Mute This Topic: https://groups.io/mt/105728777/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [edk2-devel] [PATCH v3 7/7] OvmfPkg: Remove QemuFwCfgLibMmio.inf 2024-04-25 12:12 [edk2-devel] [PATCH v3 0/7] Adjust the QemuFwCfgLibMmio and add PEI stage Chao Li ` (5 preceding siblings ...) 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 6/7] OvmfPkg/RiscVVirt: " Chao Li @ 2024-04-25 12:13 ` Chao Li 6 siblings, 0 replies; 13+ messages in thread From: Chao Li @ 2024-04-25 12:13 UTC (permalink / raw) To: devel; +Cc: Ard Biesheuvel, Jiewen Yao, Gerd Hoffmann All of platforms are switching to QemuFwCfgMmioDxeLib.inf, remove QemuFwCfgLibMmio.inf now. BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4755 Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Chao Li <lichao@loongson.cn> --- .../Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf | 51 ------------------- 1 file changed, 51 deletions(-) delete mode 100644 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf deleted file mode 100644 index 8e191f2d22..0000000000 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.inf +++ /dev/null @@ -1,51 +0,0 @@ -## @file -# -# Stateful, implicitly initialized fw_cfg library. -# -# Copyright (C) 2013 - 2014, Red Hat, Inc. -# Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR> -# Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.<BR> -# -# SPDX-License-Identifier: BSD-2-Clause-Patent -# -## - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = QemuFwCfgLib - FILE_GUID = B271F41F-B841-48A9-BA8D-545B4BC2E2BF - MODULE_TYPE = BASE - VERSION_STRING = 1.0 - LIBRARY_CLASS = QemuFwCfgLib|DXE_DRIVER UEFI_DRIVER - - CONSTRUCTOR = QemuFwCfgInitialize - -# -# The following information is for reference only and not required by the build -# tools. -# -# VALID_ARCHITECTURES = ARM AARCH64 RISCV64 LOONGARCH64 -# - -[Sources] - QemuFwCfgLibMmio.c - QemuFwCfgMmioDxe.c - -[Packages] - MdePkg/MdePkg.dec - OvmfPkg/OvmfPkg.dec - EmbeddedPkg/EmbeddedPkg.dec - -[LibraryClasses] - BaseLib - BaseMemoryLib - DebugLib - HobLib - IoLib - UefiBootServicesTableLib - -[Protocols] - gFdtClientProtocolGuid ## CONSUMES - -[Depex] - gFdtClientProtocolGuid -- 2.27.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118298): https://edk2.groups.io/g/devel/message/118298 Mute This Topic: https://groups.io/mt/105728778/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=- ^ permalink raw reply related [flat|nested] 13+ messages in thread
end of thread, other threads:[~2024-04-26 4:22 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-04-25 12:12 [edk2-devel] [PATCH v3 0/7] Adjust the QemuFwCfgLibMmio and add PEI stage Chao Li 2024-04-25 12:12 ` [edk2-devel] [PATCH v3 1/7] OvmfPkg: Separate QemuFwCfgLibMmio.c into two files Chao Li 2024-04-25 12:58 ` Ard Biesheuvel 2024-04-26 1:12 ` Chao Li 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 2/7] OvmfPkg: Add the way of HOBs in QemuFwCfgLibMmio Chao Li 2024-04-25 13:02 ` Ard Biesheuvel 2024-04-26 1:20 ` Chao Li [not found] ` <17C9AFCE49F3CEE8.6322@groups.io> 2024-04-26 4:22 ` Chao Li 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 3/7] OvmfPkg: Add the QemuFwCfgMmioLib PEI stage version Chao Li 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 4/7] OvmfPkg: Copy the same new INF as QemuFwCfgLibMmio.inf Chao Li 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 5/7] ArmVirtPkg: Enable QemuFwCfgMmioDxeLib.inf Chao Li 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 6/7] OvmfPkg/RiscVVirt: " Chao Li 2024-04-25 12:13 ` [edk2-devel] [PATCH v3 7/7] OvmfPkg: Remove QemuFwCfgLibMmio.inf Chao Li
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox