]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/MtrrLib: Make use of worker functions to get MTRRs count
authorMichael Kinney <michael.d.kinney@intel.com>
Tue, 8 Dec 2015 05:22:42 +0000 (05:22 +0000)
committervanjeff <vanjeff@Edk2>
Tue, 8 Dec 2015 05:22:42 +0000 (05:22 +0000)
Try to make use of worker functions to get MTRRs count. It could avoid invoking
IsMtrrSupported() for many times.

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

UefiCpuPkg/Library/MtrrLib/MtrrLib.c

index ea2b211e0580191a5bde922fc5cac6efcb0741b1..0358fffb28a2482d4aa87b23e74f28e5a11257e7 100644 (file)
@@ -367,13 +367,12 @@ MtrrGetFixedMtrr (
 **/\r
 MTRR_VARIABLE_SETTINGS*\r
 MtrrGetVariableMtrrWorker (\r
+  IN  UINT32                  VariableMtrrCount,\r
   OUT MTRR_VARIABLE_SETTINGS  *VariableSettings\r
   )\r
 {\r
   UINT32  Index;\r
-  UINT32  VariableMtrrCount;\r
 \r
-  VariableMtrrCount = GetVariableMtrrCount ();\r
   ASSERT (VariableMtrrCount <= MTRR_NUMBER_OF_VARIABLE_MTRR);\r
 \r
   for (Index = 0; Index < VariableMtrrCount; Index++) {\r
@@ -405,6 +404,7 @@ MtrrGetVariableMtrr (
   }\r
 \r
   return MtrrGetVariableMtrrWorker (\r
+           GetVariableMtrrCountWorker (),\r
            VariableSettings\r
            );\r
 }\r
@@ -527,7 +527,7 @@ MtrrGetMemoryAttributeInVariableMtrr (
     return 0;\r
   }\r
 \r
-  FirmwareVariableMtrrCount = GetFirmwareVariableMtrrCount ();\r
+  FirmwareVariableMtrrCount = GetFirmwareVariableMtrrCountWorker ();\r
   VariableMtrrEnd = MTRR_LIB_IA32_VARIABLE_MTRR_BASE + (2 * GetVariableMtrrCount ()) - 1;\r
 \r
   ZeroMem (VariableMtrr, sizeof (VARIABLE_MTRR) * MTRR_NUMBER_OF_VARIABLE_MTRR);\r
@@ -563,6 +563,8 @@ MtrrGetMemoryAttributeInVariableMtrr (
 /**\r
   Checks overlap between given memory range and MTRRs.\r
 \r
+  @param[in]  FirmwareVariableMtrrCount  The number of variable MTRRs available\r
+                                         to firmware.\r
   @param[in]  Start                      The start address of memory range.\r
   @param[in]  End                        The end address of memory range.\r
   @param[in]  VariableMtrr               The array to shadow variable MTRRs content\r
@@ -573,14 +575,15 @@ MtrrGetMemoryAttributeInVariableMtrr (
 **/\r
 BOOLEAN\r
 CheckMemoryAttributeOverlap (\r
-  IN PHYSICAL_ADDRESS     Start,\r
-  IN PHYSICAL_ADDRESS     End,\r
-  IN VARIABLE_MTRR      *VariableMtrr\r
+  IN UINTN             FirmwareVariableMtrrCount,\r
+  IN PHYSICAL_ADDRESS  Start,\r
+  IN PHYSICAL_ADDRESS  End,\r
+  IN VARIABLE_MTRR     *VariableMtrr\r
   )\r
 {\r
   UINT32  Index;\r
 \r
-  for (Index = 0; Index < 6; Index++) {\r
+  for (Index = 0; Index < FirmwareVariableMtrrCount; Index++) {\r
     if (\r
          VariableMtrr[Index].Valid &&\r
          !(\r
@@ -623,6 +626,8 @@ InvalidateShadowMtrr (
 \r
   If overlap exists between given memory range and MTRRs, try to combine them.\r
 \r
+  @param[in]       FirmwareVariableMtrrCount  The number of variable MTRRs\r
+                                              available to firmware.\r
   @param[in]       Attributes                 The memory type to set.\r
   @param[in, out]  Base                       The base address of memory range.\r
   @param[in, out]  Length                     The length of memory range.\r
@@ -636,6 +641,7 @@ InvalidateShadowMtrr (
 **/\r
 RETURN_STATUS\r
 CombineMemoryAttribute (\r
+  IN     UINT32             FirmwareVariableMtrrCount,\r
   IN     UINT64             Attributes,\r
   IN OUT UINT64             *Base,\r
   IN OUT UINT64             *Length,\r
@@ -649,11 +655,8 @@ CombineMemoryAttribute (
   UINT64  CombineEnd;\r
   UINT64  MtrrEnd;\r
   UINT64  EndAddress;\r
-  UINT32  FirmwareVariableMtrrCount;\r
   BOOLEAN CoveredByExistingMtrr;\r
 \r
-  FirmwareVariableMtrrCount = GetFirmwareVariableMtrrCount ();\r
-\r
   *OverwriteExistingMtrr = FALSE;\r
   CoveredByExistingMtrr = FALSE;\r
   EndAddress = *Base +*Length - 1;\r
@@ -851,21 +854,21 @@ GetMtrrNumberAndDirection (
   This function programs MTRRs according to the values specified\r
   in the shadow array.\r
 \r
+  @param[in]       VariableMtrrCount  Number of variable MTRRs\r
   @param[in, out]  VariableMtrr       Shadow of variable MTRR contents\r
 \r
 **/\r
 VOID\r
 InvalidateMtrr (\r
+  IN     UINTN                   VariableMtrrCount,\r
   IN OUT VARIABLE_MTRR           *VariableMtrr\r
   )\r
 {\r
   UINTN         Index;\r
-  UINTN         VariableMtrrCount;\r
   MTRR_CONTEXT  MtrrContext;\r
 \r
   PreMtrrChange (&MtrrContext);\r
   Index = 0;\r
-  VariableMtrrCount = GetVariableMtrrCount ();\r
   while (Index < VariableMtrrCount) {\r
     if (!VariableMtrr[Index].Valid && VariableMtrr[Index].Used) {\r
        AsmWriteMsr64 (VariableMtrr[Index].Msr, 0);\r
@@ -1139,7 +1142,7 @@ MtrrGetMemoryAttribute (
   //\r
   // Go through the variable MTRR\r
   //\r
-  VariableMtrrCount = GetVariableMtrrCount ();\r
+  VariableMtrrCount = GetVariableMtrrCountWorker ();\r
   ASSERT (VariableMtrrCount <= MTRR_NUMBER_OF_VARIABLE_MTRR);\r
 \r
   for (Index = 0; Index < VariableMtrrCount; Index++) {\r
@@ -1354,6 +1357,7 @@ MtrrSetMemoryAttribute (
   UINT32                    FirmwareVariableMtrrCount;\r
   UINT32                    VariableMtrrEnd;\r
   MTRR_CONTEXT              MtrrContext;\r
+  UINT32                    VariableMtrrCount;\r
 \r
   DEBUG((DEBUG_CACHE, "MtrrSetMemoryAttribute() %a:%016lx-%016lx\n", mMtrrMemoryCacheTypeShortName[Attribute], BaseAddress, Length));\r
 \r
@@ -1362,7 +1366,7 @@ MtrrSetMemoryAttribute (
     goto Done;\r
   }\r
 \r
-  FirmwareVariableMtrrCount = GetFirmwareVariableMtrrCount ();\r
+  FirmwareVariableMtrrCount = GetFirmwareVariableMtrrCountWorker ();\r
   VariableMtrrEnd = MTRR_LIB_IA32_VARIABLE_MTRR_BASE + (2 * GetVariableMtrrCount ()) - 1;\r
 \r
   MtrrLibInitializeMtrrMask(&MtrrValidBitsMask, &MtrrValidAddressMask);\r
@@ -1418,13 +1422,32 @@ MtrrSetMemoryAttribute (
     Length += SIZE_1MB;\r
   }\r
 \r
+  //\r
+  // Read all variable MTRRs\r
+  //\r
+  VariableMtrrCount = GetVariableMtrrCountWorker ();\r
+\r
   //\r
   // Check for overlap\r
   //\r
   UsedMtrr = MtrrGetMemoryAttributeInVariableMtrr (MtrrValidBitsMask, MtrrValidAddressMask, VariableMtrr);\r
-  OverLap = CheckMemoryAttributeOverlap (BaseAddress, BaseAddress + Length - 1, VariableMtrr);\r
+  OverLap = CheckMemoryAttributeOverlap (\r
+              FirmwareVariableMtrrCount,\r
+              BaseAddress,\r
+              BaseAddress + Length - 1,\r
+              VariableMtrr\r
+              );\r
+\r
   if (OverLap) {\r
-    Status = CombineMemoryAttribute (MemoryType, &BaseAddress, &Length, VariableMtrr, &UsedMtrr, &OverwriteExistingMtrr);\r
+    Status = CombineMemoryAttribute (\r
+               FirmwareVariableMtrrCount,\r
+               MemoryType,\r
+               &BaseAddress,\r
+               &Length,\r
+               VariableMtrr,\r
+               &UsedMtrr,\r
+               &OverwriteExistingMtrr\r
+               );\r
     if (RETURN_ERROR (Status)) {\r
       goto Done;\r
     }\r
@@ -1433,7 +1456,7 @@ MtrrSetMemoryAttribute (
       //\r
       // Combined successfully, invalidate the now-unused MTRRs\r
       //\r
-      InvalidateMtrr(VariableMtrr);\r
+      InvalidateMtrr(VariableMtrrCount, VariableMtrr);\r
       Status = RETURN_SUCCESS;\r
       goto Done;\r
     }\r
@@ -1447,7 +1470,7 @@ MtrrSetMemoryAttribute (
     //\r
     // Invalidate the now-unused MTRRs\r
     //\r
-    InvalidateMtrr(VariableMtrr);\r
+    InvalidateMtrr(VariableMtrrCount, VariableMtrr);\r
     goto Done;\r
   }\r
 \r
@@ -1461,7 +1484,7 @@ MtrrSetMemoryAttribute (
   //\r
   // Invalidate the now-unused MTRRs\r
   //\r
-  InvalidateMtrr(VariableMtrr);\r
+  InvalidateMtrr(VariableMtrrCount, VariableMtrr);\r
 \r
   //\r
   // Find first unused MTRR\r
@@ -1589,7 +1612,7 @@ MtrrSetVariableMtrrWorker (
   UINT32  Index;\r
   UINT32  VariableMtrrCount;\r
 \r
-  VariableMtrrCount = GetVariableMtrrCount ();\r
+  VariableMtrrCount = GetVariableMtrrCountWorker ();\r
   ASSERT (VariableMtrrCount <= MTRR_NUMBER_OF_VARIABLE_MTRR);\r
 \r
   for (Index = 0; Index < VariableMtrrCount; Index++) {\r
@@ -1634,7 +1657,7 @@ MtrrSetVariableMtrr (
 /**\r
   Worker function setting fixed MTRRs\r
 \r
-  @param[in]  FixedSettings  A buffer to hold fixed Mtrrs content.\r
+  @param[in]  FixedSettings  A buffer to hold fixed MTRRs content.\r
 \r
 **/\r
 VOID\r
@@ -1656,7 +1679,7 @@ MtrrSetFixedMtrrWorker (
 /**\r
   This function sets fixed MTRRs\r
 \r
-  @param[in]  FixedSettings  A buffer to hold fixed Mtrrs content.\r
+  @param[in]  FixedSettings  A buffer to hold fixed MTRRs content.\r
 \r
   @retval The pointer of FixedSettings\r
 \r
@@ -1684,7 +1707,7 @@ MtrrSetFixedMtrr (
 /**\r
   This function gets the content in all MTRRs (variable and fixed)\r
 \r
-  @param[out]  MtrrSetting  A buffer to hold all Mtrrs content.\r
+  @param[out]  MtrrSetting  A buffer to hold all MTRRs content.\r
 \r
   @retval the pointer of MtrrSetting\r
 \r
@@ -1702,12 +1725,15 @@ MtrrGetAllMtrrs (
   //\r
   // Get fixed MTRRs\r
   //\r
-  MtrrGetFixedMtrr (&MtrrSetting->Fixed);\r
+  MtrrGetFixedMtrrWorker (&MtrrSetting->Fixed);\r
 \r
   //\r
   // Get variable MTRRs\r
   //\r
-  MtrrGetVariableMtrr (&MtrrSetting->Variables);\r
+  MtrrGetVariableMtrrWorker (\r
+    GetVariableMtrrCountWorker (),\r
+    &MtrrSetting->Variables\r
+    );\r
 \r
   //\r
   // Get MTRR_DEF_TYPE value\r