]> git.proxmox.com Git - mirror_edk2.git/blame - UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c
UefiCpuPkg/RegisterCpuFeaturesLib: Fix build failure for VS2012 and GCC49.
[mirror_edk2.git] / UefiCpuPkg / Library / RegisterCpuFeaturesLib / PeiRegisterCpuFeaturesLib.c
CommitLineData
80c4b236
JF
1/** @file\r
2 CPU Register Table Library functions.\r
3\r
4 Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
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
12\r
13**/\r
14\r
15#include <PiPei.h>\r
16\r
17#include <Library/HobLib.h>\r
18#include <Library/PeiServicesLib.h>\r
19#include <Library/PeiServicesTablePointerLib.h>\r
20#include <Ppi/MpServices.h>\r
21#include "RegisterCpuFeatures.h"\r
22\r
23#define REGISTER_CPU_FEATURES_GUID \\r
24 { \\r
25 0xa694c467, 0x697a, 0x446b, { 0xb9, 0x29, 0x5b, 0x14, 0xa0, 0xcf, 0x39, 0xf } \\r
26 }\r
27\r
28EFI_GUID mRegisterCpuFeaturesHobGuid = REGISTER_CPU_FEATURES_GUID;\r
29\r
30/**\r
31 Worker function to get CPU_FEATURES_DATA pointer.\r
32\r
33 @return Pointer to CPU_FEATURES_DATA.\r
34**/\r
35CPU_FEATURES_DATA *\r
36GetCpuFeaturesData (\r
37 VOID\r
38 )\r
39{\r
40 CPU_FEATURES_DATA *CpuInitData;\r
41 EFI_HOB_GUID_TYPE *GuidHob;\r
42 VOID *DataInHob;\r
43 UINT64 Data64;\r
44\r
45 CpuInitData = NULL;\r
46 GuidHob = GetFirstGuidHob (&mRegisterCpuFeaturesHobGuid);\r
47 if (GuidHob != NULL) {\r
48 DataInHob = GET_GUID_HOB_DATA (GuidHob);\r
49 CpuInitData = (CPU_FEATURES_DATA *) (*(UINTN *) DataInHob);\r
50 ASSERT (CpuInitData != NULL);\r
51 } else {\r
52 CpuInitData = AllocateZeroPool (sizeof (CPU_FEATURES_DATA));\r
53 ASSERT (CpuInitData != NULL);\r
54 //\r
55 // Build location of CPU MP DATA buffer in HOB\r
56 //\r
57 Data64 = (UINT64) (UINTN) CpuInitData;\r
58 BuildGuidDataHob (\r
59 &mRegisterCpuFeaturesHobGuid,\r
60 (VOID *) &Data64,\r
61 sizeof (UINT64)\r
62 );\r
63 }\r
64\r
65 return CpuInitData;\r
66}\r
67\r
68/**\r
69 Worker function to get MP PPI service pointer.\r
70\r
71 @return PEI PPI service pointer.\r
72**/\r
73EFI_PEI_MP_SERVICES_PPI *\r
74GetMpPpi (\r
75 VOID\r
76 )\r
77{\r
78 EFI_STATUS Status;\r
79 EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;\r
80\r
81 //\r
82 // Get MP Services Protocol\r
83 //\r
84 Status = PeiServicesLocatePpi (\r
85 &gEfiPeiMpServicesPpiGuid,\r
86 0,\r
87 NULL,\r
88 (VOID **)&CpuMpPpi\r
89 );\r
90 ASSERT_EFI_ERROR (Status);\r
91 return CpuMpPpi;\r
92}\r
93\r
94/**\r
95 Worker function to return processor index.\r
96\r
97 @return The processor index.\r
98**/\r
99UINTN\r
100GetProcessorIndex (\r
101 VOID\r
102 )\r
103{\r
104 EFI_STATUS Status;\r
105 EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;\r
106 UINTN ProcessorIndex;\r
107\r
108 CpuMpPpi = GetMpPpi ();\r
109\r
110 Status = CpuMpPpi->WhoAmI(GetPeiServicesTablePointer (), CpuMpPpi, &ProcessorIndex);\r
111 ASSERT_EFI_ERROR (Status);\r
112 return ProcessorIndex;\r
113}\r
114\r
115/**\r
116 Worker function to MP-related information on the requested processor at the\r
117 instant this call is made.\r
118\r
119 @param[in] ProcessorNumber The handle number of processor.\r
120 @param[out] ProcessorInfoBuffer A pointer to the buffer where information for\r
121 the requested processor is deposited.\r
122\r
123 @return Status of MpServices->GetProcessorInfo().\r
124**/\r
125EFI_STATUS\r
126GetProcessorInformation (\r
127 IN UINTN ProcessorNumber,\r
128 OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer\r
129 )\r
130{\r
131 EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;\r
132 EFI_STATUS Status;\r
133\r
134 CpuMpPpi = GetMpPpi ();\r
135 Status = CpuMpPpi->GetProcessorInfo (\r
136 GetPeiServicesTablePointer(),\r
137 CpuMpPpi,\r
138 ProcessorNumber,\r
139 ProcessorInfoBuffer\r
140 );\r
141 return Status;\r
142}\r
143\r
144/**\r
145 Worker function to execute a caller provided function on all enabled APs.\r
146\r
147 @param[in] Procedure A pointer to the function to be run on\r
148 enabled APs of the system.\r
149**/\r
150VOID\r
151StartupAPsWorker (\r
b3c71b47
ED
152 IN EFI_AP_PROCEDURE Procedure,\r
153 IN EFI_EVENT MpEvent\r
80c4b236
JF
154 )\r
155{\r
156 EFI_STATUS Status;\r
157 EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;\r
b3c71b47
ED
158 CPU_FEATURES_DATA *CpuFeaturesData;\r
159\r
160 CpuFeaturesData = GetCpuFeaturesData ();\r
80c4b236
JF
161\r
162 //\r
163 // Get MP Services Protocol\r
164 //\r
165 Status = PeiServicesLocatePpi (\r
166 &gEfiPeiMpServicesPpiGuid,\r
167 0,\r
168 NULL,\r
169 (VOID **)&CpuMpPpi\r
170 );\r
171 ASSERT_EFI_ERROR (Status);\r
172\r
173 //\r
174 // Wakeup all APs for data collection.\r
175 //\r
176 Status = CpuMpPpi->StartupAllAPs (\r
177 GetPeiServicesTablePointer (),\r
178 CpuMpPpi,\r
179 Procedure,\r
180 FALSE,\r
181 0,\r
b3c71b47 182 CpuFeaturesData\r
80c4b236
JF
183 );\r
184 ASSERT_EFI_ERROR (Status);\r
185}\r
186\r
187/**\r
188 Worker function to switch the requested AP to be the BSP from that point onward.\r
189\r
190 @param[in] ProcessorNumber The handle number of AP that is to become the new BSP.\r
191**/\r
192VOID\r
193SwitchNewBsp (\r
194 IN UINTN ProcessorNumber\r
195 )\r
196{\r
197 EFI_STATUS Status;\r
198 EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;\r
199\r
200 //\r
201 // Get MP Services Protocol\r
202 //\r
203 Status = PeiServicesLocatePpi (\r
204 &gEfiPeiMpServicesPpiGuid,\r
205 0,\r
206 NULL,\r
207 (VOID **)&CpuMpPpi\r
208 );\r
209 ASSERT_EFI_ERROR (Status);\r
210\r
211 //\r
212 // Wakeup all APs for data collection.\r
213 //\r
214 Status = CpuMpPpi->SwitchBSP (\r
215 GetPeiServicesTablePointer (),\r
216 CpuMpPpi,\r
217 ProcessorNumber,\r
218 TRUE\r
219 );\r
220 ASSERT_EFI_ERROR (Status);\r
221}\r
222\r
223/**\r
224 Worker function to retrieve the number of logical processor in the platform.\r
225\r
226 @param[out] NumberOfCpus Pointer to the total number of logical\r
227 processors in the system, including the BSP\r
228 and disabled APs.\r
229 @param[out] NumberOfEnabledProcessors Pointer to the number of enabled logical\r
230 processors that exist in system, including\r
231 the BSP.\r
232**/\r
233VOID\r
234GetNumberOfProcessor (\r
235 OUT UINTN *NumberOfCpus,\r
236 OUT UINTN *NumberOfEnabledProcessors\r
237 )\r
238{\r
239 EFI_STATUS Status;\r
240 EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;\r
241\r
242 //\r
243 // Get MP Services Protocol\r
244 //\r
245 Status = PeiServicesLocatePpi (\r
246 &gEfiPeiMpServicesPpiGuid,\r
247 0,\r
248 NULL,\r
249 (VOID **)&CpuMpPpi\r
250 );\r
251 ASSERT_EFI_ERROR (Status);\r
252\r
253 //\r
254 // Get the number of CPUs\r
255 //\r
256 Status = CpuMpPpi->GetNumberOfProcessors (\r
257 GetPeiServicesTablePointer (),\r
258 CpuMpPpi,\r
259 NumberOfCpus,\r
260 NumberOfEnabledProcessors\r
261 );\r
262 ASSERT_EFI_ERROR (Status);\r
263}\r
b3c71b47
ED
264\r
265/**\r
266 Performs CPU features Initialization.\r
267\r
268 This service will invoke MP service to perform CPU features\r
269 initialization on BSP/APs per user configuration.\r
270\r
271 @note This service could be called by BSP only.\r
272**/\r
273VOID\r
274EFIAPI\r
275CpuFeaturesInitialize (\r
276 VOID\r
277 )\r
278{\r
279 CPU_FEATURES_DATA *CpuFeaturesData;\r
280 UINTN OldBspNumber;\r
281\r
282 CpuFeaturesData = GetCpuFeaturesData ();\r
283\r
284 OldBspNumber = GetProcessorIndex();\r
285 CpuFeaturesData->BspNumber = OldBspNumber;\r
286\r
287 //\r
288 // Known limitation: In PEI phase, CpuFeatures driver not\r
289 // support async mode execute tasks. So semaphore type\r
290 // register can't been used for this instance, must use\r
291 // DXE type instance.\r
292 //\r
293\r
294 //\r
295 // Wakeup all APs for programming.\r
296 //\r
297 StartupAPsWorker (SetProcessorRegister, NULL);\r
298 //\r
299 // Programming BSP\r
300 //\r
301 SetProcessorRegister (CpuFeaturesData);\r
302\r
303 //\r
304 // Switch to new BSP if required\r
305 //\r
306 if (CpuFeaturesData->BspNumber != OldBspNumber) {\r
307 SwitchNewBsp (CpuFeaturesData->BspNumber);\r
308 }\r
309}\r
310\r