<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);" class="elementToProof">
<span style="font-size:11pt;margin:0px" class="ContentPasted0">Reviewed-by: Ray Ni <ray.ni@intel.com></span>
<div style="margin:0px"><br class="ContentPasted0">
<span style="font-size:11pt;margin:0px"></span></div>
<br>
</div>
<div class="elementToProof">
<div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);">
<br>
</div>
<div id="Signature">
<div>
<div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);">
Thanks,</div>
<div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 11pt; color: rgb(0, 0, 0);">
Ray</div>
</div>
</div>
</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Tan, Dun <dun.tan@intel.com><br>
<b>Sent:</b> Wednesday, August 30, 2023 3:34 PM<br>
<b>To:</b> devel@edk2.groups.io <devel@edk2.groups.io><br>
<b>Cc:</b> Dong, Eric <eric.dong@intel.com>; Ni, Ray <ray.ni@intel.com>; Kumar, Rahul R <rahul.r.kumar@intel.com><br>
<b>Subject:</b> [Patch V3 5/5] UefiCpuPkg/PiSmmCpuDxe: use MpService2Ppi to wakeup AP in s3</font>
<div> </div>
</div>
<div class="BodyFragment"><font size="2"><span style="font-size:11pt;">
<div class="PlainText">Use MpService2Ppi to wakeup AP in s3 boot flow during initializing<br>
CPU. If mSmmS3ResumeState->MpService2Ppi is not 0, then BSP will<br>
use MpService2Ppi->StartupAllCPUs to do CPU initialization for both<br>
BSP and AP instead of only sending InitSipiSipi for AP.<br>
<br>
Signed-off-by: Dun Tan <dun.tan@intel.com><br>
Cc: Eric Dong <eric.dong@intel.com><br>
Cc: Ray Ni <ray.ni@intel.com><br>
Cc: Rahul Kumar <rahul1.kumar@intel.com><br>
---<br>
 UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c | 58 +++++++++++++++++++++++++++++++++++-----------------------<br>
 1 file changed, 35 insertions(+), 23 deletions(-)<br>
<br>
diff --git a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c<br>
index b9dbeaef87..0bae0e33f1 100644<br>
--- a/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c<br>
+++ b/UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c<br>
@@ -7,6 +7,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent<br>
 **/<br>
 <br>
 #include "PiSmmCpuDxeSmm.h"<br>
+#include <PiPei.h><br>
+#include <Ppi/MpServices2.h><br>
 <br>
 #pragma pack(1)<br>
 typedef struct {<br>
@@ -594,18 +596,21 @@ InitializeCpuAfterRebase (<br>
   UINT8  Stack[128];<br>
 <br>
   SetRegister (FALSE);<br>
-  if (IsBsp) {<br>
-    while (mNumberToFinish > 0) {<br>
-      CpuPause ();<br>
+<br>
+  if (mSmmS3ResumeState->MpService2Ppi == 0) {<br>
+    if (IsBsp) {<br>
+      while (mNumberToFinish > 0) {<br>
+        CpuPause ();<br>
+      }<br>
+    } else {<br>
+      //<br>
+      // Place AP into the safe code, count down the number with lock mechanism in the safe code.<br>
+      //<br>
+      TopOfStack  = (UINTN)Stack + sizeof (Stack);<br>
+      TopOfStack &= ~(UINTN)(CPU_STACK_ALIGNMENT - 1);<br>
+      CopyMem ((VOID *)(UINTN)mApHltLoopCode, mApHltLoopCodeTemplate, sizeof (mApHltLoopCodeTemplate));<br>
+      TransferApToSafeState ((UINTN)mApHltLoopCode, TopOfStack, (UINTN)&mNumberToFinish);<br>
     }<br>
-  } else {<br>
-    //<br>
-    // Place AP into the safe code, count down the number with lock mechanism in the safe code.<br>
-    //<br>
-    TopOfStack  = (UINTN)Stack + sizeof (Stack);<br>
-    TopOfStack &= ~(UINTN)(CPU_STACK_ALIGNMENT - 1);<br>
-    CopyMem ((VOID *)(UINTN)mApHltLoopCode, mApHltLoopCodeTemplate, sizeof (mApHltLoopCodeTemplate));<br>
-    TransferApToSafeState ((UINTN)mApHltLoopCode, TopOfStack, (UINTN)&mNumberToFinish);<br>
   }<br>
 }<br>
 <br>
@@ -783,11 +788,12 @@ SmmRestoreCpu (<br>
   VOID<br>
   )<br>
 {<br>
-  SMM_S3_RESUME_STATE       *SmmS3ResumeState;<br>
-  IA32_DESCRIPTOR           Ia32Idtr;<br>
-  IA32_DESCRIPTOR           X64Idtr;<br>
-  IA32_IDT_GATE_DESCRIPTOR  IdtEntryTable[EXCEPTION_VECTOR_NUMBER];<br>
-  EFI_STATUS                Status;<br>
+  SMM_S3_RESUME_STATE         *SmmS3ResumeState;<br>
+  IA32_DESCRIPTOR             Ia32Idtr;<br>
+  IA32_DESCRIPTOR             X64Idtr;<br>
+  IA32_IDT_GATE_DESCRIPTOR    IdtEntryTable[EXCEPTION_VECTOR_NUMBER];<br>
+  EFI_STATUS                  Status;<br>
+  EDKII_PEI_MP_SERVICES2_PPI  *Mp2ServicePpi;<br>
 <br>
   DEBUG ((DEBUG_INFO, "SmmRestoreCpu()\n"));<br>
 <br>
@@ -852,15 +858,21 @@ SmmRestoreCpu (<br>
     //<br>
     mInitApsAfterSmmBaseReloc = FALSE;<br>
 <br>
-    PrepareApStartupVector (mAcpiCpuData.StartupVector);<br>
-    //<br>
-    // Send INIT IPI - SIPI to all APs<br>
-    //<br>
-    SendInitSipiSipiAllExcludingSelf ((UINT32)mAcpiCpuData.StartupVector);<br>
+    if (mSmmS3ResumeState->MpService2Ppi != 0) {<br>
+      Mp2ServicePpi = (EDKII_PEI_MP_SERVICES2_PPI *)(UINTN)mSmmS3ResumeState->MpService2Ppi;<br>
+      Mp2ServicePpi->StartupAllCPUs (Mp2ServicePpi, InitializeCpuProcedure, 0, NULL);<br>
+    } else {<br>
+      PrepareApStartupVector (mAcpiCpuData.StartupVector);<br>
+      //<br>
+      // Send INIT IPI - SIPI to all APs<br>
+      //<br>
+      SendInitSipiSipiAllExcludingSelf ((UINT32)mAcpiCpuData.StartupVector);<br>
+      InitializeCpuProcedure (NULL);<br>
+    }<br>
+  } else {<br>
+    InitializeCpuProcedure (NULL);<br>
   }<br>
 <br>
-  InitializeCpuProcedure (NULL);<br>
-<br>
   //<br>
   // Set a flag to restore SMM configuration in S3 path.<br>
   //<br>
-- <br>
2.31.1.windows.1<br>
<br>
</div>
</span></font></div>
</body>
</html>


<div width="1" style="color:white;clear:both">_._,_._,_</div>
<hr>


Groups.io Links:<p>


  
    You receive all messages sent to this group.
  
  


<p>
<a target="_blank" href="https://edk2.groups.io/g/devel/message/108304">View/Reply Online (#108304)</a> |


  

|

  <a target="_blank" href="https://groups.io/mt/101047983/1813853">Mute This Topic</a>


| <a href="https://edk2.groups.io/g/devel/post">New Topic</a>

<br>




<a href="https://edk2.groups.io/g/devel/editsub/1813853">Your Subscription</a> |
<a href="mailto:devel+owner@edk2.groups.io">Contact Group Owner</a> |

<a href="https://edk2.groups.io/g/devel/leave/3943202/1813853/130120423/xyzzy">Unsubscribe</a>

 [edk2-devel-archive@redhat.com]<br>
<div width="1" style="color:white;clear:both">_._,_._,_</div>