summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Platform/BroxtonPlatformPkg/PlatformDsc/PcdsFeatureFlag.dsc7
-rw-r--r--Silicon/BroxtonSoC/BroxtonSiPkg/Cpu/PowerManagement/Smm/PowerMgmtS3.c23
2 files changed, 19 insertions, 11 deletions
diff --git a/Platform/BroxtonPlatformPkg/PlatformDsc/PcdsFeatureFlag.dsc b/Platform/BroxtonPlatformPkg/PlatformDsc/PcdsFeatureFlag.dsc
index 6762a416f1..19e27ad1a9 100644
--- a/Platform/BroxtonPlatformPkg/PlatformDsc/PcdsFeatureFlag.dsc
+++ b/Platform/BroxtonPlatformPkg/PlatformDsc/PcdsFeatureFlag.dsc
@@ -1,7 +1,7 @@
## @file
# Platform Feature Pcd Description.
#
-# Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>
#
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
@@ -91,3 +91,8 @@
# new core to see if we can re-enable this
gPlatformModuleTokenSpaceGuid.PcdDeprecatedFunctionRemove|FALSE
+ ## Indicates if SMM Startup AP in a blocking fashion.
+ # TRUE - SMM Startup AP in a blocking fashion.<BR>
+ # FALSE - SMM Startup AP in a non-blocking fashion.<BR>
+ # @Prompt SMM Startup AP in a blocking fashion.
+ gUefiCpuPkgTokenSpaceGuid.PcdCpuSmmBlockStartupThisAp|FALSE \ No newline at end of file
diff --git a/Silicon/BroxtonSoC/BroxtonSiPkg/Cpu/PowerManagement/Smm/PowerMgmtS3.c b/Silicon/BroxtonSoC/BroxtonSiPkg/Cpu/PowerManagement/Smm/PowerMgmtS3.c
index 4385320544..eb36343c2c 100644
--- a/Silicon/BroxtonSoC/BroxtonSiPkg/Cpu/PowerManagement/Smm/PowerMgmtS3.c
+++ b/Silicon/BroxtonSoC/BroxtonSiPkg/Cpu/PowerManagement/Smm/PowerMgmtS3.c
@@ -1,7 +1,7 @@
/** @file
This is the SMM driver for saving and restoring the powermanagement related MSRs.
- Copyright (c) 2011 - 2016, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2011 - 2017, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
@@ -140,15 +140,18 @@ RunOnAllLogicalProcessors (
// Run the procedure on all logical processors.
//
(*Procedure) (Buffer);
- for (Index = 1; Index < gSmst->NumberOfCpus; Index++) {
- Status = EFI_NOT_READY;
- while (Status != EFI_SUCCESS) {
- Status = gSmst->SmmStartupThisAp (Procedure, Index, Buffer);
- if (Status != EFI_SUCCESS) {
- //
- // SmmStartupThisAp might return failure if AP is busy executing some other code. Let's wait for sometime and try again.
- //
- MicroSecondDelay (PPM_WAIT_PERIOD);
+ for (Index = 0; Index < gSmst->NumberOfCpus; Index++) {
+ if (Index != gSmst->CurrentlyExecutingCpu) {
+ Status = EFI_NOT_READY;
+ while (Status != EFI_SUCCESS) {
+ Status = gSmst->SmmStartupThisAp (Procedure, Index, Buffer);
+ ASSERT(Status != EFI_INVALID_PARAMETER);
+ if (Status != EFI_SUCCESS) {
+ //
+ // SmmStartupThisAp might return failure if AP is busy executing some other code. Let's wait for sometime and try again.
+ //
+ MicroSecondDelay (PPM_WAIT_PERIOD);
+ }
}
}
}