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...@intel.com>
Cc: Laszlo Ersek <ler...@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Eric Dong <eric.d...@intel.com>
---
 .../RegisterCpuFeaturesLib/CpuFeaturesInitialize.c |  5 +-
 .../RegisterCpuFeaturesLib/RegisterCpuFeatures.h   |  8 +-
 .../RegisterCpuFeaturesLib.c                       | 99 ++++++++--------------
 3 files changed, 45 insertions(+), 67 deletions(-)

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

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to