UefiCpuPkg/CpuFeatures: Export HOB if CPU initialized in PEI

In current implementation, CPU initialized can be done in PEI
or DXE phase. PEI uses CpuFeaturesPei and Dxe uses CpuFeaturesDxe.
If CPU initialized in PEI phase, CpuFeaturesDxe driver will
not be used. This driver will install gEdkiiCpuFeaturesInitDoneGuid
protocol after it initializes the CPU.

Some drivers depend on this protocol to dispatch themselves. If
CpuFeaturesDxe not been used, these drivers will not be dispatched.

This patch fix the above issue. If Cpu initialized in PEI
phase, it also report a guid HOB for CpuFeaturesDxe.
CpuFeaturesDxe will check this HOB first. If it found this
HOB, it just install gEdkiiCpuFeaturesInitDoneGuid protocol,
else it will also do the CPU initialization.

Cc: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
This commit is contained in:
Eric Dong 2017-10-26 10:28:23 +08:00
parent c0cbaaf693
commit bf5a306ab5
4 changed files with 28 additions and 0 deletions

View File

@ -19,6 +19,7 @@
#include <Library/UefiLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/RegisterCpuFeaturesLib.h>
#include <Library/HobLib.h>
#include <Protocol/SmmConfiguration.h>
#include <Guid/CpuFeaturesInitDone.h>
@ -101,6 +102,25 @@ CpuFeaturesDxeInitialize (
)
{
VOID *Registration;
EFI_STATUS Status;
EFI_HANDLE Handle;
if (GetFirstGuidHob (&gEdkiiCpuFeaturesInitDoneGuid) != NULL) {
//
// Try to find HOB first. This HOB exist means CPU features have
// been initialized by CpuFeaturesPei driver, just install
// gEdkiiCpuFeaturesInitDoneGuid.
//
Handle = NULL;
Status = gBS->InstallProtocolInterface (
&Handle,
&gEdkiiCpuFeaturesInitDoneGuid,
EFI_NATIVE_INTERFACE,
NULL
);
ASSERT_EFI_ERROR (Status);
return Status;
}
if (PcdGetBool (PcdCpuFeaturesInitAfterSmmRelocation)) {
//

View File

@ -33,6 +33,7 @@
UefiDriverEntryPoint
UefiBootServicesTableLib
RegisterCpuFeaturesLib
HobLib
[Sources]
CpuFeaturesDxe.c

View File

@ -18,6 +18,7 @@
#include <Library/DebugLib.h>
#include <Library/PeiServicesLib.h>
#include <Library/RegisterCpuFeaturesLib.h>
#include <Library/HobLib.h>
#include <Guid/CpuFeaturesInitDone.h>
@ -70,6 +71,11 @@ CpuFeaturesPeimInitialize (
Status = PeiServicesInstallPpi(&mPeiCpuFeaturesInitDonePpiDesc);
ASSERT_EFI_ERROR (Status);
//
// Build HOB to let CpuFeatureDxe driver skip the initialization process.
//
BuildGuidHob (&gEdkiiCpuFeaturesInitDoneGuid, 0);
return EFI_SUCCESS;
}

View File

@ -32,6 +32,7 @@
PeimEntryPoint
PeiServicesLib
RegisterCpuFeaturesLib
HobLib
[Sources]
CpuFeaturesPei.c