]> git.proxmox.com Git - mirror_edk2.git/blob - ArmVirtPkg/Library/XenArmGenericTimerVirtCounterLib/XenArmGenericTimerVirtCounterLib.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ArmVirtPkg / Library / XenArmGenericTimerVirtCounterLib / XenArmGenericTimerVirtCounterLib.c
1 /** @file
2
3 Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>
4 Copyright (c) 2014 - 2018, Linaro Ltd. All rights reserved.<BR>
5
6 SPDX-License-Identifier: BSD-2-Clause-Patent
7
8 **/
9
10 #include <Library/ArmGenericTimerCounterLib.h>
11 #include <Library/ArmLib.h>
12
13 VOID
14 EFIAPI
15 ArmGenericTimerEnableTimer (
16 VOID
17 )
18 {
19 UINTN TimerCtrlReg;
20
21 TimerCtrlReg = ArmReadCntvCtl ();
22 TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE;
23 ArmWriteCntvCtl (TimerCtrlReg);
24 }
25
26 VOID
27 EFIAPI
28 ArmGenericTimerReenableTimer (
29 VOID
30 )
31 {
32 UINTN TimerCtrlReg;
33
34 TimerCtrlReg = ArmReadCntvCtl ();
35 TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE;
36
37 //
38 // When running under Xen, we need to unmask the interrupt on the timer side
39 // as Xen will mask it when servicing the interrupt at the hypervisor level
40 // and delivering the virtual timer interrupt to the guest. Otherwise, the
41 // interrupt will fire again, trapping into the hypervisor again, etc. etc.
42 //
43 TimerCtrlReg &= ~ARM_ARCH_TIMER_IMASK;
44 ArmWriteCntvCtl (TimerCtrlReg);
45 }
46
47 VOID
48 EFIAPI
49 ArmGenericTimerDisableTimer (
50 VOID
51 )
52 {
53 UINTN TimerCtrlReg;
54
55 TimerCtrlReg = ArmReadCntvCtl ();
56 TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE;
57 ArmWriteCntvCtl (TimerCtrlReg);
58 }
59
60 VOID
61 EFIAPI
62 ArmGenericTimerSetTimerFreq (
63 IN UINTN FreqInHz
64 )
65 {
66 ArmWriteCntFrq (FreqInHz);
67 }
68
69 UINTN
70 EFIAPI
71 ArmGenericTimerGetTimerFreq (
72 VOID
73 )
74 {
75 return ArmReadCntFrq ();
76 }
77
78 UINTN
79 EFIAPI
80 ArmGenericTimerGetTimerVal (
81 VOID
82 )
83 {
84 return ArmReadCntvTval ();
85 }
86
87 VOID
88 EFIAPI
89 ArmGenericTimerSetTimerVal (
90 IN UINTN Value
91 )
92 {
93 ArmWriteCntvTval (Value);
94 }
95
96 UINT64
97 EFIAPI
98 ArmGenericTimerGetSystemCount (
99 VOID
100 )
101 {
102 return ArmReadCntvCt ();
103 }
104
105 UINTN
106 EFIAPI
107 ArmGenericTimerGetTimerCtrlReg (
108 VOID
109 )
110 {
111 return ArmReadCntvCtl ();
112 }
113
114 VOID
115 EFIAPI
116 ArmGenericTimerSetTimerCtrlReg (
117 UINTN Value
118 )
119 {
120 ArmWriteCntvCtl (Value);
121 }
122
123 UINT64
124 EFIAPI
125 ArmGenericTimerGetCompareVal (
126 VOID
127 )
128 {
129 return ArmReadCntvCval ();
130 }
131
132 VOID
133 EFIAPI
134 ArmGenericTimerSetCompareVal (
135 IN UINT64 Value
136 )
137 {
138 ArmWriteCntvCval (Value);
139 }