From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id 159F1740077 for ; Thu, 23 Nov 2023 15:02:44 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=wsMoUffeCQrYlRDOSXo0UztbDfSpqDyTEG0r++LezDs=; 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:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Transfer-Encoding:Content-Type; s=20140610; t=1700751763; v=1; b=NZcWg3pN8ZHzrJ8UJ44t8PMM7qPgPdRm1pocp6KpcFSeLoGzTf50Gah8Cimw3fw0NjZQALcm +8GPen+0CT7BL+SvdfcYVUEkfcXAd7R5j6V/qUIWVo4OEvFB/EBa8ZcsqzeADCajoXt2nshOW67 9+8yUMabDvmrtIdPLKV/6G7g= X-Received: by 127.0.0.2 with SMTP id F17LYY7687511xKOCdaZI5Yr; Thu, 23 Nov 2023 07:02:43 -0800 X-Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mx.groups.io with SMTP id smtpd.web11.93011.1700751762887294860 for ; Thu, 23 Nov 2023 07:02:43 -0800 X-Received: from mimecast-mx02.redhat.com (mx-ext.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-487-6K5covE4MOW4CvDzlMJFfQ-1; Thu, 23 Nov 2023 10:02:40 -0500 X-MC-Unique: 6K5covE4MOW4CvDzlMJFfQ-1 X-Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.rdu2.redhat.com [10.11.54.5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 929332825E9B for ; Thu, 23 Nov 2023 15:02:40 +0000 (UTC) X-Received: from sirius.home.kraxel.org (unknown [10.39.193.187]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 3467910E45; Thu, 23 Nov 2023 15:02:40 +0000 (UTC) X-Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id E54171800DE0; Thu, 23 Nov 2023 16:02:34 +0100 (CET) From: "Gerd Hoffmann" To: devel@edk2.groups.io Cc: Oliver Steffen , =?UTF-8?q?L=C3=A1szl=C3=B3=20=C3=89rsek?= , Gerd Hoffmann Subject: [edk2-devel] [PATCH 6/7] OvmfPkg/VirtMmCommunicationDxe: add arm support Date: Thu, 23 Nov 2023 16:02:33 +0100 Message-ID: <20231123150234.117835-7-kraxel@redhat.com> In-Reply-To: <20231123150234.117835-1-kraxel@redhat.com> References: <20231123150234.117835-1-kraxel@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.4.1 on 10.11.54.5 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com 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 Reply-To: devel@edk2.groups.io,kraxel@redhat.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: taBfZsjWhgZiEuuh4QLPPwlyx7686176AA= Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=NZcWg3pN; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=redhat.com (policy=none); spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io Add support for arm. Lookup the "qemu-uefi-vars" device in the device tree, talk to it via mmio, otherwise identical to the x64 variant. Signed-off-by: Gerd Hoffmann --- .../VirtMmCommunication.inf | 15 ++ OvmfPkg/VirtMmCommunicationDxe/QemuFdt.c | 208 ++++++++++++++++++ 2 files changed, 223 insertions(+) create mode 100644 OvmfPkg/VirtMmCommunicationDxe/QemuFdt.c diff --git a/OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.inf b/OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.inf index 08fadefa5275..48184207d909 100644 --- a/OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.inf +++ b/OvmfPkg/VirtMmCommunicationDxe/VirtMmCommunication.inf @@ -20,11 +20,17 @@ [Sources] [Sources.X64] QemuX64.c +[Sources.AARCH64, Sources.ARM] + QemuFdt.c + [Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec OvmfPkg/OvmfPkg.dec +[Packages.AARCH64, Packages.ARM] + EmbeddedPkg/EmbeddedPkg.dec + [LibraryClasses] BaseMemoryLib DebugLib @@ -33,6 +39,9 @@ [LibraryClasses] MemoryAllocationLib UefiDriverEntryPoint +[LibraryClasses.AARCH64, LibraryClasses.ARM] + FdtLib + [FeaturePcd] gEfiMdeModulePkgTokenSpaceGuid.PcdEnableVariableRuntimeCache ## CONSUMES gEfiMdeModulePkgTokenSpaceGuid.PcdVariableCollectStatistics ## CONSUMES @@ -42,6 +51,9 @@ [Protocols] gEfiMmCommunication2ProtocolGuid ## PRODUCES gEfiSmmVariableProtocolGuid ## PRODUCES +[Protocols.AARCH64, Protocols.ARM] + gFdtClientProtocolGuid + [Guids] gEfiEndOfDxeEventGroupGuid gEfiEventExitBootServicesGuid @@ -50,3 +62,6 @@ [Guids] [Depex] gEfiCpuArchProtocolGuid + +[Depex.AARCH64, Depex.ARM] + gFdtClientProtocolGuid diff --git a/OvmfPkg/VirtMmCommunicationDxe/QemuFdt.c b/OvmfPkg/VirtMmCommunicationDxe/QemuFdt.c new file mode 100644 index 000000000000..ae42d9671bea --- /dev/null +++ b/OvmfPkg/VirtMmCommunicationDxe/QemuFdt.c @@ -0,0 +1,208 @@ +/** @file + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include "VirtMmCommunication.h" + +STATIC UINT64 mUefiVarsAddr; + +STATIC +EFI_STATUS +EFIAPI +VirtMmHwFind ( + VOID + ) +{ + FDT_CLIENT_PROTOCOL *FdtClient; + EFI_STATUS Status; + CONST UINT64 *Reg; + UINT32 RegSize; + UINTN AddressCells, SizeCells; + + Status = gBS->LocateProtocol ( + &gFdtClientProtocolGuid, + NULL, + (VOID **)&FdtClient + ); + ASSERT_EFI_ERROR (Status); + + Status = FdtClient->FindCompatibleNodeReg ( + FdtClient, + UEFI_VARS_FDT_COMPAT, + (CONST VOID **)&Reg, + &AddressCells, + &SizeCells, + &RegSize + ); + + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: node compatible=%a not found (%r)\n", + __func__, + UEFI_VARS_FDT_NODE, + Status + )); + return EFI_NOT_FOUND; + } + + ASSERT (AddressCells == 2); + ASSERT (SizeCells == 2); + ASSERT (RegSize == 2 * sizeof (UINT64)); + + mUefiVarsAddr = SwapBytes64 (Reg[0]); + DEBUG ((DEBUG_VERBOSE, "%a: address: 0x%lx\n", __func__, mUefiVarsAddr)); + + return RETURN_SUCCESS; +} + +STATIC +EFI_STATUS +VirtMmHwMemAttr ( + ) +{ + EFI_STATUS Status; + + Status = gDS->AddMemorySpace ( + EfiGcdMemoryTypeMemoryMappedIo, + mUefiVarsAddr, + EFI_PAGE_SIZE, + EFI_MEMORY_UC | EFI_MEMORY_RUNTIME + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: AddMemorySpace failed: %r\n", __func__, Status)); + return RETURN_UNSUPPORTED; + } + + Status = gDS->SetMemorySpaceAttributes ( + mUefiVarsAddr, + EFI_PAGE_SIZE, + EFI_MEMORY_UC | EFI_MEMORY_RUNTIME + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: SetMemorySpaceAttributes failed: %r\n", __func__, Status)); + return RETURN_UNSUPPORTED; + } + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +EFIAPI +VirtMmHwCommand ( + UINT32 Cmd + ) +{ + UINT32 Count; + UINT32 Sts; + + MmioWrite16 (mUefiVarsAddr + UEFI_VARS_REG_CMD_STS, Cmd); + for (Count = 0; Count < 100; Count++) { + Sts = MmioRead16 (mUefiVarsAddr + UEFI_VARS_REG_CMD_STS); + DEBUG ((DEBUG_VERBOSE, "%a: Sts: 0x%x\n", __func__, Sts)); + switch (Sts) { + case UEFI_VARS_STS_SUCCESS: + return RETURN_SUCCESS; + case UEFI_VARS_STS_BUSY: + CpuPause (); + break; + case UEFI_VARS_STS_ERR_NOT_SUPPORTED: + return RETURN_UNSUPPORTED; + case UEFI_VARS_STS_ERR_BAD_BUFFER_SIZE: + return RETURN_BAD_BUFFER_SIZE; + default: + return RETURN_DEVICE_ERROR; + } + } + + return RETURN_TIMEOUT; +} + +EFI_STATUS +EFIAPI +VirtMmHwInit ( + VOID + ) +{ + UINT32 Magic, AddrLo, AddrHi; + EFI_STATUS Status; + + Status = VirtMmHwFind (); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: VirtMmHwFind() failed: %d\n", __func__, Status)); + return Status; + } + + VirtMmHwMemAttr (); + + Magic = MmioRead16 (mUefiVarsAddr + UEFI_VARS_REG_MAGIC); + if (Magic != UEFI_VARS_MAGIC_VALUE) { + DEBUG (( + DEBUG_ERROR, + "%a: Magic value mismatch (0x%x != 0x%x)\n", + __func__, + Magic, + UEFI_VARS_MAGIC_VALUE + )); + return RETURN_DEVICE_ERROR; + } + + DEBUG ((DEBUG_INFO, "%a: Magic 0x%x, good\n", __func__, Magic)); + + Status = VirtMmHwCommand (UEFI_VARS_CMD_RESET); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "%a: Reset failed: %d\n", __func__, Status)); + return Status; + } + + AddrLo = (UINT32)mCommunicateBufferPhys; + AddrHi = (UINT32)RShiftU64 (mCommunicateBufferPhys, 32); + MmioWrite32 (mUefiVarsAddr + UEFI_VARS_REG_BUFFER_ADDR_LO, AddrLo); + MmioWrite32 (mUefiVarsAddr + UEFI_VARS_REG_BUFFER_ADDR_HI, AddrHi); + MmioWrite32 (mUefiVarsAddr + UEFI_VARS_REG_BUFFER_SIZE, MAX_BUFFER_SIZE); + + return RETURN_SUCCESS; +} + +EFI_STATUS +EFIAPI +VirtMmHwVirtMap ( + VOID + ) +{ + EFI_STATUS Status; + + DEBUG ((DEBUG_VERBOSE, "%a: << %lx\n", __func__, mUefiVarsAddr)); + Status = gRT->ConvertPointer (EFI_OPTIONAL_PTR, (VOID **)&mUefiVarsAddr); + DEBUG ((DEBUG_VERBOSE, "%a: >> %lx\n", __func__, mUefiVarsAddr)); + + return Status; +} + +EFI_STATUS +EFIAPI +VirtMmHwComm ( + VOID + ) +{ + EFI_STATUS Status; + + Status = VirtMmHwCommand (UEFI_VARS_CMD_MM); + DEBUG ((DEBUG_VERBOSE, "%a: Status: %r\n", __func__, Status)); + + return Status; +} -- 2.42.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#111681): https://edk2.groups.io/g/devel/message/111681 Mute This Topic: https://groups.io/mt/102767939/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-