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