]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4.c
ArmPlatformPkg/PL011Uart: Create PL011 UART driver
[mirror_edk2.git] / ArmPlatformPkg / ArmVExpressPkg / Library / ArmVExpressLibCTA9x4 / CTA9x4.c
CommitLineData
1d5d0ae9 1/** @file
2*
3* Copyright (c) 2011, ARM Limited. All rights reserved.
4*
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
9*
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.
12*
13**/
14
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>
8e06b586 21#include <Drivers/PL301Axi.h>
51d191aa 22#include <Drivers/PL310L2Cache.h>
2637d1ef 23#include <Library/SerialPortLib.h>
24
25#define SerialPrint(txt) SerialPortWrite (txt, AsciiStrLen(txt)+1);
1d5d0ae9 26
27// DDR2 timings
8be5d4d6 28PL341_DMC_CONFIG DDRTimings = {
29 .base = ARM_VE_DMC_BASE,
30 .phy_ctrl_base = 0x0, //There is no DDR2 PHY controller on CTA9 test chip
31 .MaxChip = 1,
32 .IsUserCfg = TRUE,
33 .User0Cfg = 0x7C924924,
34 .User2Cfg = (TC_UIOLHXC_VALUE << TC_UIOLHNC_SHIFT) | (TC_UIOLHXC_VALUE << TC_UIOLHPC_SHIFT) | (0x1 << TC_UIOHOCT_SHIFT) | (0x1 << TC_UIOHSTOP_SHIFT),
35 .HasQos = TRUE,
36 .refresh_prd = 0x3D0,
37 .cas_latency = 0x8,
38 .write_latency = 0x3,
39 .t_mrd = 0x2,
40 .t_ras = 0xA,
41 .t_rc = 0xE,
42 .t_rcd = 0x104,
43 .t_rfc = 0x2f32,
44 .t_rp = 0x14,
45 .t_rrd = 0x2,
46 .t_wr = 0x4,
47 .t_wtr = 0x2,
48 .t_xp = 0x2,
49 .t_xsr = 0xC8,
50 .t_esr = 0x14,
51 .MemoryCfg = DMC_MEMORY_CONFIG_ACTIVE_CHIP_1 | DMC_MEMORY_CONFIG_BURST_4 |
52 DMC_MEMORY_CONFIG_ROW_ADDRESS_15 | DMC_MEMORY_CONFIG_COLUMN_ADDRESS_10,
53 .MemoryCfg2 = DMC_MEMORY_CFG2_DQM_INIT | DMC_MEMORY_CFG2_CKE_INIT |
54 DMC_MEMORY_CFG2_BANK_BITS_3 | DMC_MEMORY_CFG2_MEM_WIDTH_32,
55 .MemoryCfg3 = 0x00000001,
56 .ChipCfg0 = 0x00010000,
57 .t_faw = 0x00000A0D,
58 .ModeReg = DDR2_MR_BURST_LENGTH_4 | DDR2_MR_CAS_LATENCY_4 | DDR2_MR_WR_CYCLES_4,
59 .ExtModeReg = DDR_EMR_RTT_50R | (DDR_EMR_ODS_VAL << DDR_EMR_ODS_MASK),
1d5d0ae9 60};
61
62/**
63 Return if Trustzone is supported by your platform
64
65 A non-zero value must be returned if you want to support a Secure World on your platform.
66 ArmVExpressTrustzoneInit() will later set up the secure regions.
67 This function can return 0 even if Trustzone is supported by your processor. In this case,
68 the platform will continue to run in Secure World.
69
70 @return A non-zero value if Trustzone supported.
71
72**/
aa01abaa 73UINTN
74ArmPlatformTrustzoneSupported (
75 VOID
76 )
77{
78 return (MmioRead32(ARM_VE_SYS_CFGRW1_REG) & ARM_VE_CFGRW1_TZASC_EN_BIT_MASK);
1d5d0ae9 79}
80
81/**
82 Initialize the Secure peripherals and memory regions
83
84 If Trustzone is supported by your platform then this function makes the required initialization
85 of the secure peripherals and memory regions.
86
87**/
88VOID ArmPlatformTrustzoneInit(VOID) {
89 //
90 // Setup TZ Protection Controller
91 //
92
93 // Set Non Secure access for all devices
94 TZPCSetDecProtBits(ARM_VE_TZPC_BASE, TZPC_DECPROT_0, 0xFFFFFFFF);
95 TZPCSetDecProtBits(ARM_VE_TZPC_BASE, TZPC_DECPROT_1, 0xFFFFFFFF);
96 TZPCSetDecProtBits(ARM_VE_TZPC_BASE, TZPC_DECPROT_2, 0xFFFFFFFF);
97
98 // Remove Non secure access to secure devices
99 TZPCClearDecProtBits(ARM_VE_TZPC_BASE, TZPC_DECPROT_0,
100 ARM_VE_DECPROT_BIT_TZPC | ARM_VE_DECPROT_BIT_DMC_TZASC | ARM_VE_DECPROT_BIT_NMC_TZASC | ARM_VE_DECPROT_BIT_SMC_TZASC);
101
102 TZPCClearDecProtBits(ARM_VE_TZPC_BASE, TZPC_DECPROT_2,
103 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);
104
105
106 //
107 // Setup TZ Address Space Controller for the SMC. Create 5 Non Secure regions (NOR0, NOR1, SRAM, SMC Peripheral regions)
108 //
109
110 // NOR Flash 0 non secure (BootMon)
111 TZASCSetRegion(ARM_VE_TZASC_BASE,1,TZASC_REGION_ENABLED,
112 ARM_VE_SMB_NOR0_BASE,0,
113 TZASC_REGION_SIZE_64MB, TZASC_REGION_SECURITY_NSRW);
114
115 // NOR Flash 1. The first half of the NOR Flash1 must be secure for the secure firmware (sec_uefi.bin)
116#if EDK2_ARMVE_SECURE_SYSTEM
117 //Note: Your OS Kernel must be aware of the secure regions before to enable this region
118 TZASCSetRegion(ARM_VE_TZASC_BASE,2,TZASC_REGION_ENABLED,
119 ARM_VE_SMB_NOR1_BASE + SIZE_32MB,0,
120 TZASC_REGION_SIZE_32MB, TZASC_REGION_SECURITY_NSRW);
121#else
122 TZASCSetRegion(ARM_VE_TZASC_BASE,2,TZASC_REGION_ENABLED,
123 ARM_VE_SMB_NOR1_BASE,0,
124 TZASC_REGION_SIZE_64MB, TZASC_REGION_SECURITY_NSRW);
125#endif
126
127 // Base of SRAM. Only half of SRAM in Non Secure world
128 // First half non secure (16MB) + Second Half secure (16MB) = 32MB of SRAM
129#if EDK2_ARMVE_SECURE_SYSTEM
130 //Note: Your OS Kernel must be aware of the secure regions before to enable this region
131 TZASCSetRegion(ARM_VE_TZASC_BASE,3,TZASC_REGION_ENABLED,
132 ARM_VE_SMB_SRAM_BASE,0,
133 TZASC_REGION_SIZE_16MB, TZASC_REGION_SECURITY_NSRW);
134#else
135 TZASCSetRegion(ARM_VE_TZASC_BASE,3,TZASC_REGION_ENABLED,
136 ARM_VE_SMB_SRAM_BASE,0,
137 TZASC_REGION_SIZE_32MB, TZASC_REGION_SECURITY_NSRW);
138#endif
139
140 // Memory Mapped Peripherals. All in non secure world
141 TZASCSetRegion(ARM_VE_TZASC_BASE,4,TZASC_REGION_ENABLED,
142 ARM_VE_SMB_PERIPH_BASE,0,
143 TZASC_REGION_SIZE_64MB, TZASC_REGION_SECURITY_NSRW);
144
145 // MotherBoard Peripherals and On-chip peripherals.
146 TZASCSetRegion(ARM_VE_TZASC_BASE,5,TZASC_REGION_ENABLED,
147 ARM_VE_SMB_MB_ON_CHIP_PERIPH_BASE,0,
148 TZASC_REGION_SIZE_256MB, TZASC_REGION_SECURITY_NSRW);
149}
150
a534d714 151/**
152 Return the current Boot Mode
153
154 This function returns the boot reason on the platform
155
156 @return Return the current Boot Mode of the platform
157
158**/
159EFI_BOOT_MODE
160ArmPlatformGetBootMode (
161 VOID
162 )
163{
164 return BOOT_WITH_FULL_CONFIGURATION;
165}
166
1d5d0ae9 167/**
168 Remap the memory at 0x0
169
170 Some platform requires or gives the ability to remap the memory at the address 0x0.
171 This function can do nothing if this feature is not relevant to your platform.
172
173**/
aa01abaa 174VOID
175ArmPlatformBootRemapping (
176 VOID
177 )
178{
1d5d0ae9 179 UINT32 val32 = MmioRead32(ARM_VE_SYS_CFGRW1_REG); //Scc - CFGRW1
180 // we remap the DRAM to 0x0
181 MmioWrite32(ARM_VE_SYS_CFGRW1_REG, (val32 & 0x0FFFFFFF) | ARM_VE_CFGRW1_REMAP_DRAM);
182}
183
8e06b586 184/**
185 Initialize controllers that must setup at the early stage
186
187 Some peripherals must be initialized in Secure World.
188 For example, some L2x0 requires to be initialized in Secure World
189
190**/
191VOID
aa01abaa 192ArmPlatformSecInitialize (
8e06b586 193 VOID
194 ) {
195 // The L2x0 controller must be intialize in Secure World
51d191aa 196 L2x0CacheInit(PcdGet32(PcdL2x0ControllerBase),
197 PL310_TAG_LATENCIES(L2x0_LATENCY_8_CYCLES,L2x0_LATENCY_8_CYCLES,L2x0_LATENCY_8_CYCLES),
198 PL310_DATA_LATENCIES(L2x0_LATENCY_8_CYCLES,L2x0_LATENCY_8_CYCLES,L2x0_LATENCY_8_CYCLES),
199 0,~0, // Use default setting for the Auxiliary Control Register
200 FALSE);
8e06b586 201}
202
aa01abaa 203/**
204 Initialize controllers that must setup in the normal world
205
206 This function is called by the ArmPlatformPkg/Pei or ArmPlatformPkg/Pei/PlatformPeim
207 in the PEI phase.
208
209**/
210VOID
211ArmPlatformNormalInitialize (
212 VOID
213 )
214{
215 // Nothing to do here
216}
217
1d5d0ae9 218/**
219 Initialize the system (or sometimes called permanent) memory
220
221 This memory is generally represented by the DRAM.
222
223**/
aa01abaa 224VOID
225ArmPlatformInitializeSystemMemory (
226 VOID
227 )
228{
8be5d4d6 229 PL341DmcInit(&DDRTimings);
aa01abaa 230 PL301AxiInit(ARM_VE_FAXI_BASE);
1d5d0ae9 231}