mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-01 12:53:27 +01:00
112 lines
2.1 KiB
C
112 lines
2.1 KiB
C
|
/** @file
|
||
|
Reset System Library functions for OVMF
|
||
|
|
||
|
Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
**/
|
||
|
|
||
|
#include <Base.h> // BIT1
|
||
|
|
||
|
#include <Library/BaseLib.h> // CpuDeadLoop()
|
||
|
#include <Library/DebugLib.h> // ASSERT()
|
||
|
#include <Library/IoLib.h> // IoWrite8()
|
||
|
#include <Library/ResetSystemLib.h> // ResetCold()
|
||
|
#include <Library/TimerLib.h> // MicroSecondDelay()
|
||
|
#include <Library/UefiRuntimeLib.h> // EfiGoneVirtual()
|
||
|
#include <OvmfPlatforms.h> // PIIX4_PMBA_VALUE
|
||
|
|
||
|
static UINTN
|
||
|
MicrovmGedBase (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
VOID *Address = (VOID *)(UINTN)MICROVM_GED_MMIO_BASE_REGS;
|
||
|
|
||
|
if (EfiGoneVirtual ()) {
|
||
|
EfiConvertPointer (0, &Address);
|
||
|
DEBUG ((DEBUG_INFO, "%a: virtual -> 0x%x\n", __func__, Address));
|
||
|
} else {
|
||
|
DEBUG ((DEBUG_INFO, "%a: physical -> 0x%x\n", __func__, Address));
|
||
|
}
|
||
|
|
||
|
return (UINTN)Address;
|
||
|
}
|
||
|
|
||
|
static VOID
|
||
|
MicrovmReset (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
UINTN Address = MicrovmGedBase ();
|
||
|
|
||
|
DEBUG ((DEBUG_INFO, "%a: microvm reset via ged\n", __func__));
|
||
|
MmioWrite8 (
|
||
|
Address + MICROVM_ACPI_GED_REG_RESET,
|
||
|
MICROVM_ACPI_GED_RESET_VALUE
|
||
|
);
|
||
|
CpuDeadLoop ();
|
||
|
}
|
||
|
|
||
|
static VOID
|
||
|
MicrovmShutdown (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
UINTN Address = MicrovmGedBase ();
|
||
|
|
||
|
DEBUG ((DEBUG_INFO, "%a: microvm poweroff via ged\n", __func__));
|
||
|
MmioWrite8 (
|
||
|
Address + MICROVM_ACPI_GED_REG_SLEEP_CTL,
|
||
|
(1 << 5) /* enable bit */ |
|
||
|
(5 << 2) /* typ == S5 */
|
||
|
);
|
||
|
CpuDeadLoop ();
|
||
|
}
|
||
|
|
||
|
VOID EFIAPI
|
||
|
ResetCold (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
MicrovmReset ();
|
||
|
}
|
||
|
|
||
|
VOID EFIAPI
|
||
|
ResetWarm (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
MicrovmReset ();
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
EFIAPI
|
||
|
ResetPlatformSpecific (
|
||
|
IN UINTN DataSize,
|
||
|
IN VOID *ResetData
|
||
|
)
|
||
|
{
|
||
|
MicrovmReset ();
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
EFIAPI
|
||
|
ResetSystem (
|
||
|
IN EFI_RESET_TYPE ResetType,
|
||
|
IN EFI_STATUS ResetStatus,
|
||
|
IN UINTN DataSize,
|
||
|
IN VOID *ResetData OPTIONAL
|
||
|
)
|
||
|
{
|
||
|
MicrovmReset ();
|
||
|
}
|
||
|
|
||
|
VOID EFIAPI
|
||
|
ResetShutdown (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
MicrovmShutdown ();
|
||
|
}
|