]> git.proxmox.com Git - mirror_edk2.git/blob - ArmVirtPkg/Library/XenArmGenericTimerVirtCounterLib/XenArmGenericTimerVirtCounterLib.c
da01870cee69b651456bb001b4a0c8a3c5f29f1b
[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
88 VOID
89 EFIAPI
90 ArmGenericTimerSetTimerVal (
91 IN UINTN Value
92 )
93 {
94 ArmWriteCntvTval (Value);
95 }
96
97 UINT64
98 EFIAPI
99 ArmGenericTimerGetSystemCount (
100 VOID
101 )
102 {
103 return ArmReadCntvCt ();
104 }
105
106 UINTN
107 EFIAPI
108 ArmGenericTimerGetTimerCtrlReg (
109 VOID
110 )
111 {
112 return ArmReadCntvCtl ();
113 }
114
115 VOID
116 EFIAPI
117 ArmGenericTimerSetTimerCtrlReg (
118 UINTN Value
119 )
120 {
121 ArmWriteCntvCtl (Value);
122 }
123
124 UINT64
125 EFIAPI
126 ArmGenericTimerGetCompareVal (
127 VOID
128 )
129 {
130 return ArmReadCntvCval ();
131 }
132
133 VOID
134 EFIAPI
135 ArmGenericTimerSetCompareVal (
136 IN UINT64 Value
137 )
138 {
139 ArmWriteCntvCval (Value);
140 }