2 CPU Register Table Library functions.
4 Copyright (c) 2016 - 2020, 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/MpServices2.h>
16 #include "RegisterCpuFeatures.h"
18 #define REGISTER_CPU_FEATURES_GUID \
20 0xa694c467, 0x697a, 0x446b, { 0xb9, 0x29, 0x5b, 0x14, 0xa0, 0xcf, 0x39, 0xf } \
23 EFI_GUID mRegisterCpuFeaturesHobGuid
= REGISTER_CPU_FEATURES_GUID
;
26 Worker function to get CPU_FEATURES_DATA pointer.
28 @return Pointer to CPU_FEATURES_DATA.
35 CPU_FEATURES_DATA
*CpuInitData
;
36 EFI_HOB_GUID_TYPE
*GuidHob
;
41 GuidHob
= GetFirstGuidHob (&mRegisterCpuFeaturesHobGuid
);
42 if (GuidHob
!= NULL
) {
43 DataInHob
= GET_GUID_HOB_DATA (GuidHob
);
44 CpuInitData
= (CPU_FEATURES_DATA
*) (*(UINTN
*) DataInHob
);
45 ASSERT (CpuInitData
!= NULL
);
47 CpuInitData
= AllocateZeroPool (sizeof (CPU_FEATURES_DATA
));
48 ASSERT (CpuInitData
!= NULL
);
50 // Build location of CPU MP DATA buffer in HOB
52 Data64
= (UINT64
) (UINTN
) CpuInitData
;
54 &mRegisterCpuFeaturesHobGuid
,
64 Worker function to get MP PPI service pointer.
66 @return MP_SERVICES variable.
74 MP_SERVICES MpService
;
77 // Get MP Services2 Ppi
79 Status
= PeiServicesLocatePpi (
80 &gEdkiiPeiMpServices2PpiGuid
,
83 (VOID
**)&MpService
.Ppi
85 ASSERT_EFI_ERROR (Status
);
90 Worker function to return processor index.
92 @param CpuFeaturesData Cpu Feature Data structure.
94 @return The processor index.
98 IN CPU_FEATURES_DATA
*CpuFeaturesData
102 EDKII_PEI_MP_SERVICES2_PPI
*CpuMp2Ppi
;
103 UINTN ProcessorIndex
;
105 CpuMp2Ppi
= CpuFeaturesData
->MpService
.Ppi
;
108 // For two reasons which use NULL for WhoAmI:
109 // 1. This function will be called by APs and AP should not use PeiServices Table
110 // 2. Check WhoAmI implementation, this parameter will not be used.
112 Status
= CpuMp2Ppi
->WhoAmI (CpuMp2Ppi
, &ProcessorIndex
);
113 ASSERT_EFI_ERROR (Status
);
114 return ProcessorIndex
;
118 Worker function to MP-related information on the requested processor at the
119 instant this call is made.
121 @param[in] ProcessorNumber The handle number of processor.
122 @param[out] ProcessorInfoBuffer A pointer to the buffer where information for
123 the requested processor is deposited.
125 @return Status of MpServices->GetProcessorInfo().
128 GetProcessorInformation (
129 IN UINTN ProcessorNumber
,
130 OUT EFI_PROCESSOR_INFORMATION
*ProcessorInfoBuffer
133 EDKII_PEI_MP_SERVICES2_PPI
*CpuMp2Ppi
;
135 CPU_FEATURES_DATA
*CpuFeaturesData
;
137 CpuFeaturesData
= GetCpuFeaturesData ();
138 CpuMp2Ppi
= CpuFeaturesData
->MpService
.Ppi
;
140 Status
= CpuMp2Ppi
->GetProcessorInfo (
149 Worker function to execute a caller provided function on all enabled APs.
151 @param[in] Procedure A pointer to the function to be run on
152 enabled APs of the system.
153 @param[in] MpEvent The Event used to sync the result.
157 StartupAllAPsWorker (
158 IN EFI_AP_PROCEDURE Procedure
,
163 EDKII_PEI_MP_SERVICES2_PPI
*CpuMp2Ppi
;
164 CPU_FEATURES_DATA
*CpuFeaturesData
;
166 CpuFeaturesData
= GetCpuFeaturesData ();
167 CpuMp2Ppi
= CpuFeaturesData
->MpService
.Ppi
;
170 // Wakeup all APs for data collection.
172 Status
= CpuMp2Ppi
->StartupAllAPs (
179 ASSERT_EFI_ERROR (Status
);
183 Worker function to execute a caller provided function on all enabled CPUs.
185 @param[in] Procedure A pointer to the function to be run on
186 enabled CPUs of the system.
190 StartupAllCPUsWorker (
191 IN EFI_AP_PROCEDURE Procedure
195 EDKII_PEI_MP_SERVICES2_PPI
*CpuMp2Ppi
;
196 CPU_FEATURES_DATA
*CpuFeaturesData
;
198 CpuFeaturesData
= GetCpuFeaturesData ();
201 // Get MP Services2 Ppi
203 CpuMp2Ppi
= CpuFeaturesData
->MpService
.Ppi
;
204 Status
= CpuMp2Ppi
->StartupAllCPUs (
210 ASSERT_EFI_ERROR (Status
);
214 Worker function to switch the requested AP to be the BSP from that point onward.
216 @param[in] ProcessorNumber The handle number of AP that is to become the new BSP.
220 IN UINTN ProcessorNumber
224 EDKII_PEI_MP_SERVICES2_PPI
*CpuMp2Ppi
;
225 CPU_FEATURES_DATA
*CpuFeaturesData
;
227 CpuFeaturesData
= GetCpuFeaturesData ();
228 CpuMp2Ppi
= CpuFeaturesData
->MpService
.Ppi
;
231 // Wakeup all APs for data collection.
233 Status
= CpuMp2Ppi
->SwitchBSP (
238 ASSERT_EFI_ERROR (Status
);
242 Worker function to retrieve the number of logical processor in the platform.
244 @param[out] NumberOfCpus Pointer to the total number of logical
245 processors in the system, including the BSP
247 @param[out] NumberOfEnabledProcessors Pointer to the number of enabled logical
248 processors that exist in system, including
252 GetNumberOfProcessor (
253 OUT UINTN
*NumberOfCpus
,
254 OUT UINTN
*NumberOfEnabledProcessors
258 EDKII_PEI_MP_SERVICES2_PPI
*CpuMp2Ppi
;
259 CPU_FEATURES_DATA
*CpuFeaturesData
;
261 CpuFeaturesData
= GetCpuFeaturesData ();
262 CpuMp2Ppi
= CpuFeaturesData
->MpService
.Ppi
;
265 // Get the number of CPUs
267 Status
= CpuMp2Ppi
->GetNumberOfProcessors (
270 NumberOfEnabledProcessors
272 ASSERT_EFI_ERROR (Status
);
276 Performs CPU features Initialization.
278 This service will invoke MP service to perform CPU features
279 initialization on BSP/APs per user configuration.
281 @note This service could be called by BSP only.
285 CpuFeaturesInitialize (
289 CPU_FEATURES_DATA
*CpuFeaturesData
;
292 CpuFeaturesData
= GetCpuFeaturesData ();
294 OldBspNumber
= GetProcessorIndex (CpuFeaturesData
);
295 CpuFeaturesData
->BspNumber
= OldBspNumber
;
298 // Start to program register for all CPUs.
300 StartupAllCPUsWorker (SetProcessorRegister
);
303 // Switch to new BSP if required
305 if (CpuFeaturesData
->BspNumber
!= OldBspNumber
) {
306 SwitchNewBsp (CpuFeaturesData
->BspNumber
);