On Mon, Jun 05, 2017 at 03:12:34PM +0000, Ard Biesheuvel wrote:
> Hi Scott,
> 
> On 5 June 2017 at 10:50, Scott Telford <stelf...@cadence.com> 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.
> >
> 
> If I am reading the code correctly, this UEFI port may execute under
> ATF or may be booted at EL3 directly, right? In the former case, you
> should really be using PSCI for reset instead of poking the system
> registers directly.
> 
> 
> > Contributed-under: TianoCore Contribution Agreement 1.0
> > Signed-off-by: Scott Telford <stelf...@cadence.com>
> > ---
> >  CadencePkg/Include/Library/CspSysReg.h             |  37 ++++++
> >  .../CadenceCspLib/AArch64/ArmPlatformHelper.S      |  62 +++++++++
> >  CadencePkg/Library/CadenceCspLib/CadenceCspLib.c   | 135 
> > +++++++++++++++++++
> >  CadencePkg/Library/CadenceCspLib/CadenceCspLib.inf |  76 +++++++++++
> >  .../Library/CadenceCspLib/CadenceCspLibMem.c       | 145 
> > +++++++++++++++++++++
> >  .../Library/CadenceCspLib/CadenceCspLibSec.inf     |  52 ++++++++
> >  .../CadenceCspResetSystemLib.c                     |  83 ++++++++++++
> >  .../CadenceCspResetSystemLib.inf                   |  40 ++++++
> >  .../Library/CadenceCspSecLib/AArch64/CspBoot.S     |  63 +++++++++
> >  .../Library/CadenceCspSecLib/AArch64/GicV3.S       |  70 ++++++++++
> >  .../Library/CadenceCspSecLib/CadenceCspSecLib.inf  |  44 +++++++
> >  CadencePkg/Library/CadenceCspSecLib/CspSec.c       |  79 +++++++++++
> >  12 files changed, 886 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..56af563
> > --- /dev/null
> > +++ b/CadencePkg/Library/CadenceCspLib/AArch64/ArmPlatformHelper.S
> > @@ -0,0 +1,62 @@
> > +//
> > +//  Copyright (c) 2012-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>
> > +
> > +.text
> > +.align 2
> > +
> > +GCC_ASM_EXPORT(ArmPlatformPeiBootAction)
> > +GCC_ASM_EXPORT(ArmPlatformGetCorePosition)
> > +GCC_ASM_EXPORT(ArmPlatformGetPrimaryCoreMpId)
> > +GCC_ASM_EXPORT(ArmPlatformIsPrimaryCore)
> > +
> > +GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCore)
> > +GCC_ASM_IMPORT(_gPcd_FixedAtBuild_PcdArmPrimaryCoreMask)
> > +
> 
> No need for imports.
> 
> > +ASM_PFX(ArmPlatformPeiBootAction):
> > +  ret
> > +
> > +//UINTN
> > +//ArmPlatformGetCorePosition (
> > +//  IN UINTN MpId
> > +//  );
> > +// With this function: CorePos = (ClusterId * 4) + CoreId
> > +ASM_PFX(ArmPlatformGetCorePosition):
> > +  and   x1, x0, #ARM_CORE_MASK
> > +  and   x0, x0, #ARM_CLUSTER_MASK
> > +  add   x0, x1, x0, LSR #6
> > +  ret
> > +
> > +//UINTN
> > +//ArmPlatformGetPrimaryCoreMpId (
> > +//  VOID
> > +//  );
> > +ASM_PFX(ArmPlatformGetPrimaryCoreMpId):
> > +  MOV32 (w0, FixedPcdGet32(PcdArmPrimaryCore))
> > +  ret
> > +
> > +//UINTN
> > +//ArmPlatformIsPrimaryCore (
> > +//  IN UINTN MpId
> > +//  );
> > +ASM_PFX(ArmPlatformIsPrimaryCore):
> > +  MOV32 (w1, FixedPcdGet32(PcdArmPrimaryCoreMask))
> > +  and   x0, x0, x1
> > +  MOV32 (w1, FixedPcdGet32(PcdArmPrimaryCore))
> > +  cmp   w0, w1
> > +  mov   x0, #1
> > +  mov   x1, #0
> > +  csel  x0, x0, x1, eq
> > +  ret
> 
> This looks like the old, clunky default implementation which we
> replaced in the mean time. Mind replacing that?
> 
> > diff --git a/CadencePkg/Library/CadenceCspLib/CadenceCspLib.c 
> > b/CadencePkg/Library/CadenceCspLib/CadenceCspLib.c
> > new file mode 100644
> > index 0000000..8a985ec
> > --- /dev/null
> > +++ b/CadencePkg/Library/CadenceCspLib/CadenceCspLib.c
> > @@ -0,0 +1,135 @@
> > +/** @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
> > +  )
> > +{
> > +  //TODO: Implement me
> 
> No TODOs please. Either put something there, or leave it empty.
> 
> > +}
> > +
> 
> 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;
> > +  }
> > +}
> > +
> > +// Needs to be declared in the file. Otherwise gArmMpCoreInfoPpiGuid is 
> > undefined in the contect of PrePeiCore
> > +EFI_GUID mArmMpCoreInfoPpiGuid = ARM_MP_CORE_INFO_PPI_GUID;
> 
> This is also cargo culted nonsense. Please sync with EDK2 master.
> 
> > +ARM_MP_CORE_INFO_PPI mMpCoreInfoPpi = { PrePeiCoreGetMpCoreInfo };
> > +
> STATIC
> 
> > +EFI_PEI_PPI_DESCRIPTOR      gPlatformPpiTable[] = {
> STATIC
> 
> > +  {
> > +    EFI_PEI_PPI_DESCRIPTOR_PPI,
> > +    &mArmMpCoreInfoPpiGuid,
> > +    &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..b2c6440
> > --- /dev/null
> > +++ b/CadencePkg/Library/CadenceCspLib/CadenceCspLib.inf
> > @@ -0,0 +1,76 @@
> > +#/* @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
> > +
> > +[FeaturePcd]
> > +  gEmbeddedTokenSpaceGuid.PcdCacheEnable
> > +
> 
> We should get rid of this: modern ARM requires the cache to be enabled
> for coherent DMA and atomics, so disabling it does not make a lot of
> sense. Could you please drop it, and remove the references to it from
> the code? We will do this at some point for the upstream as well, at
> least for AARCH64.

Wasn't this a crazy "debug" feature?
Yes, if there is nothing special in your model setup that requires
this, please drop. (And if there is, please let us know what.)

> > +[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.PcdPcie1RootPortBaseAddress
> > +  gCadenceCspTokenSpaceGuid.PcdPcieRootPortBaseAddress
> > +  gCadenceCspTokenSpaceGuid.PcdPciConfigurationSpaceBaseAddress
> > +  gCadenceCspTokenSpaceGuid.PcdPciConfigurationSpaceSize
> > +  gArmTokenSpaceGuid.PcdPciMmio32Base
> > +  gArmTokenSpaceGuid.PcdPciMmio32Size
> > +  gArmTokenSpaceGuid.PcdPciMmio64Base
> > +  gArmTokenSpaceGuid.PcdPciMmio64Size
> > diff --git a/CadencePkg/Library/CadenceCspLib/CadenceCspLibMem.c 
> > b/CadencePkg/Library/CadenceCspLib/CadenceCspLibMem.c
> > new file mode 100644
> > index 0000000..12cd6a5
> > --- /dev/null
> > +++ b/CadencePkg/Library/CadenceCspLib/CadenceCspLibMem.c
> > @@ -0,0 +1,145 @@
> > +/** @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
> > +
> > +// DDR attributes
> > +#define DDR_ATTRIBUTES_CACHED           
> > ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK
> > +#define DDR_ATTRIBUTES_UNCACHED         
> > ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED
> > +
> > +/**
> > +  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
> > +  )
> > +{
> > +  ARM_MEMORY_REGION_ATTRIBUTES  CacheAttributes;
> > +  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;
> > +  }
> > +
> > +  CacheAttributes = (FeaturePcdGet(PcdCacheEnable))
> > +                    ? DDR_ATTRIBUTES_CACHED
> > +                    : DDR_ATTRIBUTES_UNCACHED;
> > +
> > +  // SRAM
> > +  VirtualMemoryTable[Index].PhysicalBase = PcdGet64(PcdSystemMemoryBase);
> > +  VirtualMemoryTable[Index].VirtualBase  = PcdGet64(PcdSystemMemoryBase);
> > +  VirtualMemoryTable[Index].Length       = PcdGet64(PcdSystemMemorySize);
> > +  VirtualMemoryTable[Index].Attributes   = CacheAttributes;
> > +
> > +  // 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   = CacheAttributes;
> > +
> > +  // UEFI ROM (Normal)
> > +  VirtualMemoryTable[++Index].PhysicalBase = PcdGet64(PcdFdBaseAddress);
> > +  VirtualMemoryTable[Index].VirtualBase  = PcdGet64(PcdFdBaseAddress);
> > +  VirtualMemoryTable[Index].Length       = PcdGet32(PcdFdSize);
> > +  VirtualMemoryTable[Index].Attributes   = CacheAttributes;
> > +
> > +  // 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       = 0x10000;
> 
> No bare constants please
> 
> > +  VirtualMemoryTable[Index].Attributes   = 
> > ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
> > +
> > +  // GIC Redistributor
> > +  VirtualMemoryTable[++Index].PhysicalBase = 
> > PcdGet64(PcdGicRedistributorsBase);
> > +  VirtualMemoryTable[Index].VirtualBase  = 
> > PcdGet64(PcdGicRedistributorsBase);
> > +  VirtualMemoryTable[Index].Length       = 0x20000;
> 
> Idem.
> 
> > +  VirtualMemoryTable[Index].Attributes   = 
> > ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
> > +
> > +  // PCIe RP
> > +  VirtualMemoryTable[++Index].PhysicalBase = 
> > PcdGet64(PcdPcieRootPortBaseAddress);
> > +  VirtualMemoryTable[Index].VirtualBase  = 
> > PcdGet64(PcdPcieRootPortBaseAddress);
> > +  VirtualMemoryTable[Index].Length       = 0x00800000;
> > +  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;
> > +
> > +  //
> > +  // PCI Memory Space
> > +  //
> > +  VirtualMemoryTable[++Index].PhysicalBase  = PcdGet32 (PcdPciMmio32Base);
> > +  VirtualMemoryTable[Index].VirtualBase     = PcdGet32 (PcdPciMmio32Base);
> > +  VirtualMemoryTable[Index].Length          = PcdGet32 (PcdPciMmio32Size);
> > +  VirtualMemoryTable[Index].Attributes      = 
> > ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
> > +
> 
> BARs that get allocated in this region will be mapped on demand by the
> PCI DXE driver, so there is no need to create a mapping for the entire
> region here.
> 
> > +  //
> > +  // 64-bit PCI Memory Space
> > +  //
> > +  VirtualMemoryTable[++Index].PhysicalBase  = PcdGet64 (PcdPciMmio64Base);
> > +  VirtualMemoryTable[Index].VirtualBase     = PcdGet64 (PcdPciMmio64Base);
> > +  VirtualMemoryTable[Index].Length          = PcdGet64 (PcdPciMmio64Size);
> > +  VirtualMemoryTable[Index].Attributes      = 
> > ARM_MEMORY_REGION_ATTRIBUTE_DEVICE;
> > +
> 
> Same here.
> 
> > +  // PCIe EP
> > +  VirtualMemoryTable[++Index].PhysicalBase = 
> > PcdGet64(PcdPcie1RootPortBaseAddress);
> > +  VirtualMemoryTable[Index].VirtualBase  = 
> > PcdGet64(PcdPcie1RootPortBaseAddress);
> > +  VirtualMemoryTable[Index].Length       = 0x00800000;
> > +  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..144fa9f
> > --- /dev/null
> > +++ b/CadencePkg/Library/CadenceCspResetSystemLib/CadenceCspResetSystemLib.c
> > @@ -0,0 +1,83 @@
> > +/** @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 EfiResetCold:
> > +    MmioWrite16((PcdGet64(PcdCspSysRegBase) + CSP_SYSREG_SW_RESET), 
> > 0xDEAD);
> > +    break;
> > +  case EfiResetShutdown:
> > +    // XXX TODO
> 
> Another TODO. Note that 'shutdown' will now completely be ignored by
> the firmware on RELEASE builds, and will return all the way back to
> the OS. Perhaps we should deal with this in upper layers as well, but
> for now, it would be better not to ignore it here.

I would lean towards one of
  while (1) {
    ArmCallWFI();
  }
or falling back to the cold reset.

/
    Leif

> > +    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..ae0d66b
> > --- /dev/null
> > +++ b/CadencePkg/Library/CadenceCspSecLib/AArch64/CspBoot.S
> > @@ -0,0 +1,63 @@
> > +//
> > +//  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)
> > +GCC_ASM_EXPORT(ArmSecMpCoreSecondariesWrite)
> > +GCC_ASM_EXPORT(ArmSecMpCoreSecondariesRead)
> > +
> > +/**
> > +  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
> > +
> > +/* Write the flag register used to start Secondary cores */
> > +ASM_PFX(ArmSecMpCoreSecondariesWrite):
> > +  // Write to the CPU Mailbox
> > +  ret
> > +
> > +/* Read the flag register used to start Secondary cores */
> > +ASM_PFX(ArmSecMpCoreSecondariesRead):
> > +  // Return the value from the CPU Mailbox
> > +  mov x0, #0
> > +  ret
> > +
> 
> What is the point of these? Do all cores enter EL3 when booting without ATF?
> 
> > diff --git a/CadencePkg/Library/CadenceCspSecLib/AArch64/GicV3.S 
> > b/CadencePkg/Library/CadenceCspSecLib/AArch64/GicV3.S
> > new file mode 100644
> > index 0000000..035e095
> > --- /dev/null
> > +++ b/CadencePkg/Library/CadenceCspSecLib/AArch64/GicV3.S
> > @@ -0,0 +1,70 @@
> > +//
> > +//  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 to expose it as a GICv2 as UEFI does not support GICv3 
> > yet */
> > +ASM_PFX(InitializeGicV3):
> > +  // We have a GICv3. UEFI still uses the GICv2 mode. We must do enough 
> > setup
> > +  // to allow Linux to use GICv3 if it chooses.
> > +
> 
> As Leif pointed out, these comments seem a bit out of date.
> 
> > +  // 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
> 
> Is this really all configuration that needs to be done at EL3 to put
> the GIC in a well defined state?
> 
> > 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..65eedb4
> > --- /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 to expose it as a GICv2 as UEFI does not support GICv3 
> > yet
> > +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
> >
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to