]> git.proxmox.com Git - mirror_edk2.git/blobdiff - UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
UefiCpuPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / UefiCpuPkg / Library / RegisterCpuFeaturesLib / RegisterCpuFeaturesLib.c
index 9a66bc49ffe48c7d6909815e294be65f61ec79aa..fa0f0b41e26bdff055db5bd0affd6b56bd3cee3d 100644 (file)
@@ -1,14 +1,8 @@
 /** @file\r
   CPU Register Table Library functions.\r
 \r
-  Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>\r
-  This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -31,7 +25,7 @@ IsCpuFeatureMatch (
 {\r
   UINTN                 BitMaskSize;\r
 \r
-  BitMaskSize = PcdGetSize (PcdCpuFeaturesSupport);\r
+  BitMaskSize = PcdGetSize (PcdCpuFeaturesSetting);\r
   if (CompareMem (FirstFeatureMask, SecondFeatureMask, BitMaskSize) == 0) {\r
     return TRUE;\r
   } else {\r
@@ -53,7 +47,7 @@ DumpCpuFeatureMask (
   UINT8                  *Data8;\r
   UINTN                  BitMaskSize;\r
 \r
-  BitMaskSize = PcdGetSize (PcdCpuFeaturesSupport);\r
+  BitMaskSize = PcdGetSize (PcdCpuFeaturesSetting);\r
   Data8       = (UINT8 *) FeatureMask;\r
   for (Index = 0; Index < BitMaskSize; Index++) {\r
     DEBUG ((DEBUG_INFO, " %02x ", *Data8++));\r
@@ -100,7 +94,7 @@ IsBitMaskMatchCheck (
   UINT8      *Data1;\r
   UINT8      *Data2;\r
 \r
-  BitMaskSize = PcdGetSize (PcdCpuFeaturesSupport);\r
+  BitMaskSize = PcdGetSize (PcdCpuFeaturesSetting);\r
 \r
   Data1 = FeatureMask;\r
   Data2 = DependentBitMask;\r
@@ -112,6 +106,75 @@ IsBitMaskMatchCheck (
   return FALSE;\r
 }\r
 \r
+/**\r
+  Try to find the specify cpu featuren in former/after feature list.\r
+\r
+  @param[in]  FeatureList        Pointer to dependent CPU feature list\r
+  @param[in]  CurrentEntry       Pointer to current CPU feature entry.\r
+  @param[in]  SearchFormer       Find in former feature or after features.\r
+  @param[in]  FeatureMask        Pointer to CPU feature bit mask\r
+\r
+  @retval TRUE  The feature bit mask is in dependent CPU feature bit mask buffer.\r
+  @retval FALSE The feature bit mask is not in dependent CPU feature bit mask buffer.\r
+**/\r
+BOOLEAN\r
+FindSpecifyFeature (\r
+  IN LIST_ENTRY              *FeatureList,\r
+  IN LIST_ENTRY              *CurrentEntry,\r
+  IN BOOLEAN                 SearchFormer,\r
+  IN UINT8                   *FeatureMask\r
+  )\r
+{\r
+  CPU_FEATURES_ENTRY         *CpuFeature;\r
+  LIST_ENTRY                 *NextEntry;\r
+\r
+  //\r
+  // Check whether exist the not neighborhood entry first.\r
+  // If not exist, return FALSE means not found status.\r
+  //\r
+  if (SearchFormer) {\r
+    NextEntry = CurrentEntry->BackLink;\r
+    if (IsNull (FeatureList, NextEntry)) {\r
+      return FALSE;\r
+    }\r
+\r
+    NextEntry = NextEntry->BackLink;\r
+    if (IsNull (FeatureList, NextEntry)) {\r
+      return FALSE;\r
+    }\r
+\r
+    NextEntry = CurrentEntry->BackLink->BackLink;\r
+  } else {\r
+    NextEntry = CurrentEntry->ForwardLink;\r
+    if (IsNull (FeatureList, NextEntry)) {\r
+      return FALSE;\r
+    }\r
+\r
+    NextEntry = NextEntry->ForwardLink;\r
+    if (IsNull (FeatureList, NextEntry)) {\r
+      return FALSE;\r
+    }\r
+\r
+    NextEntry = CurrentEntry->ForwardLink->ForwardLink;\r
+  }\r
+\r
+  while (!IsNull (FeatureList, NextEntry)) {\r
+    CpuFeature = CPU_FEATURE_ENTRY_FROM_LINK (NextEntry);\r
+\r
+    if (IsBitMaskMatchCheck (FeatureMask, CpuFeature->FeatureMask)) {\r
+      return TRUE;\r
+    }\r
+\r
+    if (SearchFormer) {\r
+      NextEntry = NextEntry->BackLink;\r
+    } else {\r
+      NextEntry = NextEntry->ForwardLink;\r
+    }\r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
 /**\r
   Return feature dependence result.\r
 \r
@@ -125,7 +188,7 @@ CPU_FEATURE_DEPENDENCE_TYPE
 DetectFeatureScope (\r
   IN CPU_FEATURES_ENTRY         *CpuFeature,\r
   IN BOOLEAN                    Before,\r
-  IN CHAR8                      *NextCpuFeatureMask\r
+  IN UINT8                      *NextCpuFeatureMask\r
   )\r
 {\r
   //\r
@@ -178,6 +241,59 @@ DetectFeatureScope (
   return NoneDepType;\r
 }\r
 \r
+/**\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]  FeatureList           Pointer to CPU feature list.\r
+\r
+  @retval     return the dependence result.\r
+**/\r
+CPU_FEATURE_DEPENDENCE_TYPE\r
+DetectNoneNeighborhoodFeatureScope (\r
+  IN CPU_FEATURES_ENTRY         *CpuFeature,\r
+  IN BOOLEAN                    Before,\r
+  IN LIST_ENTRY                 *FeatureList\r
+  )\r
+{\r
+  if (Before) {\r
+    if ((CpuFeature->PackageBeforeFeatureBitMask != NULL) &&\r
+        FindSpecifyFeature(FeatureList, &CpuFeature->Link, FALSE, CpuFeature->PackageBeforeFeatureBitMask)) {\r
+      return PackageDepType;\r
+    }\r
+\r
+    if ((CpuFeature->CoreBeforeFeatureBitMask != NULL) &&\r
+        FindSpecifyFeature(FeatureList, &CpuFeature->Link, FALSE, CpuFeature->CoreBeforeFeatureBitMask)) {\r
+      return CoreDepType;\r
+    }\r
+\r
+    if ((CpuFeature->BeforeFeatureBitMask != NULL) &&\r
+        FindSpecifyFeature(FeatureList, &CpuFeature->Link, FALSE, CpuFeature->BeforeFeatureBitMask)) {\r
+      return ThreadDepType;\r
+    }\r
+\r
+    return NoneDepType;\r
+  }\r
+\r
+  if ((CpuFeature->PackageAfterFeatureBitMask != NULL) &&\r
+      FindSpecifyFeature(FeatureList, &CpuFeature->Link, TRUE, CpuFeature->PackageAfterFeatureBitMask)) {\r
+    return PackageDepType;\r
+  }\r
+\r
+  if ((CpuFeature->CoreAfterFeatureBitMask != NULL) &&\r
+      FindSpecifyFeature(FeatureList, &CpuFeature->Link, TRUE, CpuFeature->CoreAfterFeatureBitMask)) {\r
+    return CoreDepType;\r
+  }\r
+\r
+  if ((CpuFeature->AfterFeatureBitMask != NULL) &&\r
+      FindSpecifyFeature(FeatureList, &CpuFeature->Link, TRUE, CpuFeature->AfterFeatureBitMask)) {\r
+    return ThreadDepType;\r
+  }\r
+\r
+  return NoneDepType;\r
+}\r
+\r
 /**\r
   Base on dependence relationship to asjust feature dependence.\r
 \r
@@ -267,7 +383,8 @@ AdjustEntry (
   //\r
   if (Before) {\r
     PreviousEntry = GetPreviousNode (FeatureList, FindEntry);\r
-  } else {\r\r
+  } else {\r
+\r
     PreviousEntry = GetNextNode (FeatureList, FindEntry);\r
   }\r
 \r
@@ -309,7 +426,8 @@ AdjustEntry (
       }\r
     }\r
   }\r
-}\r\r
+}\r
+\r
 \r
 /**\r
   Checks and adjusts current CPU features per dependency relationship.\r
@@ -534,7 +652,7 @@ RegisterCpuFeatureWorker (
   UINTN                      BitMaskSize;\r
   BOOLEAN                    FeatureExist;\r
 \r
-  BitMaskSize     = PcdGetSize (PcdCpuFeaturesSupport);\r
+  BitMaskSize     = PcdGetSize (PcdCpuFeaturesSetting);\r
   CpuFeaturesData = GetCpuFeaturesData ();\r
   if (CpuFeaturesData->FeaturesCount == 0) {\r
     InitializeListHead (&CpuFeaturesData->FeatureList);\r
@@ -748,7 +866,7 @@ RegisterCpuFeature (
   BeforeAll            = FALSE;\r
   AfterAll             = FALSE;\r
 \r
-  BitMaskSize = PcdGetSize (PcdCpuFeaturesSupport);\r
+  BitMaskSize = PcdGetSize (PcdCpuFeaturesSetting);\r
 \r
   VA_START (Marker, InitializeFunc);\r
   Feature = VA_ARG (Marker, UINT32);\r
@@ -1052,8 +1170,8 @@ PreSmmCpuRegisterTableWrite (
   @param[in]  CpuBitMaskSize  The size of CPU feature bit mask buffer\r
   @param[in]  Feature         The bit number of the CPU feature\r
 \r
-  @retval  TRUE   The CPU feature is set in PcdCpuFeaturesSupport.\r
-  @retval  FALSE  The CPU feature is not set in PcdCpuFeaturesSupport.\r
+  @retval  TRUE   The CPU feature is set in CpuBitMask.\r
+  @retval  FALSE  The CPU feature is not set in CpuBitMask.\r
 \r
 **/\r
 BOOLEAN\r
@@ -1120,56 +1238,6 @@ IsCpuFeatureInSetting (
            );\r
 }\r
 \r
-/**\r
-  Determines if a CPU feature is set in PcdCpuFeaturesCapability bit mask.\r
-\r
-  @param[in]  Feature  The bit number of the CPU feature to check in the PCD\r
-                       PcdCpuFeaturesCapability\r
-\r
-  @retval  TRUE   The CPU feature is set in PcdCpuFeaturesCapability.\r
-  @retval  FALSE  The CPU feature is not set in PcdCpuFeaturesCapability.\r
-\r
-  @note This service could be called by BSP only.\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-IsCpuFeatureCapability (\r
-  IN UINT32              Feature\r
-  )\r
-{\r
-  return IsCpuFeatureSetInCpuPcd (\r
-           (UINT8 *)PcdGetPtr (PcdCpuFeaturesCapability),\r
-           PcdGetSize (PcdCpuFeaturesCapability),\r
-           Feature\r
-           );\r
-\r
-}\r
-\r
-/**\r
-  Determines if a CPU feature is set in PcdCpuFeaturesUserConfiguration bit mask.\r
-\r
-  @param[in]  Feature  The bit number of the CPU feature to check in the PCD\r
-                       PcdCpuFeaturesUserConfiguration\r
-\r
-  @retval  TRUE   The CPU feature is set in PcdCpuFeaturesUserConfiguration.\r
-  @retval  FALSE  The CPU feature is not set in PcdCpuFeaturesUserConfiguration.\r
-\r
-  @note This service could be called by BSP only.\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-IsCpuFeatureUserConfiguration (\r
-  IN UINT32              Feature\r
-  )\r
-{\r
-  return IsCpuFeatureSetInCpuPcd (\r
-           (UINT8 *)PcdGetPtr (PcdCpuFeaturesUserConfiguration),\r
-           PcdGetSize (PcdCpuFeaturesUserConfiguration),\r
-           Feature\r
-           );\r
-\r
-}\r
-\r
 /**\r
   Switches to assigned BSP after CPU features initialization.\r
 \r