]>
Commit | Line | Data |
---|---|---|
1d3e89f3 GH |
1 | /** @file\r |
2 | Reset System Library functions for OVMF\r | |
3 | \r | |
4 | Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r | |
5 | SPDX-License-Identifier: BSD-2-Clause-Patent\r | |
6 | \r | |
7 | **/\r | |
8 | \r | |
9 | #include <Base.h> // BIT1\r | |
10 | \r | |
11 | #include <Library/BaseLib.h> // CpuDeadLoop()\r | |
12 | #include <Library/DebugLib.h> // ASSERT()\r | |
13 | #include <Library/IoLib.h> // IoWrite8()\r | |
14 | #include <Library/ResetSystemLib.h> // ResetCold()\r | |
15 | #include <Library/TimerLib.h> // MicroSecondDelay()\r | |
16 | #include <Library/UefiRuntimeLib.h> // EfiGoneVirtual()\r | |
17 | #include <OvmfPlatforms.h> // PIIX4_PMBA_VALUE\r | |
18 | \r | |
ac0a286f MK |
19 | static UINTN\r |
20 | MicrovmGedBase (\r | |
21 | VOID\r | |
22 | )\r | |
1d3e89f3 | 23 | {\r |
ac0a286f | 24 | VOID *Address = (VOID *)(UINTN)MICROVM_GED_MMIO_BASE_REGS;\r |
1d3e89f3 GH |
25 | \r |
26 | if (EfiGoneVirtual ()) {\r | |
27 | EfiConvertPointer (0, &Address);\r | |
28 | DEBUG ((DEBUG_INFO, "%a: virtual -> 0x%x\n", __FUNCTION__, Address));\r | |
29 | } else {\r | |
30 | DEBUG ((DEBUG_INFO, "%a: physical -> 0x%x\n", __FUNCTION__, Address));\r | |
31 | }\r | |
32 | \r | |
ac0a286f | 33 | return (UINTN)Address;\r |
1d3e89f3 GH |
34 | }\r |
35 | \r | |
ac0a286f MK |
36 | static VOID\r |
37 | MicrovmReset (\r | |
38 | VOID\r | |
39 | )\r | |
1d3e89f3 | 40 | {\r |
ac0a286f | 41 | UINTN Address = MicrovmGedBase ();\r |
1d3e89f3 GH |
42 | \r |
43 | DEBUG ((DEBUG_INFO, "%a: microvm reset via ged\n", __FUNCTION__));\r | |
ac0a286f MK |
44 | MmioWrite8 (\r |
45 | Address + MICROVM_ACPI_GED_REG_RESET,\r | |
46 | MICROVM_ACPI_GED_RESET_VALUE\r | |
47 | );\r | |
1d3e89f3 GH |
48 | CpuDeadLoop ();\r |
49 | }\r | |
50 | \r | |
ac0a286f MK |
51 | static VOID\r |
52 | MicrovmShutdown (\r | |
53 | VOID\r | |
54 | )\r | |
1d3e89f3 | 55 | {\r |
ac0a286f | 56 | UINTN Address = MicrovmGedBase ();\r |
1d3e89f3 GH |
57 | \r |
58 | DEBUG ((DEBUG_INFO, "%a: microvm poweroff via ged\n", __FUNCTION__));\r | |
ac0a286f MK |
59 | MmioWrite8 (\r |
60 | Address + MICROVM_ACPI_GED_REG_SLEEP_CTL,\r | |
61 | (1 << 5) /* enable bit */ |\r | |
62 | (5 << 2) /* typ == S5 */\r | |
63 | );\r | |
1d3e89f3 GH |
64 | CpuDeadLoop ();\r |
65 | }\r | |
66 | \r | |
ac0a286f MK |
67 | VOID EFIAPI\r |
68 | ResetCold (\r | |
69 | VOID\r | |
70 | )\r | |
1d3e89f3 | 71 | {\r |
ac0a286f | 72 | MicrovmReset ();\r |
1d3e89f3 GH |
73 | }\r |
74 | \r | |
ac0a286f MK |
75 | VOID EFIAPI\r |
76 | ResetWarm (\r | |
77 | VOID\r | |
78 | )\r | |
1d3e89f3 | 79 | {\r |
ac0a286f | 80 | MicrovmReset ();\r |
1d3e89f3 GH |
81 | }\r |
82 | \r | |
83 | VOID\r | |
84 | EFIAPI\r | |
85 | ResetPlatformSpecific (\r | |
ac0a286f MK |
86 | IN UINTN DataSize,\r |
87 | IN VOID *ResetData\r | |
1d3e89f3 GH |
88 | )\r |
89 | {\r | |
ac0a286f | 90 | MicrovmReset ();\r |
1d3e89f3 GH |
91 | }\r |
92 | \r | |
93 | VOID\r | |
94 | EFIAPI\r | |
95 | ResetSystem (\r | |
ac0a286f MK |
96 | IN EFI_RESET_TYPE ResetType,\r |
97 | IN EFI_STATUS ResetStatus,\r | |
98 | IN UINTN DataSize,\r | |
99 | IN VOID *ResetData OPTIONAL\r | |
1d3e89f3 GH |
100 | )\r |
101 | {\r | |
ac0a286f | 102 | MicrovmReset ();\r |
1d3e89f3 GH |
103 | }\r |
104 | \r | |
ac0a286f MK |
105 | VOID EFIAPI\r |
106 | ResetShutdown (\r | |
107 | VOID\r | |
108 | )\r | |
1d3e89f3 | 109 | {\r |
ac0a286f | 110 | MicrovmShutdown ();\r |
1d3e89f3 | 111 | }\r |