]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/MpInitLib: Skip collect processor count if GUIDed HOB exist
authorJeff Fan <jeff.fan@intel.com>
Wed, 20 Jul 2016 16:32:53 +0000 (00:32 +0800)
committerJeff Fan <jeff.fan@intel.com>
Wed, 17 Aug 2016 12:01:55 +0000 (20:01 +0800)
If GUIDed HOB mCpuInitMpLibHobGuid exists, we could get the processor count and
processor APICID and Initial APICID from CPU_INFO_IN_HOB. We needn't to delay
for broadcast INIT-SIPI-SIPI results and could improve performance.

Cc: Michael Kinney <michael.d.kinney@intel.com>
Cc: Feng Tian <feng.tian@intel.com>
Cc: Giri P Mudusuru <giri.p.mudusuru@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Michael Kinney <michael.d.kinney@intel.com>
Tested-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Michael Kinney <michael.d.kinney@intel.com>
UefiCpuPkg/Library/MpInitLib/MpLib.c

index d6eef138ac13f0ff82a0452385be564e78602a5b..7ae65598dc281d7cd75382bd515077ddf532cbea 100644 (file)
@@ -765,6 +765,8 @@ MpInitLibInitialize (
   VOID\r
   )\r
 {\r
+  CPU_MP_DATA              *OldCpuMpData;\r
+  CPU_INFO_IN_HOB          *CpuInfoInHob;\r
   UINT32                   MaxLogicalProcessorNumber;\r
   UINT32                   ApStackSize;\r
   MP_ASSEMBLY_ADDRESS_MAP  AddressMap;\r
@@ -778,7 +780,13 @@ MpInitLibInitialize (
   UINTN                    Index;\r
   UINTN                    ApResetVectorSize;\r
   UINTN                    BackupBufferAddr;\r
-  MaxLogicalProcessorNumber = PcdGet32(PcdCpuMaxLogicalProcessorNumber);\r
+\r
+  OldCpuMpData = GetCpuMpDataFromGuidedHob ();\r
+  if (OldCpuMpData == NULL) {\r
+    MaxLogicalProcessorNumber = PcdGet32(PcdCpuMaxLogicalProcessorNumber);\r
+  } else {\r
+    MaxLogicalProcessorNumber = OldCpuMpData->CpuCount;\r
+  }\r
 \r
   AsmGetAddressMap (&AddressMap);\r
   ApResetVectorSize = AddressMap.RendezvousFunnelSize + sizeof (MP_CPU_EXCHANGE_INFO);\r
@@ -843,11 +851,52 @@ MpInitLibInitialize (
   //\r
   MtrrGetAllMtrrs (&CpuMpData->MtrrTable);\r
 \r
+  if (OldCpuMpData == NULL) {\r
+    //\r
+    // Wakeup all APs and calculate the processor count in system\r
+    //\r
+    CollectProcessorCount (CpuMpData);\r
+  } else {\r
+    //\r
+    // APs have been wakeup before, just get the CPU Information\r
+    // from HOB\r
+    //\r
+    CpuMpData->CpuCount  = OldCpuMpData->CpuCount;\r
+    CpuMpData->BspNumber = OldCpuMpData->BspNumber;\r
+    CpuMpData->InitFlag  = ApInitReconfig;\r
+    CpuInfoInHob = (CPU_INFO_IN_HOB *) (UINTN) OldCpuMpData->CpuInfoInHob;\r
+    for (Index = 0; Index < CpuMpData->CpuCount; Index++) {\r
+      InitializeSpinLock(&CpuMpData->CpuData[Index].ApLock);\r
+      CpuMpData->CpuData[Index].ApicId        = CpuInfoInHob[Index].ApicId;\r
+      CpuMpData->CpuData[Index].InitialApicId = CpuInfoInHob[Index].InitialApicId;\r
+      if (CpuMpData->CpuData[Index].InitialApicId >= 255) {\r
+        CpuMpData->X2ApicEnable = TRUE;\r
+      }\r
+      CpuMpData->CpuData[Index].Health     = CpuInfoInHob[Index].Health;\r
+      CpuMpData->CpuData[Index].CpuHealthy = (CpuMpData->CpuData[Index].Health == 0)? TRUE:FALSE;\r
+      CpuMpData->CpuData[Index].ApFunction = 0;\r
+      CopyMem (\r
+        &CpuMpData->CpuData[Index].VolatileRegisters,\r
+        &CpuMpData->CpuData[0].VolatileRegisters,\r
+        sizeof (CPU_VOLATILE_REGISTERS)\r
+        );\r
+    }\r
+    //\r
+    // Wakeup APs to do some AP initialize sync\r
+    //\r
+    WakeUpAP (CpuMpData, TRUE, 0, ApInitializeSync, CpuMpData);\r
+    //\r
+    // Wait for all APs finished initialization\r
+    //\r
+    while (CpuMpData->FinishedCount < (CpuMpData->CpuCount - 1)) {\r
+      CpuPause ();\r
+    }\r
+    CpuMpData->InitFlag = ApInitDone;\r
+    for (Index = 0; Index < CpuMpData->CpuCount; Index++) {\r
+      SetApState (&CpuMpData->CpuData[Index], CpuStateIdle);\r
+    }\r
+  }\r
 \r
-  //\r
-  // Wakeup all APs and calculate the processor count in system\r
-  //\r
-  CollectProcessorCount (CpuMpData);\r
   //\r
   // Initialize global data for MP support\r
   //\r
@@ -936,6 +985,7 @@ MpInitLibGetNumberOfProcessors (
 {\r
   return EFI_UNSUPPORTED;\r
 }\r
+\r
 /**\r
   Get pointer to CPU MP Data structure from GUIDed HOB.\r
 \r