3 * Copyright (c) 2011, ARM Limited. All rights reserved.
5 * This program and the accompanying materials
6 * are licensed and made available under the terms and conditions of the BSD License
7 * which accompanies this distribution. The full text of the license may be found at
8 * http://opensource.org/licenses/bsd-license.php
10 * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include <Library/IoLib.h>
16 #include <Library/ArmTrustZoneLib.h>
17 #include <Library/ArmPlatformLib.h>
18 #include <Library/DebugLib.h>
19 #include <Library/PcdLib.h>
20 #include <Library/SerialPortLib.h>
22 #include <Drivers/PL341Dmc.h>
23 #include <Drivers/PL301Axi.h>
24 #include <Drivers/PL310L2Cache.h>
25 #include <Drivers/SP804Timer.h>
27 #define SerialPrint(txt) SerialPortWrite (txt, AsciiStrLen(txt)+1);
30 PL341_DMC_CONFIG DDRTimings
= {
31 .base
= ARM_VE_DMC_BASE
,
32 .phy_ctrl_base
= 0x0, //There is no DDR2 PHY controller on CTA9 test chip
35 .User0Cfg
= 0x7C924924,
36 .User2Cfg
= (TC_UIOLHXC_VALUE
<< TC_UIOLHNC_SHIFT
) | (TC_UIOLHXC_VALUE
<< TC_UIOLHPC_SHIFT
) | (0x1 << TC_UIOHOCT_SHIFT
) | (0x1 << TC_UIOHSTOP_SHIFT
),
53 .MemoryCfg
= DMC_MEMORY_CONFIG_ACTIVE_CHIP_1
| DMC_MEMORY_CONFIG_BURST_4
|
54 DMC_MEMORY_CONFIG_ROW_ADDRESS_15
| DMC_MEMORY_CONFIG_COLUMN_ADDRESS_10
,
55 .MemoryCfg2
= DMC_MEMORY_CFG2_DQM_INIT
| DMC_MEMORY_CFG2_CKE_INIT
|
56 DMC_MEMORY_CFG2_BANK_BITS_3
| DMC_MEMORY_CFG2_MEM_WIDTH_32
,
57 .MemoryCfg3
= 0x00000001,
58 .ChipCfg0
= 0x00010000,
60 .ModeReg
= DDR2_MR_BURST_LENGTH_4
| DDR2_MR_CAS_LATENCY_4
| DDR2_MR_WR_CYCLES_4
,
61 .ExtModeReg
= DDR_EMR_RTT_50R
| (DDR_EMR_ODS_VAL
<< DDR_EMR_ODS_MASK
),
65 Return if Trustzone is supported by your platform
67 A non-zero value must be returned if you want to support a Secure World on your platform.
68 ArmVExpressTrustzoneInit() will later set up the secure regions.
69 This function can return 0 even if Trustzone is supported by your processor. In this case,
70 the platform will continue to run in Secure World.
72 @return A non-zero value if Trustzone supported.
76 ArmPlatformTrustzoneSupported (
80 return (MmioRead32(ARM_VE_SYS_CFGRW1_REG
) & ARM_VE_CFGRW1_TZASC_EN_BIT_MASK
);
84 Initialize the Secure peripherals and memory regions
86 If Trustzone is supported by your platform then this function makes the required initialization
87 of the secure peripherals and memory regions.
90 VOID
ArmPlatformTrustzoneInit(VOID
) {
92 // Setup TZ Protection Controller
95 // Set Non Secure access for all devices
96 TZPCSetDecProtBits(ARM_VE_TZPC_BASE
, TZPC_DECPROT_0
, 0xFFFFFFFF);
97 TZPCSetDecProtBits(ARM_VE_TZPC_BASE
, TZPC_DECPROT_1
, 0xFFFFFFFF);
98 TZPCSetDecProtBits(ARM_VE_TZPC_BASE
, TZPC_DECPROT_2
, 0xFFFFFFFF);
100 // Remove Non secure access to secure devices
101 TZPCClearDecProtBits(ARM_VE_TZPC_BASE
, TZPC_DECPROT_0
,
102 ARM_VE_DECPROT_BIT_TZPC
| ARM_VE_DECPROT_BIT_DMC_TZASC
| ARM_VE_DECPROT_BIT_NMC_TZASC
| ARM_VE_DECPROT_BIT_SMC_TZASC
);
104 TZPCClearDecProtBits(ARM_VE_TZPC_BASE
, TZPC_DECPROT_2
,
105 ARM_VE_DECPROT_BIT_EXT_MAST_TZ
| ARM_VE_DECPROT_BIT_DMC_TZASC_LOCK
| ARM_VE_DECPROT_BIT_NMC_TZASC_LOCK
| ARM_VE_DECPROT_BIT_SMC_TZASC_LOCK
);
109 // Setup TZ Address Space Controller for the SMC. Create 5 Non Secure regions (NOR0, NOR1, SRAM, SMC Peripheral regions)
112 // NOR Flash 0 non secure (BootMon)
113 TZASCSetRegion(ARM_VE_TZASC_BASE
,1,TZASC_REGION_ENABLED
,
114 ARM_VE_SMB_NOR0_BASE
,0,
115 TZASC_REGION_SIZE_64MB
, TZASC_REGION_SECURITY_NSRW
);
117 // NOR Flash 1. The first half of the NOR Flash1 must be secure for the secure firmware (sec_uefi.bin)
118 #if EDK2_ARMVE_SECURE_SYSTEM
119 //Note: Your OS Kernel must be aware of the secure regions before to enable this region
120 TZASCSetRegion(ARM_VE_TZASC_BASE
,2,TZASC_REGION_ENABLED
,
121 ARM_VE_SMB_NOR1_BASE
+ SIZE_32MB
,0,
122 TZASC_REGION_SIZE_32MB
, TZASC_REGION_SECURITY_NSRW
);
124 TZASCSetRegion(ARM_VE_TZASC_BASE
,2,TZASC_REGION_ENABLED
,
125 ARM_VE_SMB_NOR1_BASE
,0,
126 TZASC_REGION_SIZE_64MB
, TZASC_REGION_SECURITY_NSRW
);
129 // Base of SRAM. Only half of SRAM in Non Secure world
130 // First half non secure (16MB) + Second Half secure (16MB) = 32MB of SRAM
131 #if EDK2_ARMVE_SECURE_SYSTEM
132 //Note: Your OS Kernel must be aware of the secure regions before to enable this region
133 TZASCSetRegion(ARM_VE_TZASC_BASE
,3,TZASC_REGION_ENABLED
,
134 ARM_VE_SMB_SRAM_BASE
,0,
135 TZASC_REGION_SIZE_16MB
, TZASC_REGION_SECURITY_NSRW
);
137 TZASCSetRegion(ARM_VE_TZASC_BASE
,3,TZASC_REGION_ENABLED
,
138 ARM_VE_SMB_SRAM_BASE
,0,
139 TZASC_REGION_SIZE_32MB
, TZASC_REGION_SECURITY_NSRW
);
142 // Memory Mapped Peripherals. All in non secure world
143 TZASCSetRegion(ARM_VE_TZASC_BASE
,4,TZASC_REGION_ENABLED
,
144 ARM_VE_SMB_PERIPH_BASE
,0,
145 TZASC_REGION_SIZE_64MB
, TZASC_REGION_SECURITY_NSRW
);
147 // MotherBoard Peripherals and On-chip peripherals.
148 TZASCSetRegion(ARM_VE_TZASC_BASE
,5,TZASC_REGION_ENABLED
,
149 ARM_VE_SMB_MB_ON_CHIP_PERIPH_BASE
,0,
150 TZASC_REGION_SIZE_256MB
, TZASC_REGION_SECURITY_NSRW
);
154 Return the current Boot Mode
156 This function returns the boot reason on the platform
158 @return Return the current Boot Mode of the platform
162 ArmPlatformGetBootMode (
166 return BOOT_WITH_FULL_CONFIGURATION
;
170 Remap the memory at 0x0
172 Some platform requires or gives the ability to remap the memory at the address 0x0.
173 This function can do nothing if this feature is not relevant to your platform.
177 ArmPlatformBootRemapping (
183 if (FeaturePcdGet(PcdNorFlashRemapping
)) {
184 SerialPrint ("Secure ROM at 0x0\n\r");
186 Value
= MmioRead32(ARM_VE_SYS_CFGRW1_REG
); //Scc - CFGRW1
187 // Remap the DRAM to 0x0
188 MmioWrite32(ARM_VE_SYS_CFGRW1_REG
, (Value
& 0x0FFFFFFF) | ARM_VE_CFGRW1_REMAP_DRAM
);
192 Initialize controllers that must setup at the early stage
194 Some peripherals must be initialized in Secure World.
195 For example, some L2x0 requires to be initialized in Secure World
199 ArmPlatformSecInitialize (
202 // The L2x0 controller must be intialize in Secure World
203 L2x0CacheInit(PcdGet32(PcdL2x0ControllerBase
),
204 PL310_TAG_LATENCIES(L2x0_LATENCY_8_CYCLES
,L2x0_LATENCY_8_CYCLES
,L2x0_LATENCY_8_CYCLES
),
205 PL310_DATA_LATENCIES(L2x0_LATENCY_8_CYCLES
,L2x0_LATENCY_8_CYCLES
,L2x0_LATENCY_8_CYCLES
),
206 0,~0, // Use default setting for the Auxiliary Control Register
211 Initialize controllers that must setup in the normal world
213 This function is called by the ArmPlatformPkg/Pei or ArmPlatformPkg/Pei/PlatformPeim
218 ArmPlatformNormalInitialize (
222 // Configure periodic timer (TIMER0) for 1MHz operation
223 MmioOr32 (SP810_CTRL_BASE
+ SP810_SYS_CTRL_REG
, SP810_SYS_CTRL_TIMER0_TIMCLK
);
224 // Configure 1MHz clock
225 MmioOr32 (SP810_CTRL_BASE
+ SP810_SYS_CTRL_REG
, SP810_SYS_CTRL_TIMER1_TIMCLK
);
226 // configure SP810 to use 1MHz clock and disable
227 MmioAndThenOr32 (SP810_CTRL_BASE
+ SP810_SYS_CTRL_REG
, ~SP810_SYS_CTRL_TIMER2_EN
, SP810_SYS_CTRL_TIMER2_TIMCLK
);
228 // Configure SP810 to use 1MHz clock and disable
229 MmioAndThenOr32 (SP810_CTRL_BASE
+ SP810_SYS_CTRL_REG
, ~SP810_SYS_CTRL_TIMER3_EN
, SP810_SYS_CTRL_TIMER3_TIMCLK
);
233 Initialize the system (or sometimes called permanent) memory
235 This memory is generally represented by the DRAM.
239 ArmPlatformInitializeSystemMemory (
243 PL341DmcInit(&DDRTimings
);
244 PL301AxiInit(ARM_VE_FAXI_BASE
);