UefiCpuPkg/RegisterCpuFeaturesLib: Support MpServices2 only case.

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2883

MpServices Ppi can be replaced by MpServices2 Ppi and MpServices2
Ppi is mandatory for RegisterCpuFeaturesLib functionality,
basing on this we can drop MpServices Ppi usage from the library
and the constraint that both Ppis must be installed.

Cc: Eric Dong <eric.dong@intel.com>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Rahul Kumar <rahul1.kumar@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Signed-off-by: Chasel Chiu <chasel.chiu@intel.com>
Reviewed-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Ray Ni <ray.ni@intel.com>
This commit is contained in:
Chasel Chiu 2020-09-08 16:38:11 +08:00 committed by mergify[bot]
parent 067503a8c6
commit 1b461403ee
3 changed files with 28 additions and 44 deletions

View File

@ -1,7 +1,7 @@
/** @file /** @file
CPU Register Table Library functions. CPU Register Table Library functions.
Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR> Copyright (c) 2016 - 2020, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
@ -11,7 +11,6 @@
#include <Library/HobLib.h> #include <Library/HobLib.h>
#include <Library/PeiServicesLib.h> #include <Library/PeiServicesLib.h>
#include <Library/PeiServicesTablePointerLib.h> #include <Library/PeiServicesTablePointerLib.h>
#include <Ppi/MpServices.h>
#include <Ppi/MpServices2.h> #include <Ppi/MpServices2.h>
#include "RegisterCpuFeatures.h" #include "RegisterCpuFeatures.h"
@ -75,10 +74,10 @@ GetMpService (
MP_SERVICES MpService; MP_SERVICES MpService;
// //
// Get MP Services Protocol // Get MP Services2 Ppi
// //
Status = PeiServicesLocatePpi ( Status = PeiServicesLocatePpi (
&gEfiPeiMpServicesPpiGuid, &gEdkiiPeiMpServices2PpiGuid,
0, 0,
NULL, NULL,
(VOID **)&MpService.Ppi (VOID **)&MpService.Ppi
@ -100,17 +99,17 @@ GetProcessorIndex (
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_PEI_MP_SERVICES_PPI *CpuMpPpi; EDKII_PEI_MP_SERVICES2_PPI *CpuMp2Ppi;
UINTN ProcessorIndex; UINTN ProcessorIndex;
CpuMpPpi = CpuFeaturesData->MpService.Ppi; CpuMp2Ppi = CpuFeaturesData->MpService.Ppi;
// //
// For two reasons which use NULL for WhoAmI: // For two reasons which use NULL for WhoAmI:
// 1. This function will be called by APs and AP should not use PeiServices Table // 1. This function will be called by APs and AP should not use PeiServices Table
// 2. Check WhoAmI implementation, this parameter will not be used. // 2. Check WhoAmI implementation, this parameter will not be used.
// //
Status = CpuMpPpi->WhoAmI(NULL, CpuMpPpi, &ProcessorIndex); Status = CpuMp2Ppi->WhoAmI (CpuMp2Ppi, &ProcessorIndex);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
return ProcessorIndex; return ProcessorIndex;
} }
@ -131,16 +130,15 @@ GetProcessorInformation (
OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer OUT EFI_PROCESSOR_INFORMATION *ProcessorInfoBuffer
) )
{ {
EFI_PEI_MP_SERVICES_PPI *CpuMpPpi; EDKII_PEI_MP_SERVICES2_PPI *CpuMp2Ppi;
EFI_STATUS Status; EFI_STATUS Status;
CPU_FEATURES_DATA *CpuFeaturesData; CPU_FEATURES_DATA *CpuFeaturesData;
CpuFeaturesData = GetCpuFeaturesData (); CpuFeaturesData = GetCpuFeaturesData ();
CpuMpPpi = CpuFeaturesData->MpService.Ppi; CpuMp2Ppi = CpuFeaturesData->MpService.Ppi;
Status = CpuMpPpi->GetProcessorInfo ( Status = CpuMp2Ppi->GetProcessorInfo (
GetPeiServicesTablePointer(), CpuMp2Ppi,
CpuMpPpi,
ProcessorNumber, ProcessorNumber,
ProcessorInfoBuffer ProcessorInfoBuffer
); );
@ -162,18 +160,17 @@ StartupAllAPsWorker (
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_PEI_MP_SERVICES_PPI *CpuMpPpi; EDKII_PEI_MP_SERVICES2_PPI *CpuMp2Ppi;
CPU_FEATURES_DATA *CpuFeaturesData; CPU_FEATURES_DATA *CpuFeaturesData;
CpuFeaturesData = GetCpuFeaturesData (); CpuFeaturesData = GetCpuFeaturesData ();
CpuMpPpi = CpuFeaturesData->MpService.Ppi; CpuMp2Ppi = CpuFeaturesData->MpService.Ppi;
// //
// Wakeup all APs for data collection. // Wakeup all APs for data collection.
// //
Status = CpuMpPpi->StartupAllAPs ( Status = CpuMp2Ppi->StartupAllAPs (
GetPeiServicesTablePointer (), CpuMp2Ppi,
CpuMpPpi,
Procedure, Procedure,
FALSE, FALSE,
0, 0,
@ -203,17 +200,7 @@ StartupAllCPUsWorker (
// //
// Get MP Services2 Ppi // Get MP Services2 Ppi
// //
Status = PeiServicesLocatePpi ( CpuMp2Ppi = CpuFeaturesData->MpService.Ppi;
&gEdkiiPeiMpServices2PpiGuid,
0,
NULL,
(VOID **)&CpuMp2Ppi
);
ASSERT_EFI_ERROR (Status);
//
// Wakeup all APs for data collection.
//
Status = CpuMp2Ppi->StartupAllCPUs ( Status = CpuMp2Ppi->StartupAllCPUs (
CpuMp2Ppi, CpuMp2Ppi,
Procedure, Procedure,
@ -234,18 +221,17 @@ SwitchNewBsp (
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_PEI_MP_SERVICES_PPI *CpuMpPpi; EDKII_PEI_MP_SERVICES2_PPI *CpuMp2Ppi;
CPU_FEATURES_DATA *CpuFeaturesData; CPU_FEATURES_DATA *CpuFeaturesData;
CpuFeaturesData = GetCpuFeaturesData (); CpuFeaturesData = GetCpuFeaturesData ();
CpuMpPpi = CpuFeaturesData->MpService.Ppi; CpuMp2Ppi = CpuFeaturesData->MpService.Ppi;
// //
// Wakeup all APs for data collection. // Wakeup all APs for data collection.
// //
Status = CpuMpPpi->SwitchBSP ( Status = CpuMp2Ppi->SwitchBSP (
GetPeiServicesTablePointer (), CpuMp2Ppi,
CpuMpPpi,
ProcessorNumber, ProcessorNumber,
TRUE TRUE
); );
@ -269,18 +255,17 @@ GetNumberOfProcessor (
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_PEI_MP_SERVICES_PPI *CpuMpPpi; EDKII_PEI_MP_SERVICES2_PPI *CpuMp2Ppi;
CPU_FEATURES_DATA *CpuFeaturesData; CPU_FEATURES_DATA *CpuFeaturesData;
CpuFeaturesData = GetCpuFeaturesData (); CpuFeaturesData = GetCpuFeaturesData ();
CpuMpPpi = CpuFeaturesData->MpService.Ppi; CpuMp2Ppi = CpuFeaturesData->MpService.Ppi;
// //
// Get the number of CPUs // Get the number of CPUs
// //
Status = CpuMpPpi->GetNumberOfProcessors ( Status = CpuMp2Ppi->GetNumberOfProcessors (
GetPeiServicesTablePointer (), CpuMp2Ppi,
CpuMpPpi,
NumberOfCpus, NumberOfCpus,
NumberOfEnabledProcessors NumberOfEnabledProcessors
); );

View File

@ -1,7 +1,7 @@
## @file ## @file
# Register CPU Features Library PEI instance. # Register CPU Features Library PEI instance.
# #
# Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2017 - 2020, Intel Corporation. All rights reserved.<BR>
# SPDX-License-Identifier: BSD-2-Clause-Patent # SPDX-License-Identifier: BSD-2-Clause-Patent
# #
## ##
@ -45,7 +45,6 @@
IoLib IoLib
[Ppis] [Ppis]
gEfiPeiMpServicesPpiGuid ## CONSUMES
gEdkiiPeiMpServices2PpiGuid ## CONSUMES gEdkiiPeiMpServices2PpiGuid ## CONSUMES
[Pcd] [Pcd]
@ -55,4 +54,4 @@
gUefiCpuPkgTokenSpaceGuid.PcdCpuFeaturesSetting ## CONSUMES ## PRODUCES gUefiCpuPkgTokenSpaceGuid.PcdCpuFeaturesSetting ## CONSUMES ## PRODUCES
[Depex] [Depex]
gEfiPeiMpServicesPpiGuid AND gEdkiiCpuFeaturesSetDoneGuid gEdkiiPeiMpServices2PpiGuid AND gEdkiiCpuFeaturesSetDoneGuid

View File

@ -10,7 +10,7 @@
#define _REGISTER_CPU_FEATURES_H_ #define _REGISTER_CPU_FEATURES_H_
#include <PiPei.h> #include <PiPei.h>
#include <PiDxe.h> #include <PiDxe.h>
#include <Ppi/MpServices.h> #include <Ppi/MpServices2.h>
#include <Protocol/MpService.h> #include <Protocol/MpService.h>
#include <Library/BaseLib.h> #include <Library/BaseLib.h>
@ -64,8 +64,8 @@ typedef struct {
} PROGRAM_CPU_REGISTER_FLAGS; } PROGRAM_CPU_REGISTER_FLAGS;
typedef union { typedef union {
EFI_MP_SERVICES_PROTOCOL *Protocol; EFI_MP_SERVICES_PROTOCOL *Protocol;
EFI_PEI_MP_SERVICES_PPI *Ppi; EDKII_PEI_MP_SERVICES2_PPI *Ppi;
} MP_SERVICES; } MP_SERVICES;
typedef struct { typedef struct {