diff options
author | Eric Dong <eric.dong@intel.com> | 2017-10-26 13:55:21 +0800 |
---|---|---|
committer | Eric Dong <eric.dong@intel.com> | 2017-10-27 09:34:38 +0800 |
commit | 861218740d6d0f6b443f4ef6e170f9524372add8 (patch) | |
tree | 3940a84cb196d794630f5167f6e5bfb39f78201c /UefiCpuPkg | |
parent | bf5a306ab5e0b1829b1d59180bc010648f09a32e (diff) | |
download | edk2-861218740d6d0f6b443f4ef6e170f9524372add8.tar.gz edk2-861218740d6d0f6b443f4ef6e170f9524372add8.tar.bz2 edk2-861218740d6d0f6b443f4ef6e170f9524372add8.zip |
UefiCpuPkg/MpInitLib: Keep compatible with former AP counting solution.
For some special platforms (such as Ovmf), it is possible
that, some APs start up *and finish* before the remaining
APs start up *at all*. In this case, the enhance
solution by changes 0594ec41 not works as expected.
This change remove check CpuMpData->CpuCount logic to let old
solution still workable if platform owner still set a long
time for PcdCpuApInitTimeOutInMicroSeconds. It's platform
owner's response to decide which solution to use.
Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Jeff Fan <vanjeff_919@hotmail.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Jeff Fan <vanjeff_919@hotmail.com>
Diffstat (limited to 'UefiCpuPkg')
-rw-r--r-- | UefiCpuPkg/Library/MpInitLib/MpLib.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/UefiCpuPkg/Library/MpInitLib/MpLib.c b/UefiCpuPkg/Library/MpInitLib/MpLib.c index 48f930b701..18060fd099 100644 --- a/UefiCpuPkg/Library/MpInitLib/MpLib.c +++ b/UefiCpuPkg/Library/MpInitLib/MpLib.c @@ -936,15 +936,20 @@ WakeUpAP ( }
if (CpuMpData->InitFlag == ApInitConfig) {
//
- // Wait for one potential AP waken up in one specified period
+ // Here support two methods to collect AP count through adjust
+ // PcdCpuApInitTimeOutInMicroSeconds values.
//
- if (CpuMpData->CpuCount == 0) {
- TimedWaitForApFinish (
- CpuMpData,
- PcdGet32 (PcdCpuMaxLogicalProcessorNumber) - 1,
- PcdGet32 (PcdCpuApInitTimeOutInMicroSeconds)
- );
- }
+ // one way is set a value to just let the first AP to start the
+ // initialization, then through the later while loop to wait all Aps
+ // finsh the initialization.
+ // The other way is set a value to let all APs finished the initialzation.
+ // In this case, the later while loop is useless.
+ //
+ TimedWaitForApFinish (
+ CpuMpData,
+ PcdGet32 (PcdCpuMaxLogicalProcessorNumber) - 1,
+ PcdGet32 (PcdCpuApInitTimeOutInMicroSeconds)
+ );
while (CpuMpData->MpCpuExchangeInfo->NumApsExecuting != 0) {
CpuPause();
|