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