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 6D4A9740034 for ; Fri, 26 Apr 2024 08:29:31 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=GTlC2XoP3NDHy9oKeWxUnr3UeEroMonpwyE2W3q5NVE=; 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=1714120170; v=1; b=ZX59hCrRcYXl7Xc4fdyjcZV8oKDzQBRHBxwZLtFOFeK8WQuFUsFoVs7XFtRD7mqbP6R2T8XS R8OtAnY7R2nTu/swrW08FJ01K79gcQPYVU8L2n5Km3dBXxhSbyiBJn3cwRekRMLx+GMAviRVzkH i31shuRTuSdfNXwLXcRERHZlJkueTor1pgNxd+08KYiqMhTylbbxGJJnE9ZVWRArBzFn1eI+XTN /C+jFwSkYhrCCT18HM7xyzGZXKQTBnjG8onybuZyTR0iuOZCac5UTt+wYagLRa8rqY2Jrcf49ur kXnj7me81GK/ncJ0y2ICbe3evTwjm68pkMqpFpU5ODfdA== X-Received: by 127.0.0.2 with SMTP id w1NrYY7687511xnL2Hz9SriB; Fri, 26 Apr 2024 01:29:30 -0700 X-Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by mx.groups.io with SMTP id smtpd.web11.9140.1714120168738410956 for ; Fri, 26 Apr 2024 01:29:29 -0700 X-Received: from loongson.cn (unknown [10.2.9.245]) by gateway (Coremail) with SMTP id _____8Dx2enlZStmRl8DAA--.1783S3; Fri, 26 Apr 2024 16:29:25 +0800 (CST) X-Received: from code-server.gen (unknown [10.2.9.245]) by localhost.localdomain (Coremail) with SMTP id AQAAf8Bxut3hZStmVhYGAA--.19595S2; Fri, 26 Apr 2024 16:29:21 +0800 (CST) From: "Chao Li" To: devel@edk2.groups.io Cc: Ard Biesheuvel , Jiewen Yao , Gerd Hoffmann , Xianglai Li Subject: [edk2-devel] [PATCH v4 4/8] OvmfPkg: Add the QemuFwCfgMmioLib PEI stage version Date: Fri, 26 Apr 2024 16:29:20 +0800 Message-Id: <20240426082920.68922-1-lichao@loongson.cn> In-Reply-To: <20240426082827.68489-1-lichao@loongson.cn> References: <20240426082827.68489-1-lichao@loongson.cn> MIME-Version: 1.0 X-CM-TRANSID: AQAAf8Bxut3hZStmVhYGAA--.19595S2 X-CM-SenderInfo: xolfxt3r6o00pqjv00gofq/1tbiAQATCGYrFhMEPwAFss 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: Fri, 26 Apr 2024 01:29:29 -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: 8r4lriF9XUysachVQfwMx6bKx7686176AA= 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=ZX59hCrR; 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 | 235 ++++++++++++++++++ .../QemuFwCfgLib/QemuFwCfgMmioPeiLib.inf | 52 ++++ 2 files changed, 287 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..055148de8e --- /dev/null +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioPei.c @@ -0,0 +1,235 @@ +/** @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; + 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; + + 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)) { + UINT32 Signature; + + // + // Select Item Signature + // + MmioWrite16 (FwCfgSelectorAddress, SwapBytes16 ((UINT16)QemuFwCfgItemSignature)); + + // + // Readout the Signature. + // + Signature = MmioRead32 (FwCfgDataAddress); + + if (Signature != SIGNATURE_32 ('Q', 'E', 'M', 'U')) { + FwCfgResource->FwCfgDataAddress = 0; + FwCfgResource->FwCfgSelectorAddress = 0; + FwCfgResource->FwCfgDmaAddress = 0; + QemuBuildFwCfgResourceHob (FwCfgResource); + } + + // + // Build the firmware configure resource HOB. + // + 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..a3dc9a03da --- /dev/null +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgMmioPeiLib.inf @@ -0,0 +1,52 @@ +## @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 + +[Guids] + gQemuFirmwareResourceHobGuid -- 2.27.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#118315): https://edk2.groups.io/g/devel/message/118315 Mute This Topic: https://groups.io/mt/105746793/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-