]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4.c
ARM Packages: Removed trailing spaces
[mirror_edk2.git] / ArmPlatformPkg / ArmVExpressPkg / Library / ArmVExpressLibCTA9x4 / CTA9x4.c
CommitLineData
1e57a462 1/** @file\r
2*\r
d4c92ade 3* Copyright (c) 2011-2013, ARM Limited. All rights reserved.\r
1e57a462 4*\r
3402aac7
RC
5* This program and the accompanying materials\r
6* are licensed and made available under the terms and conditions of the BSD License\r
7* which accompanies this distribution. The full text of the license may be found at\r
8* http://opensource.org/licenses/bsd-license.php\r
9*\r
10* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
1e57a462 12*\r
13**/\r
14\r
15#include <Library/IoLib.h>\r
16#include <Library/ArmPlatformLib.h>\r
17#include <Library/DebugLib.h>\r
18#include <Library/PcdLib.h>\r
1e57a462 19\r
20#include <Drivers/PL341Dmc.h>\r
21#include <Drivers/PL301Axi.h>\r
22#include <Drivers/SP804Timer.h>\r
23\r
24#include <Ppi/ArmMpCoreInfo.h>\r
25\r
26#include <ArmPlatform.h>\r
27\r
1e57a462 28ARM_CORE_INFO mVersatileExpressMpCoreInfoCTA9x4[] = {\r
29 {\r
30 // Cluster 0, Core 0\r
31 0x0, 0x0,\r
32\r
33 // MP Core MailBox Set/Get/Clear Addresses and Clear Value\r
34 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,\r
35 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,\r
36 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,\r
37 (UINT64)0xFFFFFFFF\r
38 },\r
39 {\r
40 // Cluster 0, Core 1\r
41 0x0, 0x1,\r
42\r
43 // MP Core MailBox Set/Get/Clear Addresses and Clear Value\r
44 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,\r
45 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,\r
46 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,\r
47 (UINT64)0xFFFFFFFF\r
48 },\r
49 {\r
50 // Cluster 0, Core 2\r
51 0x0, 0x2,\r
52\r
53 // MP Core MailBox Set/Get/Clear Addresses and Clear Value\r
54 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,\r
55 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,\r
56 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,\r
57 (UINT64)0xFFFFFFFF\r
58 },\r
59 {\r
60 // Cluster 0, Core 3\r
61 0x0, 0x3,\r
62\r
63 // MP Core MailBox Set/Get/Clear Addresses and Clear Value\r
64 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,\r
65 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,\r
66 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,\r
67 (UINT64)0xFFFFFFFF\r
68 }\r
69};\r
70\r
71// DDR2 timings\r
72PL341_DMC_CONFIG DDRTimings = {\r
73 .MaxChip = 1,\r
74 .IsUserCfg = TRUE,\r
75 .User0Cfg = 0x7C924924,\r
76 .User2Cfg = (TC_UIOLHXC_VALUE << TC_UIOLHNC_SHIFT) | (TC_UIOLHXC_VALUE << TC_UIOLHPC_SHIFT) | (0x1 << TC_UIOHOCT_SHIFT) | (0x1 << TC_UIOHSTOP_SHIFT),\r
77 .HasQos = TRUE,\r
78 .RefreshPeriod = 0x3D0,\r
79 .CasLatency = 0x8,\r
80 .WriteLatency = 0x3,\r
81 .t_mrd = 0x2,\r
82 .t_ras = 0xA,\r
83 .t_rc = 0xE,\r
84 .t_rcd = 0x104,\r
85 .t_rfc = 0x2f32,\r
86 .t_rp = 0x14,\r
87 .t_rrd = 0x2,\r
88 .t_wr = 0x4,\r
89 .t_wtr = 0x2,\r
90 .t_xp = 0x2,\r
91 .t_xsr = 0xC8,\r
92 .t_esr = 0x14,\r
93 .MemoryCfg = DMC_MEMORY_CONFIG_ACTIVE_CHIP_1 | DMC_MEMORY_CONFIG_BURST_4 |\r
94 DMC_MEMORY_CONFIG_ROW_ADDRESS_15 | DMC_MEMORY_CONFIG_COLUMN_ADDRESS_10,\r
95 .MemoryCfg2 = DMC_MEMORY_CFG2_DQM_INIT | DMC_MEMORY_CFG2_CKE_INIT |\r
96 DMC_MEMORY_CFG2_BANK_BITS_3 | DMC_MEMORY_CFG2_MEM_WIDTH_32,\r
97 .MemoryCfg3 = 0x00000001,\r
98 .ChipCfg0 = 0x00010000,\r
99 .t_faw = 0x00000A0D,\r
100 .ModeReg = DDR2_MR_BURST_LENGTH_4 | DDR2_MR_CAS_LATENCY_4 | DDR2_MR_WR_CYCLES_4,\r
101 .ExtModeReg = DDR_EMR_RTT_50R | (DDR_EMR_ODS_VAL << DDR_EMR_ODS_MASK),\r
102};\r
103\r
104/**\r
105 Return the current Boot Mode\r
106\r
107 This function returns the boot reason on the platform\r
108\r
109 @return Return the current Boot Mode of the platform\r
110\r
111**/\r
112EFI_BOOT_MODE\r
113ArmPlatformGetBootMode (\r
114 VOID\r
115 )\r
116{\r
117 if (MmioRead32(ARM_VE_SYS_FLAGS_NV_REG) == 0) {\r
118 return BOOT_WITH_FULL_CONFIGURATION;\r
119 } else {\r
120 return BOOT_ON_S2_RESUME;\r
121 }\r
122}\r
123\r
124/**\r
125 Initialize controllers that must setup in the normal world\r
126\r
127 This function is called by the ArmPlatformPkg/PrePi or ArmPlatformPkg/PlatformPei\r
128 in the PEI phase.\r
129\r
130**/\r
131RETURN_STATUS\r
132ArmPlatformInitialize (\r
133 IN UINTN MpId\r
134 )\r
135{\r
bebda7ce 136 if (!ArmPlatformIsPrimaryCore (MpId)) {\r
1e57a462 137 return RETURN_SUCCESS;\r
138 }\r
139\r
140 // Configure periodic timer (TIMER0) for 1MHz operation\r
141 MmioOr32 (SP810_CTRL_BASE + SP810_SYS_CTRL_REG, SP810_SYS_CTRL_TIMER0_TIMCLK);\r
142 // Configure 1MHz clock\r
143 MmioOr32 (SP810_CTRL_BASE + SP810_SYS_CTRL_REG, SP810_SYS_CTRL_TIMER1_TIMCLK);\r
144 // configure SP810 to use 1MHz clock and disable\r
145 MmioAndThenOr32 (SP810_CTRL_BASE + SP810_SYS_CTRL_REG, ~SP810_SYS_CTRL_TIMER2_EN, SP810_SYS_CTRL_TIMER2_TIMCLK);\r
146 // Configure SP810 to use 1MHz clock and disable\r
147 MmioAndThenOr32 (SP810_CTRL_BASE + SP810_SYS_CTRL_REG, ~SP810_SYS_CTRL_TIMER3_EN, SP810_SYS_CTRL_TIMER3_TIMCLK);\r
148\r
149 return RETURN_SUCCESS;\r
150}\r
151\r
152/**\r
153 Initialize the system (or sometimes called permanent) memory\r
154\r
155 This memory is generally represented by the DRAM.\r
156\r
157**/\r
158VOID\r
159ArmPlatformInitializeSystemMemory (\r
160 VOID\r
161 )\r
162{\r
d4c92ade
OM
163 PL341DmcInit (ARM_VE_DMC_BASE, &DDRTimings);\r
164 PL301AxiInit (ARM_VE_FAXI_BASE);\r
1e57a462 165}\r
166\r
167EFI_STATUS\r
168PrePeiCoreGetMpCoreInfo (\r
169 OUT UINTN *CoreCount,\r
170 OUT ARM_CORE_INFO **ArmCoreTable\r
171 )\r
172{\r
173 *CoreCount = sizeof(mVersatileExpressMpCoreInfoCTA9x4) / sizeof(ARM_CORE_INFO);\r
174 *ArmCoreTable = mVersatileExpressMpCoreInfoCTA9x4;\r
175\r
176 return EFI_SUCCESS;\r
177}\r
178\r
179// Needs to be declared in the file. Otherwise gArmMpCoreInfoPpiGuid is undefined in the contect of PrePeiCore\r
180EFI_GUID mArmMpCoreInfoPpiGuid = ARM_MP_CORE_INFO_PPI_GUID;\r
181ARM_MP_CORE_INFO_PPI mMpCoreInfoPpi = { PrePeiCoreGetMpCoreInfo };\r
182\r
183EFI_PEI_PPI_DESCRIPTOR gPlatformPpiTable[] = {\r
184 {\r
185 EFI_PEI_PPI_DESCRIPTOR_PPI,\r
186 &mArmMpCoreInfoPpiGuid,\r
187 &mMpCoreInfoPpi\r
188 }\r
189};\r
190\r
191VOID\r
192ArmPlatformGetPlatformPpiList (\r
193 OUT UINTN *PpiListSize,\r
194 OUT EFI_PEI_PPI_DESCRIPTOR **PpiList\r
195 )\r
196{\r
197 *PpiListSize = sizeof(gPlatformPpiTable);\r
198 *PpiList = gPlatformPpiTable;\r
199}\r
200\r