]> git.proxmox.com Git - mirror_edk2.git/blame - UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c
UefiCpuPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / UefiCpuPkg / Library / RegisterCpuFeaturesLib / DxeRegisterCpuFeaturesLib.c
CommitLineData
80c4b236
JF
1/** @file\r
2 CPU Register Table Library functions.\r
3\r
4 Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>\r
0acd8697 5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
80c4b236
JF
6\r
7**/\r
8\r
9#include <PiDxe.h>\r
10\r
11#include <Library/UefiBootServicesTableLib.h>\r
b3c71b47 12#include <Library/UefiLib.h>\r
80c4b236
JF
13\r
14#include "RegisterCpuFeatures.h"\r
15\r
16CPU_FEATURES_DATA mCpuFeaturesData = {0};\r
80c4b236
JF
17\r
18/**\r
19 Worker function to get CPU_FEATURES_DATA pointer.\r
20\r
21 @return Pointer to CPU_FEATURES_DATA.\r
22**/\r
23CPU_FEATURES_DATA *\r
24GetCpuFeaturesData (\r
25 VOID\r
26 )\r
27{\r
28 return &mCpuFeaturesData;\r
29}\r
30\r
31/**\r
32 Worker function to get EFI_MP_SERVICES_PROTOCOL pointer.\r
33\r
7217b879 34 @return MP_SERVICES variable.\r
80c4b236 35**/\r
7217b879
ED
36MP_SERVICES\r
37GetMpService (\r
80c4b236
JF
38 VOID\r
39 )\r
40{\r
7217b879
ED
41 EFI_STATUS Status;\r
42 MP_SERVICES MpService;\r
80c4b236 43\r
7217b879
ED
44 //\r
45 // Get MP Services Protocol\r
46 //\r
47 Status = gBS->LocateProtocol (\r
48 &gEfiMpServiceProtocolGuid,\r
49 NULL,\r
50 (VOID **)&MpService.Protocol\r
51 );\r
52 ASSERT_EFI_ERROR (Status);\r
53\r
54 return MpService;\r
80c4b236
JF
55}\r
56\r
57/**\r
58 Worker function to return processor index.\r
59\r
7217b879
ED
60 @param CpuFeaturesData Cpu Feature Data structure.\r
61\r
80c4b236
JF
62 @return The processor index.\r
63**/\r
64UINTN\r
65GetProcessorIndex (\r
7217b879 66 IN CPU_FEATURES_DATA *CpuFeaturesData\r
80c4b236
JF
67 )\r
68{\r
69 EFI_STATUS Status;\r
70 UINTN ProcessorIndex;\r
71 EFI_MP_SERVICES_PROTOCOL *MpServices;\r
72\r
7217b879 73 MpServices = CpuFeaturesData->MpService.Protocol;\r
80c4b236
JF
74 Status = MpServices->WhoAmI(MpServices, &ProcessorIndex);\r
75 ASSERT_EFI_ERROR (Status);\r
76 return ProcessorIndex;\r
77}\r
78\r
79/**\r
80 Gets detailed MP-related information on the requested processor at the\r
81 instant this call is made.\r
82\r
83 @param[in] ProcessorNumber The handle number of processor.\r
84 @param[out] ProcessorInfoBuffer A pointer to the buffer where information for\r
85 the requested processor is deposited.\r
86\r
87 @return Status of MpServices->GetProcessorInfo().\r
88**/\r
89EFI_STATUS\r
90GetProcessorInformation (\r
91 IN UINTN ProcessorNumber,\r
92 OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer\r
93 )\r
94{\r
95 EFI_STATUS Status;\r
96 EFI_MP_SERVICES_PROTOCOL *MpServices;\r
7217b879
ED
97 CPU_FEATURES_DATA *CpuFeaturesData;\r
98\r
99 CpuFeaturesData = GetCpuFeaturesData ();\r
100 MpServices = CpuFeaturesData->MpService.Protocol;\r
80c4b236 101\r
80c4b236
JF
102 Status = MpServices->GetProcessorInfo (\r
103 MpServices,\r
104 ProcessorNumber,\r
105 ProcessorInfoBuffer\r
106 );\r
107 return Status;\r
108}\r
109\r
110/**\r
111 Worker function to execute a caller provided function on all enabled APs.\r
112\r
113 @param[in] Procedure A pointer to the function to be run on\r
114 enabled APs of the system.\r
b3c71b47
ED
115 @param[in] MpEvent A pointer to the event to be used later\r
116 to check whether procedure has done.\r
80c4b236
JF
117**/\r
118VOID\r
119StartupAPsWorker (\r
b3c71b47
ED
120 IN EFI_AP_PROCEDURE Procedure,\r
121 IN EFI_EVENT MpEvent\r
80c4b236
JF
122 )\r
123{\r
124 EFI_STATUS Status;\r
125 EFI_MP_SERVICES_PROTOCOL *MpServices;\r
b3c71b47
ED
126 CPU_FEATURES_DATA *CpuFeaturesData;\r
127\r
128 CpuFeaturesData = GetCpuFeaturesData ();\r
7217b879 129 MpServices = CpuFeaturesData->MpService.Protocol;\r
80c4b236 130\r
80c4b236
JF
131 //\r
132 // Wakeup all APs\r
133 //\r
134 Status = MpServices->StartupAllAPs (\r
135 MpServices,\r
136 Procedure,\r
137 FALSE,\r
b3c71b47 138 MpEvent,\r
80c4b236 139 0,\r
b3c71b47 140 CpuFeaturesData,\r
80c4b236
JF
141 NULL\r
142 );\r
143 ASSERT_EFI_ERROR (Status);\r
144}\r
145\r
146/**\r
147 Worker function to switch the requested AP to be the BSP from that point onward.\r
148\r
149 @param[in] ProcessorNumber The handle number of AP that is to become the new BSP.\r
150**/\r
151VOID\r
152SwitchNewBsp (\r
153 IN UINTN ProcessorNumber\r
154 )\r
155{\r
156 EFI_STATUS Status;\r
157 EFI_MP_SERVICES_PROTOCOL *MpServices;\r
7217b879
ED
158 CPU_FEATURES_DATA *CpuFeaturesData;\r
159\r
160 CpuFeaturesData = GetCpuFeaturesData ();\r
161 MpServices = CpuFeaturesData->MpService.Protocol;\r
80c4b236 162\r
80c4b236
JF
163 //\r
164 // Wakeup all APs\r
165 //\r
166 Status = MpServices->SwitchBSP (\r
167 MpServices,\r
168 ProcessorNumber,\r
169 TRUE\r
170 );\r
171 ASSERT_EFI_ERROR (Status);\r
172}\r
173\r
174/**\r
175 Worker function to retrieve the number of logical processor in the platform.\r
176\r
177 @param[out] NumberOfCpus Pointer to the total number of logical\r
178 processors in the system, including the BSP\r
179 and disabled APs.\r
180 @param[out] NumberOfEnabledProcessors Pointer to the number of enabled logical\r
181 processors that exist in system, including\r
182 the BSP.\r
183**/\r
184VOID\r
185GetNumberOfProcessor (\r
186 OUT UINTN *NumberOfCpus,\r
187 OUT UINTN *NumberOfEnabledProcessors\r
188 )\r
189{\r
190 EFI_STATUS Status;\r
191 EFI_MP_SERVICES_PROTOCOL *MpServices;\r
7217b879 192 CPU_FEATURES_DATA *CpuFeaturesData;\r
80c4b236 193\r
7217b879
ED
194 CpuFeaturesData = GetCpuFeaturesData ();\r
195 MpServices = CpuFeaturesData->MpService.Protocol;\r
80c4b236
JF
196\r
197 //\r
198 // Get the number of CPUs\r
199 //\r
200 Status = MpServices->GetNumberOfProcessors (\r
201 MpServices,\r
202 NumberOfCpus,\r
203 NumberOfEnabledProcessors\r
204 );\r
205 ASSERT_EFI_ERROR (Status);\r
206}\r
207\r
b3c71b47
ED
208/**\r
209 Performs CPU features Initialization.\r
210\r
211 This service will invoke MP service to perform CPU features\r
212 initialization on BSP/APs per user configuration.\r
213\r
214 @note This service could be called by BSP only.\r
215**/\r
216VOID\r
217EFIAPI\r
218CpuFeaturesInitialize (\r
219 VOID\r
220 )\r
221{\r
222 CPU_FEATURES_DATA *CpuFeaturesData;\r
223 UINTN OldBspNumber;\r
224 EFI_EVENT MpEvent;\r
225 EFI_STATUS Status;\r
226\r
227 CpuFeaturesData = GetCpuFeaturesData ();\r
228\r
7217b879 229 OldBspNumber = GetProcessorIndex (CpuFeaturesData);\r
b3c71b47
ED
230 CpuFeaturesData->BspNumber = OldBspNumber;\r
231\r
232 Status = gBS->CreateEvent (\r
233 EVT_NOTIFY_WAIT,\r
234 TPL_CALLBACK,\r
235 EfiEventEmptyFunction,\r
236 NULL,\r
237 &MpEvent\r
238 );\r
239 ASSERT_EFI_ERROR (Status);\r
240\r
241 //\r
242 // Wakeup all APs for programming.\r
243 //\r
244 StartupAPsWorker (SetProcessorRegister, MpEvent);\r
245 //\r
246 // Programming BSP\r
247 //\r
248 SetProcessorRegister (CpuFeaturesData);\r
249\r
250 //\r
251 // Wait all processors to finish the task.\r
252 //\r
253 do {\r
254 Status = gBS->CheckEvent (MpEvent);\r
255 } while (Status == EFI_NOT_READY);\r
256 ASSERT_EFI_ERROR (Status);\r
257\r
258 //\r
259 // Switch to new BSP if required\r
260 //\r
261 if (CpuFeaturesData->BspNumber != OldBspNumber) {\r
262 SwitchNewBsp (CpuFeaturesData->BspNumber);\r
263 }\r
264}\r
265\r