]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Library/ArmLib/AArch64/AArch64Lib.c
ArmPkg/ArmLib: remove unused ArmCleanDataCacheToPoU()
[mirror_edk2.git] / ArmPkg / Library / ArmLib / AArch64 / AArch64Lib.c
CommitLineData
25402f5d
HL
1/** @file\r
2\r
3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
01674afd 4 Portions copyright (c) 2011 - 2014, ARM Ltd. All rights reserved.<BR>\r
25402f5d
HL
5\r
6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include <Uefi.h>\r
17#include <Chipset/AArch64.h>\r
18#include <Library/ArmLib.h>\r
19#include <Library/BaseLib.h>\r
20#include <Library/IoLib.h>\r
21#include "AArch64Lib.h"\r
22#include "ArmLibPrivate.h"\r
23\r
24ARM_CACHE_TYPE\r
25EFIAPI\r
26ArmCacheType (\r
27 VOID\r
28 )\r
29{\r
30 return ARM_CACHE_TYPE_WRITE_BACK;\r
31}\r
32\r
33ARM_CACHE_ARCHITECTURE\r
34EFIAPI\r
35ArmCacheArchitecture (\r
36 VOID\r
37 )\r
38{\r
39 UINT32 CLIDR = ReadCLIDR ();\r
40\r
41 return (ARM_CACHE_ARCHITECTURE)CLIDR; // BugBug Fix Me\r
42}\r
43\r
44BOOLEAN\r
45EFIAPI\r
46ArmDataCachePresent (\r
47 VOID\r
48 )\r
49{\r
50 UINT32 CLIDR = ReadCLIDR ();\r
51\r
52 if ((CLIDR & 0x2) == 0x2) {\r
53 // Instruction cache exists\r
54 return TRUE;\r
55 }\r
56 if ((CLIDR & 0x7) == 0x4) {\r
57 // Unified cache\r
58 return TRUE;\r
59 }\r
60\r
61 return FALSE;\r
62}\r
63\r
64UINTN\r
65EFIAPI\r
66ArmDataCacheSize (\r
67 VOID\r
68 )\r
69{\r
70 UINT32 NumSets;\r
71 UINT32 Associativity;\r
72 UINT32 LineSize;\r
73 UINT32 CCSIDR = ReadCCSIDR (0);\r
74\r
75 LineSize = (1 << ((CCSIDR & 0x7) + 2));\r
76 Associativity = ((CCSIDR >> 3) & 0x3ff) + 1;\r
77 NumSets = ((CCSIDR >> 13) & 0x7fff) + 1;\r
78\r
79 // LineSize is in words (4 byte chunks)\r
80 return NumSets * Associativity * LineSize * 4;\r
81}\r
82\r
83UINTN\r
84EFIAPI\r
85ArmDataCacheAssociativity (\r
86 VOID\r
87 )\r
88{\r
89 UINT32 CCSIDR = ReadCCSIDR (0);\r
90\r
91 return ((CCSIDR >> 3) & 0x3ff) + 1;\r
92}\r
93\r
94UINTN\r
95ArmDataCacheSets (\r
96 VOID\r
97 )\r
98{\r
99 UINT32 CCSIDR = ReadCCSIDR (0);\r
100\r
101 return ((CCSIDR >> 13) & 0x7fff) + 1;\r
102}\r
103\r
104UINTN\r
105EFIAPI\r
106ArmDataCacheLineLength (\r
107 VOID\r
108 )\r
109{\r
110 UINT32 CCSIDR = ReadCCSIDR (0) & 7;\r
111\r
112 // * 4 converts to bytes\r
113 return (1 << (CCSIDR + 2)) * 4;\r
114}\r
115\r
116BOOLEAN\r
117EFIAPI\r
118ArmInstructionCachePresent (\r
119 VOID\r
120 )\r
121{\r
122 UINT32 CLIDR = ReadCLIDR ();\r
123\r
124 if ((CLIDR & 1) == 1) {\r
125 // Instruction cache exists\r
126 return TRUE;\r
127 }\r
128 if ((CLIDR & 0x7) == 0x4) {\r
129 // Unified cache\r
130 return TRUE;\r
131 }\r
132\r
133 return FALSE;\r
134}\r
135\r
136UINTN\r
137EFIAPI\r
138ArmInstructionCacheSize (\r
139 VOID\r
140 )\r
141{\r
142 UINT32 NumSets;\r
143 UINT32 Associativity;\r
144 UINT32 LineSize;\r
145 UINT32 CCSIDR = ReadCCSIDR (1);\r
146\r
147 LineSize = (1 << ((CCSIDR & 0x7) + 2));\r
148 Associativity = ((CCSIDR >> 3) & 0x3ff) + 1;\r
149 NumSets = ((CCSIDR >> 13) & 0x7fff) + 1;\r
150\r
151 // LineSize is in words (4 byte chunks)\r
152 return NumSets * Associativity * LineSize * 4;\r
153}\r
154\r
155UINTN\r
156EFIAPI\r
157ArmInstructionCacheAssociativity (\r
158 VOID\r
159 )\r
160{\r
161 UINT32 CCSIDR = ReadCCSIDR (1);\r
162\r
163 return ((CCSIDR >> 3) & 0x3ff) + 1;\r
164}\r
165\r
166UINTN\r
167EFIAPI\r
168ArmInstructionCacheSets (\r
169 VOID\r
170 )\r
171{\r
172 UINT32 CCSIDR = ReadCCSIDR (1);\r
173\r
174 return ((CCSIDR >> 13) & 0x7fff) + 1;\r
175}\r
176\r
177UINTN\r
178EFIAPI\r
179ArmInstructionCacheLineLength (\r
180 VOID\r
181 )\r
182{\r
183 UINT32 CCSIDR = ReadCCSIDR (1) & 7;\r
184\r
185 // * 4 converts to bytes\r
186 return (1 << (CCSIDR + 2)) * 4;\r
187}\r
188\r
189\r
190VOID\r
191AArch64DataCacheOperation (\r
192 IN AARCH64_CACHE_OPERATION DataCacheOperation\r
193 )\r
194{\r
195 UINTN SavedInterruptState;\r
196\r
197 SavedInterruptState = ArmGetInterruptState ();\r
198 ArmDisableInterrupts();\r
199\r
200 AArch64AllDataCachesOperation (DataCacheOperation);\r
201\r
202 ArmDrainWriteBuffer ();\r
203\r
204 if (SavedInterruptState) {\r
205 ArmEnableInterrupts ();\r
206 }\r
207}\r
208\r
25402f5d
HL
209VOID\r
210EFIAPI\r
211ArmInvalidateDataCache (\r
212 VOID\r
213 )\r
214{\r
01674afd 215 ArmDrainWriteBuffer ();\r
25402f5d
HL
216 AArch64DataCacheOperation (ArmInvalidateDataCacheEntryBySetWay);\r
217}\r
218\r
219VOID\r
220EFIAPI\r
221ArmCleanInvalidateDataCache (\r
222 VOID\r
223 )\r
224{\r
01674afd 225 ArmDrainWriteBuffer ();\r
25402f5d
HL
226 AArch64DataCacheOperation (ArmCleanInvalidateDataCacheEntryBySetWay);\r
227}\r
228\r
229VOID\r
230EFIAPI\r
231ArmCleanDataCache (\r
232 VOID\r
233 )\r
234{\r
01674afd 235 ArmDrainWriteBuffer ();\r
25402f5d
HL
236 AArch64DataCacheOperation (ArmCleanDataCacheEntryBySetWay);\r
237}\r