]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/MpInitLib: Initialize CPU_AP_DATA for CPU APs
authorJeff Fan <jeff.fan@intel.com>
Wed, 20 Jul 2016 15:43:29 +0000 (23:43 +0800)
committerJeff Fan <jeff.fan@intel.com>
Wed, 17 Aug 2016 12:00:15 +0000 (20:00 +0800)
Initialize CPU_AP_DATA for CPU APs and add GetApState()/SetApState() helper
functions to get/set AP state.

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
UefiCpuPkg/Library/MpInitLib/MpLib.h

index f05db7c2a5dc7420b5e63f4a4db4b9e370fb8b86..70e5eb1b411a843eb6369819ee350531dffbb258 100644 (file)
 \r
 #include "MpLib.h"\r
 \r
+/**\r
+  Get the Application Processors state.\r
+\r
+  @param[in]  CpuData    The pointer to CPU_AP_DATA of specified AP\r
+\r
+  @return  The AP status\r
+**/\r
+CPU_STATE\r
+GetApState (\r
+  IN  CPU_AP_DATA     *CpuData\r
+  )\r
+{\r
+  return CpuData->State;\r
+}\r
+\r
+/**\r
+  Set the Application Processors state.\r
+\r
+  @param[in]   CpuData    The pointer to CPU_AP_DATA of specified AP\r
+  @param[in]   State      The AP status\r
+**/\r
+VOID\r
+SetApState (\r
+  IN  CPU_AP_DATA     *CpuData,\r
+  IN  CPU_STATE       State\r
+  )\r
+{\r
+  AcquireSpinLock (&CpuData->ApLock);\r
+  CpuData->State = State;\r
+  ReleaseSpinLock (&CpuData->ApLock);\r
+}\r
 \r
 /**\r
   Detect whether Mwait-monitor feature is supported.\r
@@ -74,6 +105,40 @@ GetApLoopMode (
 \r
   return ApLoopMode;\r
 }\r
+/*\r
+  Initialize CPU AP Data when AP is wakeup at the first time.\r
+\r
+  @param[in, out] CpuMpData        Pointer to PEI CPU MP Data\r
+  @param[in]      ProcessorNumber  The handle number of processor\r
+  @param[in]      BistData         Processor BIST data\r
+\r
+**/\r
+VOID\r
+InitializeApData (\r
+  IN OUT CPU_MP_DATA      *CpuMpData,\r
+  IN     UINTN            ProcessorNumber,\r
+  IN     UINT32           BistData\r
+  )\r
+{\r
+  CpuMpData->CpuData[ProcessorNumber].Waiting    = FALSE;\r
+  CpuMpData->CpuData[ProcessorNumber].Health     = BistData;\r
+  CpuMpData->CpuData[ProcessorNumber].CpuHealthy = (BistData == 0) ? TRUE : FALSE;\r
+  CpuMpData->CpuData[ProcessorNumber].ApicId     = GetApicId ();\r
+  CpuMpData->CpuData[ProcessorNumber].InitialApicId = GetInitialApicId ();\r
+  if (CpuMpData->CpuData[ProcessorNumber].InitialApicId >= 0xFF) {\r
+    //\r
+    // Set x2APIC mode if there are any logical processor reporting\r
+    // an Initial APIC ID of 255 or greater.\r
+    //\r
+    AcquireSpinLock(&CpuMpData->MpLock);\r
+    CpuMpData->X2ApicEnable = TRUE;\r
+    ReleaseSpinLock(&CpuMpData->MpLock);\r
+  }\r
+\r
+  InitializeSpinLock(&CpuMpData->CpuData[ProcessorNumber].ApLock);\r
+  SetApState (&CpuMpData->CpuData[ProcessorNumber], CpuStateIdle);\r
+}\r
+\r
 /**\r
   MP Initialize Library initialization.\r
 \r
@@ -103,6 +168,7 @@ MpInitLibInitialize (
   CPU_MP_DATA              *CpuMpData;\r
   UINT8                    ApLoopMode;\r
   UINT8                    *MonitorBuffer;\r
+  UINTN                    Index;\r
   UINTN                    ApResetVectorSize;\r
   UINTN                    BackupBufferAddr;\r
   MaxLogicalProcessorNumber = PcdGet32(PcdCpuMaxLogicalProcessorNumber);\r
@@ -138,6 +204,10 @@ MpInitLibInitialize (
   CpuMpData->CpuInfoInHob     = (UINT64) (UINTN) (CpuMpData->CpuData + MaxLogicalProcessorNumber);\r
   InitializeSpinLock(&CpuMpData->MpLock);\r
   //\r
+  // Set BSP basic information\r
+  //\r
+  InitializeApData (CpuMpData, 0, 0);\r
+  //\r
   // Save assembly code information\r
   //\r
   CopyMem (&CpuMpData->AddressMap, &AddressMap, sizeof (MP_ASSEMBLY_ADDRESS_MAP));\r
@@ -147,6 +217,12 @@ MpInitLibInitialize (
   CpuMpData->ApLoopMode = ApLoopMode;\r
   DEBUG ((DEBUG_INFO, "AP Loop Mode is %d\n", CpuMpData->ApLoopMode));\r
   //\r
+  // Set up APs wakeup signal buffer\r
+  //\r
+  for (Index = 0; Index < MaxLogicalProcessorNumber; Index++) {\r
+    CpuMpData->CpuData[Index].StartupApSignal =\r
+      (UINT32 *)(MonitorBuffer + MonitorFilterSize * Index);\r
+  }\r
   // Store BSP's MTRR setting\r
   //\r
   MtrrGetAllMtrrs (&CpuMpData->MtrrTable);\r
index e605f8de41edd830f7ed12f57fdb72cf4900cb32..84bd8721982caf6b55206cfd1ebaa9651b5d62d5 100644 (file)
@@ -54,6 +54,17 @@ typedef enum {
   ApInitDone     = 3\r
 } AP_INIT_STATE;\r
 \r
+//\r
+// AP state\r
+//\r
+typedef enum {\r
+  CpuStateIdle,\r
+  CpuStateReady,\r
+  CpuStateBusy,\r
+  CpuStateFinished,\r
+  CpuStateDisabled\r
+} CPU_STATE;\r
+\r
 //\r
 // AP related data\r
 //\r
@@ -66,6 +77,7 @@ typedef struct {
   UINT32                         ApicId;\r
   UINT32                         Health;\r
   BOOLEAN                        CpuHealthy;\r
+  volatile CPU_STATE             State;\r
   BOOLEAN                        Waiting;\r
   BOOLEAN                        *Finished;\r
   UINT64                         ExpectedTime;\r