]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/CpuMpPei/CpuMpPei.c
UefiCpuPkg/CpuMpPei: Consume MpInitLib to produce CPU MP PPI services
[mirror_edk2.git] / UefiCpuPkg / CpuMpPei / CpuMpPei.c
index 4a453c657092a3bc094e925aa4356f4dcad91c7b..b5f8887007e42366c7275116f7faf3c9e71be5c5 100644 (file)
@@ -28,6 +28,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_PEI_NOTIFY_DESCRIPTOR mNotifyList = {
 \r
   @param PeiCpuMpData        Pointer to PEI CPU MP Data\r
 **/\r
+STATIC\r
 VOID\r
 SortApicId (\r
   IN PEI_CPU_MP_DATA   *PeiCpuMpData\r
@@ -84,6 +85,7 @@ SortApicId (
 \r
   @param Buffer  Pointer to private data buffer.\r
 **/\r
+STATIC\r
 VOID\r
 EFIAPI\r
 ApFuncEnableX2Apic (\r
@@ -100,6 +102,7 @@ ApFuncEnableX2Apic (
 \r
   @return The AP loop mode.\r
 **/\r
+STATIC\r
 UINT8\r
 GetApLoopMode (\r
   OUT UINT16     *MonitorFilterSize\r
@@ -170,6 +173,7 @@ GetMpHobData (
   \r
   @param  VolatileRegisters    Returns buffer saved the volatile resisters\r
 **/\r
+STATIC\r
 VOID\r
 SaveVolatileRegisters (\r
   OUT CPU_VOLATILE_REGISTERS    *VolatileRegisters\r
@@ -203,6 +207,7 @@ SaveVolatileRegisters (
   @param  IsRestoreDr         TRUE:  Restore DRx if supported\r
                               FALSE: Do not restore DRx\r
 **/\r
+STATIC\r
 VOID\r
 RestoreVolatileRegisters (\r
   IN CPU_VOLATILE_REGISTERS    *VolatileRegisters,\r
@@ -232,12 +237,42 @@ RestoreVolatileRegisters (
   }\r
 }\r
 \r
+/**\r
+  Find the current Processor number by APIC ID.\r
+\r
+  @param PeiCpuMpData        Pointer to PEI CPU MP Data\r
+  @param ProcessorNumber     Return the pocessor number found\r
+\r
+  @retval EFI_SUCCESS        ProcessorNumber is found and returned.\r
+  @retval EFI_NOT_FOUND      ProcessorNumber is not found.\r
+**/\r
+STATIC\r
+EFI_STATUS\r
+GetProcessorNumber (\r
+  IN PEI_CPU_MP_DATA         *PeiCpuMpData,\r
+  OUT UINTN                  *ProcessorNumber\r
+  )\r
+{\r
+  UINTN                   TotalProcessorNumber;\r
+  UINTN                   Index;\r
+\r
+  TotalProcessorNumber = PeiCpuMpData->CpuCount;\r
+  for (Index = 0; Index < TotalProcessorNumber; Index ++) {\r
+    if (PeiCpuMpData->CpuData[Index].ApicId == GetInitialApicId ()) {\r
+      *ProcessorNumber = Index;\r
+      return EFI_SUCCESS;\r
+    }\r
+  }\r
+  return EFI_NOT_FOUND;\r
+}\r
+\r
 /**\r
   This function will be called from AP reset code if BSP uses WakeUpAP.\r
 \r
   @param ExchangeInfo     Pointer to the MP exchange info buffer\r
   @param NumApsExecuting  Number of current executing AP\r
 **/\r
+STATIC\r
 VOID\r
 EFIAPI\r
 ApCFunction (\r
@@ -407,6 +442,7 @@ WriteStartupSignal (
   @param Procedure          The function to be invoked by AP\r
   @param ProcedureArgument  The argument to be passed into AP function\r
 **/\r
+STATIC\r
 VOID\r
 WakeUpAP (\r
   IN PEI_CPU_MP_DATA           *PeiCpuMpData,\r
@@ -487,6 +523,7 @@ WakeUpAP (
   @retval other   Return wakeup buffer address below 1MB.\r
   @retval -1      Cannot find free memory below 1MB.\r
 **/\r
+STATIC\r
 UINTN\r
 GetWakeupBuffer (\r
   IN UINTN                WakeupBufferSize\r
@@ -556,6 +593,7 @@ GetWakeupBuffer (
 \r
   @param PeiCpuMpData        Pointer to PEI CPU MP Data\r
 **/\r
+STATIC\r
 VOID\r
 BackupAndPrepareWakeupBuffer(\r
   IN PEI_CPU_MP_DATA         *PeiCpuMpData\r
@@ -578,6 +616,7 @@ BackupAndPrepareWakeupBuffer(
 \r
   @param PeiCpuMpData        Pointer to PEI CPU MP Data\r
 **/\r
+STATIC\r
 VOID\r
 RestoreWakeupBuffer(\r
   IN PEI_CPU_MP_DATA         *PeiCpuMpData\r
@@ -760,6 +799,7 @@ PrepareAPStartupVector (
   @retval EFI_SUCCESS        When everything is OK.\r
 \r
 **/\r
+STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 CpuMpEndOfPeiCallback (\r
@@ -829,8 +869,7 @@ CpuMpPeimInit (
   IN CONST EFI_PEI_SERVICES     **PeiServices\r
   )\r
 {\r
-  EFI_STATUS                       Status;\r
-  PEI_CPU_MP_DATA                 *PeiCpuMpData;\r
+  EFI_STATUS           Status;\r
   EFI_VECTOR_HANDOFF_INFO         *VectorInfo;\r
   EFI_PEI_VECTOR_HANDOFF_INFO_PPI *VectorHandoffInfoPpi;\r
 \r
@@ -849,31 +888,18 @@ CpuMpPeimInit (
   }\r
   Status = InitializeCpuExceptionHandlers (VectorInfo);\r
   ASSERT_EFI_ERROR (Status);\r
+  \r
   //\r
-  // Get wakeup buffer and copy AP reset code in it\r
-  //\r
-  PeiCpuMpData = PrepareAPStartupVector ();\r
-  //\r
-  // Count processor number and collect processor information\r
-  //\r
-  CountProcessorNumber (PeiCpuMpData);\r
-  //\r
-  // Build location of PEI CPU MP DATA buffer in HOB\r
+  // Wakeup APs to do initialization\r
   //\r
-  BuildGuidDataHob (\r
-    &gEfiCallerIdGuid,\r
-    (VOID *)&PeiCpuMpData,\r
-    sizeof(UINT64)\r
-    );\r
+  Status = MpInitLibInitialize ();\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
   //\r
   // Update and publish CPU BIST information\r
   //\r
-  CollectBistDataFromPpi (PeiServices, PeiCpuMpData);\r
-  //\r
-  // register an event for EndOfPei\r
-  //\r
-  Status  = PeiServicesNotifyPpi (&mNotifyList);\r
-  ASSERT_EFI_ERROR (Status);\r
+  CollectBistDataFromPpi (PeiServices);\r
+\r
   //\r
   // Install CPU MP PPI\r
   //\r