]> git.proxmox.com Git - mirror_edk2.git/blame - ArmPkg/Library/ArmLib/ArmV7/ArmV7Lib.c
ArmPlatformPkg/Ds5: Added script to profile EDK2 with ARM DSTREAM
[mirror_edk2.git] / ArmPkg / Library / ArmLib / ArmV7 / ArmV7Lib.c
CommitLineData
1e57a462 1/** @file\r
2\r
3 Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\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#include <Uefi.h>\r
15#include <Chipset/ArmV7.h>\r
16#include <Library/ArmLib.h>\r
17#include <Library/BaseLib.h>\r
18#include <Library/IoLib.h>\r
19#include "ArmV7Lib.h"\r
20#include "ArmLibPrivate.h"\r
21\r
22ARM_CACHE_TYPE\r
23EFIAPI\r
24ArmCacheType (\r
25 VOID\r
26 )\r
27{\r
28 return ARM_CACHE_TYPE_WRITE_BACK;\r
29}\r
30\r
31ARM_CACHE_ARCHITECTURE\r
32EFIAPI\r
33ArmCacheArchitecture (\r
34 VOID\r
35 )\r
36{\r
37 UINT32 CLIDR = ReadCLIDR ();\r
38\r
39 return (ARM_CACHE_ARCHITECTURE)CLIDR; // BugBug Fix Me\r
40}\r
41\r
42BOOLEAN\r
43EFIAPI\r
44ArmDataCachePresent (\r
45 VOID\r
46 )\r
47{\r
48 UINT32 CLIDR = ReadCLIDR ();\r
49 \r
50 if ((CLIDR & 0x2) == 0x2) {\r
51 // Instruction cache exists\r
52 return TRUE;\r
53 }\r
54 if ((CLIDR & 0x7) == 0x4) {\r
55 // Unified cache\r
56 return TRUE;\r
57 }\r
58 \r
59 return FALSE;\r
60}\r
61 \r
62UINTN\r
63EFIAPI\r
64ArmDataCacheSize (\r
65 VOID\r
66 )\r
67{\r
68 UINT32 NumSets;\r
69 UINT32 Associativity;\r
70 UINT32 LineSize;\r
71 UINT32 CCSIDR = ReadCCSIDR (0);\r
72 \r
73 LineSize = (1 << ((CCSIDR & 0x7) + 2));\r
74 Associativity = ((CCSIDR >> 3) & 0x3ff) + 1;\r
75 NumSets = ((CCSIDR >> 13) & 0x7fff) + 1;\r
76\r
77 // LineSize is in words (4 byte chunks)\r
78 return NumSets * Associativity * LineSize * 4; \r
79}\r
80 \r
81UINTN\r
82EFIAPI\r
83ArmDataCacheAssociativity (\r
84 VOID\r
85 )\r
86{\r
87 UINT32 CCSIDR = ReadCCSIDR (0);\r
88\r
89 return ((CCSIDR >> 3) & 0x3ff) + 1;\r
90}\r
91 \r
92UINTN\r
93ArmDataCacheSets (\r
94 VOID\r
95 )\r
96{\r
97 UINT32 CCSIDR = ReadCCSIDR (0);\r
98 \r
99 return ((CCSIDR >> 13) & 0x7fff) + 1;\r
100}\r
101\r
102UINTN\r
103EFIAPI\r
104ArmDataCacheLineLength (\r
105 VOID\r
106 )\r
107{\r
108 UINT32 CCSIDR = ReadCCSIDR (0) & 7;\r
109\r
110 // * 4 converts to bytes\r
111 return (1 << (CCSIDR + 2)) * 4;\r
112}\r
113 \r
114BOOLEAN\r
115EFIAPI\r
116ArmInstructionCachePresent (\r
117 VOID\r
118 )\r
119{\r
120 UINT32 CLIDR = ReadCLIDR ();\r
121 \r
122 if ((CLIDR & 1) == 1) {\r
123 // Instruction cache exists\r
124 return TRUE;\r
125 }\r
126 if ((CLIDR & 0x7) == 0x4) {\r
127 // Unified cache\r
128 return TRUE;\r
129 }\r
130 \r
131 return FALSE;\r
132}\r
133 \r
134UINTN\r
135EFIAPI\r
136ArmInstructionCacheSize (\r
137 VOID\r
138 )\r
139{\r
140 UINT32 NumSets;\r
141 UINT32 Associativity;\r
142 UINT32 LineSize;\r
143 UINT32 CCSIDR = ReadCCSIDR (1);\r
144 \r
145 LineSize = (1 << ((CCSIDR & 0x7) + 2));\r
146 Associativity = ((CCSIDR >> 3) & 0x3ff) + 1;\r
147 NumSets = ((CCSIDR >> 13) & 0x7fff) + 1;\r
148\r
149 // LineSize is in words (4 byte chunks)\r
150 return NumSets * Associativity * LineSize * 4; \r
151}\r
152 \r
153UINTN\r
154EFIAPI\r
155ArmInstructionCacheAssociativity (\r
156 VOID\r
157 )\r
158{\r
159 UINT32 CCSIDR = ReadCCSIDR (1);\r
160\r
161 return ((CCSIDR >> 3) & 0x3ff) + 1;\r
162// return 4;\r
163}\r
164 \r
165UINTN\r
166EFIAPI\r
167ArmInstructionCacheSets (\r
168 VOID\r
169 )\r
170{\r
171 UINT32 CCSIDR = ReadCCSIDR (1);\r
172 \r
173 return ((CCSIDR >> 13) & 0x7fff) + 1;\r
174}\r
175\r
176UINTN\r
177EFIAPI\r
178ArmInstructionCacheLineLength (\r
179 VOID\r
180 )\r
181{\r
182 UINT32 CCSIDR = ReadCCSIDR (1) & 7;\r
183\r
184 // * 4 converts to bytes\r
185 return (1 << (CCSIDR + 2)) * 4;\r
186\r
187// return 64;\r
188}\r
189\r
190\r
191VOID\r
192ArmV7DataCacheOperation (\r
193 IN ARM_V7_CACHE_OPERATION DataCacheOperation\r
194 )\r
195{\r
196 UINTN SavedInterruptState;\r
197\r
198 SavedInterruptState = ArmGetInterruptState ();\r
199 ArmDisableInterrupts ();\r
200 \r
201 ArmV7AllDataCachesOperation (DataCacheOperation);\r
202 \r
203 ArmDrainWriteBuffer ();\r
204 \r
205 if (SavedInterruptState) {\r
206 ArmEnableInterrupts ();\r
207 }\r
208}\r
209\r
210\r
211VOID\r
212ArmV7PoUDataCacheOperation (\r
213 IN ARM_V7_CACHE_OPERATION DataCacheOperation\r
214 )\r
215{\r
216 UINTN SavedInterruptState;\r
217\r
218 SavedInterruptState = ArmGetInterruptState ();\r
219 ArmDisableInterrupts ();\r
220 \r
221 ArmV7PerformPoUDataCacheOperation (DataCacheOperation);\r
222 \r
223 ArmDrainWriteBuffer ();\r
224 \r
225 if (SavedInterruptState) {\r
226 ArmEnableInterrupts ();\r
227 }\r
228}\r
229\r
230VOID\r
231EFIAPI\r
232ArmInvalidateDataCache (\r
233 VOID\r
234 )\r
235{\r
236 ArmV7DataCacheOperation (ArmInvalidateDataCacheEntryBySetWay);\r
237}\r
238\r
239VOID\r
240EFIAPI\r
241ArmCleanInvalidateDataCache (\r
242 VOID\r
243 )\r
244{\r
245 ArmV7DataCacheOperation (ArmCleanInvalidateDataCacheEntryBySetWay);\r
246}\r
247\r
248VOID\r
249EFIAPI\r
250ArmCleanDataCache (\r
251 VOID\r
252 )\r
253{\r
254 ArmV7DataCacheOperation (ArmCleanDataCacheEntryBySetWay);\r
255}\r
256\r
257VOID\r
258EFIAPI\r
259ArmCleanDataCacheToPoU (\r
260 VOID\r
261 )\r
262{\r
263 ArmV7PoUDataCacheOperation (ArmCleanDataCacheEntryBySetWay);\r
264}\r