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 429709418EE for ; Thu, 25 Apr 2024 12:13:17 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=dhlfpnHybj329To0FKMXfKQ17135a3itV1iGIqhev7w=; 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=1714047195; v=1; b=jujlfbLgi+Xo3tpo8c9qWVgat6Hsi/pbs+97+f907xSbPULtZUeCd3oFzh9gIgUvQfurWrHL KlhwM6jy8Olilm/8OXJXCmnJ7TlKNJBkvcn6BI1FKWcEGtyicy5gV6CRpdGpKPNyg4FGCX3u5bu 1FUTXGvIkD41uEdJFmRCHIWQrKUBw3W/DbOlPi8jkdlXtFPghEBd+4xJxFFQ+3G8ZMpqKAjAuSb /nAFp8kMHfxrKoiee/Cg1wypBBRqlE8yVYMxz8kT0VYAU9ijrOiQmLuZAVXJW4vz8SBpNj9C0aO 1swB4cokfA7y1L43PN/ZS+RX7eGL+vrSG+EyvBITB9EgA== X-Received: by 127.0.0.2 with SMTP id dDAKYY7687511x3Ghpvov2tI; Thu, 25 Apr 2024 05:13:15 -0700 X-Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by mx.groups.io with SMTP id smtpd.web11.15322.1714047193890015281 for ; Thu, 25 Apr 2024 05:13:15 -0700 X-Received: from loongson.cn (unknown [10.2.9.245]) by gateway (Coremail) with SMTP id _____8Dx2enXSCpm98oCAA--.735S3; Thu, 25 Apr 2024 20:13:11 +0800 (CST) X-Received: from code-server.gen (unknown [10.2.9.245]) by localhost.localdomain (Coremail) with SMTP id AQAAf8CxrlfWSCpmtg0FAA--.12936S2; Thu, 25 Apr 2024 20:13:10 +0800 (CST) From: "Chao Li" To: devel@edk2.groups.io Cc: Ard Biesheuvel , Jiewen Yao , Gerd Hoffmann , Xianglai Li Subject: [edk2-devel] [PATCH v3 3/7] OvmfPkg: Add the QemuFwCfgMmioLib PEI stage version Date: Thu, 25 Apr 2024 20:13:09 +0800 Message-Id: <20240425121309.3010290-1-lichao@loongson.cn> In-Reply-To: <20240425121232.3009016-1-lichao@loongson.cn> References: <20240425121232.3009016-1-lichao@loongson.cn> MIME-Version: 1.0 X-CM-TRANSID: AQAAf8CxrlfWSCpmtg0FAA--.12936S2 X-CM-SenderInfo: xolfxt3r6o00pqjv00gofq/1tbiAQASCGYpxJMJoQAFsu 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 05:13:15 -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: DEszdifv8otRvow7Lv0KIWuxx7686176AA= 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=jujlfbLg; 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 | 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.
+ (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 "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.
+# 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 + +# +# 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] -=-=-=-=-=-=-=-=-=-=-=-