From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail05.groups.io (mail05.groups.io [45.79.224.7]) by spool.mail.gandi.net (Postfix) with ESMTPS id CD866940101 for ; Fri, 26 Apr 2024 01:12:25 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=mY88Cs+CFH4cfXI38W5yGXnQtG5ujUY6ERGM6uuRJ0Y=; c=relaxed/simple; d=groups.io; h=Message-ID:Date:MIME-Version:User-Agent:Subject:To:Cc:References:From:In-Reply-To:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Resent-Date:Resent-From:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Type; s=20240206; t=1714093944; v=1; b=zSMs0vo7bNr6+nNWtDtJ0wxX1F5ywFvSeqHhGjTSfZ3yl/mPCm4Ql/46hpj9pVkXj5W+7Je3 kPdUAt4phgXgLvjH7SMI/BD1Oy/0QhNNIYIEFzkQMkXiiVwAdr7QuDxf1bQp0ZW9vjHpWivF3z1 aCig64vyJYVTUGAcP24xnjJxTKSW0kqwfTvlhDBWN1B0PRhU+QxvibPPr/t9tYcoHF5SVP76XqE AliRHgA1z6Gkp95HTEhQgqv6s+MNd4MaSDoctO7edVo5pxC22H/+DzXg637aUkEMsyCA24SIcio 6ff6U2raXg0Yp8if77VJip6JrCLrZtv0f0vlztJY01wzg== X-Received: by 127.0.0.2 with SMTP id fxNLYY7687511xWCkmTHtssP; Thu, 25 Apr 2024 18:12:24 -0700 X-Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by mx.groups.io with SMTP id smtpd.web10.3492.1714093942264023730 for ; Thu, 25 Apr 2024 18:12:23 -0700 X-Received: from loongson.cn (unknown [10.40.24.149]) by gateway (Coremail) with SMTP id _____8BxSfFw_ypmFzMDAA--.13827S3; Fri, 26 Apr 2024 09:12:16 +0800 (CST) X-Received: from [10.40.24.149] (unknown [10.40.24.149]) by localhost.localdomain (Coremail) with SMTP id AQAAf8Cxrldp_ypmQLoFAA--.13950S3; Fri, 26 Apr 2024 09:12:09 +0800 (CST) Message-ID: <0410d334-3d75-4236-b208-86d2a9d8866f@loongson.cn> Date: Fri, 26 Apr 2024 09:12:09 +0800 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [edk2-devel] [PATCH v3 1/7] OvmfPkg: Separate QemuFwCfgLibMmio.c into two files To: devel@edk2.groups.io, ardb@kernel.org Cc: Ard Biesheuvel , Jiewen Yao , Gerd Hoffmann , Leif Lindholm , Sami Mujawar , Sunil V L , Andrei Warkentin References: <20240425121232.3009016-1-lichao@loongson.cn> <20240425121257.3009757-1-lichao@loongson.cn> From: "Chao Li" In-Reply-To: X-CM-TRANSID: AQAAf8Cxrldp_ypmQLoFAA--.13950S3 X-CM-SenderInfo: xolfxt3r6o00pqjv00gofq/1tbiAQATCGYpxJMN5wAAso X-Coremail-Antispam: 1Uk129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7KY7 ZEXasCq-sGcSsGvfJ3UbIjqfuFe4nvWSU5nxnvy29KBjDU0xBIdaVrnUUvcSsGvfC2Kfnx nUUI43ZEXa7xR_UUUUUUUUU== Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Resent-Date: Thu, 25 Apr 2024 18:12:23 -0700 Resent-From: lichao@loongson.cn Reply-To: devel@edk2.groups.io,lichao@loongson.cn List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: aX0DhRUdi94V10U77mzzoHAhx7686176AA= Content-Type: multipart/alternative; boundary="------------kgeHXvu0SFMoy9qndCoquBwD" X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20240206 header.b=zSMs0vo7; dmarc=none; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 45.79.224.7 as permitted sender) smtp.mailfrom=bounce@groups.io --------------kgeHXvu0SFMoy9qndCoquBwD Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable Hi Ard, Thanks, Chao On 2024/4/25 20:58, Ard Biesheuvel wrote: > On Thu, 25 Apr 2024 at 14:13, Chao Li 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=3D4755 >> >> Cc: Ard Biesheuvel >> Cc: Jiewen Yao >> Cc: Gerd Hoffmann >> Cc: Leif Lindholm >> Cc: Sami Mujawar >> Cc: Sunil V L >> Cc: Andrei Warkentin >> Signed-off-by: Chao Li >> --- >> .../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/QemuFwCfgLibMmioIntern= al.h >> create mode 100644 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioDxe.c >> >> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmio.c b/OvmfPkg/L= ibrary/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. >> (C) Copyright 2021 Hewlett Packard Enterprise Development LP
>> + Copyright (c) 2024 Loongson Technology Corporation Limited. All right= s reserved.
>> > 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=20 or 3. > >> SPDX-License-Identifier: BSD-2-Clause-Patent >> **/ >> @@ -20,63 +19,7 @@ >> >> #include >> >> -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 =3D MmioReadB= ytes; >> -STATIC WRITE_BYTES_FUNCTION *InternalQemuFwCfgWriteBytes =3D MmioWrite= Bytes; >> -STATIC SKIP_BYTES_FUNCTION *InternalQemuFwCfgSkipBytes =3D MmioSkipB= ytes; >> +#include "QemuFwCfgLibMmioInternal.h" >> >> /** >> Returns a boolean indicating if the firmware configuration interface >> @@ -97,126 +40,6 @@ QemuFwCfgIsAvailable ( >> return (BOOLEAN)(mFwCfgSelectorAddress !=3D 0 && mFwCfgDataAddress != =3D 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 =3D gBS->LocateProtocol ( >> - &gFdtClientProtocolGuid, >> - NULL, >> - (VOID **)&FdtClient >> - ); >> - ASSERT_EFI_ERROR (Status); >> - >> - Status =3D 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 =3D= =3D %r)\n", >> - __func__, >> - Status >> - )); >> - return EFI_SUCCESS; >> - } >> - >> - ASSERT (AddressCells =3D=3D 2); >> - ASSERT (SizeCells =3D=3D 2); >> - ASSERT (RegSize =3D=3D 2 * sizeof (UINT64)); >> - >> - FwCfgDataAddress =3D SwapBytes64 (Reg[0]); >> - FwCfgDataSize =3D 8; >> - FwCfgSelectorAddress =3D FwCfgDataAddress + FwCfgDataSize; >> - FwCfgSelectorSize =3D 2; >> - >> - // >> - // The following ASSERT()s express >> - // >> - // Address + Size - 1 <=3D 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 <=3D MAX_UINTN - FwCfgSelectorSize + 1); >> - ASSERT (FwCfgDataAddress <=3D MAX_UINTN - FwCfgDataSize + 1); >> - >> - mFwCfgSelectorAddress =3D FwCfgSelectorAddress; >> - mFwCfgDataAddress =3D FwCfgDataAddress; >> - >> - DEBUG (( >> - DEBUG_INFO, >> - "Found FwCfg @ 0x%Lx/0x%Lx\n", >> - FwCfgSelectorAddress, >> - FwCfgDataAddress >> - )); >> - >> - if (SwapBytes64 (Reg[1]) >=3D 0x18) { >> - FwCfgDmaAddress =3D FwCfgDataAddress + 0x10; >> - FwCfgDmaSize =3D 0x08; >> - >> - // >> - // See explanation above. >> - // >> - ASSERT (FwCfgDmaAddress <=3D MAX_UINTN - FwCfgDmaSize + 1); >> - >> - DEBUG ((DEBUG_INFO, "Found FwCfg DMA @ 0x%Lx\n", FwCfgDmaAddress)); >> - } else { >> - FwCfgDmaAddress =3D 0; >> - } >> - >> - if (QemuFwCfgIsAvailable ()) { >> - UINT32 Signature; >> - >> - QemuFwCfgSelectItem (QemuFwCfgItemSignature); >> - Signature =3D QemuFwCfgRead32 (); >> - if (Signature =3D=3D 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 feat= ure. >> - // >> - if (FwCfgDmaAddress !=3D 0) { >> - UINT32 Features; >> - >> - QemuFwCfgSelectItem (QemuFwCfgItemInterfaceVersion); >> - Features =3D QemuFwCfgRead32 (); >> - if ((Features & FW_CFG_F_DMA) !=3D 0) { >> - mFwCfgDmaAddress =3D FwCfgDmaAddress; >> - InternalQemuFwCfgReadBytes =3D DmaReadBytes; >> - InternalQemuFwCfgWriteBytes =3D DmaWriteBytes; >> - InternalQemuFwCfgSkipBytes =3D DmaSkipBytes; >> - } >> - } >> - } else { >> - mFwCfgSelectorAddress =3D 0; >> - mFwCfgDataAddress =3D 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 =3D Size & 7; >> #else >> Left =3D Size & 3; >> @@ -262,7 +84,7 @@ MmioReadBytes ( >> Ptr =3D Buffer; >> End =3D 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 =3D MmioRead64 (mFwCfgDataAddress); >> Ptr +=3D 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)&A= ccess)); >> @@ -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 righ= ts reserved.
>> # >> # 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 =3D ARM AARCH64 RISCV64 >> +# VALID_ARCHITECTURES =3D ARM AARCH64 RISCV64 LOONGARCH64 >> # >> >> [Sources] >> QemuFwCfgLibMmio.c >> + QemuFwCfgMmioDxe.c >> >> [Packages] >> MdePkg/MdePkg.dec >> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h b/O= vmfPkg/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 Ovm= fPkg. >> + >> + Copyright (C) 2016, Red Hat, Inc. >> + Copyright (C) 2017, Advanced Micro Devices. All rights reserved >> + Copyright (c) 2024 Loongson Technology Corporation Limited. All right= s reserved.
>> + >> + 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 B= uffer. >> + 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/L= ibrary/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. >> + (C) Copyright 2021 Hewlett Packard Enterprise Development LP
>> + Copyright (c) 2024 Loongson Technology Corporation Limited. All right= s reserved.
>> + >> + SPDX-License-Identifier: BSD-2-Clause-Patent >> +**/ >> + >> +#include >> + >> +#include >> +#include >> +#include >> +#include >> + >> +#include >> + >> +#include "QemuFwCfgLibMmioInternal.h" >> + >> +UINTN mFwCfgSelectorAddress; >> +UINTN mFwCfgDataAddress; >> +UINTN mFwCfgDmaAddress; >> + >> +// >> +// These correspond to the implementation we detect at runtime. >> +// >> +READ_BYTES_FUNCTION *InternalQemuFwCfgReadBytes =3D MmioReadBytes; >> +WRITE_BYTES_FUNCTION *InternalQemuFwCfgWriteBytes =3D MmioWriteBytes; >> +SKIP_BYTES_FUNCTION *InternalQemuFwCfgSkipBytes =3D 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 =3D gBS->LocateProtocol ( >> + &gFdtClientProtocolGuid, >> + NULL, >> + (VOID **)&FdtClient >> + ); >> + ASSERT_EFI_ERROR (Status); >> + >> + Status =3D 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 =3D= =3D %r)\n", >> + __func__, >> + Status >> + )); >> + return EFI_SUCCESS; >> + } >> + >> + ASSERT (AddressCells =3D=3D 2); >> + ASSERT (SizeCells =3D=3D 2); >> + ASSERT (RegSize =3D=3D 2 * sizeof (UINT64)); >> + >> + FwCfgDataAddress =3D SwapBytes64 (Reg[0]); >> + FwCfgDataSize =3D 8; >> + FwCfgSelectorAddress =3D FwCfgDataAddress + FwCfgDataSize; >> + FwCfgSelectorSize =3D 2; >> + >> + // >> + // The following ASSERT()s express >> + // >> + // Address + Size - 1 <=3D 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 <=3D MAX_UINTN - FwCfgSelectorSize + 1); >> + ASSERT (FwCfgDataAddress <=3D MAX_UINTN - FwCfgDataSize + 1); >> + >> + mFwCfgSelectorAddress =3D FwCfgSelectorAddress; >> + mFwCfgDataAddress =3D FwCfgDataAddress; >> + >> + DEBUG (( >> + DEBUG_INFO, >> + "Found FwCfg @ 0x%Lx/0x%Lx\n", >> + FwCfgSelectorAddress, >> + FwCfgDataAddress >> + )); >> + >> + if (SwapBytes64 (Reg[1]) >=3D 0x18) { >> + FwCfgDmaAddress =3D FwCfgDataAddress + 0x10; >> + FwCfgDmaSize =3D 0x08; >> + >> + // >> + // See explanation above. >> + // >> + ASSERT (FwCfgDmaAddress <=3D MAX_UINTN - FwCfgDmaSize + 1); >> + >> + DEBUG ((DEBUG_INFO, "Found FwCfg DMA @ 0x%Lx\n", FwCfgDmaAddress)); >> + } else { >> + FwCfgDmaAddress =3D 0; >> + } >> + >> + if (QemuFwCfgIsAvailable ()) { >> + UINT32 Signature; >> + >> + QemuFwCfgSelectItem (QemuFwCfgItemSignature); >> + Signature =3D QemuFwCfgRead32 (); >> + if (Signature =3D=3D 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 feat= ure. >> + // >> + if (FwCfgDmaAddress !=3D 0) { >> + UINT32 Features; >> + >> + QemuFwCfgSelectItem (QemuFwCfgItemInterfaceVersion); >> + Features =3D QemuFwCfgRead32 (); >> + if ((Features & FW_CFG_F_DMA) !=3D 0) { >> + mFwCfgDmaAddress =3D FwCfgDmaAddress; >> + InternalQemuFwCfgReadBytes =3D DmaReadBytes; >> + InternalQemuFwCfgWriteBytes =3D DmaWriteBytes; >> + InternalQemuFwCfgSkipBytes =3D DmaSkipBytes; >> + } >> + } >> + } else { >> + mFwCfgSelectorAddress =3D 0; >> + mFwCfgDataAddress =3D 0; >> + } >> + } >> + >> + return RETURN_SUCCESS; >> +} >> -- >> 2.27.0 >> > >=20 > -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- 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] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- --------------kgeHXvu0SFMoy9qndCoquBwD Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable

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=
=3D4755

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/Libr=
ary/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 r=
eserved.<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  =3D MmioReadByte=
s;
-STATIC WRITE_BYTES_FUNCTION  *InternalQemuFwCfgWriteBytes =3D MmioWriteByt=
es;
-STATIC SKIP_BYTES_FUNCTION   *InternalQemuFwCfgSkipBytes  =3D MmioSkipByte=
s;
+#include "QemuFwCfgLibMmioInternal.h"

 /**
   Returns a boolean indicating if the firmware configuration interface
@@ -97,126 +40,6 @@ QemuFwCfgIsAvailable (
   return (BOOLEAN)(mFwCfgSelectorAddress !=3D 0 && mFwCfgDataAddre=
ss !=3D 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 =3D gBS->LocateProtocol (
-                  &gFdtClientProtocolGuid,
-                  NULL,
-                  (VOID **)&FdtClient
-                  );
-  ASSERT_EFI_ERROR (Status);
-
-  Status =3D 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 =3D=3D %=
r)\n",
-      __func__,
-      Status
-      ));
-    return EFI_SUCCESS;
-  }
-
-  ASSERT (AddressCells =3D=3D 2);
-  ASSERT (SizeCells =3D=3D 2);
-  ASSERT (RegSize =3D=3D 2 * sizeof (UINT64));
-
-  FwCfgDataAddress     =3D SwapBytes64 (Reg[0]);
-  FwCfgDataSize        =3D 8;
-  FwCfgSelectorAddress =3D FwCfgDataAddress + FwCfgDataSize;
-  FwCfgSelectorSize    =3D 2;
-
-  //
-  // The following ASSERT()s express
-  //
-  //   Address + Size - 1 <=3D 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 <=3D MAX_UINTN - FwCfgSelectorSize + 1);
-  ASSERT (FwCfgDataAddress     <=3D MAX_UINTN - FwCfgDataSize     + 1);
-
-  mFwCfgSelectorAddress =3D FwCfgSelectorAddress;
-  mFwCfgDataAddress     =3D FwCfgDataAddress;
-
-  DEBUG ((
-    DEBUG_INFO,
-    "Found FwCfg @ 0x%Lx/0x%Lx\n",
-    FwCfgSelectorAddress,
-    FwCfgDataAddress
-    ));
-
-  if (SwapBytes64 (Reg[1]) >=3D 0x18) {
-    FwCfgDmaAddress =3D FwCfgDataAddress + 0x10;
-    FwCfgDmaSize    =3D 0x08;
-
-    //
-    // See explanation above.
-    //
-    ASSERT (FwCfgDmaAddress <=3D MAX_UINTN - FwCfgDmaSize + 1);
-
-    DEBUG ((DEBUG_INFO, "Found FwCfg DMA @ 0x%Lx\n", FwCfgDmaAddress));
-  } else {
-    FwCfgDmaAddress =3D 0;
-  }
-
-  if (QemuFwCfgIsAvailable ()) {
-    UINT32  Signature;
-
-    QemuFwCfgSelectItem (QemuFwCfgItemSignature);
-    Signature =3D QemuFwCfgRead32 ();
-    if (Signature =3D=3D SIGNATURE_32 ('Q', 'E', 'M', 'U')) {
-      //
-      // For DMA support, we require the DTB to advertise the register, an=
d the
-      // feature bitmap (which we read without DMA) to confirm the feature=
.
-      //
-      if (FwCfgDmaAddress !=3D 0) {
-        UINT32  Features;
-
-        QemuFwCfgSelectItem (QemuFwCfgItemInterfaceVersion);
-        Features =3D QemuFwCfgRead32 ();
-        if ((Features & FW_CFG_F_DMA) !=3D 0) {
-          mFwCfgDmaAddress            =3D FwCfgDmaAddress;
-          InternalQemuFwCfgReadBytes  =3D DmaReadBytes;
-          InternalQemuFwCfgWriteBytes =3D DmaWriteBytes;
-          InternalQemuFwCfgSkipBytes  =3D DmaSkipBytes;
-        }
-      }
-    } else {
-      mFwCfgSelectorAddress =3D 0;
-      mFwCfgDataAddress     =3D 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 (MD=
E_CPU_LOONGARCH64)
   Left =3D Size & 7;
  #else
   Left =3D Size & 3;
@@ -262,7 +84,7 @@ MmioReadBytes (
   Ptr   =3D Buffer;
   End   =3D Ptr + Size;

- #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64)
+ #if defined (MDE_CPU_AARCH64) || defined (MDE_CPU_RISCV64) || defined (MD=
E_CPU_LOONGARCH64)
   while (Ptr < End) {
     *(UINT64 *)Ptr =3D MmioRead64 (mFwCfgDataAddress);
     Ptr           +=3D 8;
@@ -306,7 +128,6 @@ MmioReadBytes (
                           FW_CFG_DMA_CTL_READ  - read from fw_cfg into Buf=
fer.
                           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 (MD=
E_CPU_LOONGARCH64)
   MmioWrite64 (mFwCfgDmaAddress, SwapBytes64 ((UINT64)&Access));
  #else
   MmioWrite32 ((UINT32)(mFwCfgDmaAddress + 4), SwapBytes32 ((UINT32)&A=
ccess));
@@ -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/Li=
brary/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.<B=
R>
+#  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           =3D ARM AARCH64 RISCV64
+#  VALID_ARCHITECTURES           =3D ARM AARCH64 RISCV64 LOONGARCH64
 #

 [Sources]
   QemuFwCfgLibMmio.c
+  QemuFwCfgMmioDxe.c

 [Packages]
   MdePkg/MdePkg.dec
diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibMmioInternal.h b/Ovmf=
Pkg/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 OvmfPk=
g.
+
+  Copyright (C) 2016, Red Hat, Inc.
+  Copyright (C) 2017, Advanced Micro Devices. All rights reserved
+  Copyright (c) 2024 Loongson Technology Corporation Limited. All rights r=
eserved.<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. Ign=
ored,
+                          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 Buff=
er.
+                          FW_CFG_DMA_CTL_READ  - read from fw_cfg into Buf=
fer.
+                          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/Libr=
ary/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 r=
eserved.<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  =3D MmioReadBytes;
+WRITE_BYTES_FUNCTION  *InternalQemuFwCfgWriteBytes =3D MmioWriteBytes;
+SKIP_BYTES_FUNCTION   *InternalQemuFwCfgSkipBytes  =3D 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 =3D gBS->LocateProtocol (
+                  &gFdtClientProtocolGuid,
+                  NULL,
+                  (VOID **)&FdtClient
+                  );
+  ASSERT_EFI_ERROR (Status);
+
+  Status =3D 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 =3D=3D %=
r)\n",
+      __func__,
+      Status
+      ));
+    return EFI_SUCCESS;
+  }
+
+  ASSERT (AddressCells =3D=3D 2);
+  ASSERT (SizeCells =3D=3D 2);
+  ASSERT (RegSize =3D=3D 2 * sizeof (UINT64));
+
+  FwCfgDataAddress     =3D SwapBytes64 (Reg[0]);
+  FwCfgDataSize        =3D 8;
+  FwCfgSelectorAddress =3D FwCfgDataAddress + FwCfgDataSize;
+  FwCfgSelectorSize    =3D 2;
+
+  //
+  // The following ASSERT()s express
+  //
+  //   Address + Size - 1 <=3D 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 <=3D MAX_UINTN - FwCfgSelectorSize + 1);
+  ASSERT (FwCfgDataAddress     <=3D MAX_UINTN - FwCfgDataSize     + 1);
+
+  mFwCfgSelectorAddress =3D FwCfgSelectorAddress;
+  mFwCfgDataAddress     =3D FwCfgDataAddress;
+
+  DEBUG ((
+    DEBUG_INFO,
+    "Found FwCfg @ 0x%Lx/0x%Lx\n",
+    FwCfgSelectorAddress,
+    FwCfgDataAddress
+    ));
+
+  if (SwapBytes64 (Reg[1]) >=3D 0x18) {
+    FwCfgDmaAddress =3D FwCfgDataAddress + 0x10;
+    FwCfgDmaSize    =3D 0x08;
+
+    //
+    // See explanation above.
+    //
+    ASSERT (FwCfgDmaAddress <=3D MAX_UINTN - FwCfgDmaSize + 1);
+
+    DEBUG ((DEBUG_INFO, "Found FwCfg DMA @ 0x%Lx\n", FwCfgDmaAddress));
+  } else {
+    FwCfgDmaAddress =3D 0;
+  }
+
+  if (QemuFwCfgIsAvailable ()) {
+    UINT32  Signature;
+
+    QemuFwCfgSelectItem (QemuFwCfgItemSignature);
+    Signature =3D QemuFwCfgRead32 ();
+    if (Signature =3D=3D SIGNATURE_32 ('Q', 'E', 'M', 'U')) {
+      //
+      // For DMA support, we require the DTB to advertise the register, an=
d the
+      // feature bitmap (which we read without DMA) to confirm the feature=
.
+      //
+      if (FwCfgDmaAddress !=3D 0) {
+        UINT32  Features;
+
+        QemuFwCfgSelectItem (QemuFwCfgItemInterfaceVersion);
+        Features =3D QemuFwCfgRead32 ();
+        if ((Features & FW_CFG_F_DMA) !=3D 0) {
+          mFwCfgDmaAddress            =3D FwCfgDmaAddress;
+          InternalQemuFwCfgReadBytes  =3D DmaReadBytes;
+          InternalQemuFwCfgWriteBytes =3D DmaWriteBytes;
+          InternalQemuFwCfgSkipBytes  =3D DmaSkipBytes;
+        }
+      }
+    } else {
+      mFwCfgSelectorAddress =3D 0;
+      mFwCfgDataAddress     =3D 0;
+    }
+  }
+
+  return RETURN_SUCCESS;
+}
--
2.27.0




_._,_._,_

Groups.io Links:

=20 You receive all messages sent to this group. =20 =20

View/Reply Online (#118306) | =20 | Mute= This Topic | New Topic
Your Subscriptio= n | Contact Group Owner | Unsubscribe [rebecca@openfw.io]

_._,_._,_
--------------kgeHXvu0SFMoy9qndCoquBwD--