]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibRTSM/RTSM.c
ArmPlatformPkg/ArmVExpressDxe: Identify the current platform
[mirror_edk2.git] / ArmPlatformPkg / ArmVExpressPkg / Library / ArmVExpressLibRTSM / RTSM.c
CommitLineData
1e57a462 1/** @file\r
2*\r
27be3601 3* Copyright (c) 2011-2013, ARM Limited. All rights reserved.\r
1e57a462 4*\r
27be3601
HL
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
19\r
20#include <Ppi/ArmMpCoreInfo.h>\r
21\r
22#include <ArmPlatform.h>\r
23\r
1e57a462 24ARM_CORE_INFO mVersatileExpressMpCoreInfoTable[] = {\r
25 {\r
26 // Cluster 0, Core 0\r
27 0x0, 0x0,\r
28\r
29 // MP Core MailBox Set/Get/Clear Addresses and Clear Value\r
30 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,\r
31 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,\r
32 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,\r
33 (UINT64)0xFFFFFFFF\r
34 },\r
35 {\r
36 // Cluster 0, Core 1\r
37 0x0, 0x1,\r
38\r
39 // MP Core MailBox Set/Get/Clear Addresses and Clear Value\r
40 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,\r
41 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,\r
42 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,\r
43 (UINT64)0xFFFFFFFF\r
44 },\r
45 {\r
46 // Cluster 0, Core 2\r
47 0x0, 0x2,\r
48\r
49 // MP Core MailBox Set/Get/Clear Addresses and Clear Value\r
50 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,\r
51 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,\r
52 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,\r
53 (UINT64)0xFFFFFFFF\r
54 },\r
55 {\r
56 // Cluster 0, Core 3\r
57 0x0, 0x3,\r
58\r
27be3601
HL
59 // MP Core MailBox Set/Get/Clear Addresses and Clear Value\r
60 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,\r
61 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,\r
62 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,\r
63 (UINT64)0xFFFFFFFF\r
64 },\r
65 {\r
66 // Cluster 1, Core 0\r
67 0x1, 0x0,\r
68\r
69 // MP Core MailBox Set/Get/Clear Addresses and Clear Value\r
70 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,\r
71 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,\r
72 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,\r
73 (UINT64)0xFFFFFFFF\r
74 },\r
75 {\r
76 // Cluster 1, Core 1\r
77 0x1, 0x1,\r
78\r
79 // MP Core MailBox Set/Get/Clear Addresses and Clear Value\r
80 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,\r
81 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,\r
82 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,\r
83 (UINT64)0xFFFFFFFF\r
84 },\r
85 {\r
86 // Cluster 1, Core 2\r
87 0x1, 0x2,\r
88\r
89 // MP Core MailBox Set/Get/Clear Addresses and Clear Value\r
90 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,\r
91 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,\r
92 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,\r
93 (UINT64)0xFFFFFFFF\r
94 },\r
95 {\r
96 // Cluster 1, Core 3\r
97 0x1, 0x3,\r
98\r
1e57a462 99 // MP Core MailBox Set/Get/Clear Addresses and Clear Value\r
100 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_REG,\r
101 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_SET_REG,\r
102 (EFI_PHYSICAL_ADDRESS)ARM_VE_SYS_FLAGS_CLR_REG,\r
103 (UINT64)0xFFFFFFFF\r
104 }\r
105};\r
106\r
107/**\r
108 Return the current Boot Mode\r
109\r
110 This function returns the boot reason on the platform\r
111\r
112 @return Return the current Boot Mode of the platform\r
113\r
114**/\r
115EFI_BOOT_MODE\r
116ArmPlatformGetBootMode (\r
117 VOID\r
118 )\r
119{\r
120 return BOOT_WITH_FULL_CONFIGURATION;\r
121}\r
122\r
123/**\r
124 Initialize controllers that must setup in the normal world\r
125\r
126 This function is called by the ArmPlatformPkg/Pei or ArmPlatformPkg/Pei/PlatformPeim\r
127 in the PEI phase.\r
128\r
129**/\r
130RETURN_STATUS\r
131ArmPlatformInitialize (\r
132 IN UINTN MpId\r
133 )\r
134{\r
bebda7ce 135 if (!ArmPlatformIsPrimaryCore (MpId)) {\r
1e57a462 136 return RETURN_SUCCESS;\r
137 }\r
138\r
139 // Disable memory remapping and return to normal mapping\r
140 MmioOr32 (SP810_CTRL_BASE, BIT8);\r
141\r
142 return RETURN_SUCCESS;\r
143}\r
144\r
145/**\r
146 Initialize the system (or sometimes called permanent) memory\r
147\r
148 This memory is generally represented by the DRAM.\r
149\r
150**/\r
151VOID\r
152ArmPlatformInitializeSystemMemory (\r
153 VOID\r
154 )\r
155{\r
156 // Nothing to do here\r
157}\r
158\r
159EFI_STATUS\r
160PrePeiCoreGetMpCoreInfo (\r
161 OUT UINTN *CoreCount,\r
162 OUT ARM_CORE_INFO **ArmCoreTable\r
163 )\r
164{\r
165 UINT32 ProcType;\r
166\r
167 ProcType = MmioRead32 (ARM_VE_SYS_PROCID0_REG) & ARM_VE_SYS_PROC_ID_MASK;\r
168 if ((ProcType == ARM_VE_SYS_PROC_ID_CORTEX_A9) || (ProcType == ARM_VE_SYS_PROC_ID_CORTEX_A15)) {\r
27be3601 169 // Only support one cluster on all but ARMv8 FVP platform. FVP still uses CortexA9 ID.\r
1e57a462 170 *CoreCount = ArmGetCpuCountPerCluster ();\r
171 *ArmCoreTable = mVersatileExpressMpCoreInfoTable;\r
172 return EFI_SUCCESS;\r
173 } else {\r
174 return EFI_UNSUPPORTED;\r
175 }\r
176}\r
177\r
178// Needs to be declared in the file. Otherwise gArmMpCoreInfoPpiGuid is undefined in the contect of PrePeiCore\r
179EFI_GUID mArmMpCoreInfoPpiGuid = ARM_MP_CORE_INFO_PPI_GUID;\r
180ARM_MP_CORE_INFO_PPI mMpCoreInfoPpi = { PrePeiCoreGetMpCoreInfo };\r
181\r
182EFI_PEI_PPI_DESCRIPTOR gPlatformPpiTable[] = {\r
183 {\r
184 EFI_PEI_PPI_DESCRIPTOR_PPI,\r
185 &mArmMpCoreInfoPpiGuid,\r
186 &mMpCoreInfoPpi\r
187 }\r
188};\r
189\r
190VOID\r
191ArmPlatformGetPlatformPpiList (\r
192 OUT UINTN *PpiListSize,\r
193 OUT EFI_PEI_PPI_DESCRIPTOR **PpiList\r
194 )\r
195{\r
196 *PpiListSize = sizeof(gPlatformPpiTable);\r
197 *PpiList = gPlatformPpiTable;\r
198}\r