blob: 81b554519062bd729d432409f71efda40d58708b [file]
/** @file
IPMI Fault Resilient Booting (FRB) PEIM.
Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <PiPei.h>
#include <Library/DebugLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/IoLib.h>
#include <Library/PcdLib.h>
#include <Library/IpmiCommandLib.h>
#include <IndustryStandard/Ipmi.h>
/**
This function sets watchdog timer for Fault Resilient Booting
according to Frb2Enabled.
@param [in] Frb2Enabled Whether to enable FRB2 timeout
**/
VOID
SetWatchDogTimer (
IN BOOLEAN Frb2Enabled
)
{
EFI_STATUS Status;
IPMI_SET_WATCHDOG_TIMER_REQUEST FrbTimer;
IPMI_GET_WATCHDOG_TIMER_RESPONSE GetWatchdogTimer;
UINT8 CompletionCode;
Status = IpmiGetWatchdogTimer (&GetWatchdogTimer);
if (EFI_ERROR (Status)) {
return;
}
if (Frb2Enabled) {
ZeroMem (&FrbTimer, sizeof (FrbTimer));
// Byte 1
FrbTimer.TimerUse.Bits.TimerUse = IPMI_WATCHDOG_TIMER_BIOS_FRB2;
// Byte 2
FrbTimer.TimerActions.Uint8 = 0; // NormalBoot, NoTimeOutInterrupt. i.e no action when BMC watchdog timeout
// Byte 3
FrbTimer.PretimeoutInterval = 0;
// Byte 4
FrbTimer.TimerUseExpirationFlagsClear |= BIT1; // set Frb2ExpirationFlag
// Data Byte 5/6
FrbTimer.InitialCountdownValue = PcdGet16 (PcdFRBTimeoutValue) * 10;
// Set BMC watchdog timer
Status = IpmiSetWatchdogTimer (&FrbTimer, &CompletionCode);
Status = IpmiResetWatchdogTimer (&CompletionCode);
}
}
/**
The entry point of the Ipmi Fault Resilient Booting PEIM.
@param [in] FileHandle Handle of the file being invoked.
@param [in] PeiServices Describes the list of possible PEI Services.
@retval EFI_SUCCESS Indicates that Ipmi initialization completed successfully.
@retval Others Indicates that Ipmi initialization could not complete successfully.
**/
EFI_STATUS
EFIAPI
InitializeFrbPei (
IN EFI_PEI_FILE_HANDLE FileHandle,
IN CONST EFI_PEI_SERVICES **PeiServices
)
{
BOOLEAN Frb2Enabled;
//
// If we are booting with defaults, then make sure FRB2 is enabled.
//
Frb2Enabled = PcdGetBool (PcdFRB2EnabledFlag);
SetWatchDogTimer (Frb2Enabled);
return EFI_SUCCESS;
}