]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Library/ArmLib/AArch64/AArch64ArchTimer.c
ArmPkg: Move TimerDxe and ArmArchTimerLib to new ArmGenericTimerCounterLib
[mirror_edk2.git] / ArmPkg / Library / ArmLib / AArch64 / AArch64ArchTimer.c
CommitLineData
25402f5d
HL
1/** @file\r
2*\r
3* Copyright (c) 2011-2013, ARM Limited. All rights reserved.\r
4*\r
5* This program and the accompanying materials\r
6* are licensed and made available under the terms and conditions of the BSD License\r
7* which accompanies this distribution. The full text of the license may be found at\r
8* http://opensource.org/licenses/bsd-license.php\r
9*\r
10* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12*\r
13**/\r
14\r
15#include <Uefi.h>\r
16#include <Chipset/AArch64.h>\r
17#include <Library/BaseMemoryLib.h>\r
18#include <Library/MemoryAllocationLib.h>\r
19#include <Library/ArmLib.h>\r
20#include <Library/BaseLib.h>\r
21#include <Library/DebugLib.h>\r
22#include "AArch64Lib.h"\r
23#include "ArmLibPrivate.h"\r
d4bb43ce 24#include <Library/ArmArchTimer.h>\r
25402f5d
HL
25\r
26VOID\r
27EFIAPI\r
28ArmArchTimerReadReg (\r
29 IN ARM_ARCH_TIMER_REGS Reg,\r
30 OUT VOID *DstBuf\r
31 )\r
32{\r
33 // Check if the Generic/Architecture timer is implemented\r
34 if (ArmIsArchTimerImplemented ()) {\r
35\r
36 switch (Reg) {\r
37\r
38 case CntFrq:\r
39 *((UINTN *)DstBuf) = ArmReadCntFrq ();\r
40 break;\r
41\r
42 case CntPct:\r
43 *((UINT64 *)DstBuf) = ArmReadCntPct ();\r
44 break;\r
45\r
46 case CntkCtl:\r
47 *((UINTN *)DstBuf) = ArmReadCntkCtl();\r
48 break;\r
49\r
50 case CntpTval:\r
51 *((UINTN *)DstBuf) = ArmReadCntpTval ();\r
52 break;\r
53\r
54 case CntpCtl:\r
55 *((UINTN *)DstBuf) = ArmReadCntpCtl ();\r
56 break;\r
57\r
58 case CntvTval:\r
59 *((UINTN *)DstBuf) = ArmReadCntvTval ();\r
60 break;\r
61\r
62 case CntvCtl:\r
63 *((UINTN *)DstBuf) = ArmReadCntvCtl ();\r
64 break;\r
65\r
66 case CntvCt:\r
67 *((UINT64 *)DstBuf) = ArmReadCntvCt ();\r
68 break;\r
69\r
70 case CntpCval:\r
71 *((UINT64 *)DstBuf) = ArmReadCntpCval ();\r
72 break;\r
73\r
74 case CntvCval:\r
75 *((UINT64 *)DstBuf) = ArmReadCntvCval ();\r
76 break;\r
77\r
78 case CntvOff:\r
79 *((UINT64 *)DstBuf) = ArmReadCntvOff ();\r
80 break;\r
81\r
82 case CnthCtl:\r
83 case CnthpTval:\r
84 case CnthpCtl:\r
85 case CnthpCval:\r
86 DEBUG ((EFI_D_ERROR, "The register is related to Hypervisor Mode. Can't perform requested operation\n "));\r
87 break;\r
88\r
89 default:\r
90 DEBUG ((EFI_D_ERROR, "Unknown ARM Generic Timer register %x. \n ", Reg));\r
91 }\r
92 } else {\r
93 DEBUG ((EFI_D_ERROR, "Attempt to read ARM Generic Timer registers. But ARM Generic Timer extension is not implemented \n "));\r
94 ASSERT (0);\r
95 }\r
96}\r
97\r
98VOID\r
99EFIAPI\r
100ArmArchTimerWriteReg (\r
101 IN ARM_ARCH_TIMER_REGS Reg,\r
102 IN VOID *SrcBuf\r
103 )\r
104{\r
105 // Check if the Generic/Architecture timer is implemented\r
106 if (ArmIsArchTimerImplemented ()) {\r
107\r
108 switch (Reg) {\r
109\r
110 case CntFrq:\r
111 ArmWriteCntFrq (*((UINTN *)SrcBuf));\r
112 break;\r
113\r
114 case CntPct:\r
115 DEBUG ((EFI_D_ERROR, "Can't write to Read Only Register: CNTPCT \n"));\r
116 break;\r
117\r
118 case CntkCtl:\r
119 ArmWriteCntkCtl (*((UINTN *)SrcBuf));\r
120 break;\r
121\r
122 case CntpTval:\r
123 ArmWriteCntpTval (*((UINTN *)SrcBuf));\r
124 break;\r
125\r
126 case CntpCtl:\r
127 ArmWriteCntpCtl (*((UINTN *)SrcBuf));\r
128 break;\r
129\r
130 case CntvTval:\r
131 ArmWriteCntvTval (*((UINTN *)SrcBuf));\r
132 break;\r
133\r
134 case CntvCtl:\r
135 ArmWriteCntvCtl (*((UINTN *)SrcBuf));\r
136 break;\r
137\r
138 case CntvCt:\r
139 DEBUG ((EFI_D_ERROR, "Can't write to Read Only Register: CNTVCT \n"));\r
140 break;\r
141\r
142 case CntpCval:\r
143 ArmWriteCntpCval (*((UINT64 *)SrcBuf) );\r
144 break;\r
145\r
146 case CntvCval:\r
147 ArmWriteCntvCval (*((UINT64 *)SrcBuf) );\r
148 break;\r
149\r
150 case CntvOff:\r
151 ArmWriteCntvOff (*((UINT64 *)SrcBuf));\r
152 break;\r
153\r
154 case CnthCtl:\r
155 case CnthpTval:\r
156 case CnthpCtl:\r
157 case CnthpCval:\r
158 DEBUG ((EFI_D_ERROR, "The register is related to Hypervisor Mode. Can't perform requested operation\n "));\r
159 break;\r
160\r
161 default:\r
162 DEBUG ((EFI_D_ERROR, "Unknown ARM Generic Timer register %x. \n ", Reg));\r
163 }\r
164 } else {\r
165 DEBUG ((EFI_D_ERROR, "Attempt to write to ARM Generic Timer registers. But ARM Generic Timer extension is not implemented \n "));\r
166 ASSERT (0);\r
167 }\r
168}\r