diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c index 33752c1a9f..4e97e863c7 100644 --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c @@ -1074,7 +1074,7 @@ CpuFeaturesDetect ( // // Wakeup all APs for data collection. // - StartupAPsWorker (CollectProcessorData, NULL); + StartupAllAPsWorker (CollectProcessorData, NULL); } // diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c index f87b2892aa..e2e06e88e0 100644 --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c @@ -1,7 +1,7 @@ /** @file CPU Register Table Library functions. - Copyright (c) 2017, Intel Corporation. All rights reserved.
+ Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -116,7 +116,7 @@ GetProcessorInformation ( to check whether procedure has done. **/ VOID -StartupAPsWorker ( +StartupAllAPsWorker ( IN EFI_AP_PROCEDURE Procedure, IN EFI_EVENT MpEvent ) @@ -248,7 +248,7 @@ CpuFeaturesInitialize ( // // Wakeup all APs for programming. // - StartupAPsWorker (SetProcessorRegister, MpEvent); + StartupAllAPsWorker (SetProcessorRegister, MpEvent); } // diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c index 8ad5a40e5a..64768f7a74 100644 --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c @@ -1,7 +1,7 @@ /** @file CPU Register Table Library functions. - Copyright (c) 2016, Intel Corporation. All rights reserved.
+ Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -12,6 +12,8 @@ #include #include #include +#include + #include "RegisterCpuFeatures.h" #define REGISTER_CPU_FEATURES_GUID \ @@ -154,7 +156,7 @@ GetProcessorInformation ( **/ VOID -StartupAPsWorker ( +StartupAllAPsWorker ( IN EFI_AP_PROCEDURE Procedure, IN EFI_EVENT MpEvent ) @@ -180,6 +182,47 @@ StartupAPsWorker ( ASSERT_EFI_ERROR (Status); } +/** + Worker function to execute a caller provided function on all enabled CPUs. + + @param[in] Procedure A pointer to the function to be run on + enabled CPUs of the system. + +**/ +VOID +StartupAllCPUsWorker ( + IN EFI_AP_PROCEDURE Procedure + ) +{ + EFI_STATUS Status; + EDKII_PEI_MP_SERVICES2_PPI *CpuMp2Ppi; + CPU_FEATURES_DATA *CpuFeaturesData; + + CpuFeaturesData = GetCpuFeaturesData (); + + // + // Get MP Services2 Ppi + // + Status = PeiServicesLocatePpi ( + &gEdkiiPeiMpServices2PpiGuid, + 0, + NULL, + (VOID **)&CpuMp2Ppi + ); + ASSERT_EFI_ERROR (Status); + + // + // Wakeup all APs for data collection. + // + Status = CpuMp2Ppi->StartupAllCPUs ( + CpuMp2Ppi, + Procedure, + 0, + CpuFeaturesData + ); + ASSERT_EFI_ERROR (Status); +} + /** Worker function to switch the requested AP to be the BSP from that point onward. @@ -267,23 +310,9 @@ CpuFeaturesInitialize ( CpuFeaturesData->BspNumber = OldBspNumber; // - // Known limitation: In PEI phase, CpuFeatures driver not - // support async mode execute tasks. So semaphore type - // register can't been used for this instance, must use - // DXE type instance. + // Start to program register for all CPUs. // - - if (CpuFeaturesData->NumberOfCpus > 1) { - // - // Wakeup all APs for programming. - // - StartupAPsWorker (SetProcessorRegister, NULL); - } - - // - // Programming BSP - // - SetProcessorRegister (CpuFeaturesData); + StartupAllCPUsWorker (SetProcessorRegister); // // Switch to new BSP if required diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.inf b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.inf index 63091dfeb8..61f922bf63 100644 --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.inf +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.inf @@ -46,6 +46,7 @@ [Ppis] gEfiPeiMpServicesPpiGuid ## CONSUMES + gEdkiiPeiMpServices2PpiGuid ## CONSUMES [Pcd] gUefiCpuPkgTokenSpaceGuid.PcdCpuS3DataAddress ## CONSUMES diff --git a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h index a18f926641..a25dd69292 100644 --- a/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h +++ b/UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h @@ -145,7 +145,7 @@ GetProcessorInformation ( to check whether procedure has done. **/ VOID -StartupAPsWorker ( +StartupAllAPsWorker ( IN EFI_AP_PROCEDURE Procedure, IN EFI_EVENT MpEvent );