From patchwork Tue Oct 31 10:51:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ard Biesheuvel X-Patchwork-Id: 117538 Delivered-To: patch@linaro.org Received: by 10.80.245.45 with SMTP id t42csp3793544edm; Tue, 31 Oct 2017 03:52:54 -0700 (PDT) X-Google-Smtp-Source: ABhQp+SWPxmfRyRUUB68pCuHWDpA4F6yvDSVJscuwaBO15k9FNirN1NCwSsYnuCvvTswOv48kSZ5 X-Received: by 10.99.56.19 with SMTP id f19mr1313814pga.328.1509447174587; Tue, 31 Oct 2017 03:52:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1509447174; cv=none; d=google.com; s=arc-20160816; b=ft3tfxnLhZxP4dRZhMTb1DPeHyL4mFT2h2rOkE5jCKHLzSAuWxWRg5mgl9akpmf1Mg b104ebqTa7t/9mLpAc/LMEfjR2of9uP3xKhNebNr/oAbsjFc2/64z57nwFMrVqydIbWp eZyitOf050RkblmBiJOT8/JFU6nYf8SRIap1KJzmpcRcKBmxQwL9oLcblbwLEiiLIm4n xIptG7XY1Xyc3v5T7GoNRLx13megAlFpxn7KgaSRiB5feJMPA3agyt1XpBLveD3VI6gC BX9tmAHxwmgqgmHRGFHs1aVPP62elyiQuAXh//p9gxldKHWUPRydiPgYpq/2mEL+rXG/ GU/A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=3w9nwYpB2iaUIhSJ1MOtyQBNJbbYjp387lmvCqH71/4=; b=vtqkZqByqDh+yxypgTN9lkcuEBG+AGCn1HC1cyn9p3nF/GyUae5wx17wn4i19Zoxva LBomTQTITo1Iq+UXGHzVHg9Vvobx/Qm7glmhz1Px4oj3XlwOpbSkbDtz0w1riNSOa+22 MYXQKmzCqqLWamDdy7liztlXaIfjodYYsOBxrFKJoEg5cOuFVtBLVEs4zs4T8Svcu7Iy ltcIotTQIeRCI63IOC8Tf5/+9CbeCAqdub7/TEJYGCVJHJYw2lwn1bLMdubFUclkTjyT a/iFgnLV5sQyi+tIrwtF+FshSN3ItwkJtu8gtKmvtF738v44wm+aLEqkTj6/w3PkC6SP xBDw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=QI64J7E5; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from ml01.01.org (ml01.01.org. [198.145.21.10]) by mx.google.com with ESMTPS id q8si1289171pgn.679.2017.10.31.03.52.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 31 Oct 2017 03:52:54 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) client-ip=198.145.21.10; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@linaro.org header.s=google header.b=QI64J7E5; spf=pass (google.com: best guess record for domain of edk2-devel-bounces@lists.01.org designates 198.145.21.10 as permitted sender) smtp.mailfrom=edk2-devel-bounces@lists.01.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id D8A2721F3B3E1; Tue, 31 Oct 2017 03:48:52 -0700 (PDT) X-Original-To: edk2-devel@lists.01.org Delivered-To: edk2-devel@lists.01.org Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=2a00:1450:400c:c09::242; helo=mail-wm0-x242.google.com; envelope-from=ard.biesheuvel@linaro.org; receiver=edk2-devel@lists.01.org Received: from mail-wm0-x242.google.com (mail-wm0-x242.google.com [IPv6:2a00:1450:400c:c09::242]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 917E621CEB136 for ; Tue, 31 Oct 2017 03:48:51 -0700 (PDT) Received: by mail-wm0-x242.google.com with SMTP id r196so21610630wmf.2 for ; Tue, 31 Oct 2017 03:52:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=GK4YFIvMyZY308jq1C0MJeiZStHaMEWmF96qTKuvwZg=; b=QI64J7E57aw/MrqomtgQPDeGTCRnYdGylQFetz6o0lyBdbSlfnFQBRhWrPq+MF5pfA +urkhVlj/IS2kBy8IrQmHAOnS6HkV7usUqi8IC0nTIqNjb3toavbO2qxdelkQSfcU9P8 NghHyt8LpO6uHhpURUMsn4KSkUEBnzU6gE0i4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=GK4YFIvMyZY308jq1C0MJeiZStHaMEWmF96qTKuvwZg=; b=P6lleAEN8JmJ9REnsOLamn3E4S6XR7sDhenIaP5oiogexzg4Zo8po4/tsVXbgR53Gt mpUrXV6WpqOIchKgLhMqsYDeVrwbW7jYQtyHUfbi8IvEXDacaydSlxoMbFzmlebZnAlI TmXJoVbbP4bVZmdg5nXIrCaxQtGDFgpGmIwu1ouUkmT7YsVPKj0sdjlzH57860VvOXYx BdWCAKP3gQJaDA/ok5T5NeojQNjqGSUnKkuKnXrv1AjfohI6adcvtRxZyIhcE10g0Go8 AjQJ4wfW+GxfCeOkiHm4xYTZrMpQViagFP+90iNfD5kXxoc+4BaLlSJUtSbPW0dCUjvg ZQKQ== X-Gm-Message-State: AMCzsaUIzyCtmLKA9uf4XNwr67AUlxb3AuzvHlmi71AGUOJp856kQxZo EY5DSlAmWR7eOV0Q0WF3HtZueS60cd0= X-Received: by 10.28.180.2 with SMTP id d2mr1352558wmf.118.1509447161258; Tue, 31 Oct 2017 03:52:41 -0700 (PDT) Received: from localhost.localdomain ([105.129.222.2]) by smtp.gmail.com with ESMTPSA id o14sm460985wra.54.2017.10.31.03.52.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 31 Oct 2017 03:52:40 -0700 (PDT) From: Ard Biesheuvel To: edk2-devel@lists.01.org, leif.lindholm@linaro.org Date: Tue, 31 Oct 2017 10:51:56 +0000 Message-Id: <20171031105218.30208-6-ard.biesheuvel@linaro.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20171031105218.30208-1-ard.biesheuvel@linaro.org> References: <20171031105218.30208-1-ard.biesheuvel@linaro.org> Subject: [edk2] [PATCH edk2-platforms v3 05/27] Silicon/SynQuacer: add MemoryInitPeiLib implementation X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: daniel.thompson@linaro.org, masami.hiramatsu@linaro.org, Ard Biesheuvel MIME-Version: 1.0 Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" Implement MemoryInitPeiLib based on the newly added DramInfo PPI, which retrieves the DRAM information from lower level firmware. Note that the firmware volumes in SPI NOR are mapped with different attributes: the FV containing the PEI modules that may execute in place is mapped as uncached memory, given that it requires executable permissions. The FV containing the compressed DXE modules is mapped with device attributes for performance (!), and copied into DRAM by the platform PEIM once permanent memory is installed. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ard Biesheuvel --- Silicon/Socionext/SynQuacer/Library/SynQuacerMemoryInitPeiLib/SynQuacerMemoryInitPeiLib.c | 186 ++++++++++++++++++++ Silicon/Socionext/SynQuacer/Library/SynQuacerMemoryInitPeiLib/SynQuacerMemoryInitPeiLib.inf | 67 +++++++ 2 files changed, 253 insertions(+) -- 2.11.0 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel Reviewed-by: Leif Lindholm diff --git a/Silicon/Socionext/SynQuacer/Library/SynQuacerMemoryInitPeiLib/SynQuacerMemoryInitPeiLib.c b/Silicon/Socionext/SynQuacer/Library/SynQuacerMemoryInitPeiLib/SynQuacerMemoryInitPeiLib.c new file mode 100644 index 000000000000..e9a266f0997a --- /dev/null +++ b/Silicon/Socionext/SynQuacer/Library/SynQuacerMemoryInitPeiLib/SynQuacerMemoryInitPeiLib.c @@ -0,0 +1,186 @@ +/** @file +* +* Copyright (c) 2011-2015, ARM Limited. All rights reserved. +* Copyright (c) 2017, Linaro, Ltd. All rights reserved. +* +* This program and the accompanying materials +* are licensed and made available under the terms and conditions of the BSD License +* which accompanies this distribution. The full text of the license may be found at +* http://opensource.org/licenses/bsd-license.php +* +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +* +**/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#define ARM_MEMORY_REGION(Base, Size) \ + { (Base), (Base), (Size), ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK } + +#define ARM_UNCACHED_REGION(Base, Size) \ + { (Base), (Base), (Size), ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED } + +#define ARM_DEVICE_REGION(Base, Size) \ + { (Base), (Base), (Size), ARM_MEMORY_REGION_ATTRIBUTE_DEVICE } + +VOID +BuildMemoryTypeInformationHob ( + VOID + ); + +STATIC CONST EFI_RESOURCE_ATTRIBUTE_TYPE mDramResourceAttributes = + EFI_RESOURCE_ATTRIBUTE_PRESENT | + EFI_RESOURCE_ATTRIBUTE_INITIALIZED | + EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE | + EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE | + EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE | + EFI_RESOURCE_ATTRIBUTE_TESTED; + +STATIC CONST ARM_MEMORY_REGION_DESCRIPTOR mVirtualMemoryTable[] = { + // Memory mapped SPI NOR flash + // Mapped with device attributes for performance (!) + ARM_DEVICE_REGION (FixedPcdGet64 (PcdFdBaseAddress), + FixedPcdGet32 (PcdFdSize)), + + // Memory mapped SPI NOR flash - XIP region + // Sub-region of the preceding one - supersede with normal-nc attributes + ARM_UNCACHED_REGION (FixedPcdGet64 (PcdFvBaseAddress), + FixedPcdGet32 (PcdFvSize)), + + // SynQuacer OnChip peripherals + ARM_DEVICE_REGION (SYNQUACER_PERIPHERALS_BASE, + SYNQUACER_PERIPHERALS_SZ), + + // SynQuacer OnChip non-secure SRAM + ARM_UNCACHED_REGION (SYNQUACER_NON_SECURE_SRAM_BASE, + SYNQUACER_NON_SECURE_SRAM_SZ), + + // SynQuacer GIC-500 + ARM_DEVICE_REGION (SYNQUACER_GIC500_DIST_BASE, SYNQUACER_GIC500_DIST_SIZE), + ARM_DEVICE_REGION (SYNQUACER_GIC500_RDIST_BASE, SYNQUACER_GIC500_RDIST_SIZE), + + // SynQuacer eMMC(SDH30) + ARM_DEVICE_REGION (SYNQUACER_EMMC_BASE, SYNQUACER_EMMC_BASE_SZ), + + // SynQuacer EEPROM - could point to NOR flash as well + ARM_DEVICE_REGION (FixedPcdGet32 (PcdNetsecEepromBase), + SYNQUACER_EEPROM_BASE_SZ), + + // SynQuacer NETSEC + ARM_DEVICE_REGION (SYNQUACER_NETSEC_BASE, SYNQUACER_NETSEC_BASE_SZ), + + // PCIe control registers + ARM_DEVICE_REGION (SYNQUACER_PCIE_BASE, SYNQUACER_PCIE_SIZE), + + // PCIe config space + ARM_DEVICE_REGION (SYNQUACER_PCI_SEG0_CONFIG_BASE, + SYNQUACER_PCI_SEG0_CONFIG_SIZE), + ARM_DEVICE_REGION (SYNQUACER_PCI_SEG1_CONFIG_BASE, + SYNQUACER_PCI_SEG1_CONFIG_SIZE), + + // PCIe I/O space + ARM_DEVICE_REGION (SYNQUACER_PCI_SEG0_PORTIO_MEMBASE, + SYNQUACER_PCI_SEG0_PORTIO_MEMSIZE), + ARM_DEVICE_REGION (SYNQUACER_PCI_SEG1_PORTIO_MEMBASE, + SYNQUACER_PCI_SEG1_PORTIO_MEMSIZE), +}; + +STATIC +EFI_STATUS +DeclareDram ( + OUT ARM_MEMORY_REGION_DESCRIPTOR **VirtualMemoryTable + ) +{ + SYNQUACER_DRAM_INFO_PPI *DramInfo; + EFI_STATUS Status; + UINTN Idx; + UINTN RegionCount; + UINT64 Base; + UINT64 Size; + ARM_MEMORY_REGION_DESCRIPTOR *DramDescriptor; + + Status = PeiServicesLocatePpi (&gSynQuacerDramInfoPpiGuid, 0, NULL, + (VOID **)&DramInfo); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = DramInfo->GetRegionCount (&RegionCount); + if (EFI_ERROR (Status)) { + return Status; + } + + *VirtualMemoryTable = AllocatePool (sizeof (mVirtualMemoryTable) + + (RegionCount + 1) * + sizeof (ARM_MEMORY_REGION_DESCRIPTOR)); + if (*VirtualMemoryTable == NULL) { + return EFI_OUT_OF_RESOURCES; + } + CopyMem (*VirtualMemoryTable, mVirtualMemoryTable, + sizeof (mVirtualMemoryTable)); + + DramDescriptor = *VirtualMemoryTable + ARRAY_SIZE (mVirtualMemoryTable); + + for (Idx = 0; Idx < RegionCount; Idx++, DramDescriptor++) { + Status = DramInfo->GetRegion (Idx, &Base, &Size); + ASSERT_EFI_ERROR (Status); + + BuildResourceDescriptorHob (EFI_RESOURCE_SYSTEM_MEMORY, + mDramResourceAttributes, Base, Size); + + DramDescriptor->PhysicalBase = Base; + DramDescriptor->VirtualBase = Base; + DramDescriptor->Length = Size; + DramDescriptor->Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK; + } + + DramDescriptor->PhysicalBase = 0; + DramDescriptor->VirtualBase = 0; + DramDescriptor->Length = 0; + DramDescriptor->Attributes = 0; + + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +MemoryPeim ( + IN EFI_PHYSICAL_ADDRESS UefiMemoryBase, + IN UINT64 UefiMemorySize + ) +{ + EFI_STATUS Status; + ARM_MEMORY_REGION_DESCRIPTOR *VirtualMemoryTable; + + Status = DeclareDram (&VirtualMemoryTable); + ASSERT_EFI_ERROR (Status); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = ArmConfigureMmu (VirtualMemoryTable, NULL, NULL); + ASSERT_EFI_ERROR (Status); + if (EFI_ERROR (Status)) { + return Status; + } + + if (FeaturePcdGet (PcdPrePiProduceMemoryTypeInformationHob)) { + // Optional feature that helps prevent EFI memory map fragmentation. + BuildMemoryTypeInformationHob (); + } + return EFI_SUCCESS; +} diff --git a/Silicon/Socionext/SynQuacer/Library/SynQuacerMemoryInitPeiLib/SynQuacerMemoryInitPeiLib.inf b/Silicon/Socionext/SynQuacer/Library/SynQuacerMemoryInitPeiLib/SynQuacerMemoryInitPeiLib.inf new file mode 100644 index 000000000000..06cad772a1c0 --- /dev/null +++ b/Silicon/Socionext/SynQuacer/Library/SynQuacerMemoryInitPeiLib/SynQuacerMemoryInitPeiLib.inf @@ -0,0 +1,67 @@ +#/** @file +# +# Copyright (c) 2011-2014, ARM Ltd. All rights reserved.
+# Copyright (c) 2017, Linaro, Ltd. All rights reserved.
+# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +#**/ + +[Defines] + INF_VERSION = 0x00010019 + BASE_NAME = SynQuacerMemoryInitPeiLib + FILE_GUID = c69d3ce7-098c-4fcd-afb4-15fb05a39308 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = MemoryInitPeiLib|SEC PEIM + +[Sources] + SynQuacerMemoryInitPeiLib.c + +[Packages] + ArmPkg/ArmPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + Silicon/Socionext/SynQuacer/SynQuacer.dec + +[LibraryClasses] + ArmLib + ArmMmuLib + BaseMemoryLib + DebugLib + MemoryAllocationLib + PeiServicesLib + +[FeaturePcd] + gEmbeddedTokenSpaceGuid.PcdPrePiProduceMemoryTypeInformationHob + +[FixedPcd] + gArmTokenSpaceGuid.PcdFdBaseAddress + gArmTokenSpaceGuid.PcdFdSize + gArmTokenSpaceGuid.PcdFvBaseAddress + gArmTokenSpaceGuid.PcdFvSize + gArmTokenSpaceGuid.PcdGicDistributorBase + gArmTokenSpaceGuid.PcdGicRedistributorsBase + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize + gSynQuacerTokenSpaceGuid.PcdNetsecEepromBase + +[Pcd] + gArmTokenSpaceGuid.PcdSystemMemoryBase + +[Ppis] + gSynQuacerDramInfoPpiGuid ## CONSUMES + +[Depex] + gSynQuacerDramInfoPpiGuid