From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
To: Leif Lindholm <leif.lindholm@linaro.org>
Cc: Scott Telford <stelford@cadence.com>,
"edk2-devel@lists.01.org" <edk2-devel@ml01.01.org>,
Graeme Gregory <graeme.gregory@linaro.org>,
"afish@apple.com" <afish@apple.com>,
"Kinney, Michael D" <michael.d.kinney@intel.com>
Subject: Re: [staging/cadence-aarch64 PATCH v3 1/6] CadencePkg: Add libraries for Cadence CSP platform.
Date: Fri, 23 Jun 2017 18:37:07 +0000 [thread overview]
Message-ID: <CAKv+Gu-gtSDwq7Vsrp0hux=XnbULNKdp6BPkedALriD+zh1Oog@mail.gmail.com> (raw)
In-Reply-To: <20170622145046.GK26676@bivouac.eciton.net>
On 22 June 2017 at 14:50, Leif Lindholm <leif.lindholm@linaro.org> wrote:
> On Thu, Jun 22, 2017 at 10:31:56AM +0100, Scott Telford wrote:
>> Add libraries (CadenceCspLib, CadenceCspSecLib,
>> CadenceCspResetSystemLib) to support the Cadence Configurable System
>> Platform (CSP) configured with a single ARM Cortex-A53, GIC-500,
>> Cadence UART and Cadence PCIe Root Complex.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Scott Telford <stelford@cadence.com>
>
> I'd like for Ard to comment on the bits he raised last time, but from
> my point of view:
> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
>
Looks fine to me
Reviewed-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>> ---
>> CadencePkg/Include/Library/CspSysReg.h | 37 ++++++
>> .../CadenceCspLib/AArch64/ArmPlatformHelper.S | 55 +++++++++
>> CadencePkg/Library/CadenceCspLib/CadenceCspLib.c | 133 +++++++++++++++++++++
>> CadencePkg/Library/CadenceCspLib/CadenceCspLib.inf | 68 +++++++++++
>> .../Library/CadenceCspLib/CadenceCspLibMem.c | 116 ++++++++++++++++++
>> .../Library/CadenceCspLib/CadenceCspLibSec.inf | 52 ++++++++
>> .../CadenceCspResetSystemLib.c | 82 +++++++++++++
>> .../CadenceCspResetSystemLib.inf | 40 +++++++
>> .../Library/CadenceCspSecLib/AArch64/CspBoot.S | 49 ++++++++
>> .../Library/CadenceCspSecLib/AArch64/GicV3.S | 67 +++++++++++
>> .../Library/CadenceCspSecLib/CadenceCspSecLib.inf | 44 +++++++
>> CadencePkg/Library/CadenceCspSecLib/CspSec.c | 79 ++++++++++++
>> 12 files changed, 822 insertions(+)
>> create mode 100644 CadencePkg/Include/Library/CspSysReg.h
>> create mode 100644 CadencePkg/Library/CadenceCspLib/AArch64/ArmPlatformHelper.S
>> create mode 100644 CadencePkg/Library/CadenceCspLib/CadenceCspLib.c
>> create mode 100644 CadencePkg/Library/CadenceCspLib/CadenceCspLib.inf
>> create mode 100644 CadencePkg/Library/CadenceCspLib/CadenceCspLibMem.c
>> create mode 100644 CadencePkg/Library/CadenceCspLib/CadenceCspLibSec.inf
>> create mode 100644 CadencePkg/Library/CadenceCspResetSystemLib/CadenceCspResetSystemLib.c
>> create mode 100644 CadencePkg/Library/CadenceCspResetSystemLib/CadenceCspResetSystemLib.inf
>> create mode 100644 CadencePkg/Library/CadenceCspSecLib/AArch64/CspBoot.S
>> create mode 100644 CadencePkg/Library/CadenceCspSecLib/AArch64/GicV3.S
>> create mode 100644 CadencePkg/Library/CadenceCspSecLib/CadenceCspSecLib.inf
>> create mode 100644 CadencePkg/Library/CadenceCspSecLib/CspSec.c
>>
>> diff --git a/CadencePkg/Include/Library/CspSysReg.h b/CadencePkg/Include/Library/CspSysReg.h
>> new file mode 100644
>> index 0000000..4d3ac925
>> --- /dev/null
>> +++ b/CadencePkg/Include/Library/CspSysReg.h
>> @@ -0,0 +1,37 @@
>> +/** @file
>> +* Cadence CSP system register offsets.
>> +* Copyright (c) 2017, Cadence Design Systems. 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.
>> +*
>> +**/
>> +
>> +#ifndef __CSP_SYS_REG_H__
>> +#define __CSP_SYS_REG_H__
>> +
>> +// Cadence CSP system register offsets
>> +#define CSP_SYSREG_VERSION 0x00
>> +#define CSP_SYSREG_CPU_FREQ 0x04
>> +#define CSP_SYSREG_STATUS 0x08
>> +#define CSP_SYSREG_RUN_STALL 0x0C
>> +#define CSP_SYSREG_SW_RESET 0x10
>> +#define CSP_SYSREG_CORE1_RESET 0x14
>> +#define CSP_SYSREG_SCRATCH_REG_0 0x18
>> +#define CSP_SYSREG_PROC_INTERRUPT 0x1C
>> +#define CSP_SYSREG_SCRATCH_REG_1 0x20
>> +#define CSP_SYSREG_SCRATCH_REG_2 0x24
>> +#define CSP_SYSREG_SCRATCH_REG_3 0x28
>> +#define CSP_SYSREG_SCRATCH_REG_4 0x2C
>> +#define CSP_SYSREG_SCRATCH_REG_5 0x30
>> +#define CSP_SYSREG_SCRATCH_REG_6 0x34
>> +#define CSP_SYSREG_SET_INTERRUPT 0x38
>> +#define CSP_SYSREG_CLR_INTERRUPT 0x3C
>> +#define CSP_SYSREG_DIP_SWITCHES 0x40
>> +
>> +#endif
>> diff --git a/CadencePkg/Library/CadenceCspLib/AArch64/ArmPlatformHelper.S b/CadencePkg/Library/CadenceCspLib/AArch64/ArmPlatformHelper.S
>> new file mode 100644
>> index 0000000..8832673
>> --- /dev/null
>> +++ b/CadencePkg/Library/CadenceCspLib/AArch64/ArmPlatformHelper.S
>> @@ -0,0 +1,55 @@
>> +#
>> +# Copyright (c) 2011-2013, ARM Limited. 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 <AsmMacroIoLibV8.h>
>> +#include <Library/ArmLib.h>
>> +
>> +ASM_FUNC(ArmPlatformPeiBootAction)
>> + ret
>> +
>> +//UINTN
>> +//ArmPlatformGetPrimaryCoreMpId (
>> +// VOID
>> +// );
>> +ASM_FUNC(ArmPlatformGetPrimaryCoreMpId)
>> + MOV32 (w0, FixedPcdGet32 (PcdArmPrimaryCore))
>> + ret
>> +
>> +//UINTN
>> +//ArmPlatformIsPrimaryCore (
>> +// IN UINTN MpId
>> +// );
>> +ASM_FUNC(ArmPlatformIsPrimaryCore)
>> + MOV32 (w1, FixedPcdGet32 (PcdArmPrimaryCoreMask))
>> + and x0, x0, x1
>> + MOV32 (w1, FixedPcdGet32 (PcdArmPrimaryCore))
>> + cmp w0, w1
>> + b.ne 1f
>> + mov x0, #1
>> + ret
>> +1:
>> + mov x0, #0
>> + ret
>> +
>> +//UINTN
>> +//ArmPlatformGetCorePosition (
>> +// IN UINTN MpId
>> +// );
>> +// With this function: CorePos = (ClusterId * 4) + CoreId
>> +ASM_FUNC(ArmPlatformGetCorePosition)
>> + and x1, x0, #ARM_CORE_MASK
>> + and x0, x0, #ARM_CLUSTER_MASK
>> + add x0, x1, x0, LSR #6
>> + ret
>> +
>> +ASM_FUNCTION_REMOVE_IF_UNREFERENCED
>> diff --git a/CadencePkg/Library/CadenceCspLib/CadenceCspLib.c b/CadencePkg/Library/CadenceCspLib/CadenceCspLib.c
>> new file mode 100644
>> index 0000000..fc200a1
>> --- /dev/null
>> +++ b/CadencePkg/Library/CadenceCspLib/CadenceCspLib.c
>> @@ -0,0 +1,133 @@
>> +/** @file
>> +*
>> +* Copyright (c) 2011-2012, ARM Limited. All rights reserved.
>> +* Copyright (c) 2017, Cadence Design Systems, Inc. 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 <Library/ArmLib.h>
>> +#include <Library/ArmPlatformLib.h>
>> +#include <Library/CspSysReg.h>
>> +#include <Library/IoLib.h>
>> +#include <Library/PcdLib.h>
>> +
>> +#include <Ppi/ArmMpCoreInfo.h>
>> +
>> +
>> +ARM_CORE_INFO mArmPlatformNullMpCoreInfoTable[] = {
>> + {
>> + // Cluster 0, Core 0
>> + 0x0, 0x0,
>> +
>> + // MP Core MailBox Set/Get/Clear Addresses and Clear Value
>> + (EFI_PHYSICAL_ADDRESS)0,
>> + (EFI_PHYSICAL_ADDRESS)0,
>> + (EFI_PHYSICAL_ADDRESS)0,
>> + (UINT64)0xFFFFFFFF
>> + }
>> +};
>> +
>> +
>> +
>> +/**
>> + Return the current Boot Mode
>> +
>> + This function returns the boot reason on the platform
>> +
>> +**/
>> +EFI_BOOT_MODE
>> +ArmPlatformGetBootMode (
>> + VOID
>> + )
>> +{
>> + return BOOT_WITH_FULL_CONFIGURATION;
>> +}
>> +
>> +/**
>> + Initialize controllers that must setup in the normal world
>> +
>> + This function is called by the ArmPlatformPkg/PrePi or ArmPlatformPkg/PlatformPei
>> + in the PEI phase.
>> +
>> +**/
>> +RETURN_STATUS
>> +ArmPlatformInitialize (
>> + IN UINTN MpId
>> + )
>> +{
>> + UINTN CspScratchReg2;
>> +
>> + if (!ArmPlatformIsPrimaryCore (MpId)) {
>> + return RETURN_SUCCESS;
>> + }
>> +
>> + // CSP System Register initialisation
>> + CspScratchReg2 = PcdGet64 (PcdCspSysRegBase) + CSP_SYSREG_SCRATCH_REG_2;
>> + MmioWrite32 ((UINTN)CspScratchReg2, 0x1);
>> + MmioWrite32 ((UINTN)CspScratchReg2, 0x3);
>> +
>> + return RETURN_SUCCESS;
>> +}
>> +
>> +/**
>> + Initialize the system (or sometimes called permanent) memory
>> +
>> + This memory is generally represented by the DRAM.
>> +
>> +**/
>> +VOID
>> +ArmPlatformInitializeSystemMemory (
>> + VOID
>> + )
>> +{
>> +}
>> +
>> +STATIC
>> +EFI_STATUS
>> +PrePeiCoreGetMpCoreInfo (
>> + OUT UINTN *CoreCount,
>> + OUT ARM_CORE_INFO **ArmCoreTable
>> + )
>> +{
>> + if (ArmIsMpCore()) {
>> + *CoreCount = sizeof(mArmPlatformNullMpCoreInfoTable) / sizeof(ARM_CORE_INFO);
>> + *ArmCoreTable = mArmPlatformNullMpCoreInfoTable;
>> + return EFI_SUCCESS;
>> + } else {
>> + return EFI_UNSUPPORTED;
>> + }
>> +}
>> +
>> +STATIC ARM_MP_CORE_INFO_PPI mMpCoreInfoPpi = { PrePeiCoreGetMpCoreInfo };
>> +
>> +STATIC EFI_PEI_PPI_DESCRIPTOR gPlatformPpiTable[] = {
>> + {
>> + EFI_PEI_PPI_DESCRIPTOR_PPI,
>> + &gArmMpCoreInfoPpiGuid,
>> + &mMpCoreInfoPpi
>> + }
>> +};
>> +
>> +VOID
>> +ArmPlatformGetPlatformPpiList (
>> + OUT UINTN *PpiListSize,
>> + OUT EFI_PEI_PPI_DESCRIPTOR **PpiList
>> + )
>> +{
>> + if (ArmIsMpCore()) {
>> + *PpiListSize = sizeof(gPlatformPpiTable);
>> + *PpiList = gPlatformPpiTable;
>> + } else {
>> + *PpiListSize = 0;
>> + *PpiList = NULL;
>> + }
>> +}
>> +
>> diff --git a/CadencePkg/Library/CadenceCspLib/CadenceCspLib.inf b/CadencePkg/Library/CadenceCspLib/CadenceCspLib.inf
>> new file mode 100644
>> index 0000000..a09a89e
>> --- /dev/null
>> +++ b/CadencePkg/Library/CadenceCspLib/CadenceCspLib.inf
>> @@ -0,0 +1,68 @@
>> +#/* @file
>> +# Copyright (c) 2011-2012, ARM Limited. All rights reserved.
>> +# Copyright (c) 2017, Cadence Design Systems, Inc. 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 = 1.25
>> + BASE_NAME = CadenceCspLib
>> + FILE_GUID = 13392a39-0fd2-4ec1-8541-1a7b5f0005d9
>> + MODULE_TYPE = BASE
>> + VERSION_STRING = 1.0
>> + LIBRARY_CLASS = ArmPlatformLib
>> +
>> +[Packages]
>> + MdePkg/MdePkg.dec
>> + MdeModulePkg/MdeModulePkg.dec
>> + EmbeddedPkg/EmbeddedPkg.dec
>> + ArmPkg/ArmPkg.dec
>> + ArmPlatformPkg/ArmPlatformPkg.dec
>> + CadencePkg/CadenceCspPkg.dec
>> +
>> +[LibraryClasses]
>> + ArmLib
>> + MemoryAllocationLib
>> + SerialPortLib
>> + DebugLib
>> + HobLib
>> +
>> +[Sources.common]
>> + CadenceCspLib.c
>> + CadenceCspLibMem.c
>> +
>> +[Sources.AArch64]
>> + AArch64/ArmPlatformHelper.S
>> +
>> +[FixedPcd]
>> + gArmTokenSpaceGuid.PcdSystemMemoryBase
>> + gArmTokenSpaceGuid.PcdSystemMemorySize
>> +
>> + gArmTokenSpaceGuid.PcdSecureFdBaseAddress
>> + gArmTokenSpaceGuid.PcdSecureFdSize
>> + gArmTokenSpaceGuid.PcdFdBaseAddress
>> + gArmTokenSpaceGuid.PcdFdSize
>> +
>> + gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
>> + gArmTokenSpaceGuid.PcdArmPrimaryCore
>> +
>> + gArmTokenSpaceGuid.PcdGicDistributorBase
>> + gArmTokenSpaceGuid.PcdGicRedistributorsBase
>> +
>> + gCadenceCspTokenSpaceGuid.PcdCspSysRegBase
>> + gCadenceCspTokenSpaceGuid.PcdCspSysRegSize
>> +
>> + gCadenceCspTokenSpaceGuid.PcdCspSerialBase
>> + gCadenceCspTokenSpaceGuid.PcdCspSerialSize
>> +
>> + gCadenceCspTokenSpaceGuid.PcdPcieRootPortBaseAddress
>> + gCadenceCspTokenSpaceGuid.PcdPciConfigurationSpaceBaseAddress
>> + gCadenceCspTokenSpaceGuid.PcdPciConfigurationSpaceSize
>> diff --git a/CadencePkg/Library/CadenceCspLib/CadenceCspLibMem.c b/CadencePkg/Library/CadenceCspLib/CadenceCspLibMem.c
>> new file mode 100644
>> index 0000000..5eccb7c
>> --- /dev/null
>> +++ b/CadencePkg/Library/CadenceCspLib/CadenceCspLibMem.c
>> @@ -0,0 +1,116 @@
>> +/** @file
>> +*
>> +* Copyright (c) 2011, ARM Limited. All rights reserved.
>> +* Copyright (c) 2017, Cadence Design Systems, Inc. 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 <Library/ArmPlatformLib.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/IoLib.h>
>> +#include <Library/MemoryAllocationLib.h>
>> +#include <Library/PcdLib.h>
>> +
>> +#define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 14
>> +
>> +#define GICD_SZ SIZE_64KB
>> +#define GICR_SZ SIZE_128KB
>> +
>> +/**
>> + Return the Virtual Memory Map of your platform
>> +
>> + This Virtual Memory Map is used by MemoryInitPei Module to initialize the MMU on your platform.
>> +
>> + @param[out] VirtualMemoryMap Array of ARM_MEMORY_REGION_DESCRIPTOR describing a Physical-to-
>> + Virtual Memory mapping. This array must be ended by a zero-filled
>> + entry
>> +
>> +**/
>> +VOID
>> +ArmPlatformGetVirtualMemoryMap (
>> + IN ARM_MEMORY_REGION_DESCRIPTOR** VirtualMemoryMap
>> + )
>> +{
>> + UINTN Index = 0;
>> + ARM_MEMORY_REGION_DESCRIPTOR *VirtualMemoryTable;
>> +
>> + ASSERT(VirtualMemoryMap != NULL);
>> +
>> + VirtualMemoryTable = (ARM_MEMORY_REGION_DESCRIPTOR*)AllocatePages(EFI_SIZE_TO_PAGES (sizeof(ARM_MEMORY_REGION_DESCRIPTOR) * MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS));
>> + if (VirtualMemoryTable == NULL) {
>> + return;
>> + }
>> + // SRAM
>> + VirtualMemoryTable[Index].PhysicalBase = PcdGet64(PcdSystemMemoryBase);
>> + VirtualMemoryTable[Index].VirtualBase = PcdGet64(PcdSystemMemoryBase);
>> + VirtualMemoryTable[Index].Length = PcdGet64(PcdSystemMemorySize);
>> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK;
>> +
>> + // CDNS UART
>> + VirtualMemoryTable[++Index].PhysicalBase = PcdGet64(PcdCspSerialBase);
>> + VirtualMemoryTable[Index].VirtualBase = PcdGet64(PcdCspSerialBase);
>> + VirtualMemoryTable[Index].Length = PcdGet32(PcdCspSerialSize);
>> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> + // UEFI ROM (Secure)
>> + VirtualMemoryTable[++Index].PhysicalBase = PcdGet64(PcdSecureFdBaseAddress);
>> + VirtualMemoryTable[Index].VirtualBase = PcdGet64(PcdSecureFdBaseAddress);
>> + VirtualMemoryTable[Index].Length = PcdGet32(PcdSecureFdSize);
>> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK;
>> +
>> + // UEFI ROM (Normal)
>> + VirtualMemoryTable[++Index].PhysicalBase = PcdGet64(PcdFdBaseAddress);
>> + VirtualMemoryTable[Index].VirtualBase = PcdGet64(PcdFdBaseAddress);
>> + VirtualMemoryTable[Index].Length = PcdGet32(PcdFdSize);
>> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK;
>> +
>> + // CSP SysRegs
>> + VirtualMemoryTable[++Index].PhysicalBase = PcdGet64(PcdCspSysRegBase);
>> + VirtualMemoryTable[Index].VirtualBase = PcdGet64(PcdCspSysRegBase);
>> + VirtualMemoryTable[Index].Length = PcdGet32(PcdCspSysRegSize);
>> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> + // GIC Distributor
>> + VirtualMemoryTable[++Index].PhysicalBase = PcdGet64(PcdGicDistributorBase);
>> + VirtualMemoryTable[Index].VirtualBase = PcdGet64(PcdGicDistributorBase);
>> + VirtualMemoryTable[Index].Length = GICD_SZ;
>> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> + // GIC Redistributor
>> + VirtualMemoryTable[++Index].PhysicalBase = PcdGet64(PcdGicRedistributorsBase);
>> + VirtualMemoryTable[Index].VirtualBase = PcdGet64(PcdGicRedistributorsBase);
>> + VirtualMemoryTable[Index].Length = GICR_SZ;
>> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> + // PCIe RP
>> + VirtualMemoryTable[++Index].PhysicalBase = PcdGet64(PcdPcieRootPortBaseAddress);
>> + VirtualMemoryTable[Index].VirtualBase = PcdGet64(PcdPcieRootPortBaseAddress);
>> + VirtualMemoryTable[Index].Length = SIZE_8MB;
>> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> + //
>> + // PCI Configuration Space (AXI region)
>> + //
>> + VirtualMemoryTable[++Index].PhysicalBase = PcdGet64 (PcdPciConfigurationSpaceBaseAddress);
>> + VirtualMemoryTable[Index].VirtualBase = PcdGet64 (PcdPciConfigurationSpaceBaseAddress);
>> + VirtualMemoryTable[Index].Length = PcdGet64 (PcdPciConfigurationSpaceSize);
>> + VirtualMemoryTable[Index].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
>> +
>> + // End of Table
>> + VirtualMemoryTable[++Index].PhysicalBase = 0;
>> + VirtualMemoryTable[Index].VirtualBase = 0;
>> + VirtualMemoryTable[Index].Length = 0;
>> + VirtualMemoryTable[Index].Attributes = (ARM_MEMORY_REGION_ATTRIBUTES)0;
>> +
>> + ASSERT(Index < MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS);
>> +
>> + *VirtualMemoryMap = VirtualMemoryTable;
>> +}
>> diff --git a/CadencePkg/Library/CadenceCspLib/CadenceCspLibSec.inf b/CadencePkg/Library/CadenceCspLib/CadenceCspLibSec.inf
>> new file mode 100644
>> index 0000000..dd6c5c3
>> --- /dev/null
>> +++ b/CadencePkg/Library/CadenceCspLib/CadenceCspLibSec.inf
>> @@ -0,0 +1,52 @@
>> +#/* @file
>> +# Copyright (c) 2011-2012, ARM Limited. All rights reserved.
>> +# Copyright (c) 2017, Cadence Design Systems, Inc. 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 = 1.25
>> + BASE_NAME = CadenceCspLibSec
>> + FILE_GUID = 3008d873-1400-48d8-abda-6ac9cce97246
>> + MODULE_TYPE = BASE
>> + VERSION_STRING = 1.0
>> + LIBRARY_CLASS = ArmPlatformLib
>> +
>> +[Packages]
>> + ArmPkg/ArmPkg.dec
>> + ArmPlatformPkg/ArmPlatformPkg.dec
>> + CadencePkg/CadenceCspPkg.dec
>> + MdeModulePkg/MdeModulePkg.dec
>> + MdePkg/MdePkg.dec
>> +
>> +[LibraryClasses]
>> + ArmLib
>> + DebugLib
>> +
>> +[Sources.common]
>> + CadenceCspLib.c
>> +
>> +[Sources.AARCH64]
>> + AArch64/ArmPlatformHelper.S
>> +
>> +[FixedPcd]
>> + gArmTokenSpaceGuid.PcdSystemMemoryBase
>> + gArmTokenSpaceGuid.PcdSystemMemorySize
>> + gArmTokenSpaceGuid.PcdFvBaseAddress
>> +
>> + gArmTokenSpaceGuid.PcdArmPrimaryCoreMask
>> + gArmTokenSpaceGuid.PcdArmPrimaryCore
>> +
>> + gCadenceCspTokenSpaceGuid.PcdCspSysRegBase
>> + gCadenceCspTokenSpaceGuid.PcdCspSysRegSize
>> +
>> +[Ppis]
>> + gArmMpCoreInfoPpiGuid
>> diff --git a/CadencePkg/Library/CadenceCspResetSystemLib/CadenceCspResetSystemLib.c b/CadencePkg/Library/CadenceCspResetSystemLib/CadenceCspResetSystemLib.c
>> new file mode 100644
>> index 0000000..20ea1a6
>> --- /dev/null
>> +++ b/CadencePkg/Library/CadenceCspResetSystemLib/CadenceCspResetSystemLib.c
>> @@ -0,0 +1,82 @@
>> +/** @file
>> + Library to support ResetSystem Runtime call.
>> +
>> + Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
>> + Copyright (c) 2013, ARM Ltd. All rights reserved.<BR>
>> + Copyright (c) 2017, Cadence Design Systems, Inc. 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 <PiDxe.h>
>> +
>> +#include <Library/BaseLib.h>
>> +#include <Library/CspSysReg.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/EfiResetSystemLib.h>
>> +#include <Library/IoLib.h>
>> +#include <Library/PcdLib.h>
>> +
>> +/**
>> + Resets the entire platform.
>> +
>> + @param ResetType The type of reset to perform.
>> + @param ResetStatus The status code for the reset.
>> + @param DataSize The size, in bytes, of WatchdogData.
>> + @param ResetData For a ResetType of EfiResetCold, EfiResetWarm, or
>> + EfiResetShutdown the data buffer starts with a Null-terminated
>> + Unicode string, optionally followed by additional binary data.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +LibResetSystem (
>> + IN EFI_RESET_TYPE ResetType,
>> + IN EFI_STATUS ResetStatus,
>> + IN UINTN DataSize,
>> + IN CHAR16 *ResetData OPTIONAL
>> + )
>> +{
>> + switch (ResetType) {
>> + case EfiResetPlatformSpecific:
>> + // Map the platform specific reset as reboot
>> + case EfiResetWarm:
>> + // Map a warm reset into a cold reset
>> + case EfiResetShutdown:
>> + // Map a shutdown into a cold reset
>> + case EfiResetCold:
>> + MmioWrite16((PcdGet64(PcdCspSysRegBase) + CSP_SYSREG_SW_RESET), 0xDEAD);
>> + break;
>> + default:
>> + return EFI_INVALID_PARAMETER;
>> + }
>> +
>> + ASSERT(FALSE);
>> + return EFI_UNSUPPORTED;
>> +}
>> +
>> +/**
>> + Initialize any infrastructure required for LibResetSystem () to function.
>> +
>> + @param ImageHandle The firmware allocated handle for the EFI image.
>> + @param SystemTable A pointer to the EFI System Table.
>> +
>> + @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.
>> +
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +LibInitializeResetSystem (
>> + IN EFI_HANDLE ImageHandle,
>> + IN EFI_SYSTEM_TABLE *SystemTable
>> + )
>> +{
>> + return EFI_SUCCESS;
>> +}
>> diff --git a/CadencePkg/Library/CadenceCspResetSystemLib/CadenceCspResetSystemLib.inf b/CadencePkg/Library/CadenceCspResetSystemLib/CadenceCspResetSystemLib.inf
>> new file mode 100644
>> index 0000000..66491ee
>> --- /dev/null
>> +++ b/CadencePkg/Library/CadenceCspResetSystemLib/CadenceCspResetSystemLib.inf
>> @@ -0,0 +1,40 @@
>> +#/** @file
>> +# Library to support ResetSystem Runtime call.
>> +#
>> +# Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
>> +# Copyright (c) 2017, Cadence Design Systems, Inc. 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 = 1.25
>> + BASE_NAME = CadenceCspResetSystemLib
>> + FILE_GUID = 4b1bc734-7534-4baa-b33f-7f5caa743996
>> + MODULE_TYPE = BASE
>> + VERSION_STRING = 1.0
>> + LIBRARY_CLASS = EfiResetSystemLib
>> +
>> +
>> +[Sources.common]
>> + CadenceCspResetSystemLib.c
>> +
>> +[Packages]
>> + CadencePkg/CadenceCspPkg.dec
>> + EmbeddedPkg/EmbeddedPkg.dec
>> + MdePkg/MdePkg.dec
>> +
>> +[LibraryClasses]
>> + IoLib
>> + DebugLib
>> + PcdLib
>> +
>> +[FixedPcd]
>> + gCadenceCspTokenSpaceGuid.PcdCspSysRegBase
>> diff --git a/CadencePkg/Library/CadenceCspSecLib/AArch64/CspBoot.S b/CadencePkg/Library/CadenceCspSecLib/AArch64/CspBoot.S
>> new file mode 100644
>> index 0000000..f0f411e
>> --- /dev/null
>> +++ b/CadencePkg/Library/CadenceCspSecLib/AArch64/CspBoot.S
>> @@ -0,0 +1,49 @@
>> +//
>> +// Copyright (c) 2011 - 2014, ARM Limited. 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 <AsmMacroIoLibV8.h>
>> +#include <Base.h>
>> +#include <Library/ArmPlatformLib.h>
>> +#include <AutoGen.h>
>> +
>> +.text
>> +.align 3
>> +
>> +GCC_ASM_EXPORT(ArmPlatformSecBootAction)
>> +GCC_ASM_EXPORT(ArmPlatformSecBootMemoryInit)
>> +
>> +/**
>> + Call at the beginning of the platform boot up
>> +
>> + This function allows the firmware platform to do extra actions at the early
>> + stage of the platform power up.
>> +
>> + Note: This function must be implemented in assembler as there is no stack set up yet
>> +
>> +**/
>> +ASM_PFX(ArmPlatformSecBootAction):
>> + ret
>> +
>> +/**
>> + Initialize the memory where the initial stacks will reside
>> +
>> + This memory can contain the initial stacks (Secure and Secure Monitor stacks).
>> + In some platform, this region is already initialized and the implementation of this function can
>> + do nothing. This memory can also represent the Secure RAM.
>> + This function is called before the satck has been set up. Its implementation must ensure the stack
>> + pointer is not used (probably required to use assembly language)
>> +
>> +**/
>> +ASM_PFX(ArmPlatformSecBootMemoryInit):
>> + // The SMC does not need to be initialized for RTSM
>> + ret
>> diff --git a/CadencePkg/Library/CadenceCspSecLib/AArch64/GicV3.S b/CadencePkg/Library/CadenceCspSecLib/AArch64/GicV3.S
>> new file mode 100644
>> index 0000000..e136a8d
>> --- /dev/null
>> +++ b/CadencePkg/Library/CadenceCspSecLib/AArch64/GicV3.S
>> @@ -0,0 +1,67 @@
>> +//
>> +// Copyright (c) 2013-2014, ARM Limited. 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 <AsmMacroIoLibV8.h>
>> +#include <Chipset/AArch64.h>
>> +
>> +#ifndef __clang__
>> +// Register definitions used by GCC for GICv3 access.
>> +// These are defined by ARMCC, so keep them in the GCC specific code for now.
>> +#define ICC_SRE_EL2 S3_4_C12_C9_5
>> +#define ICC_SRE_EL3 S3_6_C12_C12_5
>> +#define ICC_CTLR_EL1 S3_0_C12_C12_4
>> +#define ICC_CTLR_EL3 S3_6_C12_C12_4
>> +#define ICC_PMR_EL1 S3_0_C4_C6_0
>> +#endif
>> +
>> +.text
>> +.align 3
>> +
>> +GCC_ASM_EXPORT(InitializeGicV3)
>> +
>> +/* Initialize GICv3 */
>> +ASM_PFX(InitializeGicV3):
>> + // In order to setup NS side we need to enable it first.
>> + mrs x0, scr_el3
>> + orr x0, x0, #1
>> + msr scr_el3, x0
>> +
>> + // Enable SRE at EL3 and ICC_SRE_EL2 access
>> + mov x0, #((1 << 3) | (1 << 0)) // Enable | SRE
>> + mrs x1, ICC_SRE_EL3
>> + orr x1, x1, x0
>> + msr ICC_SRE_EL3, x1
>> + isb
>> +
>> + // Enable SRE at EL2 and ICC_SRE_EL1 access..
>> + mrs x1, ICC_SRE_EL2
>> + orr x1, x1, x0
>> + msr ICC_SRE_EL2, x1
>> + isb
>> +
>> + // Configure CPU interface
>> + msr ICC_CTLR_EL3, xzr
>> + isb
>> + msr ICC_CTLR_EL1, xzr
>> + isb
>> +
>> + // The MemoryMap view and Register view may not be consistent, So Set PMR again.
>> + mov w1, #1 << 7 // allow NS access to GICC_PMR
>> + msr ICC_PMR_EL1, x1
>> + isb
>> +
>> + // Remove the SCR.NS bit
>> + mrs x0, scr_el3
>> + and x0, x0, #~SCR_NS
>> + msr scr_el3, x0
>> + ret
>> diff --git a/CadencePkg/Library/CadenceCspSecLib/CadenceCspSecLib.inf b/CadencePkg/Library/CadenceCspSecLib/CadenceCspSecLib.inf
>> new file mode 100644
>> index 0000000..1603ed1
>> --- /dev/null
>> +++ b/CadencePkg/Library/CadenceCspSecLib/CadenceCspSecLib.inf
>> @@ -0,0 +1,44 @@
>> +#/* @file
>> +# Copyright (c) 2011-2013, ARM Limited. All rights reserved.
>> +# Copyright (c) 2017, Cadence Design Systems, Inc. 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 = 1.25
>> + BASE_NAME = CadenceCspSecLib
>> + FILE_GUID = 07a2577e-43fb-40d9-9833-415cb7feefab
>> + MODULE_TYPE = BASE
>> + VERSION_STRING = 1.0
>> + LIBRARY_CLASS = ArmPlatformSecLib
>> +
>> +[Packages]
>> + ArmPkg/ArmPkg.dec
>> + ArmPlatformPkg/ArmPlatformPkg.dec
>> + EmbeddedPkg/EmbeddedPkg.dec
>> + MdeModulePkg/MdeModulePkg.dec
>> + MdePkg/MdePkg.dec
>> +
>> +[LibraryClasses]
>> + IoLib
>> + ArmLib
>> + SerialPortLib
>> +
>> +[Sources.common]
>> + CspSec.c
>> +
>> +[Sources.AARCH64]
>> + AArch64/CspBoot.S
>> + AArch64/GicV3.S
>> +
>> +[FixedPcd]
>> + gArmTokenSpaceGuid.PcdFvBaseAddress
>> + gArmTokenSpaceGuid.PcdGicInterruptInterfaceBase
>> diff --git a/CadencePkg/Library/CadenceCspSecLib/CspSec.c b/CadencePkg/Library/CadenceCspSecLib/CspSec.c
>> new file mode 100644
>> index 0000000..7ef45c0
>> --- /dev/null
>> +++ b/CadencePkg/Library/CadenceCspSecLib/CspSec.c
>> @@ -0,0 +1,79 @@
>> +/** @file
>> +*
>> +* Copyright (c) 2011-2014, ARM Limited. All rights reserved.
>> +* Copyright (c) 2017, Cadence Design Systems, Inc. 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 <Library/ArmGicLib.h>
>> +#include <Library/ArmPlatformLib.h>
>> +#include <Library/DebugLib.h>
>> +#include <Library/IoLib.h>
>> +#include <Library/PcdLib.h>
>> +
>> +// Initialize GICv3
>> +VOID
>> +InitializeGicV3 (
>> + VOID
>> + );
>> +
>> +/**
>> + Initialize the Secure peripherals and memory regions
>> +
>> + If Trustzone is supported by your platform then this function makes the required initialization
>> + of the secure peripherals and memory regions.
>> +
>> +**/
>> +VOID
>> +ArmPlatformSecTrustzoneInit (
>> + IN UINTN MpId
>> + )
>> +{
>> + // No TZPC or TZASC on RTSM to initialize
>> +}
>> +
>> +/**
>> + Initialize controllers that must setup at the early stage
>> +
>> + Some peripherals must be initialized in Secure World.
>> + For example, some L2x0 requires to be initialized in Secure World
>> +
>> +**/
>> +RETURN_STATUS
>> +ArmPlatformSecInitialize (
>> + IN UINTN MpId
>> + )
>> +{
>> + // If it is not the primary core then there is nothing to do
>> + if (!ArmPlatformIsPrimaryCore (MpId)) {
>> + return RETURN_SUCCESS;
>> + }
>> +
>> + InitializeGicV3 ();
>> +
>> + return RETURN_SUCCESS;
>> +}
>> +
>> +/**
>> + Call before jumping to Normal World
>> +
>> + This function allows the firmware platform to do extra actions before
>> + jumping to the Normal World
>> +
>> +**/
>> +VOID
>> +ArmPlatformSecExtraAction (
>> + IN UINTN MpId,
>> + OUT UINTN* JumpAddress
>> + )
>> +{
>> + *JumpAddress = PcdGet64 (PcdFvBaseAddress);
>> +}
>> --
>> 2.2.2
>>
next prev parent reply other threads:[~2017-06-23 18:35 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-22 9:31 [staging/cadence-aarch64 PATCH v3 0/6] CadencePkg: Add package for Cadence hardware IP support Scott Telford
2017-06-22 9:31 ` [staging/cadence-aarch64 PATCH v3 1/6] CadencePkg: Add libraries for Cadence CSP platform Scott Telford
2017-06-22 14:50 ` Leif Lindholm
2017-06-23 18:37 ` Ard Biesheuvel [this message]
2017-06-22 9:31 ` [staging/cadence-aarch64 PATCH v3 2/6] CadencePkg: Add library for Cadence UART Scott Telford
2017-06-22 15:02 ` Leif Lindholm
2017-06-23 18:38 ` Ard Biesheuvel
2017-06-22 9:31 ` [staging/cadence-aarch64 PATCH v3 3/6] CadencePkg: Add PCI host bridge library for Cadence PCIe Root Complex Scott Telford
2017-06-22 15:12 ` Leif Lindholm
2017-06-23 18:43 ` Ard Biesheuvel
2017-06-22 9:31 ` [staging/cadence-aarch64 PATCH v3 4/6] CadencePkg: Add SEC phase implementation for Cadence CSP platform Scott Telford
2017-06-22 15:21 ` Leif Lindholm
2017-06-23 18:43 ` Ard Biesheuvel
2017-06-22 9:32 ` [staging/cadence-aarch64 PATCH v3 5/6] CadencePkg: Add ACPI tables " Scott Telford
2017-06-29 16:17 ` Leif Lindholm
2017-06-22 9:32 ` [staging/cadence-aarch64 PATCH v3 6/6] CadencePkg: Add .dsc, .fdf and .dec files " Scott Telford
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAKv+Gu-gtSDwq7Vsrp0hux=XnbULNKdp6BPkedALriD+zh1Oog@mail.gmail.com' \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox