2 CPU Register Table Library functions.
4 Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
11 #include <Library/HobLib.h>
12 #include <Library/PeiServicesLib.h>
13 #include <Library/PeiServicesTablePointerLib.h>
14 #include <Ppi/MpServices.h>
15 #include <Ppi/MpServices2.h>
17 #include "RegisterCpuFeatures.h"
19 #define REGISTER_CPU_FEATURES_GUID \
21 0xa694c467, 0x697a, 0x446b, { 0xb9, 0x29, 0x5b, 0x14, 0xa0, 0xcf, 0x39, 0xf } \
24 EFI_GUID mRegisterCpuFeaturesHobGuid
= REGISTER_CPU_FEATURES_GUID
;
27 Worker function to get CPU_FEATURES_DATA pointer.
29 @return Pointer to CPU_FEATURES_DATA.
36 CPU_FEATURES_DATA
*CpuInitData
;
37 EFI_HOB_GUID_TYPE
*GuidHob
;
42 GuidHob
= GetFirstGuidHob (&mRegisterCpuFeaturesHobGuid
);
43 if (GuidHob
!= NULL
) {
44 DataInHob
= GET_GUID_HOB_DATA (GuidHob
);
45 CpuInitData
= (CPU_FEATURES_DATA
*) (*(UINTN
*) DataInHob
);
46 ASSERT (CpuInitData
!= NULL
);
48 CpuInitData
= AllocateZeroPool (sizeof (CPU_FEATURES_DATA
));
49 ASSERT (CpuInitData
!= NULL
);
51 // Build location of CPU MP DATA buffer in HOB
53 Data64
= (UINT64
) (UINTN
) CpuInitData
;
55 &mRegisterCpuFeaturesHobGuid
,
65 Worker function to get MP PPI service pointer.
67 @return MP_SERVICES variable.
75 MP_SERVICES MpService
;
78 // Get MP Services Protocol
80 Status
= PeiServicesLocatePpi (
81 &gEfiPeiMpServicesPpiGuid
,
84 (VOID
**)&MpService
.Ppi
86 ASSERT_EFI_ERROR (Status
);
91 Worker function to return processor index.
93 @param CpuFeaturesData Cpu Feature Data structure.
95 @return The processor index.
99 IN CPU_FEATURES_DATA
*CpuFeaturesData
103 EFI_PEI_MP_SERVICES_PPI
*CpuMpPpi
;
104 UINTN ProcessorIndex
;
106 CpuMpPpi
= CpuFeaturesData
->MpService
.Ppi
;
109 // For two reasons which use NULL for WhoAmI:
110 // 1. This function will be called by APs and AP should not use PeiServices Table
111 // 2. Check WhoAmI implementation, this parameter will not be used.
113 Status
= CpuMpPpi
->WhoAmI(NULL
, CpuMpPpi
, &ProcessorIndex
);
114 ASSERT_EFI_ERROR (Status
);
115 return ProcessorIndex
;
119 Worker function to MP-related information on the requested processor at the
120 instant this call is made.
122 @param[in] ProcessorNumber The handle number of processor.
123 @param[out] ProcessorInfoBuffer A pointer to the buffer where information for
124 the requested processor is deposited.
126 @return Status of MpServices->GetProcessorInfo().
129 GetProcessorInformation (
130 IN UINTN ProcessorNumber
,
131 OUT EFI_PROCESSOR_INFORMATION
*ProcessorInfoBuffer
134 EFI_PEI_MP_SERVICES_PPI
*CpuMpPpi
;
136 CPU_FEATURES_DATA
*CpuFeaturesData
;
138 CpuFeaturesData
= GetCpuFeaturesData ();
139 CpuMpPpi
= CpuFeaturesData
->MpService
.Ppi
;
141 Status
= CpuMpPpi
->GetProcessorInfo (
142 GetPeiServicesTablePointer(),
151 Worker function to execute a caller provided function on all enabled APs.
153 @param[in] Procedure A pointer to the function to be run on
154 enabled APs of the system.
155 @param[in] MpEvent The Event used to sync the result.
159 StartupAllAPsWorker (
160 IN EFI_AP_PROCEDURE Procedure
,
165 EFI_PEI_MP_SERVICES_PPI
*CpuMpPpi
;
166 CPU_FEATURES_DATA
*CpuFeaturesData
;
168 CpuFeaturesData
= GetCpuFeaturesData ();
169 CpuMpPpi
= CpuFeaturesData
->MpService
.Ppi
;
172 // Wakeup all APs for data collection.
174 Status
= CpuMpPpi
->StartupAllAPs (
175 GetPeiServicesTablePointer (),
182 ASSERT_EFI_ERROR (Status
);
186 Worker function to execute a caller provided function on all enabled CPUs.
188 @param[in] Procedure A pointer to the function to be run on
189 enabled CPUs of the system.
193 StartupAllCPUsWorker (
194 IN EFI_AP_PROCEDURE Procedure
198 EDKII_PEI_MP_SERVICES2_PPI
*CpuMp2Ppi
;
199 CPU_FEATURES_DATA
*CpuFeaturesData
;
201 CpuFeaturesData
= GetCpuFeaturesData ();
204 // Get MP Services2 Ppi
206 Status
= PeiServicesLocatePpi (
207 &gEdkiiPeiMpServices2PpiGuid
,
212 ASSERT_EFI_ERROR (Status
);
215 // Wakeup all APs for data collection.
217 Status
= CpuMp2Ppi
->StartupAllCPUs (
223 ASSERT_EFI_ERROR (Status
);
227 Worker function to switch the requested AP to be the BSP from that point onward.
229 @param[in] ProcessorNumber The handle number of AP that is to become the new BSP.
233 IN UINTN ProcessorNumber
237 EFI_PEI_MP_SERVICES_PPI
*CpuMpPpi
;
238 CPU_FEATURES_DATA
*CpuFeaturesData
;
240 CpuFeaturesData
= GetCpuFeaturesData ();
241 CpuMpPpi
= CpuFeaturesData
->MpService
.Ppi
;
244 // Wakeup all APs for data collection.
246 Status
= CpuMpPpi
->SwitchBSP (
247 GetPeiServicesTablePointer (),
252 ASSERT_EFI_ERROR (Status
);
256 Worker function to retrieve the number of logical processor in the platform.
258 @param[out] NumberOfCpus Pointer to the total number of logical
259 processors in the system, including the BSP
261 @param[out] NumberOfEnabledProcessors Pointer to the number of enabled logical
262 processors that exist in system, including
266 GetNumberOfProcessor (
267 OUT UINTN
*NumberOfCpus
,
268 OUT UINTN
*NumberOfEnabledProcessors
272 EFI_PEI_MP_SERVICES_PPI
*CpuMpPpi
;
273 CPU_FEATURES_DATA
*CpuFeaturesData
;
275 CpuFeaturesData
= GetCpuFeaturesData ();
276 CpuMpPpi
= CpuFeaturesData
->MpService
.Ppi
;
279 // Get the number of CPUs
281 Status
= CpuMpPpi
->GetNumberOfProcessors (
282 GetPeiServicesTablePointer (),
285 NumberOfEnabledProcessors
287 ASSERT_EFI_ERROR (Status
);
291 Performs CPU features Initialization.
293 This service will invoke MP service to perform CPU features
294 initialization on BSP/APs per user configuration.
296 @note This service could be called by BSP only.
300 CpuFeaturesInitialize (
304 CPU_FEATURES_DATA
*CpuFeaturesData
;
307 CpuFeaturesData
= GetCpuFeaturesData ();
309 OldBspNumber
= GetProcessorIndex (CpuFeaturesData
);
310 CpuFeaturesData
->BspNumber
= OldBspNumber
;
313 // Start to program register for all CPUs.
315 StartupAllCPUsWorker (SetProcessorRegister
);
318 // Switch to new BSP if required
320 if (CpuFeaturesData
->BspNumber
!= OldBspNumber
) {
321 SwitchNewBsp (CpuFeaturesData
->BspNumber
);