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 <Drivers/PL341Dmc.h>
21 #include <Drivers/PL301Axi.h>
22 #include <Library/L2X0CacheLib.h>
23 #include <Library/SerialPortLib.h>
25 #define SerialPrint(txt) SerialPortWrite (txt, AsciiStrLen(txt)+1);
28 struct pl341_dmc_config ddr_timings
= {
29 .base
= ARM_VE_DMC_BASE
,
46 .memory_cfg
= DMC_MEMORY_CONFIG_ACTIVE_CHIP_1
| DMC_MEMORY_CONFIG_BURST_4
|
47 DMC_MEMORY_CONFIG_ROW_ADDRESS_15
| DMC_MEMORY_CONFIG_COLUMN_ADDRESS_10
,
48 .memory_cfg2
= DMC_MEMORY_CFG2_DQM_INIT
| DMC_MEMORY_CFG2_CKE_INIT
|
49 DMC_MEMORY_CFG2_BANK_BITS_3
| DMC_MEMORY_CFG2_MEM_WIDTH_32
,
50 .memory_cfg3
= 0x00000001,
51 .chip_cfg0
= 0x00010000,
56 Return if Trustzone is supported by your platform
58 A non-zero value must be returned if you want to support a Secure World on your platform.
59 ArmVExpressTrustzoneInit() will later set up the secure regions.
60 This function can return 0 even if Trustzone is supported by your processor. In this case,
61 the platform will continue to run in Secure World.
63 @return A non-zero value if Trustzone supported.
66 UINTN
ArmPlatformTrustzoneSupported(VOID
) {
67 return (MmioRead32(ARM_VE_SYS_CFGRW1_REG
) & ARM_VE_CFGRW1_TZASC_EN_BIT_MASK
);
71 Initialize the Secure peripherals and memory regions
73 If Trustzone is supported by your platform then this function makes the required initialization
74 of the secure peripherals and memory regions.
77 VOID
ArmPlatformTrustzoneInit(VOID
) {
79 // Setup TZ Protection Controller
82 // Set Non Secure access for all devices
83 TZPCSetDecProtBits(ARM_VE_TZPC_BASE
, TZPC_DECPROT_0
, 0xFFFFFFFF);
84 TZPCSetDecProtBits(ARM_VE_TZPC_BASE
, TZPC_DECPROT_1
, 0xFFFFFFFF);
85 TZPCSetDecProtBits(ARM_VE_TZPC_BASE
, TZPC_DECPROT_2
, 0xFFFFFFFF);
87 // Remove Non secure access to secure devices
88 TZPCClearDecProtBits(ARM_VE_TZPC_BASE
, TZPC_DECPROT_0
,
89 ARM_VE_DECPROT_BIT_TZPC
| ARM_VE_DECPROT_BIT_DMC_TZASC
| ARM_VE_DECPROT_BIT_NMC_TZASC
| ARM_VE_DECPROT_BIT_SMC_TZASC
);
91 TZPCClearDecProtBits(ARM_VE_TZPC_BASE
, TZPC_DECPROT_2
,
92 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
);
96 // Setup TZ Address Space Controller for the SMC. Create 5 Non Secure regions (NOR0, NOR1, SRAM, SMC Peripheral regions)
99 // NOR Flash 0 non secure (BootMon)
100 TZASCSetRegion(ARM_VE_TZASC_BASE
,1,TZASC_REGION_ENABLED
,
101 ARM_VE_SMB_NOR0_BASE
,0,
102 TZASC_REGION_SIZE_64MB
, TZASC_REGION_SECURITY_NSRW
);
104 // NOR Flash 1. The first half of the NOR Flash1 must be secure for the secure firmware (sec_uefi.bin)
105 #if EDK2_ARMVE_SECURE_SYSTEM
106 //Note: Your OS Kernel must be aware of the secure regions before to enable this region
107 TZASCSetRegion(ARM_VE_TZASC_BASE
,2,TZASC_REGION_ENABLED
,
108 ARM_VE_SMB_NOR1_BASE
+ SIZE_32MB
,0,
109 TZASC_REGION_SIZE_32MB
, TZASC_REGION_SECURITY_NSRW
);
111 TZASCSetRegion(ARM_VE_TZASC_BASE
,2,TZASC_REGION_ENABLED
,
112 ARM_VE_SMB_NOR1_BASE
,0,
113 TZASC_REGION_SIZE_64MB
, TZASC_REGION_SECURITY_NSRW
);
116 // Base of SRAM. Only half of SRAM in Non Secure world
117 // First half non secure (16MB) + Second Half secure (16MB) = 32MB of SRAM
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
,3,TZASC_REGION_ENABLED
,
121 ARM_VE_SMB_SRAM_BASE
,0,
122 TZASC_REGION_SIZE_16MB
, TZASC_REGION_SECURITY_NSRW
);
124 TZASCSetRegion(ARM_VE_TZASC_BASE
,3,TZASC_REGION_ENABLED
,
125 ARM_VE_SMB_SRAM_BASE
,0,
126 TZASC_REGION_SIZE_32MB
, TZASC_REGION_SECURITY_NSRW
);
129 // Memory Mapped Peripherals. All in non secure world
130 TZASCSetRegion(ARM_VE_TZASC_BASE
,4,TZASC_REGION_ENABLED
,
131 ARM_VE_SMB_PERIPH_BASE
,0,
132 TZASC_REGION_SIZE_64MB
, TZASC_REGION_SECURITY_NSRW
);
134 // MotherBoard Peripherals and On-chip peripherals.
135 TZASCSetRegion(ARM_VE_TZASC_BASE
,5,TZASC_REGION_ENABLED
,
136 ARM_VE_SMB_MB_ON_CHIP_PERIPH_BASE
,0,
137 TZASC_REGION_SIZE_256MB
, TZASC_REGION_SECURITY_NSRW
);
141 Return the current Boot Mode
143 This function returns the boot reason on the platform
145 @return Return the current Boot Mode of the platform
149 ArmPlatformGetBootMode (
153 return BOOT_WITH_FULL_CONFIGURATION
;
157 Remap the memory at 0x0
159 Some platform requires or gives the ability to remap the memory at the address 0x0.
160 This function can do nothing if this feature is not relevant to your platform.
163 VOID
ArmPlatformBootRemapping(VOID
) {
164 UINT32 val32
= MmioRead32(ARM_VE_SYS_CFGRW1_REG
); //Scc - CFGRW1
165 // we remap the DRAM to 0x0
166 MmioWrite32(ARM_VE_SYS_CFGRW1_REG
, (val32
& 0x0FFFFFFF) | ARM_VE_CFGRW1_REMAP_DRAM
);
170 Initialize controllers that must setup at the early stage
172 Some peripherals must be initialized in Secure World.
173 For example, some L2x0 requires to be initialized in Secure World
177 ArmPlatformInitialize (
180 // The L2x0 controller must be intialize in Secure World
181 L2x0CacheInit(PcdGet32(PcdL2x0ControllerBase
), FALSE
);
185 Initialize the system (or sometimes called permanent) memory
187 This memory is generally represented by the DRAM.
190 VOID
ArmPlatformInitializeSystemMemory(VOID
) {
191 PL341DmcInit(&ddr_timings
);
192 PL301AxiInit(ARM_VE_FAXI_BASE
);