**/\r
VOID\r
StartupAPsWorker (\r
- IN EFI_AP_PROCEDURE Procedure\r
+ IN EFI_AP_PROCEDURE Procedure,\r
+ IN EFI_EVENT MpEvent\r
)\r
{\r
EFI_STATUS Status;\r
EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;\r
+ CPU_FEATURES_DATA *CpuFeaturesData;\r
+\r
+ CpuFeaturesData = GetCpuFeaturesData ();\r
\r
//\r
// Get MP Services Protocol\r
Procedure,\r
FALSE,\r
0,\r
- NULL\r
+ CpuFeaturesData\r
);\r
ASSERT_EFI_ERROR (Status);\r
}\r
);\r
ASSERT_EFI_ERROR (Status);\r
}\r
+\r
+/**\r
+ Performs CPU features Initialization.\r
+\r
+ This service will invoke MP service to perform CPU features\r
+ initialization on BSP/APs per user configuration.\r
+\r
+ @note This service could be called by BSP only.\r
+**/\r
+VOID\r
+EFIAPI\r
+CpuFeaturesInitialize (\r
+ VOID\r
+ )\r
+{\r
+ CPU_FEATURES_DATA *CpuFeaturesData;\r
+ UINTN OldBspNumber;\r
+\r
+ CpuFeaturesData = GetCpuFeaturesData ();\r
+\r
+ OldBspNumber = GetProcessorIndex();\r
+ CpuFeaturesData->BspNumber = OldBspNumber;\r
+\r
+ //\r
+ // Known limitation: In PEI phase, CpuFeatures driver not\r
+ // support async mode execute tasks. So semaphore type\r
+ // register can't been used for this instance, must use\r
+ // DXE type instance.\r
+ //\r
+\r
+ //\r
+ // Wakeup all APs for programming.\r
+ //\r
+ StartupAPsWorker (SetProcessorRegister, NULL);\r
+ //\r
+ // Programming BSP\r
+ //\r
+ SetProcessorRegister (CpuFeaturesData);\r
+\r
+ //\r
+ // Switch to new BSP if required\r
+ //\r
+ if (CpuFeaturesData->BspNumber != OldBspNumber) {\r
+ SwitchNewBsp (CpuFeaturesData->BspNumber);\r
+ }\r
+}\r
+\r