The FVP Base Model has GICv3 support. UEFI SEC does limited configuration of GICv3 if present. This is required for Linux to use GICv3. UEFI itself uses the GICv3 in legacy mode (GICv2). Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Olivier Martin <olivier.martin@arm.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14824 6f19259b-4bc3-4df7-8a09-765794883524
101 lines
2.8 KiB
C
101 lines
2.8 KiB
C
/** @file
|
|
*
|
|
* 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 <Library/IoLib.h>
|
|
#include <Library/ArmGicLib.h>
|
|
#include <Library/ArmPlatformLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/PcdLib.h>
|
|
|
|
#include <Drivers/PL310L2Cache.h>
|
|
#include <Drivers/SP804Timer.h>
|
|
|
|
#include <ArmPlatform.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
|
|
)
|
|
{
|
|
UINT32 Identification;
|
|
|
|
// If it is not the primary core then there is nothing to do
|
|
if (!ArmPlatformIsPrimaryCore (MpId)) {
|
|
return RETURN_SUCCESS;
|
|
}
|
|
|
|
// Configure periodic timer (TIMER0) for 1MHz operation
|
|
MmioOr32 (SP810_CTRL_BASE + SP810_SYS_CTRL_REG, SP810_SYS_CTRL_TIMER0_TIMCLK);
|
|
// Configure 1MHz clock
|
|
MmioOr32 (SP810_CTRL_BASE + SP810_SYS_CTRL_REG, SP810_SYS_CTRL_TIMER1_TIMCLK);
|
|
// Configure SP810 to use 1MHz clock and disable
|
|
MmioAndThenOr32 (SP810_CTRL_BASE + SP810_SYS_CTRL_REG, ~SP810_SYS_CTRL_TIMER2_EN, SP810_SYS_CTRL_TIMER2_TIMCLK);
|
|
// Configure SP810 to use 1MHz clock and disable
|
|
MmioAndThenOr32 (SP810_CTRL_BASE + SP810_SYS_CTRL_REG, ~SP810_SYS_CTRL_TIMER3_EN, SP810_SYS_CTRL_TIMER3_TIMCLK);
|
|
|
|
// Read the GIC Identification Register
|
|
Identification = MmioRead32 (PcdGet32(PcdGicInterruptInterfaceBase) + ARM_GIC_ICCIDR);
|
|
|
|
// Check if we are GICv3
|
|
if (ARM_GIC_ICCIDR_GET_ARCH_VERSION(Identification) >= 0x3) {
|
|
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 = PcdGet32(PcdFvBaseAddress);
|
|
}
|