/** @file
IPMI Os watchdog timer Driver.
Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
BOOLEAN mOsWdtFlag = FALSE;
EFI_EVENT mExitBootServicesEvent;
VOID
EFIAPI
EnableEfiOsBootWdtHandler (
IN EFI_EVENT Event,
IN VOID *Context
)
/*++
Routine Description:
Enable the OS Boot Watchdog Timer.
Is called only on legacy or EFI OS boot.
Arguments:
Event - Event type
*Context - Context for the event
Returns:
None
--*/
{
EFI_STATUS Status;
IPMI_SET_WATCHDOG_TIMER_REQUEST SetWatchdogTimer;
UINT8 CompletionCode;
IPMI_GET_WATCHDOG_TIMER_RESPONSE GetWatchdogTimer;
static BOOLEAN OsWdtEventHandled = FALSE;
DEBUG((DEBUG_ERROR, "!!! EnableEfiOsBootWdtHandler()!!!\n"));
//
// Make sure it processes once only. And proceess it only if OsWdtFlag==TRUE;
//
if (OsWdtEventHandled || !mOsWdtFlag) {
return ;
}
OsWdtEventHandled = TRUE;
Status = IpmiGetWatchdogTimer (&GetWatchdogTimer);
if (EFI_ERROR (Status)) {
return ;
}
ZeroMem (&SetWatchdogTimer, sizeof(SetWatchdogTimer));
//
// Just flip the Timer Use bit. This should release the timer.
//
SetWatchdogTimer.TimerUse.Bits.TimerRunning = 1;
SetWatchdogTimer.TimerUse.Bits.TimerUse = IPMI_WATCHDOG_TIMER_OS_LOADER;
SetWatchdogTimer.TimerActions.Uint8 = IPMI_WATCHDOG_TIMER_ACTION_HARD_RESET;
SetWatchdogTimer.TimerUseExpirationFlagsClear &= ~BIT4;
SetWatchdogTimer.TimerUseExpirationFlagsClear |= BIT1 | BIT2;
SetWatchdogTimer.InitialCountdownValue = 600; // 100ms / count
Status = IpmiSetWatchdogTimer (&SetWatchdogTimer, &CompletionCode);
return ;
}
EFI_STATUS
EFIAPI
DriverInit (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
/*++
Routine Description:
This is the standard EFI driver point. This function intitializes
the private data required for creating ASRR Driver.
Arguments:
As required for DXE driver enrty routine.
ImageHandle - ImageHandle of the loaded driver
SystemTable - Pointer to the System Table
Returns:
@retval EFI_SUCCESS Protocol successfully started and installed.
@retval EFI_OUT_OF_RESOURCES The event could not be allocated.
--*/
{
EFI_STATUS Status;
Status = gBS->CreateEvent (
EVT_SIGNAL_EXIT_BOOT_SERVICES,
TPL_NOTIFY,
EnableEfiOsBootWdtHandler,
NULL,
&mExitBootServicesEvent
);
return Status;
}