/** @file
Library for Board Init.
@copyright
Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
IIO_UDS *mIioUds;
/**
Connects Root Bridge
**/
VOID
ConnectRootBridge (
BOOLEAN Recursive
);
VOID
ProgramDPRregs (
VOID
);
/**
A hook for board-specific initialization after PCI enumeration.
@retval EFI_SUCCESS The board initialization was successful.
@retval EFI_NOT_READY The board has not been detected yet.
**/
EFI_STATUS
EFIAPI
BoardInitAfterPciEnumeration (
VOID
)
{
return EFI_SUCCESS;
}
/**
A hook for board-specific functionality for the ReadyToBoot event.
@retval EFI_SUCCESS The board initialization was successful.
@retval EFI_NOT_READY The board has not been detected yet.
**/
EFI_STATUS
EFIAPI
BoardInitReadyToBoot (
VOID
)
{
return EFI_SUCCESS;
}
/**
A hook for board-specific functionality for the ExitBootServices event.
@retval EFI_SUCCESS The board initialization was successful.
@retval EFI_NOT_READY The board has not been detected yet.
**/
EFI_STATUS
EFIAPI
BoardInitEndOfFirmware (
VOID
)
{
return EFI_SUCCESS;
}
/**
This function will retrieve the DPR data from HOBs produced by MRC
and will use it to program the DPR registers in IIO and in PCH
@param VOID
@retval VOID
**/
VOID
ProgramDprRegs (
VOID
)
{
return;
}
/**
Function to set the WPE bit of the BIOS Info Flags MSR to enable Anti-Flash wearout
protection within BIOS Guard before booting to the OS
@param[in] EFI_EVENT Event
@param[in] VOID *Context
@retval None
**/
VOID
EFIAPI
EnableAntiFlashWearout (
EFI_EVENT Event,
VOID *Context
)
{
EFI_STATUS Status;
EFI_MP_SERVICES_PROTOCOL *MpServices = NULL;
SYSTEM_CONFIGURATION SetupData;
DYNAMIC_SI_LIBARY_PROTOCOL *DynamicSiLibraryProtocol = NULL;
Status = gBS->LocateProtocol (&gDynamicSiLibraryProtocolGuid, NULL, &DynamicSiLibraryProtocol);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return;
}
CopyMem (&SetupData, PcdGetPtr(PcdSetup), sizeof(SYSTEM_CONFIGURATION));
//
// First check if Anti-flash wearout feature is supported by platform and Setup variable is enabled
//
if (SetupData.AntiFlashWearoutSupported == TRUE && SetupData.EnableAntiFlashWearout) {
Status = gBS->LocateProtocol (
&gEfiMpServiceProtocolGuid,
NULL,
(VOID **) &MpServices
);
ASSERT_EFI_ERROR(Status);
//
// Set WPE on BSP, then all other APs
//
DynamicSiLibraryProtocol->SetBiosInfoFlagWpe();
MpServices->StartupAllAPs (
MpServices,
(EFI_AP_PROCEDURE) DynamicSiLibraryProtocol->SetBiosInfoFlagWpe,
FALSE,
NULL,
0,
NULL,
NULL
);
}
}
/**
Before console after trusted console event callback
@param[in] Event The Event this notify function registered to.
@param[in] Context Pointer to the context data registered to the Event.
**/
VOID
BdsBoardBeforeConsoleAfterTrustedConsoleCallback (
IN EFI_EVENT Event,
IN VOID *Context
)
{
EFI_STATUS Status;
VOID *Interface;
DEBUG ((DEBUG_INFO, "Board gBdsEventBeforeConsoleBeforeEndOfDxeGuid callback starts\n"));
//
// make sure root bridge is already connected before EndOfDxe.
// Try to locate gEfiPciEnumerationCompleteProtocolGuid to see if PciBus scan already executed.
//
Status = gBS->LocateProtocol (
&gEfiPciEnumerationCompleteProtocolGuid,
NULL,
&Interface
);
if (EFI_ERROR (Status)) {
ConnectRootBridge (FALSE);
}
}
EFI_STATUS
EFIAPI
BoardNotificationInit (
VOID
)
{
EFI_STATUS Status;
EFI_EVENT EndOfDxeEvent;
UINT32 BspCpuidSignature;
UINT32 RegEax, RegEbx, RegEcx, RegEdx;
EFI_HOB_GUID_TYPE *GuidHob;
IIO_UDS *UdsHobPtr;
EFI_BOOT_MODE BootMode;
EFI_GUID UniversalDataGuid = IIO_UNIVERSAL_DATA_GUID;
EFI_EVENT BeforeConsoleAfterTrustedConsoleEvent;
DYNAMIC_SI_LIBARY_PROTOCOL *DynamicSiLibraryProtocol = NULL;
Status = gBS->LocateProtocol (&gDynamicSiLibraryProtocolGuid, NULL, &DynamicSiLibraryProtocol);
if (EFI_ERROR (Status)) {
ASSERT_EFI_ERROR (Status);
return Status;
}
DEBUG((DEBUG_INFO, "PlatformEarlyDxeEntry \n"));
//
// Get the IIO_UDS data HOB
//
GuidHob = GetFirstGuidHob (&UniversalDataGuid);
ASSERT(GuidHob != NULL);
if (GuidHob == NULL) {
return EFI_NOT_FOUND;
}
UdsHobPtr = GET_GUID_HOB_DATA(GuidHob);
//
// Allocate Memory Pool buffer for IIO_UDS data
//
Status = gBS->AllocatePool ( EfiBootServicesData, sizeof (IIO_UDS), (VOID **) &mIioUds );
ASSERT_EFI_ERROR (Status);
//
// Initialize the Memory Pool buffer with the data from the Hand-Off-Block
//
CopyMem(mIioUds, UdsHobPtr, sizeof(IIO_UDS));
//
// Get the boot mode that we are currently in
//
BootMode = GetBootModeHob();
//
// Program DPR registers with the range from Memory Init
//
ProgramDprRegs ();
//
// Program the GenProtRange registers for BIOS Guard
//
DynamicSiLibraryProtocol->ProgramGenProtRangeRegs (mIioUds);
//
// Program the IMR registers for ME IMR region
//
DynamicSiLibraryProtocol->ProgramImrRegs (mIioUds);
//
// Program the IMR2 registers for CPM & nCPM IMR region
//
DynamicSiLibraryProtocol->ProgramImr2Regs (mIioUds);
//
// Get BSP CPU ID
// Shift out the stepping
//
AsmCpuid (0x01, &RegEax, &RegEbx, &RegEcx, &RegEdx);
BspCpuidSignature = (RegEax >> 4) & 0x0000FFFF;
if ( (BspCpuidSignature == CPU_FAMILY_SKX) && (BootMode != BOOT_ON_FLASH_UPDATE)) {
//
// Register event to set WPE bit in Bios Info Flags MSR to enable Anti Flash wearout
//
Status = gBS->CreateEventEx (
EVT_NOTIFY_SIGNAL,
TPL_CALLBACK,
EnableAntiFlashWearout,
NULL,
&gEfiEndOfDxeEventGroupGuid,
&EndOfDxeEvent
);
ASSERT_EFI_ERROR (Status);
}
//
// Create BeforeConsoleAfterTrustedConsole event callback
//
Status = gBS->CreateEventEx (
EVT_NOTIFY_SIGNAL,
TPL_CALLBACK,
BdsBoardBeforeConsoleAfterTrustedConsoleCallback,
NULL,
&gBdsEventBeforeConsoleAfterTrustedConsoleGuid,
&BeforeConsoleAfterTrustedConsoleEvent
);
ASSERT_EFI_ERROR (Status);
return Status;
}