/** @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
{\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
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
UINT8 *Data1;\r
UINT8 *Data2;\r
\r
- BitMaskSize = PcdGetSize (PcdCpuFeaturesSupport);\r
+ BitMaskSize = PcdGetSize (PcdCpuFeaturesSetting);\r
\r
Data1 = FeatureMask;\r
Data2 = DependentBitMask;\r
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
DetectFeatureScope (\r
IN CPU_FEATURES_ENTRY *CpuFeature,\r
IN BOOLEAN Before,\r
- IN CHAR8 *NextCpuFeatureMask\r
+ IN UINT8 *NextCpuFeatureMask\r
)\r
{\r
//\r
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
//\r
if (Before) {\r
PreviousEntry = GetPreviousNode (FeatureList, FindEntry);\r
- } else {\r\r
+ } else {\r
+\r
PreviousEntry = GetNextNode (FeatureList, FindEntry);\r
}\r
\r
}\r
}\r
}\r
-}\r\r
+}\r
+\r
\r
/**\r
Checks and adjusts current CPU features per dependency relationship.\r
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
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
@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
);\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