UefiCpuPkg/MpInitLib: Send INIT-SIPI-SIPI to get processor count

CollectProcessorCount() will send the 1st INIT-SIPI-SIPI to get processor count
in system.

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>
This commit is contained in:
Jeff Fan 2016-07-21 00:28:45 +08:00
parent 96f5920d1d
commit 03434dffb7
1 changed files with 40 additions and 0 deletions

View File

@ -268,6 +268,42 @@ GetProcessorNumber (
return EFI_NOT_FOUND;
}
/**
This function will get CPU count in the system.
@param[in] CpuMpData Pointer to PEI CPU MP Data
@return CPU count detected
**/
UINTN
CollectProcessorCount (
IN CPU_MP_DATA *CpuMpData
)
{
//
// Send 1st broadcast IPI to APs to wakeup APs
//
CpuMpData->InitFlag = ApInitConfig;
CpuMpData->X2ApicEnable = FALSE;
WakeUpAP (CpuMpData, TRUE, 0, NULL, NULL);
//
// Wait for AP task to complete and then exit.
//
MicroSecondDelay (PcdGet32(PcdCpuApInitTimeOutInMicroSeconds));
CpuMpData->InitFlag = ApInitDone;
ASSERT (CpuMpData->CpuCount <= PcdGet32 (PcdCpuMaxLogicalProcessorNumber));
//
// Wait for all APs finished the initialization
//
while (CpuMpData->FinishedCount < (CpuMpData->CpuCount - 1)) {
CpuPause ();
}
DEBUG ((DEBUG_INFO, "MpInitLib: Find %d processors in system.\n", CpuMpData->CpuCount));
return CpuMpData->CpuCount;
}
/*
Initialize CPU AP Data when AP is wakeup at the first time.
@ -704,6 +740,10 @@ MpInitLibInitialize (
MtrrGetAllMtrrs (&CpuMpData->MtrrTable);
//
// Wakeup all APs and calculate the processor count in system
//
CollectProcessorCount (CpuMpData);
//
// Initialize global data for MP support
//