\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
\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
CPU_MP_DATA *CpuMpData;\r
UINT8 ApLoopMode;\r
UINT8 *MonitorBuffer;\r
+ UINTN Index;\r
UINTN ApResetVectorSize;\r
UINTN BackupBufferAddr;\r
MaxLogicalProcessorNumber = PcdGet32(PcdCpuMaxLogicalProcessorNumber);\r
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
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