]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/CpuMpPei: Add GetApLoopMode() to get AP loop mode
authorJeff Fan <jeff.fan@intel.com>
Fri, 18 Dec 2015 03:24:27 +0000 (03:24 +0000)
committervanjeff <vanjeff@Edk2>
Fri, 18 Dec 2015 03:24:27 +0000 (03:24 +0000)
Add GetApLoopMode() that will get PCD PcdCpuApLoopMode firstly. If it is
ApInMwaitLoop, we will check if MONITOR/MWAIT feature supported by CPUID. If
MONITOR/MWAIT feature is not supported, force AP loop mode to ApInHltLoop.

GetApLoopMode() also return the largest line size required.

Contributed-under: TianoCore Contribution Agreement 1.0
Cc: Feng Tian <feng.tian@intel.com>
Cc: Michael Kinney <michael.d.kinney@intel.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Signed-off-by: Michael Kinney <michael.d.kinney@intel.com>
Tested-by: Michael Kinney <michael.d.kinney@intel.com>
Reviewed-by: Michael Kinney <michael.d.kinney@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19343 6f19259b-4bc3-4df7-8a09-765794883524

UefiCpuPkg/CpuMpPei/CpuMpPei.c
UefiCpuPkg/CpuMpPei/CpuMpPei.h
UefiCpuPkg/CpuMpPei/CpuMpPei.inf
UefiCpuPkg/Include/Register/Cpuid.h

index 2e6e7611a2618ea1492d6debceb2f756bc2113bb..ac609a01f8cc4a4e2b3c0894f313eaed2d7f15c2 100644 (file)
@@ -117,6 +117,54 @@ ApFuncEnableX2Apic (
   SetApicMode (LOCAL_APIC_MODE_X2APIC);\r
 }\r
 \r
+/**\r
+  Get AP loop mode.\r
+\r
+  @param MonitorFilterSize  Returns the largest monitor-line size in bytes.\r
+\r
+  @return The AP loop mode.\r
+**/\r
+UINT8\r
+GetApLoopMode (\r
+  OUT UINT16     *MonitorFilterSize\r
+  )\r
+{\r
+  UINT8          ApLoopMode;\r
+  UINT32         RegEbx;\r
+  UINT32         RegEcx;\r
+  UINT32         RegEdx;\r
+\r
+  ASSERT (MonitorFilterSize != NULL);\r
+\r
+  ApLoopMode = PcdGet8 (PcdCpuApLoopMode);\r
+  ASSERT (ApLoopMode >= ApInHltLoop && ApLoopMode <= ApInRunLoop);\r
+  if (ApLoopMode == ApInMwaitLoop) {\r
+    AsmCpuid (CPUID_VERSION_INFO, NULL, NULL, &RegEcx, NULL);\r
+    if ((RegEcx & BIT3) == 0) {\r
+      //\r
+      // If processor does not support MONITOR/MWAIT feature\r
+      // by CPUID.[EAX=01H]:ECX.BIT3, force AP in Hlt-loop mode\r
+      //\r
+      ApLoopMode = ApInHltLoop;\r
+    }\r
+  }\r
+\r
+  if (ApLoopMode == ApInHltLoop) {\r
+    *MonitorFilterSize = 0;\r
+  } else if (ApLoopMode == ApInRunLoop) {\r
+    *MonitorFilterSize = sizeof (UINT32);\r
+  } else if (ApLoopMode == ApInMwaitLoop) {\r
+    //\r
+    // CPUID.[EAX=05H]:EBX.BIT0-15: Largest monitor-line size in bytes\r
+    // CPUID.[EAX=05H].EDX: C-states supported using MWAIT\r
+    //\r
+    AsmCpuid (CPUID_MONITOR_MWAIT, NULL, &RegEbx, NULL, &RegEdx);\r
+    *MonitorFilterSize = RegEbx & 0xFFFF;\r
+  }\r
+\r
+  return ApLoopMode;\r
+}\r
+\r
 /**\r
   Get CPU MP Data pointer from the Guided HOB.\r
 \r
index 2b960c6eb1fe56d8f55c96ce68168f32684b24cb..be4e31237747b1737c660edad97f3cfb7a0baf45 100644 (file)
@@ -50,6 +50,12 @@ typedef enum {
   CpuStateDisabled\r
 } CPU_STATE;\r
 \r
+typedef enum {\r
+  ApInHltLoop   = 1,\r
+  ApInMwaitLoop = 2,\r
+  ApInRunLoop   = 3\r
+} AP_LOOP_MODE;\r
+\r
 //\r
 // AP reset code information\r
 //\r
index 423f7f10ed52ad35cce5969451883bd36e3495e5..4a5cfe75ff954e6b3e63c6f8dc100b7e6931c8a5 100644 (file)
@@ -81,6 +81,7 @@
   gUefiCpuPkgTokenSpaceGuid.PcdCpuApStackSize                      ## CONSUMES\r
   gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchAddress            ## CONSUMES\r
   gUefiCpuPkgTokenSpaceGuid.PcdCpuMicrocodePatchRegionSize         ## CONSUMES\r
+  gUefiCpuPkgTokenSpaceGuid.PcdCpuApLoopMode                       ## CONSUMES\r
 \r
 [Depex]\r
   gEfiPeiMemoryDiscoveredPpiGuid\r
index 6730551ff8cd30bd6bbbb69443c44748308788b8..f8ff247d098f58ed137cb5f319c296f4084ffd7a 100644 (file)
@@ -31,6 +31,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #define CPUID_CACHE_PARAMS                      0x4\r
 \r
+#define CPUID_MONITOR_MWAIT                     0x5\r
+\r
 #define CPUID_EXTENDED_TOPOLOGY                 0xB\r
 #define   CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_INVALID  0x0\r
 #define   CPUID_EXTENDED_TOPOLOGY_LEVEL_TYPE_SMT      0x1\r