/**\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
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
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
CollectProcessorData (CpuFeaturesData);\r
\r
- AnalysisProcessorFeatures (NumberOfCpus);\r
+ AnalysisProcessorFeatures (CpuFeaturesData->NumberOfCpus);\r
}\r
\r
#include "RegisterCpuFeatures.h"\r
\r
CPU_FEATURES_DATA mCpuFeaturesData = {0};\r
-EFI_MP_SERVICES_PROTOCOL *mCpuFeaturesMpServices = NULL;\r
\r
/**\r
Worker function to get CPU_FEATURES_DATA pointer.\r
/**\r
Worker function to get EFI_MP_SERVICES_PROTOCOL pointer.\r
\r
- @return Pointer to EFI_MP_SERVICES_PROTOCOL.\r
+ @return MP_SERVICES variable.\r
**/\r
-EFI_MP_SERVICES_PROTOCOL *\r
-GetMpProtocol (\r
+MP_SERVICES\r
+GetMpService (\r
VOID\r
)\r
{\r
- EFI_STATUS Status;\r
-\r
- if (mCpuFeaturesMpServices == NULL) {\r
- //\r
- // Get MP Services Protocol\r
- //\r
- Status = gBS->LocateProtocol (\r
- &gEfiMpServiceProtocolGuid,\r
- NULL,\r
- (VOID **)&mCpuFeaturesMpServices\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
- }\r
+ EFI_STATUS Status;\r
+ MP_SERVICES MpService;\r
\r
- ASSERT (mCpuFeaturesMpServices != NULL);\r
- return mCpuFeaturesMpServices;\r
+ //\r
+ // Get MP Services Protocol\r
+ //\r
+ Status = gBS->LocateProtocol (\r
+ &gEfiMpServiceProtocolGuid,\r
+ NULL,\r
+ (VOID **)&MpService.Protocol\r
+ );\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ return MpService;\r
}\r
\r
/**\r
Worker function to return processor index.\r
\r
+ @param CpuFeaturesData Cpu Feature Data structure.\r
+\r
@return The processor index.\r
**/\r
UINTN\r
GetProcessorIndex (\r
- VOID\r
+ IN CPU_FEATURES_DATA *CpuFeaturesData\r
)\r
{\r
EFI_STATUS Status;\r
UINTN ProcessorIndex;\r
EFI_MP_SERVICES_PROTOCOL *MpServices;\r
\r
- MpServices = GetMpProtocol ();\r
+ MpServices = CpuFeaturesData->MpService.Protocol;\r
Status = MpServices->WhoAmI(MpServices, &ProcessorIndex);\r
ASSERT_EFI_ERROR (Status);\r
return ProcessorIndex;\r
{\r
EFI_STATUS Status;\r
EFI_MP_SERVICES_PROTOCOL *MpServices;\r
+ CPU_FEATURES_DATA *CpuFeaturesData;\r
+\r
+ CpuFeaturesData = GetCpuFeaturesData ();\r
+ MpServices = CpuFeaturesData->MpService.Protocol;\r
\r
- MpServices = GetMpProtocol ();\r
Status = MpServices->GetProcessorInfo (\r
MpServices,\r
ProcessorNumber,\r
CPU_FEATURES_DATA *CpuFeaturesData;\r
\r
CpuFeaturesData = GetCpuFeaturesData ();\r
+ MpServices = CpuFeaturesData->MpService.Protocol;\r
\r
- MpServices = GetMpProtocol ();\r
//\r
// Wakeup all APs\r
//\r
{\r
EFI_STATUS Status;\r
EFI_MP_SERVICES_PROTOCOL *MpServices;\r
+ CPU_FEATURES_DATA *CpuFeaturesData;\r
+\r
+ CpuFeaturesData = GetCpuFeaturesData ();\r
+ MpServices = CpuFeaturesData->MpService.Protocol;\r
\r
- MpServices = GetMpProtocol ();\r
//\r
// Wakeup all APs\r
//\r
{\r
EFI_STATUS Status;\r
EFI_MP_SERVICES_PROTOCOL *MpServices;\r
+ CPU_FEATURES_DATA *CpuFeaturesData;\r
\r
- MpServices = GetMpProtocol ();\r
+ CpuFeaturesData = GetCpuFeaturesData ();\r
+ MpServices = CpuFeaturesData->MpService.Protocol;\r
\r
//\r
// Get the number of CPUs\r
\r
CpuFeaturesData = GetCpuFeaturesData ();\r
\r
- OldBspNumber = GetProcessorIndex();\r
+ OldBspNumber = GetProcessorIndex (CpuFeaturesData);\r
CpuFeaturesData->BspNumber = OldBspNumber;\r
\r
Status = gBS->CreateEvent (\r
/**\r
Worker function to get MP PPI service pointer.\r
\r
- @return PEI PPI service pointer.\r
+ @return MP_SERVICES variable.\r
**/\r
-EFI_PEI_MP_SERVICES_PPI *\r
-GetMpPpi (\r
+MP_SERVICES\r
+GetMpService (\r
VOID\r
)\r
{\r
EFI_STATUS Status;\r
- EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;\r
+ MP_SERVICES MpService;\r
\r
//\r
// Get MP Services Protocol\r
&gEfiPeiMpServicesPpiGuid,\r
0,\r
NULL,\r
- (VOID **)&CpuMpPpi\r
+ (VOID **)&MpService.Ppi\r
);\r
ASSERT_EFI_ERROR (Status);\r
- return CpuMpPpi;\r
+ return MpService;\r
}\r
\r
/**\r
Worker function to return processor index.\r
\r
+ @param CpuFeaturesData Cpu Feature Data structure.\r
+\r
@return The processor index.\r
**/\r
UINTN\r
GetProcessorIndex (\r
- VOID\r
+ IN CPU_FEATURES_DATA *CpuFeaturesData\r
)\r
{\r
EFI_STATUS Status;\r
EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;\r
UINTN ProcessorIndex;\r
\r
- CpuMpPpi = GetMpPpi ();\r
+ CpuMpPpi = CpuFeaturesData->MpService.Ppi;\r
\r
- Status = CpuMpPpi->WhoAmI(GetPeiServicesTablePointer (), CpuMpPpi, &ProcessorIndex);\r
+ //\r
+ // For two reasons which use NULL for WhoAmI:\r
+ // 1. This function will be called by APs and AP should not use PeiServices Table\r
+ // 2. Check WhoAmI implementation, this parameter will not be used.\r
+ //\r
+ Status = CpuMpPpi->WhoAmI(NULL, CpuMpPpi, &ProcessorIndex);\r
ASSERT_EFI_ERROR (Status);\r
return ProcessorIndex;\r
}\r
{\r
EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;\r
EFI_STATUS Status;\r
+ CPU_FEATURES_DATA *CpuFeaturesData;\r
+\r
+ CpuFeaturesData = GetCpuFeaturesData ();\r
+ CpuMpPpi = CpuFeaturesData->MpService.Ppi;\r
\r
- CpuMpPpi = GetMpPpi ();\r
Status = CpuMpPpi->GetProcessorInfo (\r
GetPeiServicesTablePointer(),\r
CpuMpPpi,\r
CPU_FEATURES_DATA *CpuFeaturesData;\r
\r
CpuFeaturesData = GetCpuFeaturesData ();\r
-\r
- //\r
- // Get MP Services Protocol\r
- //\r
- Status = PeiServicesLocatePpi (\r
- &gEfiPeiMpServicesPpiGuid,\r
- 0,\r
- NULL,\r
- (VOID **)&CpuMpPpi\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
+ CpuMpPpi = CpuFeaturesData->MpService.Ppi;\r
\r
//\r
// Wakeup all APs for data collection.\r
{\r
EFI_STATUS Status;\r
EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;\r
+ CPU_FEATURES_DATA *CpuFeaturesData;\r
\r
- //\r
- // Get MP Services Protocol\r
- //\r
- Status = PeiServicesLocatePpi (\r
- &gEfiPeiMpServicesPpiGuid,\r
- 0,\r
- NULL,\r
- (VOID **)&CpuMpPpi\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
+ CpuFeaturesData = GetCpuFeaturesData ();\r
+ CpuMpPpi = CpuFeaturesData->MpService.Ppi;\r
\r
//\r
// Wakeup all APs for data collection.\r
{\r
EFI_STATUS Status;\r
EFI_PEI_MP_SERVICES_PPI *CpuMpPpi;\r
+ CPU_FEATURES_DATA *CpuFeaturesData;\r
\r
- //\r
- // Get MP Services Protocol\r
- //\r
- Status = PeiServicesLocatePpi (\r
- &gEfiPeiMpServicesPpiGuid,\r
- 0,\r
- NULL,\r
- (VOID **)&CpuMpPpi\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
+ CpuFeaturesData = GetCpuFeaturesData ();\r
+ CpuMpPpi = CpuFeaturesData->MpService.Ppi;\r
\r
//\r
// Get the number of CPUs\r
\r
CpuFeaturesData = GetCpuFeaturesData ();\r
\r
- OldBspNumber = GetProcessorIndex();\r
+ OldBspNumber = GetProcessorIndex (CpuFeaturesData);\r
CpuFeaturesData->BspNumber = OldBspNumber;\r
\r
//\r
\r
#ifndef _REGISTER_CPU_FEATURES_H_\r
#define _REGISTER_CPU_FEATURES_H_\r
+#include <PiPei.h>\r
+#include <PiDxe.h>\r
+#include <Ppi/MpServices.h>\r
+#include <Protocol/MpService.h>\r
\r
#include <Library/BaseLib.h>\r
#include <Library/DebugLib.h>\r
volatile UINT32 *PackageSemaphoreCount; // Semaphore containers used to program Package semaphore.\r
} PROGRAM_CPU_REGISTER_FLAGS;\r
\r
+typedef union {\r
+ EFI_MP_SERVICES_PROTOCOL *Protocol;\r
+ EFI_PEI_MP_SERVICES_PPI *Ppi;\r
+} MP_SERVICES;\r
+\r
typedef struct {\r
UINTN FeaturesCount;\r
UINT32 BitMaskSize;\r
UINTN BspNumber;\r
\r
PROGRAM_CPU_REGISTER_FLAGS CpuFlags;\r
+\r
+ MP_SERVICES MpService;\r
} CPU_FEATURES_DATA;\r
\r
#define CPU_FEATURE_ENTRY_FROM_LINK(a) \\r
/**\r
Worker function to return processor index.\r
\r
+ @param CpuFeaturesData Cpu Feature Data structure.\r
+\r
@return The processor index.\r
**/\r
UINTN\r
GetProcessorIndex (\r
- VOID\r
+ IN CPU_FEATURES_DATA *CpuFeaturesData\r
);\r
\r
/**\r
VOID\r
);\r
\r
+/**\r
+ Worker function to get MP service pointer.\r
+\r
+ @return MP_SERVICES variable.\r
+**/\r
+MP_SERVICES\r
+GetMpService (\r
+ VOID\r
+ );\r
+\r
#endif\r