]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Library/ResetSystemLib/DxeResetShutdown.c
OvmfPkg/PlatformInitLib: Add PlatformScanE820 and GetFirstNonAddressCB
[mirror_edk2.git] / OvmfPkg / Library / ResetSystemLib / DxeResetShutdown.c
CommitLineData
93f6df5f
LE
1/** @file\r
2 DXE Reset System Library Shutdown API implementation for OVMF.\r
3\r
4 Copyright (C) 2020, Red Hat, Inc.\r
5 Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
7**/\r
8\r
9#include <Base.h> // BIT13\r
10\r
11#include <Library/BaseLib.h> // CpuDeadLoop()\r
12#include <Library/DebugLib.h> // ASSERT()\r
13#include <Library/IoLib.h> // IoOr16()\r
14#include <Library/PcdLib.h> // PcdGet16()\r
15#include <Library/ResetSystemLib.h> // ResetShutdown()\r
16#include <OvmfPlatforms.h> // PIIX4_PMBA_VALUE\r
17\r
ac0a286f 18STATIC UINT16 mAcpiPmBaseAddress;\r
9afcd48a 19STATIC UINT16 mAcpiHwReducedSleepCtl;\r
93f6df5f
LE
20\r
21EFI_STATUS\r
22EFIAPI\r
23DxeResetInit (\r
ac0a286f
MK
24 IN EFI_HANDLE ImageHandle,\r
25 IN EFI_SYSTEM_TABLE *SystemTable\r
93f6df5f
LE
26 )\r
27{\r
ac0a286f 28 UINT16 HostBridgeDevId;\r
93f6df5f
LE
29\r
30 HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId);\r
31 switch (HostBridgeDevId) {\r
ac0a286f
MK
32 case INTEL_82441_DEVICE_ID:\r
33 mAcpiPmBaseAddress = PIIX4_PMBA_VALUE;\r
34 break;\r
35 case INTEL_Q35_MCH_DEVICE_ID:\r
36 mAcpiPmBaseAddress = ICH9_PMBASE_VALUE;\r
37 break;\r
9afcd48a
SB
38 case CLOUDHV_DEVICE_ID:\r
39 mAcpiHwReducedSleepCtl = CLOUDHV_ACPI_SHUTDOWN_IO_ADDRESS;\r
40 break;\r
ac0a286f
MK
41 default:\r
42 ASSERT (FALSE);\r
43 CpuDeadLoop ();\r
44 return EFI_UNSUPPORTED;\r
93f6df5f
LE
45 }\r
46\r
47 return EFI_SUCCESS;\r
48}\r
49\r
50/**\r
51 Calling this function causes the system to enter a power state equivalent\r
52 to the ACPI G2/S5 or G3 states.\r
53\r
54 System shutdown should not return, if it returns, it means the system does\r
55 not support shut down reset.\r
56**/\r
57VOID\r
58EFIAPI\r
59ResetShutdown (\r
60 VOID\r
61 )\r
62{\r
9afcd48a
SB
63 if (mAcpiHwReducedSleepCtl) {\r
64 IoWrite8 (mAcpiHwReducedSleepCtl, 5 << 2 | 1 << 5);\r
65 } else {\r
66 IoBitFieldWrite16 (mAcpiPmBaseAddress + 4, 10, 13, 0);\r
67 IoOr16 (mAcpiPmBaseAddress + 4, BIT13);\r
68 }\r
69\r
93f6df5f
LE
70 CpuDeadLoop ();\r
71}\r