]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
UefiCpuPkg/RegisterCpuFeaturesLib: Adjust Order.
[mirror_edk2.git] / UefiCpuPkg / Library / RegisterCpuFeaturesLib / CpuFeaturesInitialize.c
index 8588800e4a428b4a191e8a059c2c53597d4cd65a..e61ace9bade84a954f6475b7dd6040e907b4f2f4 100644 (file)
@@ -527,6 +527,32 @@ DumpRegisterTableOnProcessor (
   }\r
 }\r
 \r
+/**\r
+  Get the biggest dependence type.\r
+  PackageDepType > CoreDepType > ThreadDepType > NoneDepType.\r
+\r
+  @param[in]  BeforeDep           Before dependence type.\r
+  @param[in]  AfterDep            After dependence type.\r
+  @param[in]  NoneNeibBeforeDep   Before dependence type for not neighborhood features.\r
+  @param[in]  NoneNeibAfterDep    After dependence type for not neighborhood features.\r
+\r
+  @retval  Return the biggest dependence type.\r
+**/\r
+CPU_FEATURE_DEPENDENCE_TYPE\r
+BiggestDep (\r
+  IN CPU_FEATURE_DEPENDENCE_TYPE  BeforeDep,\r
+  IN CPU_FEATURE_DEPENDENCE_TYPE  AfterDep,\r
+  IN CPU_FEATURE_DEPENDENCE_TYPE  NoneNeibBeforeDep,\r
+  IN CPU_FEATURE_DEPENDENCE_TYPE  NoneNeibAfterDep\r
+  )\r
+{\r
+  CPU_FEATURE_DEPENDENCE_TYPE Bigger;\r
+\r
+  Bigger = MAX (BeforeDep, AfterDep);\r
+  Bigger = MAX (Bigger, NoneNeibBeforeDep);\r
+  return MAX(Bigger, NoneNeibAfterDep);\r
+}\r
+\r
 /**\r
   Analysis register CPU features on each processor and save CPU setting in CPU register table.\r
 \r
@@ -551,6 +577,8 @@ AnalysisProcessorFeatures (
   BOOLEAN                              Success;\r
   CPU_FEATURE_DEPENDENCE_TYPE          BeforeDep;\r
   CPU_FEATURE_DEPENDENCE_TYPE          AfterDep;\r
+  CPU_FEATURE_DEPENDENCE_TYPE          NoneNeibBeforeDep;\r
+  CPU_FEATURE_DEPENDENCE_TYPE          NoneNeibAfterDep;\r
 \r
   CpuFeaturesData = GetCpuFeaturesData ();\r
   CpuFeaturesData->CapabilityPcd = AllocatePool (CpuFeaturesData->BitMaskSize);\r
@@ -627,14 +655,9 @@ AnalysisProcessorFeatures (
     //\r
     CpuInfo = &CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo;\r
     Entry = GetFirstNode (&CpuInitOrder->OrderList);\r
-    NextEntry = Entry->ForwardLink;\r
     while (!IsNull (&CpuInitOrder->OrderList, Entry)) {\r
       CpuFeatureInOrder = CPU_FEATURE_ENTRY_FROM_LINK (Entry);\r
-      if (!IsNull (&CpuInitOrder->OrderList, NextEntry)) {\r
-        NextCpuFeatureInOrder = CPU_FEATURE_ENTRY_FROM_LINK (NextEntry);\r
-      } else {\r
-        NextCpuFeatureInOrder = NULL;\r
-      }\r
+\r
       Success = FALSE;\r
       if (IsBitMaskMatch (CpuFeatureInOrder->FeatureMask, CpuFeaturesData->SettingPcd)) {\r
         Status = CpuFeatureInOrder->InitializeFunc (ProcessorNumber, CpuInfo, CpuFeatureInOrder->ConfigData, TRUE);\r
@@ -667,31 +690,43 @@ AnalysisProcessorFeatures (
       }\r
 \r
       if (Success) {\r
-        //\r
-        // If feature has dependence with the next feature (ONLY care core/package dependency).\r
-        // and feature initialize succeed, add sync semaphere here.\r
-        //\r
-        if (NextCpuFeatureInOrder != NULL) {\r
+        NextEntry = Entry->ForwardLink;\r
+        if (!IsNull (&CpuInitOrder->OrderList, NextEntry)) {\r
+          NextCpuFeatureInOrder = CPU_FEATURE_ENTRY_FROM_LINK (NextEntry);\r
+\r
+          //\r
+          // 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, NextCpuFeatureInOrder->FeatureMask);\r
           AfterDep  = DetectFeatureScope (NextCpuFeatureInOrder, FALSE, CpuFeatureInOrder->FeatureMask);\r
+          //\r
+          // Check whether next feature has After type dependence with not neighborhood CPU\r
+          // Features in former CPU features.\r
+          //\r
+          NoneNeibAfterDep = DetectNoneNeighborhoodFeatureScope(NextCpuFeatureInOrder, FALSE, &CpuInitOrder->OrderList);\r
         } else {\r
-          BeforeDep = DetectFeatureScope (CpuFeatureInOrder, TRUE, NULL);\r
-          AfterDep = NoneDepType;\r
+          BeforeDep        = NoneDepType;\r
+          AfterDep         = NoneDepType;\r
+          NoneNeibAfterDep = NoneDepType;\r
         }\r
         //\r
-        // Assume only one of the depend is valid.\r
+        // Check whether current feature has Before type dependence with none neighborhood\r
+        // CPU features in after Cpu features.\r
+        //\r
+        NoneNeibBeforeDep = DetectNoneNeighborhoodFeatureScope(CpuFeatureInOrder, TRUE, &CpuInitOrder->OrderList);\r
+\r
+        //\r
+        // Get the biggest dependence and add semaphore for it.\r
+        // PackageDepType > CoreDepType > ThreadDepType > NoneDepType.\r
         //\r
-        ASSERT (!(BeforeDep > ThreadDepType && AfterDep > ThreadDepType));\r
+        BeforeDep = BiggestDep(BeforeDep, AfterDep, NoneNeibBeforeDep, NoneNeibAfterDep);\r
         if (BeforeDep > ThreadDepType) {\r
           CPU_REGISTER_TABLE_WRITE32 (ProcessorNumber, Semaphore, 0, BeforeDep);\r
         }\r
-        if (AfterDep > ThreadDepType) {\r
-          CPU_REGISTER_TABLE_WRITE32 (ProcessorNumber, Semaphore, 0, AfterDep);\r
-        }\r
       }\r
 \r
-      Entry     = Entry->ForwardLink;\r
-      NextEntry = Entry->ForwardLink;\r
+      Entry = Entry->ForwardLink;\r
     }\r
 \r
     //\r