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 49181AC0C73 for ; Tue, 30 Apr 2024 07:48:22 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=nhSbGaGOcYjIPD9vOmXzHegRbbyDUmveeT4306v8mNA=; c=relaxed/simple; d=groups.io; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Resent-Date:Resent-From:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Transfer-Encoding; s=20240206; t=1714463301; v=1; b=NIfYIGCNvN0GiGL27tZFcPpUTU0ZpPcPLCdIAF1XmImq64tVqZZ5VFe2bNZxGj3Bo1/jmvVJ HlwKr7yR5R1+MCvdAWaUDgnsQ7erjPS7cozGwK9azfDBiP3b9yaw75jK79JI74fP7MUc4jDnACE t38tgGV4+K7bbUnGZc5WcrO0jfUD+RXTAO8BXnxk4FNVW8biJHmHGTxZf3v4T1HTg1syvh5nBJU UryAVbap9KlIBu7hXkqH4KmUkeCuMXHL6lShtDcJ31PeqpHeitHwv9WVeYzT8oTqzbVSh41TLWc abasdGb6FmWCA9O8Hv0QI0Qlt7ynttLZOwpLLac9H97uQ== X-Received: by 127.0.0.2 with SMTP id NRvrYY7687511xVbthNMhzt4; Tue, 30 Apr 2024 00:48:21 -0700 X-Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by mx.groups.io with SMTP id smtpd.web11.9766.1714463299922064521 for ; Tue, 30 Apr 2024 00:48:20 -0700 X-Received: from loongson.cn (unknown [10.2.9.245]) by gateway (Coremail) with SMTP id _____8AxY+pBojBmkVIFAA--.5474S3; Tue, 30 Apr 2024 15:48:17 +0800 (CST) X-Received: from code-server.gen (unknown [10.2.9.245]) by localhost.localdomain (Coremail) with SMTP id AQAAf8CxpFY+ojBmLfEKAA--.9489S2; Tue, 30 Apr 2024 15:48:15 +0800 (CST) From: "Chao Li" To: devel@edk2.groups.io Cc: Ard Biesheuvel , Jiewen Yao , Gerd Hoffmann , Xianglai Li Subject: [edk2-devel] [PATCH v5 4/8] OvmfPkg: Add the QemuFwCfgMmioLib PEI stage version Date: Tue, 30 Apr 2024 15:48:14 +0800 Message-Id: <20240430074814.664535-1-lichao@loongson.cn> In-Reply-To: <20240430074720.649353-1-lichao@loongson.cn> References: <20240430074720.649353-1-lichao@loongson.cn> MIME-Version: 1.0 X-CM-TRANSID: AQAAf8CxpFY+ojBmLfEKAA--.9489S2 X-CM-SenderInfo: xolfxt3r6o00pqjv00gofq/1tbiAQADCGYwXBMCVgANsK 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: Tue, 30 Apr 2024 00:48:20 -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: jHiYkk7SSOZm1cCb9jwV7PVqx7686176AA= Content-Transfer-Encoding: 8bit X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20240206 header.b=NIfYIGCN; 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 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 Cc: Jiewen Yao Cc: Gerd Hoffmann Co-authored-by: Xianglai Li Signed-off-by: Chao Li --- .../Library/QemuFwCfgLib/QemuFwCfgMmioPei.c | 236 ++++++++++++++++++ .../QemuFwCfgLib/QemuFwCfgMmioPeiLib.inf | 45 ++++ 2 files changed, 281 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..6f35fb4304 --- /dev/null +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioPei.c @@ -0,0 +1,236 @@ +/** @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 rights reserved.
+ + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include + +#include +#include +#include +#include +#include + +#include + +#include "QemuFwCfgLibMmioInternal.h" + +/** + 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; + UINT32 Signature; + 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; + + // + // 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 + // + FwCfgResource = AllocateZeroPool (sizeof (QEMU_FW_CFG_RESOURCE)); + ASSERT (FwCfgResource != NULL); + + 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 != NULL) && + (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; + + 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)); + FwCfgResource->FwCfgDmaAddress = FwCfgDmaAddress; + } else { + FwCfgDmaAddress = 0; + } + + if ((FwCfgSelectorAddress != 0) && (FwCfgDataAddress != 0)) { + // + // Select Item Signature + // + MmioWrite16 (FwCfgSelectorAddress, SwapBytes16 ((UINT16)QemuFwCfgItemSignature)); + + // + // Readout the Signature. + // + Signature = MmioRead32 (FwCfgDataAddress); + + if (Signature == SIGNATURE_32 ('Q', 'E', 'M', 'U')) { + // + // Build the firmware configure resource HOB. + // + QemuBuildFwCfgResourceHob (FwCfgResource); + } else { + FwCfgResource->FwCfgDataAddress = 0; + FwCfgResource->FwCfgSelectorAddress = 0; + FwCfgResource->FwCfgDmaAddress = 0; + + DEBUG (( + DEBUG_ERROR, + "%a: Signature dose not match QEMU!\n", + __func__ + )); + break; + } + } + + 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..b91f106c86 --- /dev/null +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioPeiLib.inf @@ -0,0 +1,45 @@ +## @file +# +# Stateful, implicitly initialized fw_cfg library. +# +# Copyright (C) 2013 - 2014, Red Hat, Inc. +# Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.
+# Copyright (c) 2024 Loongson Technology Corporation Limited. All rights reserved.
+# +# 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 + +[Sources] + QemuFwCfgLibMmio.c + QemuFwCfgMmioPei.c + +[Packages] + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + OvmfPkg/OvmfPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + HobLib + IoLib + MemoryAllocationLib + PcdLib + +[Pcd] + gUefiOvmfPkgTokenSpaceGuid.PcdDeviceTreeInitialBaseAddress + +[Guids] + gQemuFirmwareResourceHobGuid -- 2.27.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118426): https://edk2.groups.io/g/devel/message/118426 Mute This Topic: https://groups.io/mt/105816970/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-