/** @file DXE Reset System Library Shutdown API implementation for OVMF. Copyright (C) 2020, Red Hat, Inc. Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include <Base.h> // BIT13 #include <Library/BaseLib.h> // CpuDeadLoop() #include <Library/DebugLib.h> // ASSERT() #include <Library/IoLib.h> // IoOr16() #include <Library/PcdLib.h> // PcdGet16() #include <Library/ResetSystemLib.h> // ResetShutdown() #include <OvmfPlatforms.h> // PIIX4_PMBA_VALUE STATIC UINT16 mAcpiPmBaseAddress; STATIC UINT16 mAcpiHwReducedSleepCtl; EFI_STATUS EFIAPI DxeResetInit ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { UINT16 HostBridgeDevId; HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId); switch (HostBridgeDevId) { case INTEL_82441_DEVICE_ID: mAcpiPmBaseAddress = PIIX4_PMBA_VALUE; break; case INTEL_Q35_MCH_DEVICE_ID: mAcpiPmBaseAddress = ICH9_PMBASE_VALUE; break; case CLOUDHV_DEVICE_ID: mAcpiHwReducedSleepCtl = CLOUDHV_ACPI_SHUTDOWN_IO_ADDRESS; break; default: ASSERT (FALSE); CpuDeadLoop (); return EFI_UNSUPPORTED; } return EFI_SUCCESS; } /** Calling this function causes the system to enter a power state equivalent to the ACPI G2/S5 or G3 states. System shutdown should not return, if it returns, it means the system does not support shut down reset. **/ VOID EFIAPI ResetShutdown ( VOID ) { if (mAcpiHwReducedSleepCtl) { IoWrite8 (mAcpiHwReducedSleepCtl, 5 << 2 | 1 << 5); } else { IoBitFieldWrite16 (mAcpiPmBaseAddress + 4, 10, 13, 0); IoOr16 (mAcpiPmBaseAddress + 4, BIT13); } CpuDeadLoop (); }