From patchwork Thu Nov 27 23:19:16 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laszlo Ersek X-Patchwork-Id: 415735 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 9F32C1401DC for ; Fri, 28 Nov 2014 10:23:09 +1100 (AEDT) Received: from localhost ([::1]:41862 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xu8Ow-0000ZB-On for incoming@patchwork.ozlabs.org; Thu, 27 Nov 2014 18:23:06 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:41433) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xu8Lp-0003nR-LH for qemu-devel@nongnu.org; Thu, 27 Nov 2014 18:19:59 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xu8Lj-00075h-Gc for qemu-devel@nongnu.org; Thu, 27 Nov 2014 18:19:53 -0500 Received: from mx1.redhat.com ([209.132.183.28]:37342) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xu8Lj-00075Z-9m for qemu-devel@nongnu.org; Thu, 27 Nov 2014 18:19:47 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id sARNJcxw001712 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Thu, 27 Nov 2014 18:19:38 -0500 Received: from lacos-laptop-7.usersys.redhat.com (ovpn-116-24.ams2.redhat.com [10.36.116.24]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id sARNJUAD030338; Thu, 27 Nov 2014 18:19:35 -0500 From: Laszlo Ersek To: qemu-devel@nongnu.org, edk2-devel@lists.sourceforge.net, drjones@redhat.com, ard.biesheuvel@linaro.org, peter.maydell@linaro.org, imammedo@redhat.com, mst@redhat.com Date: Fri, 28 Nov 2014 00:19:16 +0100 Message-Id: <1417130367-17777-2-git-send-email-lersek@redhat.com> In-Reply-To: <1417130367-17777-1-git-send-email-lersek@redhat.com> References: <5477B0FD.9040806@redhat.com> <1417130367-17777-1-git-send-email-lersek@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [edk2 PATCH 01/12] ArmVirtualizationPkg: VirtFdtDxe: forward FwCfg addresses from DTB to PCDs X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Qemu's firmware configuration interface consists of two MMIO registers, a 16-bit selector and an 8-bit data register. Parse their addresses and verify their sizes from the DTB, and expose them to the rest of DXE by storing them in dynamic PCDs. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek --- ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.inf | 2 ++ ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.c | 26 ++++++++++++++++++++++++++ ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec | 3 +++ ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc | 3 +++ 4 files changed, 34 insertions(+) diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.inf b/ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.inf index 1c9dd20..daafe6c 100644 --- a/ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.inf +++ b/ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.inf @@ -47,6 +47,8 @@ [Pcd] gArmVirtualizationTokenSpaceGuid.PcdDeviceTreeBaseAddress gArmVirtualizationTokenSpaceGuid.PcdArmPsciMethod + gArmVirtualizationTokenSpaceGuid.PcdFwCfgSelectorAddress + gArmVirtualizationTokenSpaceGuid.PcdFwCfgDataAddress gArmTokenSpaceGuid.PcdGicDistributorBase gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase gArmTokenSpaceGuid.PcdArmArchTimerSecIntrNum diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.c b/ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.c index d002e66..f1b5283 100644 --- a/ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.c +++ b/ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.c @@ -44,6 +44,7 @@ typedef enum { PropertyTypeUart, PropertyTypeTimer, PropertyTypePsci, + PropertyTypeFwCfg, } PROPERTY_TYPE; typedef struct { @@ -59,6 +60,7 @@ STATIC CONST PROPERTY CompatibleProperties[] = { { PropertyTypeTimer, "arm,armv7-timer" }, { PropertyTypeTimer, "arm,armv8-timer" }, { PropertyTypePsci, "arm,psci-0.2" }, + { PropertyTypeFwCfg, "fw-cfg,mmio" }, { PropertyTypeUnknown, "" } }; @@ -115,6 +117,10 @@ InitializeVirtFdtDxe ( CONST INTERRUPT_PROPERTY *InterruptProp; INT32 SecIntrNum, IntrNum, VirtIntrNum, HypIntrNum; CONST CHAR8 *PsciMethod; + UINT64 FwCfgSelectorAddress; + UINT64 FwCfgSelectorSize; + UINT64 FwCfgDataAddress; + UINT64 FwCfgDataSize; DeviceTreeBase = (VOID *)(UINTN)PcdGet64 (PcdDeviceTreeBaseAddress); ASSERT (DeviceTreeBase != NULL); @@ -160,6 +166,26 @@ InitializeVirtFdtDxe ( (PropType == PropertyTypePsci)); switch (PropType) { + case PropertyTypeFwCfg: + ASSERT (Len == 4 * sizeof (UINT64)); + + FwCfgSelectorAddress = fdt64_to_cpu (((UINT64 *)RegProp)[0]); + FwCfgSelectorSize = fdt64_to_cpu (((UINT64 *)RegProp)[1]); + FwCfgDataAddress = fdt64_to_cpu (((UINT64 *)RegProp)[2]); + FwCfgDataSize = fdt64_to_cpu (((UINT64 *)RegProp)[3]); + + ASSERT (FwCfgSelectorSize == 2); + ASSERT (FwCfgDataSize == 1); + ASSERT (FwCfgSelectorAddress <= MAX_UINTN - FwCfgSelectorSize + 1); + ASSERT (FwCfgDataAddress <= MAX_UINTN - FwCfgDataSize + 1); + + PcdSet64 (PcdFwCfgSelectorAddress, FwCfgSelectorAddress); + PcdSet64 (PcdFwCfgDataAddress, FwCfgDataAddress); + + DEBUG ((EFI_D_INFO, "Found FwCfg @ 0x%Lx/0x%Lx\n", FwCfgSelectorAddress, + FwCfgDataAddress)); + break; + case PropertyTypeVirtio: ASSERT (Len == 16); // diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec index b581add..9941154 100644 --- a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec +++ b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec @@ -53,3 +53,6 @@ # PcdArmPsciMethod == 2 : use SMC # gArmVirtualizationTokenSpaceGuid.PcdArmPsciMethod|0|UINT32|0x00000003 + + gArmVirtualizationTokenSpaceGuid.PcdFwCfgSelectorAddress|0x0|UINT64|0x00000004 + gArmVirtualizationTokenSpaceGuid.PcdFwCfgDataAddress|0x0|UINT64|0x00000005 diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc index 61689b7..1f3ddea 100644 --- a/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc +++ b/ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc @@ -173,6 +173,9 @@ gArmVirtualizationTokenSpaceGuid.PcdArmPsciMethod|0 + gArmVirtualizationTokenSpaceGuid.PcdFwCfgSelectorAddress|0x0 + gArmVirtualizationTokenSpaceGuid.PcdFwCfgDataAddress|0x0 + ################################################################################ # # Components Section - list of all EDK II Modules needed by this Platform