1cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel/** @file
2cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
3cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  Copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>
4cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  Copyright (c) 2014, Linaro Ltd. All rights reserved.<BR>
5cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
6cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  This program and the accompanying materials
7cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  are licensed and made available under the terms and conditions of the BSD License
8cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  which accompanies this distribution.  The full text of the license may be found at
9cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  http://opensource.org/licenses/bsd-license.php
10cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
11cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
14cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel**/
15cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
16cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel#include <Library/ArmGenericTimerCounterLib.h>
17cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel#include <Library/ArmArchTimer.h>
18cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
19cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelVOID
20cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI
21cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerEnableTimer (
22cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  VOID
23cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  )
24cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{
25cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  UINTN TimerCtrlReg;
26cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
27cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  ArmArchTimerReadReg (CntpCtl, (VOID *)&TimerCtrlReg);
28cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE;
29cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  ArmArchTimerWriteReg (CntpCtl, (VOID *)&TimerCtrlReg);
30cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel}
31cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
32cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelVOID
33cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI
34cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerDisableTimer (
35cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  VOID
36cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  )
37cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{
38cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  UINTN TimerCtrlReg;
39cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
40cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  ArmArchTimerReadReg (CntpCtl, (VOID *)&TimerCtrlReg);
41cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  TimerCtrlReg &= ~ARM_ARCH_TIMER_ENABLE;
42cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  ArmArchTimerWriteReg (CntpCtl, (VOID *)&TimerCtrlReg);
43cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel}
44cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
45cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelVOID
46cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI
47cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerSetTimerFreq (
48cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  IN   UINTN  FreqInHz
49cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  )
50cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{
51cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  ArmArchTimerWriteReg (CntFrq, (VOID *)&FreqInHz);
52cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel}
53cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
54cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelUINTN
55cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI
56cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerGetTimerFreq (
57cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  VOID
58cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  )
59cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{
60cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  UINTN ArchTimerFreq = 0;
61cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  ArmArchTimerReadReg (CntFrq, (VOID *)&ArchTimerFreq);
62cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  return ArchTimerFreq;
63cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel}
64cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
65cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelUINTN
66cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI
67cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerGetTimerVal (
68cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  VOID
69cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  )
70cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{
71cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  UINTN ArchTimerValue;
72cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  ArmArchTimerReadReg (CntpTval, (VOID *)&ArchTimerValue);
73cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
74cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  return ArchTimerValue;
75cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel}
76cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
77cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
78cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelVOID
79cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI
80cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerSetTimerVal (
81cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  IN   UINTN   Value
82cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  )
83cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{
84cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  ArmArchTimerWriteReg (CntpTval, (VOID *)&Value);
85cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel}
86cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
87cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelUINT64
88cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI
89cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerGetSystemCount (
90cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  VOID
91cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  )
92cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{
93cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  UINT64 SystemCount;
94cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  ArmArchTimerReadReg (CntPct, (VOID *)&SystemCount);
95cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
96cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  return SystemCount;
97cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel}
98cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
99cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelUINTN
100cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI
101cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerGetTimerCtrlReg (
102cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  VOID
103cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  )
104cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{
105cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  UINTN  Value;
106cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  ArmArchTimerReadReg (CntpCtl, (VOID *)&Value);
107cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
108cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  return Value;
109cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel}
110cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
111cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelVOID
112cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI
113cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerSetTimerCtrlReg (
114cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  UINTN Value
115cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  )
116cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{
117cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  ArmArchTimerWriteReg (CntpCtl, (VOID *)&Value);
118cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel}
119cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
120cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelUINT64
121cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI
122cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerGetCompareVal (
123cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  VOID
124cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  )
125cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{
126cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  UINT64  Value;
127cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  ArmArchTimerReadReg (CntpCval, (VOID *)&Value);
128cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
129cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  return Value;
130cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel}
131cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel
132cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelVOID
133cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelEFIAPI
134cece12d3f60fbf6e389e28e32f04c0990676c7acArd BiesheuvelArmGenericTimerSetCompareVal (
135cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  IN   UINT64   Value
136cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  )
137cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel{
138cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel  ArmArchTimerWriteReg (CntpCval, (VOID *)&Value);
139cece12d3f60fbf6e389e28e32f04c0990676c7acArd Biesheuvel}
140