]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/RegisterCpuFeaturesLib: Avoid AP calls PeiService.
authorEric Dong <eric.dong@intel.com>
Fri, 4 Jan 2019 05:37:29 +0000 (13:37 +0800)
committerEric Dong <eric.dong@intel.com>
Mon, 14 Jan 2019 02:29:29 +0000 (10:29 +0800)
V3:
   Define union to specify the ppi or protocol.

V2:
1. Initialize CpuFeaturesData->MpService in CpuInitDataInitialize
   and make this function been called at the begin of the
   initialization.
2. let all other functions use CpuFeaturesData->MpService install
   of locate the protocol itself.

V1:
GetProcessorIndex function calls GetMpPpi to get the MP Ppi.
Ap will calls GetProcessorIndex function which final let AP calls
PeiService.

This patch avoid GetProcessorIndex call PeiService.

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=1411

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
UefiCpuPkg/Library/RegisterCpuFeaturesLib/DxeRegisterCpuFeaturesLib.c
UefiCpuPkg/Library/RegisterCpuFeaturesLib/PeiRegisterCpuFeaturesLib.c
UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeatures.h

index 624ddee0559c18d592144f7aebef987dbc88fd79..269af052b160fb9317aa8a5bdc3bcb8b6ae6487b 100644 (file)
@@ -134,11 +134,10 @@ FillProcessorInfo (
 /**\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
@@ -157,12 +156,22 @@ CpuInitDataInitialize (
   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
@@ -409,7 +418,7 @@ CollectProcessorData (
   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
@@ -1105,15 +1114,11 @@ CpuFeaturesDetect (
   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
@@ -1125,6 +1130,6 @@ CpuFeaturesDetect (
   //\r
   CollectProcessorData (CpuFeaturesData);\r
 \r
-  AnalysisProcessorFeatures (NumberOfCpus);\r
+  AnalysisProcessorFeatures (CpuFeaturesData->NumberOfCpus);\r
 }\r
 \r
index 926698dc95e0ca1bbf69aeafafa39df9e6d4f2ba..3654c105ef78312618cf42276f51985114b977ad 100644 (file)
@@ -20,7 +20,6 @@
 #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
@@ -38,46 +37,46 @@ GetCpuFeaturesData (
 /**\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
@@ -101,8 +100,11 @@ GetProcessorInformation (
 {\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
@@ -130,8 +132,8 @@ StartupAPsWorker (
   CPU_FEATURES_DATA                    *CpuFeaturesData;\r
 \r
   CpuFeaturesData = GetCpuFeaturesData ();\r
+  MpServices = CpuFeaturesData->MpService.Protocol;\r
 \r
-  MpServices = GetMpProtocol ();\r
   //\r
   // Wakeup all APs\r
   //\r
@@ -159,8 +161,11 @@ SwitchNewBsp (
 {\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
@@ -190,8 +195,10 @@ GetNumberOfProcessor (
 {\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
@@ -225,7 +232,7 @@ CpuFeaturesInitialize (
 \r
   CpuFeaturesData = GetCpuFeaturesData ();\r
 \r
-  OldBspNumber = GetProcessorIndex();\r
+  OldBspNumber = GetProcessorIndex (CpuFeaturesData);\r
   CpuFeaturesData->BspNumber = OldBspNumber;\r
 \r
   Status = gBS->CreateEvent (\r
index 4bab2837cc68c38dbd0d8fa980e09af023a0bddd..03d852e618b259e39df198e51afeb16df0ecc0a4 100644 (file)
@@ -68,15 +68,15 @@ GetCpuFeaturesData (
 /**\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
@@ -85,29 +85,36 @@ GetMpPpi (
              &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
@@ -130,8 +137,11 @@ GetProcessorInformation (
 {\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
@@ -160,17 +170,7 @@ StartupAPsWorker (
   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
@@ -198,17 +198,10 @@ SwitchNewBsp (
 {\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
@@ -240,17 +233,10 @@ GetNumberOfProcessor (
 {\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
@@ -283,7 +269,7 @@ CpuFeaturesInitialize (
 \r
   CpuFeaturesData = GetCpuFeaturesData ();\r
 \r
-  OldBspNumber = GetProcessorIndex();\r
+  OldBspNumber = GetProcessorIndex (CpuFeaturesData);\r
   CpuFeaturesData->BspNumber = OldBspNumber;\r
 \r
   //\r
index cf3da8483732a66d011ad1fe694f123cc8319f61..21dd5773a637c4449999354ea8affcb853d0e6ca 100644 (file)
 \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
@@ -66,6 +70,11 @@ typedef struct {
   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
@@ -85,6 +94,8 @@ typedef struct {
   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
@@ -108,11 +119,13 @@ GetCpuFeaturesData (
 /**\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
@@ -245,4 +258,14 @@ GetAcpiCpuData (
   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