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