/** @file\r
CPU Features Initialize functions.\r
\r
- Copyright (c) 2017 - 2018, 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
#include "RegisterCpuFeatures.h"\r
\r
CHAR16 *mDependTypeStr[] = {L"None", L"Thread", L"Core", L"Package", L"Invalid" };\r
-CHAR16 *mRegisterTypeStr[] = {L"MSR", L"CR", L"MMIO", L"CACHE", L"SEMAP", L"INVALID" };\r
\r
/**\r
Worker function to save PcdCpuFeaturesCapability.\r
\r
@param[in] SupportedFeatureMask The pointer to CPU feature bits mask buffer\r
+ @param[in] BitMaskSize CPU feature bits mask buffer size.\r
+\r
**/\r
VOID\r
SetCapabilityPcd (\r
- IN UINT8 *SupportedFeatureMask\r
+ IN UINT8 *SupportedFeatureMask,\r
+ IN UINTN BitMaskSize\r
)\r
{\r
EFI_STATUS Status;\r
- UINTN BitMaskSize;\r
\r
- BitMaskSize = PcdGetSize (PcdCpuFeaturesCapability);\r
Status = PcdSetPtrS (PcdCpuFeaturesCapability, &BitMaskSize, SupportedFeatureMask);\r
ASSERT_EFI_ERROR (Status);\r
}\r
Worker function to save PcdCpuFeaturesSetting.\r
\r
@param[in] SupportedFeatureMask The pointer to CPU feature bits mask buffer\r
+ @param[in] BitMaskSize CPU feature bits mask buffer size.\r
**/\r
VOID\r
SetSettingPcd (\r
- IN UINT8 *SupportedFeatureMask\r
+ IN UINT8 *SupportedFeatureMask,\r
+ IN UINTN BitMaskSize\r
)\r
{\r
EFI_STATUS Status;\r
- UINTN BitMaskSize;\r
\r
- BitMaskSize = PcdGetSize (PcdCpuFeaturesSetting);\r
Status = PcdSetPtrS (PcdCpuFeaturesSetting, &BitMaskSize, SupportedFeatureMask);\r
ASSERT_EFI_ERROR (Status);\r
}\r
\r
-/**\r
- Worker function to get PcdCpuFeaturesSupport.\r
-\r
- @return The pointer to CPU feature bits mask buffer.\r
-**/\r
-UINT8 *\r
-GetSupportPcd (\r
- VOID\r
- )\r
-{\r
- UINT8 *SupportBitMask;\r
-\r
- SupportBitMask = AllocateCopyPool (\r
- PcdGetSize (PcdCpuFeaturesSupport),\r
- PcdGetPtr (PcdCpuFeaturesSupport)\r
- );\r
- ASSERT (SupportBitMask != NULL);\r
-\r
- return SupportBitMask;\r
-}\r
-\r
-/**\r
- Worker function to get PcdCpuFeaturesUserConfiguration.\r
-\r
- @return The pointer to CPU feature bits mask buffer.\r
-**/\r
-UINT8 *\r
-GetConfigurationPcd (\r
- VOID\r
- )\r
-{\r
- UINT8 *SupportBitMask;\r
-\r
- SupportBitMask = AllocateCopyPool (\r
- PcdGetSize (PcdCpuFeaturesUserConfiguration),\r
- PcdGetPtr (PcdCpuFeaturesUserConfiguration)\r
- );\r
- ASSERT (SupportBitMask != NULL);\r
-\r
- return SupportBitMask;\r
-}\r
-\r
/**\r
Collects CPU type and feature information.\r
\r
/**\r
Prepares for private data used for CPU features.\r
\r
- @param[in] NumberOfCpus Number of processor in system\r
**/\r
VOID\r
CpuInitDataInitialize (\r
- IN UINTN NumberOfCpus\r
+ VOID\r
)\r
{\r
EFI_STATUS Status;\r
ACPI_CPU_DATA *AcpiCpuData;\r
CPU_STATUS_INFORMATION *CpuStatus;\r
UINT32 *ValidCoreCountPerPackage;\r
+ UINTN NumberOfCpus;\r
+ UINTN NumberOfEnabledProcessors;\r
\r
Core = 0;\r
Package = 0;\r
Thread = 0;\r
\r
CpuFeaturesData = GetCpuFeaturesData ();\r
+\r
+ //\r
+ // Initialize CpuFeaturesData->MpService as early as possile, so later function can use it.\r
+ //\r
+ CpuFeaturesData->MpService = GetMpService ();\r
+\r
+ GetNumberOfProcessor (&NumberOfCpus, &NumberOfEnabledProcessors);\r
+\r
CpuFeaturesData->InitOrder = AllocateZeroPool (sizeof (CPU_FEATURES_INIT_ORDER) * NumberOfCpus);\r
ASSERT (CpuFeaturesData->InitOrder != NULL);\r
\r
ASSERT (CpuFeaturesData->CpuFlags.CoreSemaphoreCount != NULL);\r
CpuFeaturesData->CpuFlags.PackageSemaphoreCount = AllocateZeroPool (sizeof (UINT32) * CpuStatus->PackageCount * CpuStatus->MaxCoreCount * CpuStatus->MaxThreadCount);\r
ASSERT (CpuFeaturesData->CpuFlags.PackageSemaphoreCount != NULL);\r
-\r
- //\r
- // Get support and configuration PCDs\r
- //\r
- CpuFeaturesData->SupportPcd = GetSupportPcd ();\r
- CpuFeaturesData->ConfigurationPcd = GetConfigurationPcd ();\r
}\r
\r
/**\r
\r
@param[in] SupportedFeatureMask The pointer to CPU feature bits mask buffer\r
@param[in] OrFeatureBitMask The feature bit mask to do OR operation\r
+ @param[in] BitMaskSize The CPU feature bits mask buffer size.\r
+\r
**/\r
VOID\r
SupportedMaskOr (\r
IN UINT8 *SupportedFeatureMask,\r
- IN UINT8 *OrFeatureBitMask\r
+ IN UINT8 *OrFeatureBitMask,\r
+ IN UINT32 BitMaskSize\r
)\r
{\r
UINTN Index;\r
- UINTN BitMaskSize;\r
UINT8 *Data1;\r
UINT8 *Data2;\r
\r
- BitMaskSize = PcdGetSize (PcdCpuFeaturesSupport);\r
Data1 = SupportedFeatureMask;\r
Data2 = OrFeatureBitMask;\r
for (Index = 0; Index < BitMaskSize; Index++) {\r
\r
@param[in] SupportedFeatureMask The pointer to CPU feature bits mask buffer\r
@param[in] AndFeatureBitMask The feature bit mask to do AND operation\r
+ @param[in] BitMaskSize CPU feature bits mask buffer size.\r
+\r
**/\r
VOID\r
SupportedMaskAnd (\r
- IN UINT8 *SupportedFeatureMask,\r
- IN UINT8 *AndFeatureBitMask\r
+ IN UINT8 *SupportedFeatureMask,\r
+ IN CONST UINT8 *AndFeatureBitMask,\r
+ IN UINT32 BitMaskSize\r
)\r
{\r
UINTN Index;\r
- UINTN BitMaskSize;\r
UINT8 *Data1;\r
- UINT8 *Data2;\r
+ CONST UINT8 *Data2;\r
\r
- BitMaskSize = PcdGetSize (PcdCpuFeaturesSupport);\r
Data1 = SupportedFeatureMask;\r
Data2 = AndFeatureBitMask;\r
for (Index = 0; Index < BitMaskSize; Index++) {\r
\r
@param[in] SupportedFeatureMask The pointer to CPU feature bits mask buffer\r
@param[in] AndFeatureBitMask The feature bit mask to do XOR operation\r
+ @param[in] BitMaskSize CPU feature bits mask buffer size.\r
**/\r
VOID\r
SupportedMaskCleanBit (\r
IN UINT8 *SupportedFeatureMask,\r
- IN UINT8 *AndFeatureBitMask\r
+ IN UINT8 *AndFeatureBitMask,\r
+ IN UINT32 BitMaskSize\r
)\r
{\r
UINTN Index;\r
- UINTN BitMaskSize;\r
UINT8 *Data1;\r
UINT8 *Data2;\r
\r
- BitMaskSize = PcdGetSize (PcdCpuFeaturesSupport);\r
Data1 = SupportedFeatureMask;\r
Data2 = AndFeatureBitMask;\r
for (Index = 0; Index < BitMaskSize; Index++) {\r
\r
@param[in] SupportedFeatureMask The pointer to CPU feature bits mask buffer\r
@param[in] ComparedFeatureBitMask The feature bit mask to be compared\r
+ @param[in] BitMaskSize CPU feature bits mask buffer size.\r
\r
@retval TRUE The ComparedFeatureBitMask is set in CPU feature supported bits\r
mask buffer.\r
BOOLEAN\r
IsBitMaskMatch (\r
IN UINT8 *SupportedFeatureMask,\r
- IN UINT8 *ComparedFeatureBitMask\r
+ IN UINT8 *ComparedFeatureBitMask,\r
+ IN UINT32 BitMaskSize\r
)\r
{\r
UINTN Index;\r
- UINTN BitMaskSize;\r
UINT8 *Data1;\r
UINT8 *Data2;\r
\r
- BitMaskSize = PcdGetSize (PcdCpuFeaturesSupport);\r
-\r
Data1 = SupportedFeatureMask;\r
Data2 = ComparedFeatureBitMask;\r
for (Index = 0; Index < BitMaskSize; Index++) {\r
CPU_FEATURES_DATA *CpuFeaturesData;\r
\r
CpuFeaturesData = (CPU_FEATURES_DATA *)Buffer;\r
- ProcessorNumber = GetProcessorIndex ();\r
+ ProcessorNumber = GetProcessorIndex (CpuFeaturesData);\r
CpuInfo = &CpuFeaturesData->InitOrder[ProcessorNumber].CpuInfo;\r
//\r
// collect processor information\r
Entry = GetFirstNode (&CpuFeaturesData->FeatureList);\r
while (!IsNull (&CpuFeaturesData->FeatureList, Entry)) {\r
CpuFeature = CPU_FEATURE_ENTRY_FROM_LINK (Entry);\r
- if (IsBitMaskMatch (CpuFeaturesData->SupportPcd, CpuFeature->FeatureMask)) {\r
- if (CpuFeature->SupportFunc == NULL) {\r
- //\r
- // If SupportFunc is NULL, then the feature is supported.\r
- //\r
- SupportedMaskOr (\r
- CpuFeaturesData->InitOrder[ProcessorNumber].FeaturesSupportedMask,\r
- CpuFeature->FeatureMask\r
- );\r
- } else if (CpuFeature->SupportFunc (ProcessorNumber, CpuInfo, CpuFeature->ConfigData)) {\r
- SupportedMaskOr (\r
- CpuFeaturesData->InitOrder[ProcessorNumber].FeaturesSupportedMask,\r
- CpuFeature->FeatureMask\r
- );\r
- }\r
+ if (CpuFeature->SupportFunc == NULL) {\r
+ //\r
+ // If SupportFunc is NULL, then the feature is supported.\r
+ //\r
+ SupportedMaskOr (\r
+ CpuFeaturesData->InitOrder[ProcessorNumber].FeaturesSupportedMask,\r
+ CpuFeature->FeatureMask,\r
+ CpuFeaturesData->BitMaskSize\r
+ );\r
+ } else if (CpuFeature->SupportFunc (ProcessorNumber, CpuInfo, CpuFeature->ConfigData)) {\r
+ SupportedMaskOr (\r
+ CpuFeaturesData->InitOrder[ProcessorNumber].FeaturesSupportedMask,\r
+ CpuFeature->FeatureMask,\r
+ CpuFeaturesData->BitMaskSize\r
+ );\r
}\r
Entry = Entry->ForwardLink;\r
}\r
//\r
// Calculate the last capability on all processors\r
//\r
- SupportedMaskAnd (CpuFeaturesData->CapabilityPcd, CpuInitOrder->FeaturesSupportedMask);\r
+ SupportedMaskAnd (CpuFeaturesData->CapabilityPcd, CpuInitOrder->FeaturesSupportedMask, CpuFeaturesData->BitMaskSize);\r
}\r
//\r
// Calculate the last setting\r
//\r
-\r
CpuFeaturesData->SettingPcd = AllocateCopyPool (CpuFeaturesData->BitMaskSize, CpuFeaturesData->CapabilityPcd);\r
ASSERT (CpuFeaturesData->SettingPcd != NULL);\r
- SupportedMaskAnd (CpuFeaturesData->SettingPcd, CpuFeaturesData->ConfigurationPcd);\r
-\r
- //\r
- // Save PCDs and display CPU PCDs\r
- //\r
- SetCapabilityPcd (CpuFeaturesData->CapabilityPcd);\r
- SetSettingPcd (CpuFeaturesData->SettingPcd);\r
+ SupportedMaskAnd (CpuFeaturesData->SettingPcd, PcdGetPtr (PcdCpuFeaturesSetting), CpuFeaturesData->BitMaskSize);\r
\r
//\r
// Dump the last CPU feature list\r
Entry = GetFirstNode (&CpuFeaturesData->FeatureList);\r
while (!IsNull (&CpuFeaturesData->FeatureList, Entry)) {\r
CpuFeature = CPU_FEATURE_ENTRY_FROM_LINK (Entry);\r
- if (IsBitMaskMatch (CpuFeature->FeatureMask, CpuFeaturesData->CapabilityPcd)) {\r
- if (IsBitMaskMatch (CpuFeature->FeatureMask, CpuFeaturesData->SettingPcd)) {\r
+ if (IsBitMaskMatch (CpuFeature->FeatureMask, CpuFeaturesData->CapabilityPcd, CpuFeaturesData->BitMaskSize)) {\r
+ if (IsBitMaskMatch (CpuFeature->FeatureMask, CpuFeaturesData->SettingPcd, CpuFeaturesData->BitMaskSize)) {\r
DEBUG ((DEBUG_INFO, "[Enable ] "));\r
} else {\r
DEBUG ((DEBUG_INFO, "[Disable ] "));\r
} else {\r
DEBUG ((DEBUG_INFO, "[Unsupport] "));\r
}\r
- DumpCpuFeature (CpuFeature);\r
+ DumpCpuFeature (CpuFeature, CpuFeaturesData->BitMaskSize);\r
Entry = Entry->ForwardLink;\r
}\r
- DEBUG ((DEBUG_INFO, "PcdCpuFeaturesSupport:\n"));\r
- DumpCpuFeatureMask (CpuFeaturesData->SupportPcd);\r
- DEBUG ((DEBUG_INFO, "PcdCpuFeaturesUserConfiguration:\n"));\r
- DumpCpuFeatureMask (CpuFeaturesData->ConfigurationPcd);\r
DEBUG ((DEBUG_INFO, "PcdCpuFeaturesCapability:\n"));\r
- DumpCpuFeatureMask (CpuFeaturesData->CapabilityPcd);\r
- DEBUG ((DEBUG_INFO, "PcdCpuFeaturesSetting:\n"));\r
- DumpCpuFeatureMask (CpuFeaturesData->SettingPcd);\r
+ DumpCpuFeatureMask (CpuFeaturesData->CapabilityPcd, CpuFeaturesData->BitMaskSize);\r
+ DEBUG ((DEBUG_INFO, "Origin PcdCpuFeaturesSetting:\n"));\r
+ DumpCpuFeatureMask (PcdGetPtr (PcdCpuFeaturesSetting), CpuFeaturesData->BitMaskSize);\r
+ DEBUG ((DEBUG_INFO, "Final PcdCpuFeaturesSetting:\n"));\r
+ DumpCpuFeatureMask (CpuFeaturesData->SettingPcd, CpuFeaturesData->BitMaskSize);\r
);\r
\r
+ //\r
+ // Save PCDs and display CPU PCDs\r
+ //\r
+ SetCapabilityPcd (CpuFeaturesData->CapabilityPcd, CpuFeaturesData->BitMaskSize);\r
+ SetSettingPcd (CpuFeaturesData->SettingPcd, CpuFeaturesData->BitMaskSize);\r
+\r
for (ProcessorNumber = 0; ProcessorNumber < NumberOfCpus; ProcessorNumber++) {\r
CpuInitOrder = &CpuFeaturesData->InitOrder[ProcessorNumber];\r
Entry = GetFirstNode (&CpuFeaturesData->FeatureList);\r
// Insert each feature into processor's order list\r
//\r
CpuFeature = CPU_FEATURE_ENTRY_FROM_LINK (Entry);\r
- if (IsBitMaskMatch (CpuFeature->FeatureMask, CpuFeaturesData->CapabilityPcd)) {\r
+ if (IsBitMaskMatch (CpuFeature->FeatureMask, CpuFeaturesData->CapabilityPcd, CpuFeaturesData->BitMaskSize)) {\r
CpuFeatureInOrder = AllocateCopyPool (sizeof (CPU_FEATURES_ENTRY), CpuFeature);\r
ASSERT (CpuFeatureInOrder != NULL);\r
InsertTailList (&CpuInitOrder->OrderList, &CpuFeatureInOrder->Link);\r
CpuFeatureInOrder = CPU_FEATURE_ENTRY_FROM_LINK (Entry);\r
\r
Success = FALSE;\r
- if (IsBitMaskMatch (CpuFeatureInOrder->FeatureMask, CpuFeaturesData->SettingPcd)) {\r
+ if (IsBitMaskMatch (CpuFeatureInOrder->FeatureMask, CpuFeaturesData->SettingPcd, CpuFeaturesData->BitMaskSize)) {\r
Status = CpuFeatureInOrder->InitializeFunc (ProcessorNumber, CpuInfo, CpuFeatureInOrder->ConfigData, TRUE);\r
if (EFI_ERROR (Status)) {\r
//\r
// Clean the CpuFeatureInOrder->FeatureMask in setting PCD.\r
//\r
- SupportedMaskCleanBit (CpuFeaturesData->SettingPcd, CpuFeatureInOrder->FeatureMask);\r
+ SupportedMaskCleanBit (CpuFeaturesData->SettingPcd, CpuFeatureInOrder->FeatureMask, CpuFeaturesData->BitMaskSize);\r
if (CpuFeatureInOrder->FeatureName != NULL) {\r
DEBUG ((DEBUG_WARN, "Warning :: Failed to enable Feature: Name = %a.\n", CpuFeatureInOrder->FeatureName));\r
} else {\r
DEBUG ((DEBUG_WARN, "Warning :: Failed to enable Feature: Mask = "));\r
- DumpCpuFeatureMask (CpuFeatureInOrder->FeatureMask);\r
+ DumpCpuFeatureMask (CpuFeatureInOrder->FeatureMask, CpuFeaturesData->BitMaskSize);\r
}\r
} else {\r
Success = TRUE;\r
DEBUG ((DEBUG_WARN, "Warning :: Failed to disable Feature: Name = %a.\n", CpuFeatureInOrder->FeatureName));\r
} else {\r
DEBUG ((DEBUG_WARN, "Warning :: Failed to disable Feature: Mask = "));\r
- DumpCpuFeatureMask (CpuFeatureInOrder->FeatureMask);\r
+ DumpCpuFeatureMask (CpuFeatureInOrder->FeatureMask, CpuFeaturesData->BitMaskSize);\r
}\r
} else {\r
Success = TRUE;\r
// again during initialize the features.\r
//\r
DEBUG ((DEBUG_INFO, "Dump final value for PcdCpuFeaturesSetting:\n"));\r
- DumpCpuFeatureMask (CpuFeaturesData->SettingPcd);\r
+ DumpCpuFeatureMask (CpuFeaturesData->SettingPcd, CpuFeaturesData->BitMaskSize);\r
\r
//\r
// Dump the RegisterTable\r
UINT32 PackageThreadsCount;\r
UINT32 CurrentThread;\r
UINTN ProcessorIndex;\r
- UINTN ThreadIndex;\r
UINTN ValidThreadCount;\r
UINT32 *ValidCoreCountPerPackage;\r
\r
\r
RegisterTableEntry = &RegisterTableEntryHead[Index];\r
\r
- DEBUG_CODE_BEGIN ();\r
- AcquireSpinLock (&CpuFlags->ConsoleLogLock);\r
- ThreadIndex = ApLocation->Package * CpuStatus->MaxCoreCount * CpuStatus->MaxThreadCount +\r
- ApLocation->Core * CpuStatus->MaxThreadCount +\r
- ApLocation->Thread;\r
- DEBUG ((\r
- DEBUG_INFO,\r
- "Processor = %08lu, Index %08lu, Type = %s!\n",\r
- (UINT64)ThreadIndex,\r
- (UINT64)Index,\r
- mRegisterTypeStr[MIN ((REGISTER_TYPE)RegisterTableEntry->RegisterType, InvalidReg)]\r
- ));\r
- ReleaseSpinLock (&CpuFlags->ConsoleLogLock);\r
- DEBUG_CODE_END ();\r
-\r
//\r
// Check the type of specified register\r
//\r
VOID\r
)\r
{\r
- UINTN NumberOfCpus;\r
- UINTN NumberOfEnabledProcessors;\r
CPU_FEATURES_DATA *CpuFeaturesData;\r
\r
CpuFeaturesData = GetCpuFeaturesData();\r
\r
- GetNumberOfProcessor (&NumberOfCpus, &NumberOfEnabledProcessors);\r
-\r
- CpuInitDataInitialize (NumberOfCpus);\r
+ CpuInitDataInitialize ();\r
\r
- //\r
- // Wakeup all APs for data collection.\r
- //\r
- StartupAPsWorker (CollectProcessorData, NULL);\r
+ if (CpuFeaturesData->NumberOfCpus > 1) {\r
+ //\r
+ // Wakeup all APs for data collection.\r
+ //\r
+ StartupAllAPsWorker (CollectProcessorData, NULL);\r
+ }\r
\r
//\r
// Collect data on BSP\r
//\r
CollectProcessorData (CpuFeaturesData);\r
\r
- AnalysisProcessorFeatures (NumberOfCpus);\r
+ AnalysisProcessorFeatures (CpuFeaturesData->NumberOfCpus);\r
}\r
\r