]> git.proxmox.com Git - mirror_edk2.git/blob - OvmfPkg/Library/ResetSystemLib/ResetSystemLibMicrovm.c
OvmfPkg/ResetSystemLib: add driver for microvm
[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 MicrovmGedBase (VOID)
20 {
21 VOID *Address = (VOID*) MICROVM_GED_MMIO_BASE_REGS;
22
23 if (EfiGoneVirtual ()) {
24 EfiConvertPointer (0, &Address);
25 DEBUG ((DEBUG_INFO, "%a: virtual -> 0x%x\n", __FUNCTION__, Address));
26 } else {
27 DEBUG ((DEBUG_INFO, "%a: physical -> 0x%x\n", __FUNCTION__, Address));
28 }
29
30 return (UINTN) Address;
31 }
32
33 static VOID MicrovmReset (VOID)
34 {
35 UINTN Address = MicrovmGedBase();
36
37 DEBUG ((DEBUG_INFO, "%a: microvm reset via ged\n", __FUNCTION__));
38 MmioWrite8 (Address + MICROVM_ACPI_GED_REG_RESET,
39 MICROVM_ACPI_GED_RESET_VALUE);
40 CpuDeadLoop ();
41 }
42
43 static VOID MicrovmShutdown (VOID)
44 {
45 UINTN Address = MicrovmGedBase();
46
47 DEBUG ((DEBUG_INFO, "%a: microvm poweroff via ged\n", __FUNCTION__));
48 MmioWrite8 (Address + MICROVM_ACPI_GED_REG_SLEEP_CTL,
49 (1 << 5) /* enable bit */ |
50 (5 << 2) /* typ == S5 */);
51 CpuDeadLoop ();
52 }
53
54 VOID EFIAPI ResetCold (VOID)
55 {
56 MicrovmReset();
57 }
58
59 VOID EFIAPI ResetWarm (VOID)
60 {
61 MicrovmReset();
62 }
63
64 VOID
65 EFIAPI
66 ResetPlatformSpecific (
67 IN UINTN DataSize,
68 IN VOID *ResetData
69 )
70 {
71 MicrovmReset();
72 }
73
74 VOID
75 EFIAPI
76 ResetSystem (
77 IN EFI_RESET_TYPE ResetType,
78 IN EFI_STATUS ResetStatus,
79 IN UINTN DataSize,
80 IN VOID *ResetData OPTIONAL
81 )
82 {
83 MicrovmReset();
84 }
85
86 VOID EFIAPI ResetShutdown (VOID)
87 {
88 MicrovmShutdown();
89 }