From patchwork Wed Aug 27 15:12:51 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 36107 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-ob0-f200.google.com (mail-ob0-f200.google.com [209.85.214.200]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 4CF122054F for ; Wed, 27 Aug 2014 15:14:12 +0000 (UTC) Received: by mail-ob0-f200.google.com with SMTP id va2sf1394309obc.11 for ; Wed, 27 Aug 2014 08:14:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:date:message-id:in-reply-to :references:subject:precedence:reply-to:list-id:list-unsubscribe :list-archive:list-post:list-help:list-subscribe:mime-version :errors-to:x-original-sender:x-original-authentication-results :mailing-list:content-type:content-transfer-encoding; bh=eq2Kkjbk+ZiRtDF/8vxrCwhOZLTLOS8t3cn2m7ApdsA=; b=Gzn3jrtgB8W5lli/iLC7ym/wVImj9WCl8SSYQfSecQ1J0ljdWrtJ10/c8DCPO006Uu z8OlJIdfA01n3l4I/7dVSGa2DdYYt05l9X6wJWnZEY4wabPek+TlKx7txctKQj8x3kDs SFZAJT/aMMx1x3YLHimsARruBuu9m59yJKoCflx3+KFzGOMajQGkR93x2UsTdcXmU0g4 LamQJbB07IXnZNxlmG+yj2m2tDbQoKVNOHZyE8PvNlWX2fhmMWdn48SFbpK89DzBUtq7 CgvgAS/dIYtBAjKDvjzObAinjlnRxze8WuZCXLezIwidjXl/dWo/XrU185/CWnX0hHdP AEjA== X-Gm-Message-State: ALoCoQntrYeFsf8krG6FEMeIzj5Q4lCUiBijZManfAHdeHErNcMPxOJ3F3MCmvH1RMn9qVA992eb X-Received: by 10.182.123.163 with SMTP id mb3mr21785641obb.32.1409152451931; Wed, 27 Aug 2014 08:14:11 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.140.94.87 with SMTP id f81ls174183qge.65.gmail; Wed, 27 Aug 2014 08:14:11 -0700 (PDT) X-Received: by 10.236.14.34 with SMTP id c22mr21027943yhc.97.1409152451804; Wed, 27 Aug 2014 08:14:11 -0700 (PDT) Received: from mail-yh0-f49.google.com (mail-yh0-f49.google.com [209.85.213.49]) by mx.google.com with ESMTPS id s4si622497yhs.83.2014.08.27.08.14.11 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 27 Aug 2014 08:14:11 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.213.49 as permitted sender) client-ip=209.85.213.49; Received: by mail-yh0-f49.google.com with SMTP id b6so326858yha.36 for ; Wed, 27 Aug 2014 08:14:11 -0700 (PDT) X-Received: by 10.52.120.51 with SMTP id kz19mr754436vdb.95.1409152451688; Wed, 27 Aug 2014 08:14:11 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.221.45.67 with SMTP id uj3csp96976vcb; Wed, 27 Aug 2014 08:14:11 -0700 (PDT) X-Received: by 10.42.12.6 with SMTP id w6mr9348741icw.69.1409152450763; Wed, 27 Aug 2014 08:14:10 -0700 (PDT) Received: from lists.sourceforge.net (lists.sourceforge.net. [216.34.181.88]) by mx.google.com with ESMTPS id u12si1007068icc.36.2014.08.27.08.14.10 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Wed, 27 Aug 2014 08:14:10 -0700 (PDT) Received-SPF: pass (google.com: domain of edk2-devel-bounces@lists.sourceforge.net designates 216.34.181.88 as permitted sender) client-ip=216.34.181.88; Received: from localhost ([127.0.0.1] helo=sfs-ml-4.v29.ch3.sourceforge.com) by sfs-ml-4.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1XMevB-0001Gx-Fb; Wed, 27 Aug 2014 15:14:01 +0000 Received: from sog-mx-2.v43.ch3.sourceforge.com ([172.29.43.192] helo=mx.sourceforge.net) by sfs-ml-4.v29.ch3.sourceforge.com with esmtp (Exim 4.76) (envelope-from ) id 1XMevA-0001Gn-D1 for edk2-devel@lists.sourceforge.net; Wed, 27 Aug 2014 15:14:00 +0000 Received-SPF: pass (sog-mx-2.v43.ch3.sourceforge.com: domain of linaro.org designates 209.85.212.174 as permitted sender) client-ip=209.85.212.174; envelope-from=ard.biesheuvel@linaro.org; helo=mail-wi0-f174.google.com; Received: from mail-wi0-f174.google.com ([209.85.212.174]) by sog-mx-2.v43.ch3.sourceforge.com with esmtps (TLSv1:RC4-SHA:128) (Exim 4.76) id 1XMev9-000897-81 for edk2-devel@lists.sourceforge.net; Wed, 27 Aug 2014 15:14:00 +0000 Received: by mail-wi0-f174.google.com with SMTP id d1so6030333wiv.1 for ; Wed, 27 Aug 2014 08:13:52 -0700 (PDT) X-Received: by 10.194.86.34 with SMTP id m2mr16454893wjz.23.1409152432299; Wed, 27 Aug 2014 08:13:52 -0700 (PDT) Received: from ards-macbook-pro.local (BSN-143-138-142.dial-up.dsl.siol.net. [89.143.138.142]) by mx.google.com with ESMTPSA id fh5sm3972994wib.5.2014.08.27.08.13.30 for (version=TLSv1.1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Wed, 27 Aug 2014 08:13:51 -0700 (PDT) From: Ard Biesheuvel To: lersek@redhat.com, olivier.martin@arm.com, edk2-devel@lists.sourceforge.net, peter.maydell@linaro.org, christoffer.dall@linaro.org, drjones@redhat.com, ilias.biris@linaro.org, leif.lindholm@linaro.org Date: Wed, 27 Aug 2014 17:12:51 +0200 Message-Id: <1409152378-19706-4-git-send-email-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1409152378-19706-1-git-send-email-ard.biesheuvel@linaro.org> References: <1409152378-19706-1-git-send-email-ard.biesheuvel@linaro.org> X-Spam-Score: -1.5 (-) X-Spam-Report: Spam Filtering performed by mx.sourceforge.net. See http://spamassassin.org/tag/ for more details. -1.5 SPF_CHECK_PASS SPF reports sender host as permitted sender for sender-domain -0.0 SPF_PASS SPF: sender matches SPF record X-Headers-End: 1XMev9-000897-81 Subject: [edk2] [PATCH v3 03/10] ArmPkg: allow dynamic GIC base addresses X-BeenThere: edk2-devel@lists.sourceforge.net X-Mailman-Version: 2.1.9 Precedence: list Reply-To: edk2-devel@lists.sourceforge.net List-Id: List-Unsubscribe: , List-Archive: List-Post: , List-Help: , List-Subscribe: , MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.sourceforge.net X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: ard.biesheuvel@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.213.49 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 Allow the PCDs gArmTokenSpaceGuid.PcdGicDistributorBase and gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase to be redeclared as PcdsDynamic by the platform, so virtual machines can set these properties during boot. As the PcdGet32() calls now call into the PCD database, cache the values that are required during the handling of interrupts. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel Acked-by: Laszlo Ersek --- ArmPkg/ArmPkg.dec | 15 +++++++------ ArmPkg/Drivers/ArmGic/ArmGicDxe.inf | 4 +++- ArmPkg/Drivers/ArmGic/GicV2/ArmGicV2Dxe.c | 37 ++++++++++++++++++------------- ArmPkg/Library/BdsLib/BdsLib.inf | 2 +- 4 files changed, 33 insertions(+), 25 deletions(-) diff --git a/ArmPkg/ArmPkg.dec b/ArmPkg/ArmPkg.dec index 0392af52758f..e5ed445ca367 100644 --- a/ArmPkg/ArmPkg.dec +++ b/ArmPkg/ArmPkg.dec @@ -72,6 +72,14 @@ # Whether to use the virtual rather than the physical architected timer gArmTokenSpaceGuid.PcdArmArchTimerUseVirtual|FALSE|BOOLEAN|0x0000003F +[PcdsFixedAtBuild.common,PcdsDynamic.common] + # + # ARM Generic Interrupt Controller + # + gArmTokenSpaceGuid.PcdGicDistributorBase|0|UINT32|0x0000000C + gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase|0|UINT32|0x0000000D + gArmTokenSpaceGuid.PcdGicSgiIntId|0|UINT32|0x00000025 + [PcdsFixedAtBuild.common] gArmTokenSpaceGuid.PcdTrustzoneSupport|FALSE|BOOLEAN|0x00000006 @@ -85,13 +93,6 @@ gArmTokenSpaceGuid.PcdCpuResetAddress|0x00000000|UINT32|0x00000005 # - # ARM Generic Interrupt Controller - # - gArmTokenSpaceGuid.PcdGicDistributorBase|0|UINT32|0x0000000C - gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase|0|UINT32|0x0000000D - gArmTokenSpaceGuid.PcdGicSgiIntId|0|UINT32|0x00000025 - - # # ARM Secure Firmware PCDs # gArmTokenSpaceGuid.PcdSecureFdBaseAddress|0|UINT32|0x00000015 diff --git a/ArmPkg/Drivers/ArmGic/ArmGicDxe.inf b/ArmPkg/Drivers/ArmGic/ArmGicDxe.inf index 7dc14b34ec48..522b5a842dfd 100644 --- a/ArmPkg/Drivers/ArmGic/ArmGicDxe.inf +++ b/ArmPkg/Drivers/ArmGic/ArmGicDxe.inf @@ -43,15 +43,17 @@ MemoryAllocationLib UefiDriverEntryPoint IoLib + PcdLib [Protocols] gHardwareInterruptProtocolGuid gEfiCpuArchProtocolGuid -[FixedPcd.common] +[Pcd.common] gArmTokenSpaceGuid.PcdGicDistributorBase gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase +[FixedPcd.common] gArmTokenSpaceGuid.PcdArmPrimaryCore [Depex] diff --git a/ArmPkg/Drivers/ArmGic/GicV2/ArmGicV2Dxe.c b/ArmPkg/Drivers/ArmGic/GicV2/ArmGicV2Dxe.c index 5561de630d6e..3f9e37b5f2d8 100644 --- a/ArmPkg/Drivers/ArmGic/GicV2/ArmGicV2Dxe.c +++ b/ArmPkg/Drivers/ArmGic/GicV2/ArmGicV2Dxe.c @@ -29,6 +29,9 @@ Abstract: extern EFI_HARDWARE_INTERRUPT_PROTOCOL gHardwareInterruptV2Protocol; +UINT32 mGicInterruptInterfaceBase; +UINT32 mGicDistributorBase; + /** Enable interrupt source Source. @@ -51,7 +54,7 @@ GicV2EnableInterruptSource ( return EFI_UNSUPPORTED; } - ArmGicEnableInterrupt (FixedPcdGet32 (PcdGicDistributorBase), Source); + ArmGicEnableInterrupt (mGicDistributorBase, Source); return EFI_SUCCESS; } @@ -78,7 +81,7 @@ GicV2DisableInterruptSource ( return EFI_UNSUPPORTED; } - ArmGicDisableInterrupt (FixedPcdGet32 (PcdGicDistributorBase), Source); + ArmGicDisableInterrupt (mGicDistributorBase, Source); return EFI_SUCCESS; } @@ -107,7 +110,7 @@ GicV2GetInterruptSourceState ( return EFI_UNSUPPORTED; } - *InterruptState = ArmGicIsInterruptEnabled (FixedPcdGet32 (PcdGicDistributorBase), Source); + *InterruptState = ArmGicIsInterruptEnabled (mGicDistributorBase, Source); return EFI_SUCCESS; } @@ -135,7 +138,7 @@ GicV2EndOfInterrupt ( return EFI_UNSUPPORTED; } - ArmGicV2EndOfInterrupt (FixedPcdGet32 (PcdGicInterruptInterfaceBase), Source); + ArmGicV2EndOfInterrupt (mGicInterruptInterfaceBase, Source); return EFI_SUCCESS; } @@ -160,7 +163,7 @@ GicV2IrqInterruptHandler ( UINT32 GicInterrupt; HARDWARE_INTERRUPT_HANDLER InterruptHandler; - GicInterrupt = ArmGicV2AcknowledgeInterrupt (FixedPcdGet32 (PcdGicInterruptInterfaceBase)); + GicInterrupt = ArmGicV2AcknowledgeInterrupt (mGicInterruptInterfaceBase); // Special Interrupts (ID1020-ID1023) have an Interrupt ID greater than the number of interrupt (ie: Spurious interrupt). if ((GicInterrupt & ARM_GIC_ICCIAR_ACKINTID) >= mGicNumInterrupts) { @@ -216,7 +219,7 @@ GicV2ExitBootServicesEvent ( // Acknowledge all pending interrupts do { - GicInterrupt = ArmGicV2AcknowledgeInterrupt (FixedPcdGet32 (PcdGicInterruptInterfaceBase)); + GicInterrupt = ArmGicV2AcknowledgeInterrupt (mGicInterruptInterfaceBase); if ((GicInterrupt & ARM_GIC_ICCIAR_ACKINTID) < mGicNumInterrupts) { GicV2EndOfInterrupt (&gHardwareInterruptV2Protocol, GicInterrupt); @@ -224,10 +227,10 @@ GicV2ExitBootServicesEvent ( } while (!ARM_GIC_IS_SPECIAL_INTERRUPTS (GicInterrupt)); // Disable Gic Interface - ArmGicV2DisableInterruptInterface (FixedPcdGet32 (PcdGicInterruptInterfaceBase)); + ArmGicV2DisableInterruptInterface (mGicInterruptInterfaceBase); // Disable Gic Distributor - ArmGicDisableDistributor (FixedPcdGet32 (PcdGicDistributorBase)); + ArmGicDisableDistributor (mGicDistributorBase); } /** @@ -256,7 +259,9 @@ GicV2DxeInitialize ( // Make sure the Interrupt Controller Protocol is not already installed in the system. ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gHardwareInterruptProtocolGuid); - mGicNumInterrupts = ArmGicGetMaxNumInterrupts (FixedPcdGet32 (PcdGicDistributorBase)); + mGicInterruptInterfaceBase = PcdGet32 (PcdGicInterruptInterfaceBase); + mGicDistributorBase = PcdGet32 (PcdGicDistributorBase); + mGicNumInterrupts = ArmGicGetMaxNumInterrupts (mGicDistributorBase); for (Index = 0; Index < mGicNumInterrupts; Index++) { GicV2DisableInterruptSource (&gHardwareInterruptV2Protocol, Index); @@ -265,7 +270,7 @@ GicV2DxeInitialize ( RegOffset = Index / 4; RegShift = (Index % 4) * 8; MmioAndThenOr32 ( - FixedPcdGet32 (PcdGicDistributorBase) + ARM_GIC_ICDIPR + (4 * RegOffset), + mGicDistributorBase + ARM_GIC_ICDIPR + (4 * RegOffset), ~(0xff << RegShift), ARM_GIC_DEFAULT_PRIORITY << RegShift ); @@ -282,28 +287,28 @@ GicV2DxeInitialize ( // // Read the first Interrupt Processor Targets Register (that corresponds to the 4 // first SGIs) - CpuTarget = MmioRead32 (FixedPcdGet32 (PcdGicDistributorBase) + ARM_GIC_ICDIPTR); + CpuTarget = MmioRead32 (mGicDistributorBase + ARM_GIC_ICDIPTR); // The CPU target is a bit field mapping each CPU to a GIC CPU Interface. This value // is 0 when we run on a uniprocessor platform. if (CpuTarget != 0) { // The 8 first Interrupt Processor Targets Registers are read-only for (Index = 8; Index < (mGicNumInterrupts / 4); Index++) { - MmioWrite32 (FixedPcdGet32 (PcdGicDistributorBase) + ARM_GIC_ICDIPTR + (Index * 4), CpuTarget); + MmioWrite32 (mGicDistributorBase + ARM_GIC_ICDIPTR + (Index * 4), CpuTarget); } } // Set binary point reg to 0x7 (no preemption) - MmioWrite32 (FixedPcdGet32 (PcdGicInterruptInterfaceBase) + ARM_GIC_ICCBPR, 0x7); + MmioWrite32 (mGicInterruptInterfaceBase + ARM_GIC_ICCBPR, 0x7); // Set priority mask reg to 0xff to allow all priorities through - MmioWrite32 (FixedPcdGet32 (PcdGicInterruptInterfaceBase) + ARM_GIC_ICCPMR, 0xff); + MmioWrite32 (mGicInterruptInterfaceBase + ARM_GIC_ICCPMR, 0xff); // Enable gic cpu interface - ArmGicEnableInterruptInterface (FixedPcdGet32 (PcdGicInterruptInterfaceBase)); + ArmGicEnableInterruptInterface (mGicInterruptInterfaceBase); // Enable gic distributor - ArmGicEnableDistributor (FixedPcdGet32 (PcdGicDistributorBase)); + ArmGicEnableDistributor (mGicDistributorBase); Status = InstallAndRegisterInterruptService ( &gHardwareInterruptV2Protocol, GicV2IrqInterruptHandler, GicV2ExitBootServicesEvent); diff --git a/ArmPkg/Library/BdsLib/BdsLib.inf b/ArmPkg/Library/BdsLib/BdsLib.inf index 27962680159a..3e1ae8914abf 100644 --- a/ArmPkg/Library/BdsLib/BdsLib.inf +++ b/ArmPkg/Library/BdsLib/BdsLib.inf @@ -91,7 +91,7 @@ [FixedPcd.ARM] gArmTokenSpaceGuid.PcdArmLinuxAtagMaxOffset -[FixedPcd.AARCH64] +[Pcd.AARCH64] gArmTokenSpaceGuid.PcdGicDistributorBase gArmTokenSpaceGuid.PcdGicSgiIntId