]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/RegisterCpuFeaturesLib: Support combo CPU feature style.
authorEric Dong <eric.dong@intel.com>
Thu, 25 Oct 2018 06:50:22 +0000 (14:50 +0800)
committerEric Dong <eric.dong@intel.com>
Fri, 26 Oct 2018 04:39:49 +0000 (12:39 +0800)
Current code assume only one dependence (before or after) for one
feature. Enhance code logic to support feature has two dependence
(before and after) type.

Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h
UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c

index 173f2edbeaf13c7d2a8aff5206a7fa0d3f5a1458..bc372a338f0b81f0bbc869afacb5e3cf0f1c964e 100644 (file)
@@ -671,10 +671,11 @@ AnalysisProcessorFeatures (
         // If feature has dependence with the next feature (ONLY care core/package dependency).\r
         // and feature initialize succeed, add sync semaphere here.\r
         //\r
-        BeforeDep = DetectFeatureScope (CpuFeatureInOrder, TRUE);\r
         if (NextCpuFeatureInOrder != NULL) {\r
-          AfterDep  = DetectFeatureScope (NextCpuFeatureInOrder, FALSE);\r
+          BeforeDep = DetectFeatureScope (CpuFeatureInOrder, TRUE, NextCpuFeatureInOrder->FeatureMask);\r
+          AfterDep  = DetectFeatureScope (NextCpuFeatureInOrder, FALSE, CpuFeatureInOrder->FeatureMask);\r
         } else {\r
+          BeforeDep = DetectFeatureScope (CpuFeatureInOrder, TRUE, NULL);\r
           AfterDep = NoneDepType;\r
         }\r
         //\r
index 42a3f91fbfe4aeb6352f4015f7c26e2103e935c4..b5fe8fbce131897a9fd99f39164d4a98251be080 100644 (file)
@@ -193,15 +193,17 @@ DumpCpuFeature (
 /**\r
   Return feature dependence result.\r
 \r
-  @param[in]  CpuFeature        Pointer to CPU feature.\r
-  @param[in]  Before            Check before dependence or after.\r
+  @param[in]  CpuFeature            Pointer to CPU feature.\r
+  @param[in]  Before                Check before dependence or after.\r
+  @param[in]  NextCpuFeatureMask    Pointer to next CPU feature Mask.\r
 \r
   @retval     return the dependence result.\r
 **/\r
 CPU_FEATURE_DEPENDENCE_TYPE\r
 DetectFeatureScope (\r
   IN CPU_FEATURES_ENTRY         *CpuFeature,\r
-  IN BOOLEAN                    Before\r
+  IN BOOLEAN                    Before,\r
+  IN CHAR8                      *NextCpuFeatureMask\r
   );\r
 \r
 /**\r
index b6e108b8ad143ecaaaee3b2d9bd7537b3edb4904..9a66bc49ffe48c7d6909815e294be65f61ec79aa 100644 (file)
@@ -115,90 +115,69 @@ IsBitMaskMatchCheck (
 /**\r
   Return feature dependence result.\r
 \r
-  @param[in]  CpuFeature        Pointer to CPU feature.\r
-  @param[in]  Before            Check before dependence or after.\r
+  @param[in]  CpuFeature            Pointer to CPU feature.\r
+  @param[in]  Before                Check before dependence or after.\r
+  @param[in]  NextCpuFeatureMask    Pointer to next CPU feature Mask.\r
 \r
   @retval     return the dependence result.\r
 **/\r
 CPU_FEATURE_DEPENDENCE_TYPE\r
 DetectFeatureScope (\r
   IN CPU_FEATURES_ENTRY         *CpuFeature,\r
-  IN BOOLEAN                    Before\r
+  IN BOOLEAN                    Before,\r
+  IN CHAR8                      *NextCpuFeatureMask\r
   )\r
 {\r
+  //\r
+  // if need to check before type dependence but the feature after current feature is not\r
+  // exist, means this before type dependence not valid, just return NoneDepType.\r
+  // Just like Feature A has a dependence of feature B, but Feature B not installed, so\r
+  // Feature A maybe insert to the last entry of the list. In this case, for below code,\r
+  // Featrure A has depend of feature B, but it is the last entry of the list, so the\r
+  // NextCpuFeatureMask is NULL, so the dependence for feature A here is useless and code\r
+  // just return NoneDepType.\r
+  //\r
+  if (NextCpuFeatureMask == NULL) {\r
+    return NoneDepType;\r
+  }\r
+\r
   if (Before) {\r
-    if (CpuFeature->PackageBeforeFeatureBitMask != NULL) {\r
+    if ((CpuFeature->PackageBeforeFeatureBitMask != NULL) &&\r
+        IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->PackageBeforeFeatureBitMask)) {\r
       return PackageDepType;\r
     }\r
 \r
-    if (CpuFeature->CoreBeforeFeatureBitMask != NULL) {\r
+    if ((CpuFeature->CoreBeforeFeatureBitMask != NULL) &&\r
+        IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->CoreBeforeFeatureBitMask)) {\r
       return CoreDepType;\r
     }\r
 \r
-    if (CpuFeature->BeforeFeatureBitMask != NULL) {\r
+    if ((CpuFeature->BeforeFeatureBitMask != NULL) &&\r
+        IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->BeforeFeatureBitMask)) {\r
       return ThreadDepType;\r
     }\r
 \r
     return NoneDepType;\r
   }\r
 \r
-  if (CpuFeature->PackageAfterFeatureBitMask != NULL) {\r
+  if ((CpuFeature->PackageAfterFeatureBitMask != NULL) &&\r
+      IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->PackageAfterFeatureBitMask)) {\r
     return PackageDepType;\r
   }\r
 \r
-  if (CpuFeature->CoreAfterFeatureBitMask != NULL) {\r
+  if ((CpuFeature->CoreAfterFeatureBitMask != NULL) &&\r
+      IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->CoreAfterFeatureBitMask)) {\r
     return CoreDepType;\r
   }\r
 \r
-  if (CpuFeature->AfterFeatureBitMask != NULL) {\r
+  if ((CpuFeature->AfterFeatureBitMask != NULL) &&\r
+      IsBitMaskMatchCheck (NextCpuFeatureMask, CpuFeature->AfterFeatureBitMask)) {\r
     return ThreadDepType;\r
   }\r
 \r
   return NoneDepType;\r
 }\r
 \r
-/**\r
-  Clear dependence for the specified type.\r
-\r
-  @param[in]  CpuFeature         Cpu feature need to clear.\r
-  @param[in]  Before             Before or after dependence relationship.\r
-\r
-**/\r
-VOID\r
-ClearFeatureScope (\r
-  IN CPU_FEATURES_ENTRY           *CpuFeature,\r
-  IN BOOLEAN                      Before\r
-  )\r
-{\r
-  if (Before) {\r
-    if (CpuFeature->BeforeFeatureBitMask != NULL) {\r
-      FreePool (CpuFeature->BeforeFeatureBitMask);\r
-      CpuFeature->BeforeFeatureBitMask = NULL;\r
-    }\r
-    if (CpuFeature->CoreBeforeFeatureBitMask != NULL) {\r
-      FreePool (CpuFeature->CoreBeforeFeatureBitMask);\r
-      CpuFeature->CoreBeforeFeatureBitMask = NULL;\r
-    }\r
-    if (CpuFeature->PackageBeforeFeatureBitMask != NULL) {\r
-      FreePool (CpuFeature->PackageBeforeFeatureBitMask);\r
-      CpuFeature->PackageBeforeFeatureBitMask = NULL;\r
-    }\r
-  } else {\r
-    if (CpuFeature->PackageAfterFeatureBitMask != NULL) {\r
-      FreePool (CpuFeature->PackageAfterFeatureBitMask);\r
-      CpuFeature->PackageAfterFeatureBitMask = NULL;\r
-    }\r
-    if (CpuFeature->CoreAfterFeatureBitMask != NULL) {\r
-      FreePool (CpuFeature->CoreAfterFeatureBitMask);\r
-      CpuFeature->CoreAfterFeatureBitMask = NULL;\r
-    }\r
-    if (CpuFeature->AfterFeatureBitMask != NULL) {\r
-      FreePool (CpuFeature->AfterFeatureBitMask);\r
-      CpuFeature->AfterFeatureBitMask = NULL;\r
-    }\r
-  }\r
-}\r
-\r
 /**\r
   Base on dependence relationship to asjust feature dependence.\r
 \r
@@ -209,6 +188,7 @@ ClearFeatureScope (
 \r
   @param[in, out]  PreviousFeature    CPU feature current before the find one.\r
   @param[in, out]  CurrentFeature     Cpu feature need to adjust.\r
+  @param[in]       FindFeature        Cpu feature which current feature depends.\r
   @param[in]       Before             Before or after dependence relationship.\r
 \r
   @retval   TRUE   means the current feature dependence has been adjusted.\r
@@ -221,14 +201,15 @@ BOOLEAN
 AdjustFeaturesDependence (\r
   IN OUT CPU_FEATURES_ENTRY         *PreviousFeature,\r
   IN OUT CPU_FEATURES_ENTRY         *CurrentFeature,\r
+  IN     CPU_FEATURES_ENTRY         *FindFeature,\r
   IN     BOOLEAN                    Before\r
   )\r
 {\r
   CPU_FEATURE_DEPENDENCE_TYPE            PreDependType;\r
   CPU_FEATURE_DEPENDENCE_TYPE            CurrentDependType;\r
 \r
-  PreDependType     = DetectFeatureScope(PreviousFeature, Before);\r
-  CurrentDependType = DetectFeatureScope(CurrentFeature, Before);\r
+  PreDependType     = DetectFeatureScope(PreviousFeature, Before, FindFeature->FeatureMask);\r
+  CurrentDependType = DetectFeatureScope(CurrentFeature, Before, FindFeature->FeatureMask);\r
 \r
   //\r
   // If previous feature has no dependence with the find featue.\r
@@ -243,10 +224,8 @@ AdjustFeaturesDependence (
   // processors and clear the dependence for the other one.\r
   //\r
   if (PreDependType >= CurrentDependType) {\r
-    ClearFeatureScope (CurrentFeature, Before);\r
     return TRUE;\r
   } else {\r
-    ClearFeatureScope (PreviousFeature, Before);\r
     return FALSE;\r
   }\r
 }\r
@@ -271,6 +250,7 @@ AdjustEntry (
   LIST_ENTRY                *PreviousEntry;\r
   CPU_FEATURES_ENTRY        *PreviousFeature;\r
   CPU_FEATURES_ENTRY        *CurrentFeature;\r
+  CPU_FEATURES_ENTRY        *FindFeature;\r
 \r
   //\r
   // For CPU feature which has core or package type dependence, later code need to insert\r
@@ -308,8 +288,9 @@ AdjustEntry (
     // If exist the previous or next entry, need to check it before insert curent entry.\r
     //\r
     PreviousFeature = CPU_FEATURE_ENTRY_FROM_LINK (PreviousEntry);\r
+    FindFeature     = CPU_FEATURE_ENTRY_FROM_LINK (FindEntry);\r
 \r
-    if (AdjustFeaturesDependence (PreviousFeature, CurrentFeature, Before)) {\r
+    if (AdjustFeaturesDependence (PreviousFeature, CurrentFeature, FindFeature, Before)) {\r
       //\r
       // Return TRUE means current feature dependence has been cleared and the previous\r
       // feature dependence has been kept and used. So insert current feature before (or after)\r
@@ -486,7 +467,6 @@ CheckCpuFeaturesDependency (
     if (CpuFeature->BeforeFeatureBitMask != NULL) {\r
       Swapped = InsertToBeforeEntry (FeatureList, CurrentEntry, CpuFeature->BeforeFeatureBitMask);\r
       if (Swapped) {\r
-        CurrentEntry = NextEntry;\r
         continue;\r
       }\r
     }\r
@@ -494,7 +474,6 @@ CheckCpuFeaturesDependency (
     if (CpuFeature->AfterFeatureBitMask != NULL) {\r
       Swapped = InsertToAfterEntry (FeatureList, CurrentEntry, CpuFeature->AfterFeatureBitMask);\r
       if (Swapped) {\r
-        CurrentEntry = NextEntry;\r
         continue;\r
       }\r
     }\r
@@ -502,7 +481,6 @@ CheckCpuFeaturesDependency (
     if (CpuFeature->CoreBeforeFeatureBitMask != NULL) {\r
       Swapped = InsertToBeforeEntry (FeatureList, CurrentEntry, CpuFeature->CoreBeforeFeatureBitMask);\r
       if (Swapped) {\r
-        CurrentEntry = NextEntry;\r
         continue;\r
       }\r
     }\r
@@ -510,7 +488,6 @@ CheckCpuFeaturesDependency (
     if (CpuFeature->CoreAfterFeatureBitMask != NULL) {\r
       Swapped = InsertToAfterEntry (FeatureList, CurrentEntry, CpuFeature->CoreAfterFeatureBitMask);\r
       if (Swapped) {\r
-        CurrentEntry = NextEntry;\r
         continue;\r
       }\r
     }\r
@@ -518,7 +495,6 @@ CheckCpuFeaturesDependency (
     if (CpuFeature->PackageBeforeFeatureBitMask != NULL) {\r
       Swapped = InsertToBeforeEntry (FeatureList, CurrentEntry, CpuFeature->PackageBeforeFeatureBitMask);\r
       if (Swapped) {\r
-        CurrentEntry = NextEntry;\r
         continue;\r
       }\r
     }\r
@@ -526,7 +502,6 @@ CheckCpuFeaturesDependency (
     if (CpuFeature->PackageAfterFeatureBitMask != NULL) {\r
       Swapped = InsertToAfterEntry (FeatureList, CurrentEntry, CpuFeature->PackageAfterFeatureBitMask);\r
       if (Swapped) {\r
-        CurrentEntry = NextEntry;\r
         continue;\r
       }\r
     }\r