Wed Jun 12 00:35:34 2013 UTC ()
If the L1 instruction cache policy is PIPT, don't set the prefer_mask.


(matt)
diff -r1.120 -r1.121 src/sys/arch/arm/arm/cpufunc.c

cvs diff -r1.120 -r1.121 src/sys/arch/arm/arm/cpufunc.c (switch to unified diff)

--- src/sys/arch/arm/arm/cpufunc.c 2013/05/19 15:37:06 1.120
+++ src/sys/arch/arm/arm/cpufunc.c 2013/06/12 00:35:34 1.121
@@ -1,2553 +1,2555 @@ @@ -1,2553 +1,2555 @@
1/* $NetBSD: cpufunc.c,v 1.120 2013/05/19 15:37:06 rkujawa Exp $ */ 1/* $NetBSD: cpufunc.c,v 1.121 2013/06/12 00:35:34 matt Exp $ */
2 2
3/* 3/*
4 * arm7tdmi support code Copyright (c) 2001 John Fremlin 4 * arm7tdmi support code Copyright (c) 2001 John Fremlin
5 * arm8 support code Copyright (c) 1997 ARM Limited 5 * arm8 support code Copyright (c) 1997 ARM Limited
6 * arm8 support code Copyright (c) 1997 Causality Limited 6 * arm8 support code Copyright (c) 1997 Causality Limited
7 * arm9 support code Copyright (C) 2001 ARM Ltd 7 * arm9 support code Copyright (C) 2001 ARM Ltd
8 * arm11 support code Copyright (c) 2007 Microsoft 8 * arm11 support code Copyright (c) 2007 Microsoft
9 * cortexa8 support code Copyright (c) 2008 3am Software Foundry 9 * cortexa8 support code Copyright (c) 2008 3am Software Foundry
10 * cortexa8 improvements Copyright (c) Goeran Weinholt 10 * cortexa8 improvements Copyright (c) Goeran Weinholt
11 * Copyright (c) 1997 Mark Brinicombe. 11 * Copyright (c) 1997 Mark Brinicombe.
12 * Copyright (c) 1997 Causality Limited 12 * Copyright (c) 1997 Causality Limited
13 * All rights reserved. 13 * All rights reserved.
14 * 14 *
15 * Redistribution and use in source and binary forms, with or without 15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions 16 * modification, are permitted provided that the following conditions
17 * are met: 17 * are met:
18 * 1. Redistributions of source code must retain the above copyright 18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer. 19 * notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright 20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in the 21 * notice, this list of conditions and the following disclaimer in the
22 * documentation and/or other materials provided with the distribution. 22 * documentation and/or other materials provided with the distribution.
23 * 3. All advertising materials mentioning features or use of this software 23 * 3. All advertising materials mentioning features or use of this software
24 * must display the following acknowledgement: 24 * must display the following acknowledgement:
25 * This product includes software developed by Causality Limited. 25 * This product includes software developed by Causality Limited.
26 * 4. The name of Causality Limited may not be used to endorse or promote 26 * 4. The name of Causality Limited may not be used to endorse or promote
27 * products derived from this software without specific prior written 27 * products derived from this software without specific prior written
28 * permission. 28 * permission.
29 * 29 *
30 * THIS SOFTWARE IS PROVIDED BY CAUSALITY LIMITED ``AS IS'' AND ANY EXPRESS 30 * THIS SOFTWARE IS PROVIDED BY CAUSALITY LIMITED ``AS IS'' AND ANY EXPRESS
31 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 31 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
32 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 32 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
33 * DISCLAIMED. IN NO EVENT SHALL CAUSALITY LIMITED BE LIABLE FOR ANY DIRECT, 33 * DISCLAIMED. IN NO EVENT SHALL CAUSALITY LIMITED BE LIABLE FOR ANY DIRECT,
34 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 34 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
35 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 35 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
36 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
37 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 37 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
38 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 38 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
39 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 39 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
40 * SUCH DAMAGE. 40 * SUCH DAMAGE.
41 * 41 *
42 * RiscBSD kernel project 42 * RiscBSD kernel project
43 * 43 *
44 * cpufuncs.c 44 * cpufuncs.c
45 * 45 *
46 * C functions for supporting CPU / MMU / TLB specific operations. 46 * C functions for supporting CPU / MMU / TLB specific operations.
47 * 47 *
48 * Created : 30/01/97 48 * Created : 30/01/97
49 */ 49 */
50 50
51#include <sys/cdefs.h> 51#include <sys/cdefs.h>
52__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.120 2013/05/19 15:37:06 rkujawa Exp $"); 52__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.121 2013/06/12 00:35:34 matt Exp $");
53 53
54#include "opt_compat_netbsd.h" 54#include "opt_compat_netbsd.h"
55#include "opt_cpuoptions.h" 55#include "opt_cpuoptions.h"
56#include "opt_perfctrs.h" 56#include "opt_perfctrs.h"
57 57
58#include <sys/types.h> 58#include <sys/types.h>
59#include <sys/param.h> 59#include <sys/param.h>
60#include <sys/pmc.h> 60#include <sys/pmc.h>
61#include <sys/systm.h> 61#include <sys/systm.h>
62#include <machine/cpu.h> 62#include <machine/cpu.h>
63#include <machine/bootconfig.h> 63#include <machine/bootconfig.h>
64#include <arch/arm/arm/disassem.h> 64#include <arch/arm/arm/disassem.h>
65 65
66#include <uvm/uvm.h> 66#include <uvm/uvm.h>
67 67
68#include <arm/cpuconf.h> 68#include <arm/cpuconf.h>
69#include <arm/cpufunc.h> 69#include <arm/cpufunc.h>
70 70
71#ifdef CPU_XSCALE_80200 71#ifdef CPU_XSCALE_80200
72#include <arm/xscale/i80200reg.h> 72#include <arm/xscale/i80200reg.h>
73#include <arm/xscale/i80200var.h> 73#include <arm/xscale/i80200var.h>
74#endif 74#endif
75 75
76#ifdef CPU_XSCALE_80321 76#ifdef CPU_XSCALE_80321
77#include <arm/xscale/i80321reg.h> 77#include <arm/xscale/i80321reg.h>
78#include <arm/xscale/i80321var.h> 78#include <arm/xscale/i80321var.h>
79#endif 79#endif
80 80
81#ifdef CPU_XSCALE_IXP425 81#ifdef CPU_XSCALE_IXP425
82#include <arm/xscale/ixp425reg.h> 82#include <arm/xscale/ixp425reg.h>
83#include <arm/xscale/ixp425var.h> 83#include <arm/xscale/ixp425var.h>
84#endif 84#endif
85 85
86#if defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) 86#if defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321)
87#include <arm/xscale/xscalereg.h> 87#include <arm/xscale/xscalereg.h>
88#endif 88#endif
89 89
90#if defined(PERFCTRS) 90#if defined(PERFCTRS)
91struct arm_pmc_funcs *arm_pmc; 91struct arm_pmc_funcs *arm_pmc;
92#endif 92#endif
93 93
94/* PRIMARY CACHE VARIABLES */ 94/* PRIMARY CACHE VARIABLES */
95#if (ARM_MMU_V6 + ARM_MMU_V7) != 0 95#if (ARM_MMU_V6 + ARM_MMU_V7) != 0
96u_int arm_cache_prefer_mask; 96u_int arm_cache_prefer_mask;
97#endif 97#endif
98struct arm_cache_info arm_pcache; 98struct arm_cache_info arm_pcache;
99struct arm_cache_info arm_scache; 99struct arm_cache_info arm_scache;
100 100
101u_int arm_dcache_align; 101u_int arm_dcache_align;
102u_int arm_dcache_align_mask; 102u_int arm_dcache_align_mask;
103 103
104/* 1 == use cpu_sleep(), 0 == don't */ 104/* 1 == use cpu_sleep(), 0 == don't */
105int cpu_do_powersave; 105int cpu_do_powersave;
106 106
107#ifdef CPU_ARM2 107#ifdef CPU_ARM2
108struct cpu_functions arm2_cpufuncs = { 108struct cpu_functions arm2_cpufuncs = {
109 /* CPU functions */ 109 /* CPU functions */
110 110
111 .cf_id = arm2_id, 111 .cf_id = arm2_id,
112 .cf_cpwait = cpufunc_nullop, 112 .cf_cpwait = cpufunc_nullop,
113 113
114 /* MMU functions */ 114 /* MMU functions */
115 115
116 .cf_control = (void *)cpufunc_nullop, 116 .cf_control = (void *)cpufunc_nullop,
117 117
118 /* TLB functions */ 118 /* TLB functions */
119 119
120 .cf_tlb_flushID = cpufunc_nullop, 120 .cf_tlb_flushID = cpufunc_nullop,
121 .cf_tlb_flushID_SE = (void *)cpufunc_nullop, 121 .cf_tlb_flushID_SE = (void *)cpufunc_nullop,
122 .cf_tlb_flushI = cpufunc_nullop, 122 .cf_tlb_flushI = cpufunc_nullop,
123 .cf_tlb_flushI_SE = (void *)cpufunc_nullop, 123 .cf_tlb_flushI_SE = (void *)cpufunc_nullop,
124 .cf_tlb_flushD = cpufunc_nullop, 124 .cf_tlb_flushD = cpufunc_nullop,
125 .cf_tlb_flushD_SE = (void *)cpufunc_nullop, 125 .cf_tlb_flushD_SE = (void *)cpufunc_nullop,
126 126
127 /* Cache operations */ 127 /* Cache operations */
128 128
129 .cf_icache_sync_all = cpufunc_nullop, 129 .cf_icache_sync_all = cpufunc_nullop,
130 .cf_icache_sync_range = (void *) cpufunc_nullop, 130 .cf_icache_sync_range = (void *) cpufunc_nullop,
131 131
132 .cf_dcache_wbinv_all = arm3_cache_flush, 132 .cf_dcache_wbinv_all = arm3_cache_flush,
133 .cf_dcache_wbinv_range = (void *)cpufunc_nullop, 133 .cf_dcache_wbinv_range = (void *)cpufunc_nullop,
134 .cf_dcache_inv_range = (void *)cpufunc_nullop, 134 .cf_dcache_inv_range = (void *)cpufunc_nullop,
135 .cf_dcache_wb_range = (void *)cpufunc_nullop, 135 .cf_dcache_wb_range = (void *)cpufunc_nullop,
136 136
137 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 137 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
138 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 138 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
139 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 139 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
140 140
141 .cf_idcache_wbinv_all = cpufunc_nullop, 141 .cf_idcache_wbinv_all = cpufunc_nullop,
142 .cf_idcache_wbinv_range = (void *)cpufunc_nullop, 142 .cf_idcache_wbinv_range = (void *)cpufunc_nullop,
143 143
144 /* Other functions */ 144 /* Other functions */
145 145
146 .cf_flush_prefetchbuf = cpufunc_nullop, 146 .cf_flush_prefetchbuf = cpufunc_nullop,
147 .cf_drain_writebuf = cpufunc_nullop, 147 .cf_drain_writebuf = cpufunc_nullop,
148 .cf_flush_brnchtgt_C = cpufunc_nullop, 148 .cf_flush_brnchtgt_C = cpufunc_nullop,
149 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 149 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
150 150
151 .cf_sleep = (void *)cpufunc_nullop, 151 .cf_sleep = (void *)cpufunc_nullop,
152 152
153 /* Soft functions */ 153 /* Soft functions */
154 154
155 .cf_dataabt_fixup = early_abort_fixup, 155 .cf_dataabt_fixup = early_abort_fixup,
156 .cf_prefetchabt_fixup = cpufunc_null_fixup, 156 .cf_prefetchabt_fixup = cpufunc_null_fixup,
157 157
158 .cf_setup = (void *)cpufunc_nullop 158 .cf_setup = (void *)cpufunc_nullop
159 159
160}; 160};
161#endif /* CPU_ARM2 */ 161#endif /* CPU_ARM2 */
162 162
163#ifdef CPU_ARM250 163#ifdef CPU_ARM250
164struct cpu_functions arm250_cpufuncs = { 164struct cpu_functions arm250_cpufuncs = {
165 /* CPU functions */ 165 /* CPU functions */
166 166
167 .cf_id = arm250_id, 167 .cf_id = arm250_id,
168 .cf_cpwait = cpufunc_nullop, 168 .cf_cpwait = cpufunc_nullop,
169 169
170 /* MMU functions */ 170 /* MMU functions */
171 171
172 .cf_control = (void *)cpufunc_nullop, 172 .cf_control = (void *)cpufunc_nullop,
173 173
174 /* TLB functions */ 174 /* TLB functions */
175 175
176 .cf_tlb_flushID = cpufunc_nullop, 176 .cf_tlb_flushID = cpufunc_nullop,
177 .cf_tlb_flushID_SE = (void *)cpufunc_nullop, 177 .cf_tlb_flushID_SE = (void *)cpufunc_nullop,
178 .cf_tlb_flushI = cpufunc_nullop, 178 .cf_tlb_flushI = cpufunc_nullop,
179 .cf_tlb_flushI_SE = (void *)cpufunc_nullop, 179 .cf_tlb_flushI_SE = (void *)cpufunc_nullop,
180 .cf_tlb_flushD = cpufunc_nullop, 180 .cf_tlb_flushD = cpufunc_nullop,
181 .cf_tlb_flushD_SE = (void *)cpufunc_nullop, 181 .cf_tlb_flushD_SE = (void *)cpufunc_nullop,
182 182
183 /* Cache operations */ 183 /* Cache operations */
184 184
185 .cf_icache_sync_all = cpufunc_nullop, 185 .cf_icache_sync_all = cpufunc_nullop,
186 .cf_icache_sync_range = (void *) cpufunc_nullop, 186 .cf_icache_sync_range = (void *) cpufunc_nullop,
187 187
188 .cf_dcache_wbinv_all = arm3_cache_flush, 188 .cf_dcache_wbinv_all = arm3_cache_flush,
189 .cf_dcache_wbinv_range = (void *)cpufunc_nullop, 189 .cf_dcache_wbinv_range = (void *)cpufunc_nullop,
190 .cf_dcache_inv_range = (void *)cpufunc_nullop, 190 .cf_dcache_inv_range = (void *)cpufunc_nullop,
191 .cf_dcache_wb_range = (void *)cpufunc_nullop, 191 .cf_dcache_wb_range = (void *)cpufunc_nullop,
192 192
193 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 193 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
194 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 194 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
195 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 195 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
196 196
197 .cf_idcache_wbinv_all = cpufunc_nullop, 197 .cf_idcache_wbinv_all = cpufunc_nullop,
198 .cf_idcache_wbinv_range = (void *)cpufunc_nullop, 198 .cf_idcache_wbinv_range = (void *)cpufunc_nullop,
199 199
200 /* Other functions */ 200 /* Other functions */
201 201
202 .cf_flush_prefetchbuf = cpufunc_nullop, 202 .cf_flush_prefetchbuf = cpufunc_nullop,
203 .cf_drain_writebuf = cpufunc_nullop, 203 .cf_drain_writebuf = cpufunc_nullop,
204 .cf_flush_brnchtgt_C = cpufunc_nullop, 204 .cf_flush_brnchtgt_C = cpufunc_nullop,
205 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 205 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
206 206
207 .cf_sleep = (void *)cpufunc_nullop, 207 .cf_sleep = (void *)cpufunc_nullop,
208 208
209 /* Soft functions */ 209 /* Soft functions */
210 210
211 .cf_dataabt_fixup = early_abort_fixup, 211 .cf_dataabt_fixup = early_abort_fixup,
212 .cf_prefetchabt_fixup = cpufunc_null_fixup, 212 .cf_prefetchabt_fixup = cpufunc_null_fixup,
213 213
214 .cf_setup = (void *)cpufunc_nullop 214 .cf_setup = (void *)cpufunc_nullop
215 215
216}; 216};
217#endif /* CPU_ARM250 */ 217#endif /* CPU_ARM250 */
218 218
219#ifdef CPU_ARM3 219#ifdef CPU_ARM3
220struct cpu_functions arm3_cpufuncs = { 220struct cpu_functions arm3_cpufuncs = {
221 /* CPU functions */ 221 /* CPU functions */
222 222
223 .cf_id = cpufunc_id, 223 .cf_id = cpufunc_id,
224 .cf_cpwait = cpufunc_nullop, 224 .cf_cpwait = cpufunc_nullop,
225 225
226 /* MMU functions */ 226 /* MMU functions */
227 227
228 .cf_control = arm3_control, 228 .cf_control = arm3_control,
229 229
230 /* TLB functions */ 230 /* TLB functions */
231 231
232 .cf_tlb_flushID = cpufunc_nullop, 232 .cf_tlb_flushID = cpufunc_nullop,
233 .cf_tlb_flushID_SE = (void *)cpufunc_nullop, 233 .cf_tlb_flushID_SE = (void *)cpufunc_nullop,
234 .cf_tlb_flushI = cpufunc_nullop, 234 .cf_tlb_flushI = cpufunc_nullop,
235 .cf_tlb_flushI_SE = (void *)cpufunc_nullop, 235 .cf_tlb_flushI_SE = (void *)cpufunc_nullop,
236 .cf_tlb_flushD = cpufunc_nullop, 236 .cf_tlb_flushD = cpufunc_nullop,
237 .cf_tlb_flushD_SE = (void *)cpufunc_nullop, 237 .cf_tlb_flushD_SE = (void *)cpufunc_nullop,
238 238
239 /* Cache operations */ 239 /* Cache operations */
240 240
241 .cf_icache_sync_all = cpufunc_nullop, 241 .cf_icache_sync_all = cpufunc_nullop,
242 .cf_icache_sync_range = (void *) cpufunc_nullop, 242 .cf_icache_sync_range = (void *) cpufunc_nullop,
243 243
244 .cf_dcache_wbinv_all = arm3_cache_flush, 244 .cf_dcache_wbinv_all = arm3_cache_flush,
245 .cf_dcache_wbinv_range = (void *)arm3_cache_flush, 245 .cf_dcache_wbinv_range = (void *)arm3_cache_flush,
246 .cf_dcache_inv_range = (void *)arm3_cache_flush, 246 .cf_dcache_inv_range = (void *)arm3_cache_flush,
247 .cf_dcache_wb_range = (void *)cpufunc_nullop, 247 .cf_dcache_wb_range = (void *)cpufunc_nullop,
248 248
249 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 249 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
250 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 250 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
251 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 251 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
252 252
253 .cf_idcache_wbinv_all = arm3_cache_flush, 253 .cf_idcache_wbinv_all = arm3_cache_flush,
254 .cf_idcache_wbinv_range = (void *)arm3_cache_flush, 254 .cf_idcache_wbinv_range = (void *)arm3_cache_flush,
255 255
256 /* Other functions */ 256 /* Other functions */
257 257
258 .cf_flush_prefetchbuf = cpufunc_nullop, 258 .cf_flush_prefetchbuf = cpufunc_nullop,
259 .cf_drain_writebuf = cpufunc_nullop, 259 .cf_drain_writebuf = cpufunc_nullop,
260 .cf_flush_brnchtgt_C = cpufunc_nullop, 260 .cf_flush_brnchtgt_C = cpufunc_nullop,
261 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 261 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
262 262
263 .cf_sleep = (void *)cpufunc_nullop, 263 .cf_sleep = (void *)cpufunc_nullop,
264 264
265 /* Soft functions */ 265 /* Soft functions */
266 266
267 .cf_dataabt_fixup = early_abort_fixup, 267 .cf_dataabt_fixup = early_abort_fixup,
268 .cf_prefetchabt_fixup = cpufunc_null_fixup, 268 .cf_prefetchabt_fixup = cpufunc_null_fixup,
269 269
270 .cf_setup = (void *)cpufunc_nullop 270 .cf_setup = (void *)cpufunc_nullop
271 271
272}; 272};
273#endif /* CPU_ARM3 */ 273#endif /* CPU_ARM3 */
274 274
275#ifdef CPU_ARM6 275#ifdef CPU_ARM6
276struct cpu_functions arm6_cpufuncs = { 276struct cpu_functions arm6_cpufuncs = {
277 /* CPU functions */ 277 /* CPU functions */
278 278
279 .cf_id = cpufunc_id, 279 .cf_id = cpufunc_id,
280 .cf_cpwait = cpufunc_nullop, 280 .cf_cpwait = cpufunc_nullop,
281 281
282 /* MMU functions */ 282 /* MMU functions */
283 283
284 .cf_control = cpufunc_control, 284 .cf_control = cpufunc_control,
285 .cf_domains = cpufunc_domains, 285 .cf_domains = cpufunc_domains,
286 .cf_setttb = arm67_setttb, 286 .cf_setttb = arm67_setttb,
287 .cf_faultstatus = cpufunc_faultstatus, 287 .cf_faultstatus = cpufunc_faultstatus,
288 .cf_faultaddress = cpufunc_faultaddress, 288 .cf_faultaddress = cpufunc_faultaddress,
289 289
290 /* TLB functions */ 290 /* TLB functions */
291 291
292 .cf_tlb_flushID = arm67_tlb_flush, 292 .cf_tlb_flushID = arm67_tlb_flush,
293 .cf_tlb_flushID_SE = arm67_tlb_purge, 293 .cf_tlb_flushID_SE = arm67_tlb_purge,
294 .cf_tlb_flushI = arm67_tlb_flush, 294 .cf_tlb_flushI = arm67_tlb_flush,
295 .cf_tlb_flushI_SE = arm67_tlb_purge, 295 .cf_tlb_flushI_SE = arm67_tlb_purge,
296 .cf_tlb_flushD = arm67_tlb_flush, 296 .cf_tlb_flushD = arm67_tlb_flush,
297 .cf_tlb_flushD_SE = arm67_tlb_purge, 297 .cf_tlb_flushD_SE = arm67_tlb_purge,
298 298
299 /* Cache operations */ 299 /* Cache operations */
300 300
301 .cf_icache_sync_all = cpufunc_nullop, 301 .cf_icache_sync_all = cpufunc_nullop,
302 .cf_icache_sync_range = (void *) cpufunc_nullop, 302 .cf_icache_sync_range = (void *) cpufunc_nullop,
303 303
304 .cf_dcache_wbinv_all = arm67_cache_flush, 304 .cf_dcache_wbinv_all = arm67_cache_flush,
305 .cf_dcache_wbinv_range = (void *)arm67_cache_flush, 305 .cf_dcache_wbinv_range = (void *)arm67_cache_flush,
306 .cf_dcache_inv_range = (void *)arm67_cache_flush, 306 .cf_dcache_inv_range = (void *)arm67_cache_flush,
307 .cf_dcache_wb_range = (void *)cpufunc_nullop, 307 .cf_dcache_wb_range = (void *)cpufunc_nullop,
308 308
309 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 309 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
310 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 310 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
311 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 311 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
312 312
313 .cf_idcache_wbinv_all = arm67_cache_flush, 313 .cf_idcache_wbinv_all = arm67_cache_flush,
314 .cf_idcache_wbinv_range = (void *)arm67_cache_flush, 314 .cf_idcache_wbinv_range = (void *)arm67_cache_flush,
315 315
316 /* Other functions */ 316 /* Other functions */
317 317
318 .cf_flush_prefetchbuf = cpufunc_nullop, 318 .cf_flush_prefetchbuf = cpufunc_nullop,
319 .cf_drain_writebuf = cpufunc_nullop, 319 .cf_drain_writebuf = cpufunc_nullop,
320 .cf_flush_brnchtgt_C = cpufunc_nullop, 320 .cf_flush_brnchtgt_C = cpufunc_nullop,
321 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 321 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
322 322
323 .cf_sleep = (void *)cpufunc_nullop, 323 .cf_sleep = (void *)cpufunc_nullop,
324 324
325 /* Soft functions */ 325 /* Soft functions */
326 326
327#ifdef ARM6_LATE_ABORT 327#ifdef ARM6_LATE_ABORT
328 .cf_dataabt_fixup = late_abort_fixup, 328 .cf_dataabt_fixup = late_abort_fixup,
329#else 329#else
330 .cf_dataabt_fixup = early_abort_fixup, 330 .cf_dataabt_fixup = early_abort_fixup,
331#endif 331#endif
332 .cf_prefetchabt_fixup = cpufunc_null_fixup, 332 .cf_prefetchabt_fixup = cpufunc_null_fixup,
333 333
334 .cf_context_switch = arm67_context_switch, 334 .cf_context_switch = arm67_context_switch,
335 335
336 .cf_setup = arm6_setup 336 .cf_setup = arm6_setup
337 337
338}; 338};
339#endif /* CPU_ARM6 */ 339#endif /* CPU_ARM6 */
340 340
341#ifdef CPU_ARM7 341#ifdef CPU_ARM7
342struct cpu_functions arm7_cpufuncs = { 342struct cpu_functions arm7_cpufuncs = {
343 /* CPU functions */ 343 /* CPU functions */
344 344
345 .cf_id = cpufunc_id, 345 .cf_id = cpufunc_id,
346 .cf_cpwait = cpufunc_nullop, 346 .cf_cpwait = cpufunc_nullop,
347 347
348 /* MMU functions */ 348 /* MMU functions */
349 349
350 .cf_control = cpufunc_control, 350 .cf_control = cpufunc_control,
351 .cf_domains = cpufunc_domains, 351 .cf_domains = cpufunc_domains,
352 .cf_setttb = arm67_setttb, 352 .cf_setttb = arm67_setttb,
353 .cf_faultstatus = cpufunc_faultstatus, 353 .cf_faultstatus = cpufunc_faultstatus,
354 .cf_faultaddress = cpufunc_faultaddress, 354 .cf_faultaddress = cpufunc_faultaddress,
355 355
356 /* TLB functions */ 356 /* TLB functions */
357 357
358 .cf_tlb_flushID = arm67_tlb_flush, 358 .cf_tlb_flushID = arm67_tlb_flush,
359 .cf_tlb_flushID_SE = arm67_tlb_purge, 359 .cf_tlb_flushID_SE = arm67_tlb_purge,
360 .cf_tlb_flushI = arm67_tlb_flush, 360 .cf_tlb_flushI = arm67_tlb_flush,
361 .cf_tlb_flushI_SE = arm67_tlb_purge, 361 .cf_tlb_flushI_SE = arm67_tlb_purge,
362 .cf_tlb_flushD = arm67_tlb_flush, 362 .cf_tlb_flushD = arm67_tlb_flush,
363 .cf_tlb_flushD_SE = arm67_tlb_purge, 363 .cf_tlb_flushD_SE = arm67_tlb_purge,
364 364
365 /* Cache operations */ 365 /* Cache operations */
366 366
367 .cf_icache_sync_all = cpufunc_nullop, 367 .cf_icache_sync_all = cpufunc_nullop,
368 .cf_icache_sync_range = (void *)cpufunc_nullop, 368 .cf_icache_sync_range = (void *)cpufunc_nullop,
369 369
370 .cf_dcache_wbinv_all = arm67_cache_flush, 370 .cf_dcache_wbinv_all = arm67_cache_flush,
371 .cf_dcache_wbinv_range = (void *)arm67_cache_flush, 371 .cf_dcache_wbinv_range = (void *)arm67_cache_flush,
372 .cf_dcache_inv_range = (void *)arm67_cache_flush, 372 .cf_dcache_inv_range = (void *)arm67_cache_flush,
373 .cf_dcache_wb_range = (void *)cpufunc_nullop, 373 .cf_dcache_wb_range = (void *)cpufunc_nullop,
374 374
375 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 375 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
376 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 376 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
377 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 377 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
378 378
379 .cf_idcache_wbinv_all = arm67_cache_flush, 379 .cf_idcache_wbinv_all = arm67_cache_flush,
380 .cf_idcache_wbinv_range = (void *)arm67_cache_flush, 380 .cf_idcache_wbinv_range = (void *)arm67_cache_flush,
381 381
382 /* Other functions */ 382 /* Other functions */
383 383
384 .cf_flush_prefetchbuf = cpufunc_nullop, 384 .cf_flush_prefetchbuf = cpufunc_nullop,
385 .cf_drain_writebuf = cpufunc_nullop, 385 .cf_drain_writebuf = cpufunc_nullop,
386 .cf_flush_brnchtgt_C = cpufunc_nullop, 386 .cf_flush_brnchtgt_C = cpufunc_nullop,
387 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 387 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
388 388
389 .cf_sleep = (void *)cpufunc_nullop, 389 .cf_sleep = (void *)cpufunc_nullop,
390 390
391 /* Soft functions */ 391 /* Soft functions */
392 392
393 .cf_dataabt_fixup = late_abort_fixup, 393 .cf_dataabt_fixup = late_abort_fixup,
394 .cf_prefetchabt_fixup = cpufunc_null_fixup, 394 .cf_prefetchabt_fixup = cpufunc_null_fixup,
395 395
396 .cf_context_switch = arm67_context_switch, 396 .cf_context_switch = arm67_context_switch,
397 397
398 .cf_setup = arm7_setup 398 .cf_setup = arm7_setup
399 399
400}; 400};
401#endif /* CPU_ARM7 */ 401#endif /* CPU_ARM7 */
402 402
403#ifdef CPU_ARM7TDMI 403#ifdef CPU_ARM7TDMI
404struct cpu_functions arm7tdmi_cpufuncs = { 404struct cpu_functions arm7tdmi_cpufuncs = {
405 /* CPU functions */ 405 /* CPU functions */
406 406
407 .cf_id = cpufunc_id, 407 .cf_id = cpufunc_id,
408 .cf_cpwait = cpufunc_nullop, 408 .cf_cpwait = cpufunc_nullop,
409 409
410 /* MMU functions */ 410 /* MMU functions */
411 411
412 .cf_control = cpufunc_control, 412 .cf_control = cpufunc_control,
413 .cf_domains = cpufunc_domains, 413 .cf_domains = cpufunc_domains,
414 .cf_setttb = arm7tdmi_setttb, 414 .cf_setttb = arm7tdmi_setttb,
415 .cf_faultstatus = cpufunc_faultstatus, 415 .cf_faultstatus = cpufunc_faultstatus,
416 .cf_faultaddress = cpufunc_faultaddress, 416 .cf_faultaddress = cpufunc_faultaddress,
417 417
418 /* TLB functions */ 418 /* TLB functions */
419 419
420 .cf_tlb_flushID = arm7tdmi_tlb_flushID, 420 .cf_tlb_flushID = arm7tdmi_tlb_flushID,
421 .cf_tlb_flushID_SE = arm7tdmi_tlb_flushID_SE, 421 .cf_tlb_flushID_SE = arm7tdmi_tlb_flushID_SE,
422 .cf_tlb_flushI = arm7tdmi_tlb_flushID, 422 .cf_tlb_flushI = arm7tdmi_tlb_flushID,
423 .cf_tlb_flushI_SE = arm7tdmi_tlb_flushID_SE, 423 .cf_tlb_flushI_SE = arm7tdmi_tlb_flushID_SE,
424 .cf_tlb_flushD = arm7tdmi_tlb_flushID, 424 .cf_tlb_flushD = arm7tdmi_tlb_flushID,
425 .cf_tlb_flushD_SE = arm7tdmi_tlb_flushID_SE, 425 .cf_tlb_flushD_SE = arm7tdmi_tlb_flushID_SE,
426 426
427 /* Cache operations */ 427 /* Cache operations */
428 428
429 .cf_icache_sync_all = cpufunc_nullop, 429 .cf_icache_sync_all = cpufunc_nullop,
430 .cf_icache_sync_range = (void *)cpufunc_nullop, 430 .cf_icache_sync_range = (void *)cpufunc_nullop,
431 431
432 .cf_dcache_wbinv_all = arm7tdmi_cache_flushID, 432 .cf_dcache_wbinv_all = arm7tdmi_cache_flushID,
433 .cf_dcache_wbinv_range = (void *)arm7tdmi_cache_flushID, 433 .cf_dcache_wbinv_range = (void *)arm7tdmi_cache_flushID,
434 .cf_dcache_inv_range = (void *)arm7tdmi_cache_flushID, 434 .cf_dcache_inv_range = (void *)arm7tdmi_cache_flushID,
435 .cf_dcache_wb_range = (void *)cpufunc_nullop, 435 .cf_dcache_wb_range = (void *)cpufunc_nullop,
436 436
437 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 437 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
438 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 438 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
439 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 439 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
440 440
441 .cf_idcache_wbinv_all = arm7tdmi_cache_flushID, 441 .cf_idcache_wbinv_all = arm7tdmi_cache_flushID,
442 .cf_idcache_wbinv_range = (void *)arm7tdmi_cache_flushID, 442 .cf_idcache_wbinv_range = (void *)arm7tdmi_cache_flushID,
443 443
444 /* Other functions */ 444 /* Other functions */
445 445
446 .cf_flush_prefetchbuf = cpufunc_nullop, 446 .cf_flush_prefetchbuf = cpufunc_nullop,
447 .cf_drain_writebuf = cpufunc_nullop, 447 .cf_drain_writebuf = cpufunc_nullop,
448 .cf_flush_brnchtgt_C = cpufunc_nullop, 448 .cf_flush_brnchtgt_C = cpufunc_nullop,
449 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 449 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
450 450
451 .cf_sleep = (void *)cpufunc_nullop, 451 .cf_sleep = (void *)cpufunc_nullop,
452 452
453 /* Soft functions */ 453 /* Soft functions */
454 454
455 .cf_dataabt_fixup = late_abort_fixup, 455 .cf_dataabt_fixup = late_abort_fixup,
456 .cf_prefetchabt_fixup = cpufunc_null_fixup, 456 .cf_prefetchabt_fixup = cpufunc_null_fixup,
457 457
458 .cf_context_switch = arm7tdmi_context_switch, 458 .cf_context_switch = arm7tdmi_context_switch,
459 459
460 .cf_setup = arm7tdmi_setup 460 .cf_setup = arm7tdmi_setup
461 461
462}; 462};
463#endif /* CPU_ARM7TDMI */ 463#endif /* CPU_ARM7TDMI */
464 464
465#ifdef CPU_ARM8 465#ifdef CPU_ARM8
466struct cpu_functions arm8_cpufuncs = { 466struct cpu_functions arm8_cpufuncs = {
467 /* CPU functions */ 467 /* CPU functions */
468 468
469 .cf_id = cpufunc_id, 469 .cf_id = cpufunc_id,
470 .cf_cpwait = cpufunc_nullop, 470 .cf_cpwait = cpufunc_nullop,
471 471
472 /* MMU functions */ 472 /* MMU functions */
473 473
474 .cf_control = cpufunc_control, 474 .cf_control = cpufunc_control,
475 .cf_domains = cpufunc_domains, 475 .cf_domains = cpufunc_domains,
476 .cf_setttb = arm8_setttb, 476 .cf_setttb = arm8_setttb,
477 .cf_faultstatus = cpufunc_faultstatus, 477 .cf_faultstatus = cpufunc_faultstatus,
478 .cf_faultaddress = cpufunc_faultaddress, 478 .cf_faultaddress = cpufunc_faultaddress,
479 479
480 /* TLB functions */ 480 /* TLB functions */
481 481
482 .cf_tlb_flushID = arm8_tlb_flushID, 482 .cf_tlb_flushID = arm8_tlb_flushID,
483 .cf_tlb_flushID_SE = arm8_tlb_flushID_SE, 483 .cf_tlb_flushID_SE = arm8_tlb_flushID_SE,
484 .cf_tlb_flushI = arm8_tlb_flushID, 484 .cf_tlb_flushI = arm8_tlb_flushID,
485 .cf_tlb_flushI_SE = arm8_tlb_flushID_SE, 485 .cf_tlb_flushI_SE = arm8_tlb_flushID_SE,
486 .cf_tlb_flushD = arm8_tlb_flushID, 486 .cf_tlb_flushD = arm8_tlb_flushID,
487 .cf_tlb_flushD_SE = arm8_tlb_flushID_SE, 487 .cf_tlb_flushD_SE = arm8_tlb_flushID_SE,
488 488
489 /* Cache operations */ 489 /* Cache operations */
490 490
491 .cf_icache_sync_all = cpufunc_nullop, 491 .cf_icache_sync_all = cpufunc_nullop,
492 .cf_icache_sync_range = (void *)cpufunc_nullop, 492 .cf_icache_sync_range = (void *)cpufunc_nullop,
493 493
494 .cf_dcache_wbinv_all = arm8_cache_purgeID, 494 .cf_dcache_wbinv_all = arm8_cache_purgeID,
495 .cf_dcache_wbinv_range = (void *)arm8_cache_purgeID, 495 .cf_dcache_wbinv_range = (void *)arm8_cache_purgeID,
496/*XXX*/ .cf_dcache_inv_range = (void *)arm8_cache_purgeID, 496/*XXX*/ .cf_dcache_inv_range = (void *)arm8_cache_purgeID,
497 .cf_dcache_wb_range = (void *)arm8_cache_cleanID, 497 .cf_dcache_wb_range = (void *)arm8_cache_cleanID,
498 498
499 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 499 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
500 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 500 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
501 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 501 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
502 502
503 .cf_idcache_wbinv_all = arm8_cache_purgeID, 503 .cf_idcache_wbinv_all = arm8_cache_purgeID,
504 .cf_idcache_wbinv_range = (void *)arm8_cache_purgeID, 504 .cf_idcache_wbinv_range = (void *)arm8_cache_purgeID,
505 505
506 /* Other functions */ 506 /* Other functions */
507 507
508 .cf_flush_prefetchbuf = cpufunc_nullop, 508 .cf_flush_prefetchbuf = cpufunc_nullop,
509 .cf_drain_writebuf = cpufunc_nullop, 509 .cf_drain_writebuf = cpufunc_nullop,
510 .cf_flush_brnchtgt_C = cpufunc_nullop, 510 .cf_flush_brnchtgt_C = cpufunc_nullop,
511 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 511 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
512 512
513 .cf_sleep = (void *)cpufunc_nullop, 513 .cf_sleep = (void *)cpufunc_nullop,
514 514
515 /* Soft functions */ 515 /* Soft functions */
516 516
517 .cf_dataabt_fixup = cpufunc_null_fixup, 517 .cf_dataabt_fixup = cpufunc_null_fixup,
518 .cf_prefetchabt_fixup = cpufunc_null_fixup, 518 .cf_prefetchabt_fixup = cpufunc_null_fixup,
519 519
520 .cf_context_switch = arm8_context_switch, 520 .cf_context_switch = arm8_context_switch,
521 521
522 .cf_setup = arm8_setup 522 .cf_setup = arm8_setup
523}; 523};
524#endif /* CPU_ARM8 */ 524#endif /* CPU_ARM8 */
525 525
526#ifdef CPU_ARM9 526#ifdef CPU_ARM9
527struct cpu_functions arm9_cpufuncs = { 527struct cpu_functions arm9_cpufuncs = {
528 /* CPU functions */ 528 /* CPU functions */
529 529
530 .cf_id = cpufunc_id, 530 .cf_id = cpufunc_id,
531 .cf_cpwait = cpufunc_nullop, 531 .cf_cpwait = cpufunc_nullop,
532 532
533 /* MMU functions */ 533 /* MMU functions */
534 534
535 .cf_control = cpufunc_control, 535 .cf_control = cpufunc_control,
536 .cf_domains = cpufunc_domains, 536 .cf_domains = cpufunc_domains,
537 .cf_setttb = arm9_setttb, 537 .cf_setttb = arm9_setttb,
538 .cf_faultstatus = cpufunc_faultstatus, 538 .cf_faultstatus = cpufunc_faultstatus,
539 .cf_faultaddress = cpufunc_faultaddress, 539 .cf_faultaddress = cpufunc_faultaddress,
540 540
541 /* TLB functions */ 541 /* TLB functions */
542 542
543 .cf_tlb_flushID = armv4_tlb_flushID, 543 .cf_tlb_flushID = armv4_tlb_flushID,
544 .cf_tlb_flushID_SE = arm9_tlb_flushID_SE, 544 .cf_tlb_flushID_SE = arm9_tlb_flushID_SE,
545 .cf_tlb_flushI = armv4_tlb_flushI, 545 .cf_tlb_flushI = armv4_tlb_flushI,
546 .cf_tlb_flushI_SE = (void *)armv4_tlb_flushI, 546 .cf_tlb_flushI_SE = (void *)armv4_tlb_flushI,
547 .cf_tlb_flushD = armv4_tlb_flushD, 547 .cf_tlb_flushD = armv4_tlb_flushD,
548 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE, 548 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE,
549 549
550 /* Cache operations */ 550 /* Cache operations */
551 551
552 .cf_icache_sync_all = arm9_icache_sync_all, 552 .cf_icache_sync_all = arm9_icache_sync_all,
553 .cf_icache_sync_range = arm9_icache_sync_range, 553 .cf_icache_sync_range = arm9_icache_sync_range,
554 554
555 .cf_dcache_wbinv_all = arm9_dcache_wbinv_all, 555 .cf_dcache_wbinv_all = arm9_dcache_wbinv_all,
556 .cf_dcache_wbinv_range = arm9_dcache_wbinv_range, 556 .cf_dcache_wbinv_range = arm9_dcache_wbinv_range,
557/*XXX*/ .cf_dcache_inv_range = arm9_dcache_wbinv_range, 557/*XXX*/ .cf_dcache_inv_range = arm9_dcache_wbinv_range,
558 .cf_dcache_wb_range = arm9_dcache_wb_range, 558 .cf_dcache_wb_range = arm9_dcache_wb_range,
559 559
560 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 560 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
561 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 561 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
562 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 562 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
563 563
564 .cf_idcache_wbinv_all = arm9_idcache_wbinv_all, 564 .cf_idcache_wbinv_all = arm9_idcache_wbinv_all,
565 .cf_idcache_wbinv_range = arm9_idcache_wbinv_range, 565 .cf_idcache_wbinv_range = arm9_idcache_wbinv_range,
566 566
567 /* Other functions */ 567 /* Other functions */
568 568
569 .cf_flush_prefetchbuf = cpufunc_nullop, 569 .cf_flush_prefetchbuf = cpufunc_nullop,
570 .cf_drain_writebuf = armv4_drain_writebuf, 570 .cf_drain_writebuf = armv4_drain_writebuf,
571 .cf_flush_brnchtgt_C = cpufunc_nullop, 571 .cf_flush_brnchtgt_C = cpufunc_nullop,
572 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 572 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
573 573
574 .cf_sleep = (void *)cpufunc_nullop, 574 .cf_sleep = (void *)cpufunc_nullop,
575 575
576 /* Soft functions */ 576 /* Soft functions */
577 577
578 .cf_dataabt_fixup = cpufunc_null_fixup, 578 .cf_dataabt_fixup = cpufunc_null_fixup,
579 .cf_prefetchabt_fixup = cpufunc_null_fixup, 579 .cf_prefetchabt_fixup = cpufunc_null_fixup,
580 580
581 .cf_context_switch = arm9_context_switch, 581 .cf_context_switch = arm9_context_switch,
582 582
583 .cf_setup = arm9_setup 583 .cf_setup = arm9_setup
584 584
585}; 585};
586#endif /* CPU_ARM9 */ 586#endif /* CPU_ARM9 */
587 587
588#if defined(CPU_ARM9E) || defined(CPU_ARM10) 588#if defined(CPU_ARM9E) || defined(CPU_ARM10)
589struct cpu_functions armv5_ec_cpufuncs = { 589struct cpu_functions armv5_ec_cpufuncs = {
590 /* CPU functions */ 590 /* CPU functions */
591 591
592 .cf_id = cpufunc_id, 592 .cf_id = cpufunc_id,
593 .cf_cpwait = cpufunc_nullop, 593 .cf_cpwait = cpufunc_nullop,
594 594
595 /* MMU functions */ 595 /* MMU functions */
596 596
597 .cf_control = cpufunc_control, 597 .cf_control = cpufunc_control,
598 .cf_domains = cpufunc_domains, 598 .cf_domains = cpufunc_domains,
599 .cf_setttb = armv5_ec_setttb, 599 .cf_setttb = armv5_ec_setttb,
600 .cf_faultstatus = cpufunc_faultstatus, 600 .cf_faultstatus = cpufunc_faultstatus,
601 .cf_faultaddress = cpufunc_faultaddress, 601 .cf_faultaddress = cpufunc_faultaddress,
602 602
603 /* TLB functions */ 603 /* TLB functions */
604 604
605 .cf_tlb_flushID = armv4_tlb_flushID, 605 .cf_tlb_flushID = armv4_tlb_flushID,
606 .cf_tlb_flushID_SE = arm10_tlb_flushID_SE, 606 .cf_tlb_flushID_SE = arm10_tlb_flushID_SE,
607 .cf_tlb_flushI = armv4_tlb_flushI, 607 .cf_tlb_flushI = armv4_tlb_flushI,
608 .cf_tlb_flushI_SE = arm10_tlb_flushI_SE, 608 .cf_tlb_flushI_SE = arm10_tlb_flushI_SE,
609 .cf_tlb_flushD = armv4_tlb_flushD, 609 .cf_tlb_flushD = armv4_tlb_flushD,
610 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE, 610 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE,
611 611
612 /* Cache operations */ 612 /* Cache operations */
613 613
614 .cf_icache_sync_all = armv5_ec_icache_sync_all, 614 .cf_icache_sync_all = armv5_ec_icache_sync_all,
615 .cf_icache_sync_range = armv5_ec_icache_sync_range, 615 .cf_icache_sync_range = armv5_ec_icache_sync_range,
616 616
617 .cf_dcache_wbinv_all = armv5_ec_dcache_wbinv_all, 617 .cf_dcache_wbinv_all = armv5_ec_dcache_wbinv_all,
618 .cf_dcache_wbinv_range = armv5_ec_dcache_wbinv_range, 618 .cf_dcache_wbinv_range = armv5_ec_dcache_wbinv_range,
619/*XXX*/ .cf_dcache_inv_range = armv5_ec_dcache_wbinv_range, 619/*XXX*/ .cf_dcache_inv_range = armv5_ec_dcache_wbinv_range,
620 .cf_dcache_wb_range = armv5_ec_dcache_wb_range, 620 .cf_dcache_wb_range = armv5_ec_dcache_wb_range,
621 621
622 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 622 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
623 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 623 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
624 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 624 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
625 625
626 .cf_idcache_wbinv_all = armv5_ec_idcache_wbinv_all, 626 .cf_idcache_wbinv_all = armv5_ec_idcache_wbinv_all,
627 .cf_idcache_wbinv_range = armv5_ec_idcache_wbinv_range, 627 .cf_idcache_wbinv_range = armv5_ec_idcache_wbinv_range,
628 628
629 /* Other functions */ 629 /* Other functions */
630 630
631 .cf_flush_prefetchbuf = cpufunc_nullop, 631 .cf_flush_prefetchbuf = cpufunc_nullop,
632 .cf_drain_writebuf = armv4_drain_writebuf, 632 .cf_drain_writebuf = armv4_drain_writebuf,
633 .cf_flush_brnchtgt_C = cpufunc_nullop, 633 .cf_flush_brnchtgt_C = cpufunc_nullop,
634 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 634 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
635 635
636 .cf_sleep = (void *)cpufunc_nullop, 636 .cf_sleep = (void *)cpufunc_nullop,
637 637
638 /* Soft functions */ 638 /* Soft functions */
639 639
640 .cf_dataabt_fixup = cpufunc_null_fixup, 640 .cf_dataabt_fixup = cpufunc_null_fixup,
641 .cf_prefetchabt_fixup = cpufunc_null_fixup, 641 .cf_prefetchabt_fixup = cpufunc_null_fixup,
642 642
643 .cf_context_switch = arm10_context_switch, 643 .cf_context_switch = arm10_context_switch,
644 644
645 .cf_setup = arm10_setup 645 .cf_setup = arm10_setup
646 646
647}; 647};
648#endif /* CPU_ARM9E || CPU_ARM10 */ 648#endif /* CPU_ARM9E || CPU_ARM10 */
649 649
650#ifdef CPU_ARM10 650#ifdef CPU_ARM10
651struct cpu_functions arm10_cpufuncs = { 651struct cpu_functions arm10_cpufuncs = {
652 /* CPU functions */ 652 /* CPU functions */
653 653
654 .cf_id = cpufunc_id, 654 .cf_id = cpufunc_id,
655 .cf_cpwait = cpufunc_nullop, 655 .cf_cpwait = cpufunc_nullop,
656 656
657 /* MMU functions */ 657 /* MMU functions */
658 658
659 .cf_control = cpufunc_control, 659 .cf_control = cpufunc_control,
660 .cf_domains = cpufunc_domains, 660 .cf_domains = cpufunc_domains,
661 .cf_setttb = armv5_setttb, 661 .cf_setttb = armv5_setttb,
662 .cf_faultstatus = cpufunc_faultstatus, 662 .cf_faultstatus = cpufunc_faultstatus,
663 .cf_faultaddress = cpufunc_faultaddress, 663 .cf_faultaddress = cpufunc_faultaddress,
664 664
665 /* TLB functions */ 665 /* TLB functions */
666 666
667 .cf_tlb_flushID = armv4_tlb_flushID, 667 .cf_tlb_flushID = armv4_tlb_flushID,
668 .cf_tlb_flushID_SE = arm10_tlb_flushID_SE, 668 .cf_tlb_flushID_SE = arm10_tlb_flushID_SE,
669 .cf_tlb_flushI = armv4_tlb_flushI, 669 .cf_tlb_flushI = armv4_tlb_flushI,
670 .cf_tlb_flushI_SE = arm10_tlb_flushI_SE, 670 .cf_tlb_flushI_SE = arm10_tlb_flushI_SE,
671 .cf_tlb_flushD = armv4_tlb_flushD, 671 .cf_tlb_flushD = armv4_tlb_flushD,
672 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE, 672 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE,
673 673
674 /* Cache operations */ 674 /* Cache operations */
675 675
676 .cf_icache_sync_all = armv5_icache_sync_all, 676 .cf_icache_sync_all = armv5_icache_sync_all,
677 .cf_icache_sync_range = armv5_icache_sync_range, 677 .cf_icache_sync_range = armv5_icache_sync_range,
678 678
679 .cf_dcache_wbinv_all = armv5_dcache_wbinv_all, 679 .cf_dcache_wbinv_all = armv5_dcache_wbinv_all,
680 .cf_dcache_wbinv_range = armv5_dcache_wbinv_range, 680 .cf_dcache_wbinv_range = armv5_dcache_wbinv_range,
681/*XXX*/ .cf_dcache_inv_range = armv5_dcache_wbinv_range, 681/*XXX*/ .cf_dcache_inv_range = armv5_dcache_wbinv_range,
682 .cf_dcache_wb_range = armv5_dcache_wb_range, 682 .cf_dcache_wb_range = armv5_dcache_wb_range,
683 683
684 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 684 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
685 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 685 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
686 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 686 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
687 687
688 .cf_idcache_wbinv_all = armv5_idcache_wbinv_all, 688 .cf_idcache_wbinv_all = armv5_idcache_wbinv_all,
689 .cf_idcache_wbinv_range = armv5_idcache_wbinv_range, 689 .cf_idcache_wbinv_range = armv5_idcache_wbinv_range,
690 690
691 /* Other functions */ 691 /* Other functions */
692 692
693 .cf_flush_prefetchbuf = cpufunc_nullop, 693 .cf_flush_prefetchbuf = cpufunc_nullop,
694 .cf_drain_writebuf = armv4_drain_writebuf, 694 .cf_drain_writebuf = armv4_drain_writebuf,
695 .cf_flush_brnchtgt_C = cpufunc_nullop, 695 .cf_flush_brnchtgt_C = cpufunc_nullop,
696 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 696 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
697 697
698 .cf_sleep = (void *)cpufunc_nullop, 698 .cf_sleep = (void *)cpufunc_nullop,
699 699
700 /* Soft functions */ 700 /* Soft functions */
701 701
702 .cf_dataabt_fixup = cpufunc_null_fixup, 702 .cf_dataabt_fixup = cpufunc_null_fixup,
703 .cf_prefetchabt_fixup = cpufunc_null_fixup, 703 .cf_prefetchabt_fixup = cpufunc_null_fixup,
704 704
705 .cf_context_switch = arm10_context_switch, 705 .cf_context_switch = arm10_context_switch,
706 706
707 .cf_setup = arm10_setup 707 .cf_setup = arm10_setup
708 708
709}; 709};
710#endif /* CPU_ARM10 */ 710#endif /* CPU_ARM10 */
711 711
712#ifdef CPU_ARM11 712#ifdef CPU_ARM11
713struct cpu_functions arm11_cpufuncs = { 713struct cpu_functions arm11_cpufuncs = {
714 /* CPU functions */ 714 /* CPU functions */
715 715
716 .cf_id = cpufunc_id, 716 .cf_id = cpufunc_id,
717 .cf_cpwait = cpufunc_nullop, 717 .cf_cpwait = cpufunc_nullop,
718 718
719 /* MMU functions */ 719 /* MMU functions */
720 720
721 .cf_control = cpufunc_control, 721 .cf_control = cpufunc_control,
722 .cf_domains = cpufunc_domains, 722 .cf_domains = cpufunc_domains,
723 .cf_setttb = arm11_setttb, 723 .cf_setttb = arm11_setttb,
724 .cf_faultstatus = cpufunc_faultstatus, 724 .cf_faultstatus = cpufunc_faultstatus,
725 .cf_faultaddress = cpufunc_faultaddress, 725 .cf_faultaddress = cpufunc_faultaddress,
726 726
727 /* TLB functions */ 727 /* TLB functions */
728 728
729 .cf_tlb_flushID = arm11_tlb_flushID, 729 .cf_tlb_flushID = arm11_tlb_flushID,
730 .cf_tlb_flushID_SE = arm11_tlb_flushID_SE, 730 .cf_tlb_flushID_SE = arm11_tlb_flushID_SE,
731 .cf_tlb_flushI = arm11_tlb_flushI, 731 .cf_tlb_flushI = arm11_tlb_flushI,
732 .cf_tlb_flushI_SE = arm11_tlb_flushI_SE, 732 .cf_tlb_flushI_SE = arm11_tlb_flushI_SE,
733 .cf_tlb_flushD = arm11_tlb_flushD, 733 .cf_tlb_flushD = arm11_tlb_flushD,
734 .cf_tlb_flushD_SE = arm11_tlb_flushD_SE, 734 .cf_tlb_flushD_SE = arm11_tlb_flushD_SE,
735 735
736 /* Cache operations */ 736 /* Cache operations */
737 737
738 .cf_icache_sync_all = armv6_icache_sync_all, 738 .cf_icache_sync_all = armv6_icache_sync_all,
739 .cf_icache_sync_range = armv6_icache_sync_range, 739 .cf_icache_sync_range = armv6_icache_sync_range,
740 740
741 .cf_dcache_wbinv_all = armv6_dcache_wbinv_all, 741 .cf_dcache_wbinv_all = armv6_dcache_wbinv_all,
742 .cf_dcache_wbinv_range = armv6_dcache_wbinv_range, 742 .cf_dcache_wbinv_range = armv6_dcache_wbinv_range,
743 .cf_dcache_inv_range = armv6_dcache_inv_range, 743 .cf_dcache_inv_range = armv6_dcache_inv_range,
744 .cf_dcache_wb_range = armv6_dcache_wb_range, 744 .cf_dcache_wb_range = armv6_dcache_wb_range,
745 745
746 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 746 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
747 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 747 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
748 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 748 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
749 749
750 .cf_idcache_wbinv_all = armv6_idcache_wbinv_all, 750 .cf_idcache_wbinv_all = armv6_idcache_wbinv_all,
751 .cf_idcache_wbinv_range = armv6_idcache_wbinv_range, 751 .cf_idcache_wbinv_range = armv6_idcache_wbinv_range,
752 752
753 /* Other functions */ 753 /* Other functions */
754 754
755 .cf_flush_prefetchbuf = cpufunc_nullop, 755 .cf_flush_prefetchbuf = cpufunc_nullop,
756 .cf_drain_writebuf = arm11_drain_writebuf, 756 .cf_drain_writebuf = arm11_drain_writebuf,
757 .cf_flush_brnchtgt_C = cpufunc_nullop, 757 .cf_flush_brnchtgt_C = cpufunc_nullop,
758 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 758 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
759 759
760 .cf_sleep = arm11_sleep, 760 .cf_sleep = arm11_sleep,
761 761
762 /* Soft functions */ 762 /* Soft functions */
763 763
764 .cf_dataabt_fixup = cpufunc_null_fixup, 764 .cf_dataabt_fixup = cpufunc_null_fixup,
765 .cf_prefetchabt_fixup = cpufunc_null_fixup, 765 .cf_prefetchabt_fixup = cpufunc_null_fixup,
766 766
767 .cf_context_switch = arm11_context_switch, 767 .cf_context_switch = arm11_context_switch,
768 768
769 .cf_setup = arm11_setup 769 .cf_setup = arm11_setup
770 770
771}; 771};
772#endif /* CPU_ARM11 */ 772#endif /* CPU_ARM11 */
773 773
774#ifdef CPU_ARM1136 774#ifdef CPU_ARM1136
775struct cpu_functions arm1136_cpufuncs = { 775struct cpu_functions arm1136_cpufuncs = {
776 /* CPU functions */ 776 /* CPU functions */
777 777
778 .cf_id = cpufunc_id, 778 .cf_id = cpufunc_id,
779 .cf_cpwait = cpufunc_nullop, 779 .cf_cpwait = cpufunc_nullop,
780 780
781 /* MMU functions */ 781 /* MMU functions */
782 782
783 .cf_control = cpufunc_control, 783 .cf_control = cpufunc_control,
784 .cf_domains = cpufunc_domains, 784 .cf_domains = cpufunc_domains,
785 .cf_setttb = arm11x6_setttb, 785 .cf_setttb = arm11x6_setttb,
786 .cf_faultstatus = cpufunc_faultstatus, 786 .cf_faultstatus = cpufunc_faultstatus,
787 .cf_faultaddress = cpufunc_faultaddress, 787 .cf_faultaddress = cpufunc_faultaddress,
788 788
789 /* TLB functions */ 789 /* TLB functions */
790 790
791 .cf_tlb_flushID = arm11_tlb_flushID, 791 .cf_tlb_flushID = arm11_tlb_flushID,
792 .cf_tlb_flushID_SE = arm11_tlb_flushID_SE, 792 .cf_tlb_flushID_SE = arm11_tlb_flushID_SE,
793 .cf_tlb_flushI = arm11_tlb_flushI, 793 .cf_tlb_flushI = arm11_tlb_flushI,
794 .cf_tlb_flushI_SE = arm11_tlb_flushI_SE, 794 .cf_tlb_flushI_SE = arm11_tlb_flushI_SE,
795 .cf_tlb_flushD = arm11_tlb_flushD, 795 .cf_tlb_flushD = arm11_tlb_flushD,
796 .cf_tlb_flushD_SE = arm11_tlb_flushD_SE, 796 .cf_tlb_flushD_SE = arm11_tlb_flushD_SE,
797 797
798 /* Cache operations */ 798 /* Cache operations */
799 799
800 .cf_icache_sync_all = arm11x6_icache_sync_all, /* 411920 */ 800 .cf_icache_sync_all = arm11x6_icache_sync_all, /* 411920 */
801 .cf_icache_sync_range = arm11x6_icache_sync_range, /* 371025 */ 801 .cf_icache_sync_range = arm11x6_icache_sync_range, /* 371025 */
802 802
803 .cf_dcache_wbinv_all = arm11x6_dcache_wbinv_all, /* 411920 */ 803 .cf_dcache_wbinv_all = arm11x6_dcache_wbinv_all, /* 411920 */
804 .cf_dcache_wbinv_range = armv6_dcache_wbinv_range, 804 .cf_dcache_wbinv_range = armv6_dcache_wbinv_range,
805 .cf_dcache_inv_range = armv6_dcache_inv_range, 805 .cf_dcache_inv_range = armv6_dcache_inv_range,
806 .cf_dcache_wb_range = armv6_dcache_wb_range, 806 .cf_dcache_wb_range = armv6_dcache_wb_range,
807 807
808 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 808 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
809 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 809 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
810 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 810 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
811 811
812 .cf_idcache_wbinv_all = arm11x6_idcache_wbinv_all, /* 411920 */ 812 .cf_idcache_wbinv_all = arm11x6_idcache_wbinv_all, /* 411920 */
813 .cf_idcache_wbinv_range = arm11x6_idcache_wbinv_range, /* 371025 */ 813 .cf_idcache_wbinv_range = arm11x6_idcache_wbinv_range, /* 371025 */
814 814
815 /* Other functions */ 815 /* Other functions */
816 816
817 .cf_flush_prefetchbuf = arm11x6_flush_prefetchbuf, 817 .cf_flush_prefetchbuf = arm11x6_flush_prefetchbuf,
818 .cf_drain_writebuf = arm11_drain_writebuf, 818 .cf_drain_writebuf = arm11_drain_writebuf,
819 .cf_flush_brnchtgt_C = cpufunc_nullop, 819 .cf_flush_brnchtgt_C = cpufunc_nullop,
820 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 820 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
821 821
822 .cf_sleep = arm11_sleep, /* arm1136_sleep_rev0 */ 822 .cf_sleep = arm11_sleep, /* arm1136_sleep_rev0 */
823 823
824 /* Soft functions */ 824 /* Soft functions */
825 825
826 .cf_dataabt_fixup = cpufunc_null_fixup, 826 .cf_dataabt_fixup = cpufunc_null_fixup,
827 .cf_prefetchabt_fixup = cpufunc_null_fixup, 827 .cf_prefetchabt_fixup = cpufunc_null_fixup,
828 828
829 .cf_context_switch = arm11_context_switch, 829 .cf_context_switch = arm11_context_switch,
830 830
831 .cf_setup = arm11x6_setup 831 .cf_setup = arm11x6_setup
832 832
833}; 833};
834#endif /* CPU_ARM1136 */ 834#endif /* CPU_ARM1136 */
835 835
836#ifdef CPU_ARM1176 836#ifdef CPU_ARM1176
837struct cpu_functions arm1176_cpufuncs = { 837struct cpu_functions arm1176_cpufuncs = {
838 /* CPU functions */ 838 /* CPU functions */
839 839
840 .cf_id = cpufunc_id, 840 .cf_id = cpufunc_id,
841 .cf_cpwait = cpufunc_nullop, 841 .cf_cpwait = cpufunc_nullop,
842 842
843 /* MMU functions */ 843 /* MMU functions */
844 844
845 .cf_control = cpufunc_control, 845 .cf_control = cpufunc_control,
846 .cf_domains = cpufunc_domains, 846 .cf_domains = cpufunc_domains,
847 .cf_setttb = arm11x6_setttb, 847 .cf_setttb = arm11x6_setttb,
848 .cf_faultstatus = cpufunc_faultstatus, 848 .cf_faultstatus = cpufunc_faultstatus,
849 .cf_faultaddress = cpufunc_faultaddress, 849 .cf_faultaddress = cpufunc_faultaddress,
850 850
851 /* TLB functions */ 851 /* TLB functions */
852 852
853 .cf_tlb_flushID = arm11_tlb_flushID, 853 .cf_tlb_flushID = arm11_tlb_flushID,
854 .cf_tlb_flushID_SE = arm11_tlb_flushID_SE, 854 .cf_tlb_flushID_SE = arm11_tlb_flushID_SE,
855 .cf_tlb_flushI = arm11_tlb_flushI, 855 .cf_tlb_flushI = arm11_tlb_flushI,
856 .cf_tlb_flushI_SE = arm11_tlb_flushI_SE, 856 .cf_tlb_flushI_SE = arm11_tlb_flushI_SE,
857 .cf_tlb_flushD = arm11_tlb_flushD, 857 .cf_tlb_flushD = arm11_tlb_flushD,
858 .cf_tlb_flushD_SE = arm11_tlb_flushD_SE, 858 .cf_tlb_flushD_SE = arm11_tlb_flushD_SE,
859 859
860 /* Cache operations */ 860 /* Cache operations */
861 861
862 .cf_icache_sync_all = arm11x6_icache_sync_all, /* 415045 */ 862 .cf_icache_sync_all = arm11x6_icache_sync_all, /* 415045 */
863 .cf_icache_sync_range = arm11x6_icache_sync_range, /* 371367 */ 863 .cf_icache_sync_range = arm11x6_icache_sync_range, /* 371367 */
864 864
865 .cf_dcache_wbinv_all = arm11x6_dcache_wbinv_all, /* 415045 */ 865 .cf_dcache_wbinv_all = arm11x6_dcache_wbinv_all, /* 415045 */
866 .cf_dcache_wbinv_range = armv6_dcache_wbinv_range, 866 .cf_dcache_wbinv_range = armv6_dcache_wbinv_range,
867 .cf_dcache_inv_range = armv6_dcache_inv_range, 867 .cf_dcache_inv_range = armv6_dcache_inv_range,
868 .cf_dcache_wb_range = armv6_dcache_wb_range, 868 .cf_dcache_wb_range = armv6_dcache_wb_range,
869 869
870 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 870 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
871 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 871 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
872 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 872 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
873 873
874 .cf_idcache_wbinv_all = arm11x6_idcache_wbinv_all, /* 415045 */ 874 .cf_idcache_wbinv_all = arm11x6_idcache_wbinv_all, /* 415045 */
875 .cf_idcache_wbinv_range = arm11x6_idcache_wbinv_range, /* 371367 */ 875 .cf_idcache_wbinv_range = arm11x6_idcache_wbinv_range, /* 371367 */
876 876
877 /* Other functions */ 877 /* Other functions */
878 878
879 .cf_flush_prefetchbuf = arm11x6_flush_prefetchbuf, 879 .cf_flush_prefetchbuf = arm11x6_flush_prefetchbuf,
880 .cf_drain_writebuf = arm11_drain_writebuf, 880 .cf_drain_writebuf = arm11_drain_writebuf,
881 .cf_flush_brnchtgt_C = cpufunc_nullop, 881 .cf_flush_brnchtgt_C = cpufunc_nullop,
882 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 882 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
883 883
884 .cf_sleep = arm11x6_sleep, /* no ref. */ 884 .cf_sleep = arm11x6_sleep, /* no ref. */
885 885
886 /* Soft functions */ 886 /* Soft functions */
887 887
888 .cf_dataabt_fixup = cpufunc_null_fixup, 888 .cf_dataabt_fixup = cpufunc_null_fixup,
889 .cf_prefetchabt_fixup = cpufunc_null_fixup, 889 .cf_prefetchabt_fixup = cpufunc_null_fixup,
890 890
891 .cf_context_switch = arm11_context_switch, 891 .cf_context_switch = arm11_context_switch,
892 892
893 .cf_setup = arm11x6_setup 893 .cf_setup = arm11x6_setup
894 894
895}; 895};
896#endif /* CPU_ARM1176 */ 896#endif /* CPU_ARM1176 */
897 897
898 898
899#ifdef CPU_ARM11MPCORE 899#ifdef CPU_ARM11MPCORE
900struct cpu_functions arm11mpcore_cpufuncs = { 900struct cpu_functions arm11mpcore_cpufuncs = {
901 /* CPU functions */ 901 /* CPU functions */
902 902
903 .cf_id = cpufunc_id, 903 .cf_id = cpufunc_id,
904 .cf_cpwait = cpufunc_nullop, 904 .cf_cpwait = cpufunc_nullop,
905 905
906 /* MMU functions */ 906 /* MMU functions */
907 907
908 .cf_control = cpufunc_control, 908 .cf_control = cpufunc_control,
909 .cf_domains = cpufunc_domains, 909 .cf_domains = cpufunc_domains,
910 .cf_setttb = arm11_setttb, 910 .cf_setttb = arm11_setttb,
911 .cf_faultstatus = cpufunc_faultstatus, 911 .cf_faultstatus = cpufunc_faultstatus,
912 .cf_faultaddress = cpufunc_faultaddress, 912 .cf_faultaddress = cpufunc_faultaddress,
913 913
914 /* TLB functions */ 914 /* TLB functions */
915 915
916 .cf_tlb_flushID = arm11_tlb_flushID, 916 .cf_tlb_flushID = arm11_tlb_flushID,
917 .cf_tlb_flushID_SE = arm11_tlb_flushID_SE, 917 .cf_tlb_flushID_SE = arm11_tlb_flushID_SE,
918 .cf_tlb_flushI = arm11_tlb_flushI, 918 .cf_tlb_flushI = arm11_tlb_flushI,
919 .cf_tlb_flushI_SE = arm11_tlb_flushI_SE, 919 .cf_tlb_flushI_SE = arm11_tlb_flushI_SE,
920 .cf_tlb_flushD = arm11_tlb_flushD, 920 .cf_tlb_flushD = arm11_tlb_flushD,
921 .cf_tlb_flushD_SE = arm11_tlb_flushD_SE, 921 .cf_tlb_flushD_SE = arm11_tlb_flushD_SE,
922 922
923 /* Cache operations */ 923 /* Cache operations */
924 924
925 .cf_icache_sync_all = armv6_icache_sync_all, 925 .cf_icache_sync_all = armv6_icache_sync_all,
926 .cf_icache_sync_range = armv5_icache_sync_range, 926 .cf_icache_sync_range = armv5_icache_sync_range,
927 927
928 .cf_dcache_wbinv_all = armv6_dcache_wbinv_all, 928 .cf_dcache_wbinv_all = armv6_dcache_wbinv_all,
929 .cf_dcache_wbinv_range = armv5_dcache_wbinv_range, 929 .cf_dcache_wbinv_range = armv5_dcache_wbinv_range,
930 .cf_dcache_inv_range = armv5_dcache_inv_range, 930 .cf_dcache_inv_range = armv5_dcache_inv_range,
931 .cf_dcache_wb_range = armv5_dcache_wb_range, 931 .cf_dcache_wb_range = armv5_dcache_wb_range,
932 932
933 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 933 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
934 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 934 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
935 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 935 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
936 936
937 .cf_idcache_wbinv_all = armv6_idcache_wbinv_all, 937 .cf_idcache_wbinv_all = armv6_idcache_wbinv_all,
938 .cf_idcache_wbinv_range = armv5_idcache_wbinv_range, 938 .cf_idcache_wbinv_range = armv5_idcache_wbinv_range,
939 939
940 /* Other functions */ 940 /* Other functions */
941 941
942 .cf_flush_prefetchbuf = cpufunc_nullop, 942 .cf_flush_prefetchbuf = cpufunc_nullop,
943 .cf_drain_writebuf = arm11_drain_writebuf, 943 .cf_drain_writebuf = arm11_drain_writebuf,
944 .cf_flush_brnchtgt_C = cpufunc_nullop, 944 .cf_flush_brnchtgt_C = cpufunc_nullop,
945 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 945 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
946 946
947 .cf_sleep = arm11_sleep, 947 .cf_sleep = arm11_sleep,
948 948
949 /* Soft functions */ 949 /* Soft functions */
950 950
951 .cf_dataabt_fixup = cpufunc_null_fixup, 951 .cf_dataabt_fixup = cpufunc_null_fixup,
952 .cf_prefetchabt_fixup = cpufunc_null_fixup, 952 .cf_prefetchabt_fixup = cpufunc_null_fixup,
953 953
954 .cf_context_switch = arm11_context_switch, 954 .cf_context_switch = arm11_context_switch,
955 955
956 .cf_setup = arm11mpcore_setup 956 .cf_setup = arm11mpcore_setup
957 957
958}; 958};
959#endif /* CPU_ARM11MPCORE */ 959#endif /* CPU_ARM11MPCORE */
960 960
961#ifdef CPU_SA110 961#ifdef CPU_SA110
962struct cpu_functions sa110_cpufuncs = { 962struct cpu_functions sa110_cpufuncs = {
963 /* CPU functions */ 963 /* CPU functions */
964 964
965 .cf_id = cpufunc_id, 965 .cf_id = cpufunc_id,
966 .cf_cpwait = cpufunc_nullop, 966 .cf_cpwait = cpufunc_nullop,
967 967
968 /* MMU functions */ 968 /* MMU functions */
969 969
970 .cf_control = cpufunc_control, 970 .cf_control = cpufunc_control,
971 .cf_domains = cpufunc_domains, 971 .cf_domains = cpufunc_domains,
972 .cf_setttb = sa1_setttb, 972 .cf_setttb = sa1_setttb,
973 .cf_faultstatus = cpufunc_faultstatus, 973 .cf_faultstatus = cpufunc_faultstatus,
974 .cf_faultaddress = cpufunc_faultaddress, 974 .cf_faultaddress = cpufunc_faultaddress,
975 975
976 /* TLB functions */ 976 /* TLB functions */
977 977
978 .cf_tlb_flushID = armv4_tlb_flushID, 978 .cf_tlb_flushID = armv4_tlb_flushID,
979 .cf_tlb_flushID_SE = sa1_tlb_flushID_SE, 979 .cf_tlb_flushID_SE = sa1_tlb_flushID_SE,
980 .cf_tlb_flushI = armv4_tlb_flushI, 980 .cf_tlb_flushI = armv4_tlb_flushI,
981 .cf_tlb_flushI_SE = (void *)armv4_tlb_flushI, 981 .cf_tlb_flushI_SE = (void *)armv4_tlb_flushI,
982 .cf_tlb_flushD = armv4_tlb_flushD, 982 .cf_tlb_flushD = armv4_tlb_flushD,
983 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE, 983 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE,
984 984
985 /* Cache operations */ 985 /* Cache operations */
986 986
987 .cf_icache_sync_all = sa1_cache_syncI, 987 .cf_icache_sync_all = sa1_cache_syncI,
988 .cf_icache_sync_range = sa1_cache_syncI_rng, 988 .cf_icache_sync_range = sa1_cache_syncI_rng,
989 989
990 .cf_dcache_wbinv_all = sa1_cache_purgeD, 990 .cf_dcache_wbinv_all = sa1_cache_purgeD,
991 .cf_dcache_wbinv_range = sa1_cache_purgeD_rng, 991 .cf_dcache_wbinv_range = sa1_cache_purgeD_rng,
992/*XXX*/ .cf_dcache_inv_range = sa1_cache_purgeD_rng, 992/*XXX*/ .cf_dcache_inv_range = sa1_cache_purgeD_rng,
993 .cf_dcache_wb_range = sa1_cache_cleanD_rng, 993 .cf_dcache_wb_range = sa1_cache_cleanD_rng,
994 994
995 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 995 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
996 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 996 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
997 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 997 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
998 998
999 .cf_idcache_wbinv_all = sa1_cache_purgeID, 999 .cf_idcache_wbinv_all = sa1_cache_purgeID,
1000 .cf_idcache_wbinv_range = sa1_cache_purgeID_rng, 1000 .cf_idcache_wbinv_range = sa1_cache_purgeID_rng,
1001 1001
1002 /* Other functions */ 1002 /* Other functions */
1003 1003
1004 .cf_flush_prefetchbuf = cpufunc_nullop, 1004 .cf_flush_prefetchbuf = cpufunc_nullop,
1005 .cf_drain_writebuf = armv4_drain_writebuf, 1005 .cf_drain_writebuf = armv4_drain_writebuf,
1006 .cf_flush_brnchtgt_C = cpufunc_nullop, 1006 .cf_flush_brnchtgt_C = cpufunc_nullop,
1007 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 1007 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
1008 1008
1009 .cf_sleep = (void *)cpufunc_nullop, 1009 .cf_sleep = (void *)cpufunc_nullop,
1010 1010
1011 /* Soft functions */ 1011 /* Soft functions */
1012 1012
1013 .cf_dataabt_fixup = cpufunc_null_fixup, 1013 .cf_dataabt_fixup = cpufunc_null_fixup,
1014 .cf_prefetchabt_fixup = cpufunc_null_fixup, 1014 .cf_prefetchabt_fixup = cpufunc_null_fixup,
1015 1015
1016 .cf_context_switch = sa110_context_switch, 1016 .cf_context_switch = sa110_context_switch,
1017 1017
1018 .cf_setup = sa110_setup 1018 .cf_setup = sa110_setup
1019}; 1019};
1020#endif /* CPU_SA110 */ 1020#endif /* CPU_SA110 */
1021 1021
1022#if defined(CPU_SA1100) || defined(CPU_SA1110) 1022#if defined(CPU_SA1100) || defined(CPU_SA1110)
1023struct cpu_functions sa11x0_cpufuncs = { 1023struct cpu_functions sa11x0_cpufuncs = {
1024 /* CPU functions */ 1024 /* CPU functions */
1025 1025
1026 .cf_id = cpufunc_id, 1026 .cf_id = cpufunc_id,
1027 .cf_cpwait = cpufunc_nullop, 1027 .cf_cpwait = cpufunc_nullop,
1028 1028
1029 /* MMU functions */ 1029 /* MMU functions */
1030 1030
1031 .cf_control = cpufunc_control, 1031 .cf_control = cpufunc_control,
1032 .cf_domains = cpufunc_domains, 1032 .cf_domains = cpufunc_domains,
1033 .cf_setttb = sa1_setttb, 1033 .cf_setttb = sa1_setttb,
1034 .cf_faultstatus = cpufunc_faultstatus, 1034 .cf_faultstatus = cpufunc_faultstatus,
1035 .cf_faultaddress = cpufunc_faultaddress, 1035 .cf_faultaddress = cpufunc_faultaddress,
1036 1036
1037 /* TLB functions */ 1037 /* TLB functions */
1038 1038
1039 .cf_tlb_flushID = armv4_tlb_flushID, 1039 .cf_tlb_flushID = armv4_tlb_flushID,
1040 .cf_tlb_flushID_SE = sa1_tlb_flushID_SE, 1040 .cf_tlb_flushID_SE = sa1_tlb_flushID_SE,
1041 .cf_tlb_flushI = armv4_tlb_flushI, 1041 .cf_tlb_flushI = armv4_tlb_flushI,
1042 .cf_tlb_flushI_SE = (void *)armv4_tlb_flushI, 1042 .cf_tlb_flushI_SE = (void *)armv4_tlb_flushI,
1043 .cf_tlb_flushD = armv4_tlb_flushD, 1043 .cf_tlb_flushD = armv4_tlb_flushD,
1044 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE, 1044 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE,
1045 1045
1046 /* Cache operations */ 1046 /* Cache operations */
1047 1047
1048 .cf_icache_sync_all = sa1_cache_syncI, 1048 .cf_icache_sync_all = sa1_cache_syncI,
1049 .cf_icache_sync_range = sa1_cache_syncI_rng, 1049 .cf_icache_sync_range = sa1_cache_syncI_rng,
1050 1050
1051 .cf_dcache_wbinv_all = sa1_cache_purgeD, 1051 .cf_dcache_wbinv_all = sa1_cache_purgeD,
1052 .cf_dcache_wbinv_range = sa1_cache_purgeD_rng, 1052 .cf_dcache_wbinv_range = sa1_cache_purgeD_rng,
1053/*XXX*/ .cf_dcache_inv_range = sa1_cache_purgeD_rng, 1053/*XXX*/ .cf_dcache_inv_range = sa1_cache_purgeD_rng,
1054 .cf_dcache_wb_range = sa1_cache_cleanD_rng, 1054 .cf_dcache_wb_range = sa1_cache_cleanD_rng,
1055 1055
1056 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 1056 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
1057 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 1057 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
1058 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 1058 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
1059 1059
1060 .cf_idcache_wbinv_all = sa1_cache_purgeID, 1060 .cf_idcache_wbinv_all = sa1_cache_purgeID,
1061 .cf_idcache_wbinv_range = sa1_cache_purgeID_rng, 1061 .cf_idcache_wbinv_range = sa1_cache_purgeID_rng,
1062 1062
1063 /* Other functions */ 1063 /* Other functions */
1064 1064
1065 .cf_flush_prefetchbuf = sa11x0_drain_readbuf, 1065 .cf_flush_prefetchbuf = sa11x0_drain_readbuf,
1066 .cf_drain_writebuf = armv4_drain_writebuf, 1066 .cf_drain_writebuf = armv4_drain_writebuf,
1067 .cf_flush_brnchtgt_C = cpufunc_nullop, 1067 .cf_flush_brnchtgt_C = cpufunc_nullop,
1068 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 1068 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
1069 1069
1070 .cf_sleep = sa11x0_cpu_sleep, 1070 .cf_sleep = sa11x0_cpu_sleep,
1071 1071
1072 /* Soft functions */ 1072 /* Soft functions */
1073 1073
1074 .cf_dataabt_fixup = cpufunc_null_fixup, 1074 .cf_dataabt_fixup = cpufunc_null_fixup,
1075 .cf_prefetchabt_fixup = cpufunc_null_fixup, 1075 .cf_prefetchabt_fixup = cpufunc_null_fixup,
1076 1076
1077 .cf_context_switch = sa11x0_context_switch, 1077 .cf_context_switch = sa11x0_context_switch,
1078 1078
1079 .cf_setup = sa11x0_setup 1079 .cf_setup = sa11x0_setup
1080}; 1080};
1081#endif /* CPU_SA1100 || CPU_SA1110 */ 1081#endif /* CPU_SA1100 || CPU_SA1110 */
1082 1082
1083#if defined(CPU_FA526) 1083#if defined(CPU_FA526)
1084struct cpu_functions fa526_cpufuncs = { 1084struct cpu_functions fa526_cpufuncs = {
1085 /* CPU functions */ 1085 /* CPU functions */
1086 1086
1087 .cf_id = cpufunc_id, 1087 .cf_id = cpufunc_id,
1088 .cf_cpwait = cpufunc_nullop, 1088 .cf_cpwait = cpufunc_nullop,
1089 1089
1090 /* MMU functions */ 1090 /* MMU functions */
1091 1091
1092 .cf_control = cpufunc_control, 1092 .cf_control = cpufunc_control,
1093 .cf_domains = cpufunc_domains, 1093 .cf_domains = cpufunc_domains,
1094 .cf_setttb = fa526_setttb, 1094 .cf_setttb = fa526_setttb,
1095 .cf_faultstatus = cpufunc_faultstatus, 1095 .cf_faultstatus = cpufunc_faultstatus,
1096 .cf_faultaddress = cpufunc_faultaddress, 1096 .cf_faultaddress = cpufunc_faultaddress,
1097 1097
1098 /* TLB functions */ 1098 /* TLB functions */
1099 1099
1100 .cf_tlb_flushID = armv4_tlb_flushID, 1100 .cf_tlb_flushID = armv4_tlb_flushID,
1101 .cf_tlb_flushID_SE = fa526_tlb_flushID_SE, 1101 .cf_tlb_flushID_SE = fa526_tlb_flushID_SE,
1102 .cf_tlb_flushI = armv4_tlb_flushI, 1102 .cf_tlb_flushI = armv4_tlb_flushI,
1103 .cf_tlb_flushI_SE = fa526_tlb_flushI_SE, 1103 .cf_tlb_flushI_SE = fa526_tlb_flushI_SE,
1104 .cf_tlb_flushD = armv4_tlb_flushD, 1104 .cf_tlb_flushD = armv4_tlb_flushD,
1105 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE, 1105 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE,
1106 1106
1107 /* Cache operations */ 1107 /* Cache operations */
1108 1108
1109 .cf_icache_sync_all = fa526_icache_sync_all, 1109 .cf_icache_sync_all = fa526_icache_sync_all,
1110 .cf_icache_sync_range = fa526_icache_sync_range, 1110 .cf_icache_sync_range = fa526_icache_sync_range,
1111 1111
1112 .cf_dcache_wbinv_all = fa526_dcache_wbinv_all, 1112 .cf_dcache_wbinv_all = fa526_dcache_wbinv_all,
1113 .cf_dcache_wbinv_range = fa526_dcache_wbinv_range, 1113 .cf_dcache_wbinv_range = fa526_dcache_wbinv_range,
1114 .cf_dcache_inv_range = fa526_dcache_inv_range, 1114 .cf_dcache_inv_range = fa526_dcache_inv_range,
1115 .cf_dcache_wb_range = fa526_dcache_wb_range, 1115 .cf_dcache_wb_range = fa526_dcache_wb_range,
1116 1116
1117 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 1117 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
1118 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 1118 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
1119 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 1119 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
1120 1120
1121 .cf_idcache_wbinv_all = fa526_idcache_wbinv_all, 1121 .cf_idcache_wbinv_all = fa526_idcache_wbinv_all,
1122 .cf_idcache_wbinv_range = fa526_idcache_wbinv_range, 1122 .cf_idcache_wbinv_range = fa526_idcache_wbinv_range,
1123 1123
1124 /* Other functions */ 1124 /* Other functions */
1125 1125
1126 .cf_flush_prefetchbuf = fa526_flush_prefetchbuf, 1126 .cf_flush_prefetchbuf = fa526_flush_prefetchbuf,
1127 .cf_drain_writebuf = armv4_drain_writebuf, 1127 .cf_drain_writebuf = armv4_drain_writebuf,
1128 .cf_flush_brnchtgt_C = cpufunc_nullop, 1128 .cf_flush_brnchtgt_C = cpufunc_nullop,
1129 .cf_flush_brnchtgt_E = fa526_flush_brnchtgt_E, 1129 .cf_flush_brnchtgt_E = fa526_flush_brnchtgt_E,
1130 1130
1131 .cf_sleep = fa526_cpu_sleep, 1131 .cf_sleep = fa526_cpu_sleep,
1132 1132
1133 /* Soft functions */ 1133 /* Soft functions */
1134 1134
1135 .cf_dataabt_fixup = cpufunc_null_fixup, 1135 .cf_dataabt_fixup = cpufunc_null_fixup,
1136 .cf_prefetchabt_fixup = cpufunc_null_fixup, 1136 .cf_prefetchabt_fixup = cpufunc_null_fixup,
1137 1137
1138 .cf_context_switch = fa526_context_switch, 1138 .cf_context_switch = fa526_context_switch,
1139 1139
1140 .cf_setup = fa526_setup 1140 .cf_setup = fa526_setup
1141}; 1141};
1142#endif /* CPU_FA526 */ 1142#endif /* CPU_FA526 */
1143 1143
1144#ifdef CPU_IXP12X0 1144#ifdef CPU_IXP12X0
1145struct cpu_functions ixp12x0_cpufuncs = { 1145struct cpu_functions ixp12x0_cpufuncs = {
1146 /* CPU functions */ 1146 /* CPU functions */
1147 1147
1148 .cf_id = cpufunc_id, 1148 .cf_id = cpufunc_id,
1149 .cf_cpwait = cpufunc_nullop, 1149 .cf_cpwait = cpufunc_nullop,
1150 1150
1151 /* MMU functions */ 1151 /* MMU functions */
1152 1152
1153 .cf_control = cpufunc_control, 1153 .cf_control = cpufunc_control,
1154 .cf_domains = cpufunc_domains, 1154 .cf_domains = cpufunc_domains,
1155 .cf_setttb = sa1_setttb, 1155 .cf_setttb = sa1_setttb,
1156 .cf_faultstatus = cpufunc_faultstatus, 1156 .cf_faultstatus = cpufunc_faultstatus,
1157 .cf_faultaddress = cpufunc_faultaddress, 1157 .cf_faultaddress = cpufunc_faultaddress,
1158 1158
1159 /* TLB functions */ 1159 /* TLB functions */
1160 1160
1161 .cf_tlb_flushID = armv4_tlb_flushID, 1161 .cf_tlb_flushID = armv4_tlb_flushID,
1162 .cf_tlb_flushID_SE = sa1_tlb_flushID_SE, 1162 .cf_tlb_flushID_SE = sa1_tlb_flushID_SE,
1163 .cf_tlb_flushI = armv4_tlb_flushI, 1163 .cf_tlb_flushI = armv4_tlb_flushI,
1164 .cf_tlb_flushI_SE = (void *)armv4_tlb_flushI, 1164 .cf_tlb_flushI_SE = (void *)armv4_tlb_flushI,
1165 .cf_tlb_flushD = armv4_tlb_flushD, 1165 .cf_tlb_flushD = armv4_tlb_flushD,
1166 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE, 1166 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE,
1167 1167
1168 /* Cache operations */ 1168 /* Cache operations */
1169 1169
1170 .cf_icache_sync_all = sa1_cache_syncI, 1170 .cf_icache_sync_all = sa1_cache_syncI,
1171 .cf_icache_sync_range = sa1_cache_syncI_rng, 1171 .cf_icache_sync_range = sa1_cache_syncI_rng,
1172 1172
1173 .cf_dcache_wbinv_all = sa1_cache_purgeD, 1173 .cf_dcache_wbinv_all = sa1_cache_purgeD,
1174 .cf_dcache_wbinv_range = sa1_cache_purgeD_rng, 1174 .cf_dcache_wbinv_range = sa1_cache_purgeD_rng,
1175/*XXX*/ .cf_dcache_inv_range = sa1_cache_purgeD_rng, 1175/*XXX*/ .cf_dcache_inv_range = sa1_cache_purgeD_rng,
1176 .cf_dcache_wb_range = sa1_cache_cleanD_rng, 1176 .cf_dcache_wb_range = sa1_cache_cleanD_rng,
1177 1177
1178 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 1178 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
1179 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 1179 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
1180 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 1180 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
1181 1181
1182 .cf_idcache_wbinv_all = sa1_cache_purgeID, 1182 .cf_idcache_wbinv_all = sa1_cache_purgeID,
1183 .cf_idcache_wbinv_range = sa1_cache_purgeID_rng, 1183 .cf_idcache_wbinv_range = sa1_cache_purgeID_rng,
1184 1184
1185 /* Other functions */ 1185 /* Other functions */
1186 1186
1187 .cf_flush_prefetchbuf = ixp12x0_drain_readbuf, 1187 .cf_flush_prefetchbuf = ixp12x0_drain_readbuf,
1188 .cf_drain_writebuf = armv4_drain_writebuf, 1188 .cf_drain_writebuf = armv4_drain_writebuf,
1189 .cf_flush_brnchtgt_C = cpufunc_nullop, 1189 .cf_flush_brnchtgt_C = cpufunc_nullop,
1190 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 1190 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
1191 1191
1192 .cf_sleep = (void *)cpufunc_nullop, 1192 .cf_sleep = (void *)cpufunc_nullop,
1193 1193
1194 /* Soft functions */ 1194 /* Soft functions */
1195 1195
1196 .cf_dataabt_fixup = cpufunc_null_fixup, 1196 .cf_dataabt_fixup = cpufunc_null_fixup,
1197 .cf_prefetchabt_fixup = cpufunc_null_fixup, 1197 .cf_prefetchabt_fixup = cpufunc_null_fixup,
1198 1198
1199 .cf_context_switch = ixp12x0_context_switch, 1199 .cf_context_switch = ixp12x0_context_switch,
1200 1200
1201 .cf_setup = ixp12x0_setup 1201 .cf_setup = ixp12x0_setup
1202}; 1202};
1203#endif /* CPU_IXP12X0 */ 1203#endif /* CPU_IXP12X0 */
1204 1204
1205#if defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \ 1205#if defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
1206 defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) 1206 defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425)
1207struct cpu_functions xscale_cpufuncs = { 1207struct cpu_functions xscale_cpufuncs = {
1208 /* CPU functions */ 1208 /* CPU functions */
1209 1209
1210 .cf_id = cpufunc_id, 1210 .cf_id = cpufunc_id,
1211 .cf_cpwait = xscale_cpwait, 1211 .cf_cpwait = xscale_cpwait,
1212 1212
1213 /* MMU functions */ 1213 /* MMU functions */
1214 1214
1215 .cf_control = xscale_control, 1215 .cf_control = xscale_control,
1216 .cf_domains = cpufunc_domains, 1216 .cf_domains = cpufunc_domains,
1217 .cf_setttb = xscale_setttb, 1217 .cf_setttb = xscale_setttb,
1218 .cf_faultstatus = cpufunc_faultstatus, 1218 .cf_faultstatus = cpufunc_faultstatus,
1219 .cf_faultaddress = cpufunc_faultaddress, 1219 .cf_faultaddress = cpufunc_faultaddress,
1220 1220
1221 /* TLB functions */ 1221 /* TLB functions */
1222 1222
1223 .cf_tlb_flushID = armv4_tlb_flushID, 1223 .cf_tlb_flushID = armv4_tlb_flushID,
1224 .cf_tlb_flushID_SE = xscale_tlb_flushID_SE, 1224 .cf_tlb_flushID_SE = xscale_tlb_flushID_SE,
1225 .cf_tlb_flushI = armv4_tlb_flushI, 1225 .cf_tlb_flushI = armv4_tlb_flushI,
1226 .cf_tlb_flushI_SE = (void *)armv4_tlb_flushI, 1226 .cf_tlb_flushI_SE = (void *)armv4_tlb_flushI,
1227 .cf_tlb_flushD = armv4_tlb_flushD, 1227 .cf_tlb_flushD = armv4_tlb_flushD,
1228 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE, 1228 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE,
1229 1229
1230 /* Cache operations */ 1230 /* Cache operations */
1231 1231
1232 .cf_icache_sync_all = xscale_cache_syncI, 1232 .cf_icache_sync_all = xscale_cache_syncI,
1233 .cf_icache_sync_range = xscale_cache_syncI_rng, 1233 .cf_icache_sync_range = xscale_cache_syncI_rng,
1234 1234
1235 .cf_dcache_wbinv_all = xscale_cache_purgeD, 1235 .cf_dcache_wbinv_all = xscale_cache_purgeD,
1236 .cf_dcache_wbinv_range = xscale_cache_purgeD_rng, 1236 .cf_dcache_wbinv_range = xscale_cache_purgeD_rng,
1237 .cf_dcache_inv_range = xscale_cache_flushD_rng, 1237 .cf_dcache_inv_range = xscale_cache_flushD_rng,
1238 .cf_dcache_wb_range = xscale_cache_cleanD_rng, 1238 .cf_dcache_wb_range = xscale_cache_cleanD_rng,
1239 1239
1240 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 1240 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
1241 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 1241 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
1242 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 1242 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
1243 1243
1244 .cf_idcache_wbinv_all = xscale_cache_purgeID, 1244 .cf_idcache_wbinv_all = xscale_cache_purgeID,
1245 .cf_idcache_wbinv_range = xscale_cache_purgeID_rng, 1245 .cf_idcache_wbinv_range = xscale_cache_purgeID_rng,
1246 1246
1247 /* Other functions */ 1247 /* Other functions */
1248 1248
1249 .cf_flush_prefetchbuf = cpufunc_nullop, 1249 .cf_flush_prefetchbuf = cpufunc_nullop,
1250 .cf_drain_writebuf = armv4_drain_writebuf, 1250 .cf_drain_writebuf = armv4_drain_writebuf,
1251 .cf_flush_brnchtgt_C = cpufunc_nullop, 1251 .cf_flush_brnchtgt_C = cpufunc_nullop,
1252 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 1252 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
1253 1253
1254 .cf_sleep = xscale_cpu_sleep, 1254 .cf_sleep = xscale_cpu_sleep,
1255 1255
1256 /* Soft functions */ 1256 /* Soft functions */
1257 1257
1258 .cf_dataabt_fixup = cpufunc_null_fixup, 1258 .cf_dataabt_fixup = cpufunc_null_fixup,
1259 .cf_prefetchabt_fixup = cpufunc_null_fixup, 1259 .cf_prefetchabt_fixup = cpufunc_null_fixup,
1260 1260
1261 .cf_context_switch = xscale_context_switch, 1261 .cf_context_switch = xscale_context_switch,
1262 1262
1263 .cf_setup = xscale_setup 1263 .cf_setup = xscale_setup
1264}; 1264};
1265#endif 1265#endif
1266/* CPU_XSCALE_80200 || CPU_XSCALE_80321 || __CPU_XSCALE_PXA2XX || CPU_XSCALE_IXP425 */ 1266/* CPU_XSCALE_80200 || CPU_XSCALE_80321 || __CPU_XSCALE_PXA2XX || CPU_XSCALE_IXP425 */
1267 1267
1268#if defined(CPU_CORTEX) 1268#if defined(CPU_CORTEX)
1269struct cpu_functions cortex_cpufuncs = { 1269struct cpu_functions cortex_cpufuncs = {
1270 /* CPU functions */ 1270 /* CPU functions */
1271 1271
1272 .cf_id = cpufunc_id, 1272 .cf_id = cpufunc_id,
1273 .cf_cpwait = cpufunc_nullop, 1273 .cf_cpwait = cpufunc_nullop,
1274 1274
1275 /* MMU functions */ 1275 /* MMU functions */
1276 1276
1277 .cf_control = cpufunc_control, 1277 .cf_control = cpufunc_control,
1278 .cf_domains = cpufunc_domains, 1278 .cf_domains = cpufunc_domains,
1279 .cf_setttb = armv7_setttb, 1279 .cf_setttb = armv7_setttb,
1280 .cf_faultstatus = cpufunc_faultstatus, 1280 .cf_faultstatus = cpufunc_faultstatus,
1281 .cf_faultaddress = cpufunc_faultaddress, 1281 .cf_faultaddress = cpufunc_faultaddress,
1282 1282
1283 /* TLB functions */ 1283 /* TLB functions */
1284 1284
1285 .cf_tlb_flushID = arm11_tlb_flushID, 1285 .cf_tlb_flushID = arm11_tlb_flushID,
1286 .cf_tlb_flushID_SE = armv7_tlb_flushID_SE, 1286 .cf_tlb_flushID_SE = armv7_tlb_flushID_SE,
1287 .cf_tlb_flushI = arm11_tlb_flushI, 1287 .cf_tlb_flushI = arm11_tlb_flushI,
1288 .cf_tlb_flushI_SE = arm11_tlb_flushI_SE, 1288 .cf_tlb_flushI_SE = arm11_tlb_flushI_SE,
1289 .cf_tlb_flushD = arm11_tlb_flushD, 1289 .cf_tlb_flushD = arm11_tlb_flushD,
1290 .cf_tlb_flushD_SE = arm11_tlb_flushD_SE, 1290 .cf_tlb_flushD_SE = arm11_tlb_flushD_SE,
1291 1291
1292 /* Cache operations */ 1292 /* Cache operations */
1293 1293
1294 .cf_icache_sync_all = armv7_icache_sync_all, 1294 .cf_icache_sync_all = armv7_icache_sync_all,
1295 .cf_dcache_wbinv_all = armv7_dcache_wbinv_all, 1295 .cf_dcache_wbinv_all = armv7_dcache_wbinv_all,
1296 1296
1297 .cf_dcache_inv_range = armv7_dcache_inv_range, 1297 .cf_dcache_inv_range = armv7_dcache_inv_range,
1298 .cf_dcache_wb_range = armv7_dcache_wb_range, 1298 .cf_dcache_wb_range = armv7_dcache_wb_range,
1299 .cf_dcache_wbinv_range = armv7_dcache_wbinv_range, 1299 .cf_dcache_wbinv_range = armv7_dcache_wbinv_range,
1300 1300
1301 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 1301 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
1302 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 1302 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
1303 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 1303 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
1304 1304
1305 .cf_icache_sync_range = armv7_icache_sync_range, 1305 .cf_icache_sync_range = armv7_icache_sync_range,
1306 .cf_idcache_wbinv_range = armv7_idcache_wbinv_range, 1306 .cf_idcache_wbinv_range = armv7_idcache_wbinv_range,
1307 1307
1308 1308
1309 .cf_idcache_wbinv_all = armv7_idcache_wbinv_all, 1309 .cf_idcache_wbinv_all = armv7_idcache_wbinv_all,
1310 1310
1311 /* Other functions */ 1311 /* Other functions */
1312 1312
1313 .cf_flush_prefetchbuf = cpufunc_nullop, 1313 .cf_flush_prefetchbuf = cpufunc_nullop,
1314 .cf_drain_writebuf = armv7_drain_writebuf, 1314 .cf_drain_writebuf = armv7_drain_writebuf,
1315 .cf_flush_brnchtgt_C = cpufunc_nullop, 1315 .cf_flush_brnchtgt_C = cpufunc_nullop,
1316 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 1316 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
1317 1317
1318 .cf_sleep = armv7_cpu_sleep, 1318 .cf_sleep = armv7_cpu_sleep,
1319 1319
1320 /* Soft functions */ 1320 /* Soft functions */
1321 1321
1322 .cf_dataabt_fixup = cpufunc_null_fixup, 1322 .cf_dataabt_fixup = cpufunc_null_fixup,
1323 .cf_prefetchabt_fixup = cpufunc_null_fixup, 1323 .cf_prefetchabt_fixup = cpufunc_null_fixup,
1324 1324
1325 .cf_context_switch = armv7_context_switch, 1325 .cf_context_switch = armv7_context_switch,
1326 1326
1327 .cf_setup = armv7_setup 1327 .cf_setup = armv7_setup
1328 1328
1329}; 1329};
1330#endif /* CPU_CORTEX */ 1330#endif /* CPU_CORTEX */
1331 1331
1332#ifdef CPU_PJ4B 1332#ifdef CPU_PJ4B
1333struct cpu_functions pj4bv7_cpufuncs = { 1333struct cpu_functions pj4bv7_cpufuncs = {
1334 /* CPU functions */ 1334 /* CPU functions */
1335 1335
1336 .cf_id = cpufunc_id, 1336 .cf_id = cpufunc_id,
1337 .cf_cpwait = pj4b_drain_writebuf, 1337 .cf_cpwait = pj4b_drain_writebuf,
1338 1338
1339 /* MMU functions */ 1339 /* MMU functions */
1340 1340
1341 .cf_control = cpufunc_control, 1341 .cf_control = cpufunc_control,
1342 .cf_domains = cpufunc_domains, 1342 .cf_domains = cpufunc_domains,
1343 .cf_setttb = pj4b_setttb, 1343 .cf_setttb = pj4b_setttb,
1344 .cf_faultstatus = cpufunc_faultstatus, 1344 .cf_faultstatus = cpufunc_faultstatus,
1345 .cf_faultaddress = cpufunc_faultaddress, 1345 .cf_faultaddress = cpufunc_faultaddress,
1346 1346
1347 /* TLB functions */ 1347 /* TLB functions */
1348 1348
1349 .cf_tlb_flushID = pj4b_tlb_flushID, 1349 .cf_tlb_flushID = pj4b_tlb_flushID,
1350 .cf_tlb_flushID_SE = pj4b_tlb_flushID_SE, 1350 .cf_tlb_flushID_SE = pj4b_tlb_flushID_SE,
1351 .cf_tlb_flushI = pj4b_tlb_flushID, 1351 .cf_tlb_flushI = pj4b_tlb_flushID,
1352 .cf_tlb_flushI_SE = pj4b_tlb_flushID_SE, 1352 .cf_tlb_flushI_SE = pj4b_tlb_flushID_SE,
1353 .cf_tlb_flushD = pj4b_tlb_flushID, 1353 .cf_tlb_flushD = pj4b_tlb_flushID,
1354 .cf_tlb_flushD_SE = pj4b_tlb_flushID_SE, 1354 .cf_tlb_flushD_SE = pj4b_tlb_flushID_SE,
1355 1355
1356 /* Cache operations */ 1356 /* Cache operations */
1357 1357
1358 .cf_icache_sync_all = armv7_idcache_wbinv_all, 1358 .cf_icache_sync_all = armv7_idcache_wbinv_all,
1359 .cf_icache_sync_range = pj4b_icache_sync_range, 1359 .cf_icache_sync_range = pj4b_icache_sync_range,
1360 1360
1361 .cf_dcache_wbinv_all = armv7_dcache_wbinv_all, 1361 .cf_dcache_wbinv_all = armv7_dcache_wbinv_all,
1362 .cf_dcache_wbinv_range = pj4b_dcache_wbinv_range, 1362 .cf_dcache_wbinv_range = pj4b_dcache_wbinv_range,
1363 .cf_dcache_inv_range = pj4b_dcache_inv_range, 1363 .cf_dcache_inv_range = pj4b_dcache_inv_range,
1364 .cf_dcache_wb_range = pj4b_dcache_wb_range, 1364 .cf_dcache_wb_range = pj4b_dcache_wb_range,
1365 1365
1366 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 1366 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
1367 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 1367 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
1368 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 1368 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
1369 1369
1370 .cf_idcache_wbinv_all = armv7_idcache_wbinv_all, 1370 .cf_idcache_wbinv_all = armv7_idcache_wbinv_all,
1371 .cf_idcache_wbinv_range = pj4b_idcache_wbinv_range, 1371 .cf_idcache_wbinv_range = pj4b_idcache_wbinv_range,
1372 1372
1373 /* Other functions */ 1373 /* Other functions */
1374 1374
1375 .cf_flush_prefetchbuf = pj4b_drain_readbuf, 1375 .cf_flush_prefetchbuf = pj4b_drain_readbuf,
1376 .cf_drain_writebuf = pj4b_drain_writebuf, 1376 .cf_drain_writebuf = pj4b_drain_writebuf,
1377 .cf_flush_brnchtgt_C = pj4b_flush_brnchtgt_all, 1377 .cf_flush_brnchtgt_C = pj4b_flush_brnchtgt_all,
1378 .cf_flush_brnchtgt_E = pj4b_flush_brnchtgt_va, 1378 .cf_flush_brnchtgt_E = pj4b_flush_brnchtgt_va,
1379 1379
1380 .cf_sleep = (void *)cpufunc_nullop, 1380 .cf_sleep = (void *)cpufunc_nullop,
1381 1381
1382 /* Soft functions */ 1382 /* Soft functions */
1383 1383
1384 .cf_dataabt_fixup = cpufunc_null_fixup, 1384 .cf_dataabt_fixup = cpufunc_null_fixup,
1385 .cf_prefetchabt_fixup = cpufunc_null_fixup, 1385 .cf_prefetchabt_fixup = cpufunc_null_fixup,
1386 1386
1387 .cf_context_switch = pj4b_context_switch, 1387 .cf_context_switch = pj4b_context_switch,
1388 1388
1389 .cf_setup = pj4bv7_setup 1389 .cf_setup = pj4bv7_setup
1390}; 1390};
1391#endif /* CPU_PJ4B */ 1391#endif /* CPU_PJ4B */
1392 1392
1393#ifdef CPU_SHEEVA 1393#ifdef CPU_SHEEVA
1394struct cpu_functions sheeva_cpufuncs = { 1394struct cpu_functions sheeva_cpufuncs = {
1395 /* CPU functions */ 1395 /* CPU functions */
1396 1396
1397 .cf_id = cpufunc_id, 1397 .cf_id = cpufunc_id,
1398 .cf_cpwait = cpufunc_nullop, 1398 .cf_cpwait = cpufunc_nullop,
1399 1399
1400 /* MMU functions */ 1400 /* MMU functions */
1401 1401
1402 .cf_control = cpufunc_control, 1402 .cf_control = cpufunc_control,
1403 .cf_domains = cpufunc_domains, 1403 .cf_domains = cpufunc_domains,
1404 .cf_setttb = armv5_ec_setttb, 1404 .cf_setttb = armv5_ec_setttb,
1405 .cf_faultstatus = cpufunc_faultstatus, 1405 .cf_faultstatus = cpufunc_faultstatus,
1406 .cf_faultaddress = cpufunc_faultaddress, 1406 .cf_faultaddress = cpufunc_faultaddress,
1407 1407
1408 /* TLB functions */ 1408 /* TLB functions */
1409 1409
1410 .cf_tlb_flushID = armv4_tlb_flushID, 1410 .cf_tlb_flushID = armv4_tlb_flushID,
1411 .cf_tlb_flushID_SE = arm10_tlb_flushID_SE, 1411 .cf_tlb_flushID_SE = arm10_tlb_flushID_SE,
1412 .cf_tlb_flushI = armv4_tlb_flushI, 1412 .cf_tlb_flushI = armv4_tlb_flushI,
1413 .cf_tlb_flushI_SE = arm10_tlb_flushI_SE, 1413 .cf_tlb_flushI_SE = arm10_tlb_flushI_SE,
1414 .cf_tlb_flushD = armv4_tlb_flushD, 1414 .cf_tlb_flushD = armv4_tlb_flushD,
1415 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE, 1415 .cf_tlb_flushD_SE = armv4_tlb_flushD_SE,
1416 1416
1417 /* Cache operations */ 1417 /* Cache operations */
1418 1418
1419 .cf_icache_sync_all = armv5_ec_icache_sync_all, 1419 .cf_icache_sync_all = armv5_ec_icache_sync_all,
1420 .cf_icache_sync_range = armv5_ec_icache_sync_range, 1420 .cf_icache_sync_range = armv5_ec_icache_sync_range,
1421 1421
1422 .cf_dcache_wbinv_all = armv5_ec_dcache_wbinv_all, 1422 .cf_dcache_wbinv_all = armv5_ec_dcache_wbinv_all,
1423 .cf_dcache_wbinv_range = sheeva_dcache_wbinv_range, 1423 .cf_dcache_wbinv_range = sheeva_dcache_wbinv_range,
1424 .cf_dcache_inv_range = sheeva_dcache_inv_range, 1424 .cf_dcache_inv_range = sheeva_dcache_inv_range,
1425 .cf_dcache_wb_range = sheeva_dcache_wb_range, 1425 .cf_dcache_wb_range = sheeva_dcache_wb_range,
1426 1426
1427 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop, 1427 .cf_sdcache_wbinv_range = (void *)cpufunc_nullop,
1428 .cf_sdcache_inv_range = (void *)cpufunc_nullop, 1428 .cf_sdcache_inv_range = (void *)cpufunc_nullop,
1429 .cf_sdcache_wb_range = (void *)cpufunc_nullop, 1429 .cf_sdcache_wb_range = (void *)cpufunc_nullop,
1430 1430
1431 .cf_idcache_wbinv_all = armv5_ec_idcache_wbinv_all, 1431 .cf_idcache_wbinv_all = armv5_ec_idcache_wbinv_all,
1432 .cf_idcache_wbinv_range = sheeva_idcache_wbinv_range, 1432 .cf_idcache_wbinv_range = sheeva_idcache_wbinv_range,
1433 1433
1434 /* Other functions */ 1434 /* Other functions */
1435 1435
1436 .cf_flush_prefetchbuf = cpufunc_nullop, 1436 .cf_flush_prefetchbuf = cpufunc_nullop,
1437 .cf_drain_writebuf = armv4_drain_writebuf, 1437 .cf_drain_writebuf = armv4_drain_writebuf,
1438 .cf_flush_brnchtgt_C = cpufunc_nullop, 1438 .cf_flush_brnchtgt_C = cpufunc_nullop,
1439 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop, 1439 .cf_flush_brnchtgt_E = (void *)cpufunc_nullop,
1440 1440
1441 .cf_sleep = (void *)sheeva_cpu_sleep, 1441 .cf_sleep = (void *)sheeva_cpu_sleep,
1442 1442
1443 /* Soft functions */ 1443 /* Soft functions */
1444 1444
1445 .cf_dataabt_fixup = cpufunc_null_fixup, 1445 .cf_dataabt_fixup = cpufunc_null_fixup,
1446 .cf_prefetchabt_fixup = cpufunc_null_fixup, 1446 .cf_prefetchabt_fixup = cpufunc_null_fixup,
1447 1447
1448 .cf_context_switch = arm10_context_switch, 1448 .cf_context_switch = arm10_context_switch,
1449 1449
1450 .cf_setup = sheeva_setup 1450 .cf_setup = sheeva_setup
1451}; 1451};
1452#endif /* CPU_SHEEVA */ 1452#endif /* CPU_SHEEVA */
1453 1453
1454 1454
1455/* 1455/*
1456 * Global constants also used by locore.s 1456 * Global constants also used by locore.s
1457 */ 1457 */
1458 1458
1459struct cpu_functions cpufuncs; 1459struct cpu_functions cpufuncs;
1460u_int cputype; 1460u_int cputype;
1461 1461
1462#if defined(CPU_ARM7TDMI) || defined(CPU_ARM8) || defined(CPU_ARM9) || \ 1462#if defined(CPU_ARM7TDMI) || defined(CPU_ARM8) || defined(CPU_ARM9) || \
1463 defined(CPU_ARM9E) || defined(CPU_ARM10) || defined(CPU_ARM11) || \ 1463 defined(CPU_ARM9E) || defined(CPU_ARM10) || defined(CPU_ARM11) || \
1464 defined(CPU_FA526) || \ 1464 defined(CPU_FA526) || \
1465 defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \ 1465 defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
1466 defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) || \ 1466 defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) || \
1467 defined(CPU_CORTEX) || defined(CPU_PJ4B) || defined(CPU_SHEEVA) 1467 defined(CPU_CORTEX) || defined(CPU_PJ4B) || defined(CPU_SHEEVA)
1468static void get_cachetype_cp15(void); 1468static void get_cachetype_cp15(void);
1469 1469
1470/* Additional cache information local to this file. Log2 of some of the 1470/* Additional cache information local to this file. Log2 of some of the
1471 above numbers. */ 1471 above numbers. */
1472static int arm_dcache_log2_nsets; 1472static int arm_dcache_log2_nsets;
1473static int arm_dcache_log2_assoc; 1473static int arm_dcache_log2_assoc;
1474static int arm_dcache_log2_linesize; 1474static int arm_dcache_log2_linesize;
1475 1475
1476#if (ARM_MMU_V6 + ARM_MMU_V7) > 0 1476#if (ARM_MMU_V6 + ARM_MMU_V7) > 0
1477static inline u_int 1477static inline u_int
1478get_cachesize_cp15(int cssr) 1478get_cachesize_cp15(int cssr)
1479{ 1479{
1480 u_int csid; 1480 u_int csid;
1481 1481
1482#if ((CPU_CORTEX) > 0) || defined(CPU_PJ4B) 1482#if ((CPU_CORTEX) > 0) || defined(CPU_PJ4B)
1483 __asm volatile(".arch\tarmv7a"); 1483 __asm volatile(".arch\tarmv7a");
1484 __asm volatile("mcr p15, 2, %0, c0, c0, 0" :: "r" (cssr)); 1484 __asm volatile("mcr p15, 2, %0, c0, c0, 0" :: "r" (cssr));
1485 __asm volatile("isb"); /* sync to the new cssr */ 1485 __asm volatile("isb"); /* sync to the new cssr */
1486#else 1486#else
1487 __asm volatile("mcr p15, 1, %0, c0, c0, 2" :: "r" (cssr)); 1487 __asm volatile("mcr p15, 1, %0, c0, c0, 2" :: "r" (cssr));
1488#endif 1488#endif
1489 __asm volatile("mrc p15, 1, %0, c0, c0, 0" : "=r" (csid)); 1489 __asm volatile("mrc p15, 1, %0, c0, c0, 0" : "=r" (csid));
1490 return csid; 1490 return csid;
1491} 1491}
1492#endif 1492#endif
1493 1493
1494#if (ARM_MMU_V6 + ARM_MMU_V7) > 0 1494#if (ARM_MMU_V6 + ARM_MMU_V7) > 0
1495static void 1495static void
1496get_cacheinfo_clidr(struct arm_cache_info *info, u_int level, u_int clidr) 1496get_cacheinfo_clidr(struct arm_cache_info *info, u_int level, u_int clidr)
1497{ 1497{
1498 u_int csid; 1498 u_int csid;
1499 u_int nsets; 1499 u_int nsets;
1500 1500
1501 if (clidr & 6) { 1501 if (clidr & 6) {
1502 csid = get_cachesize_cp15(level << 1); /* select L1 dcache values */ 1502 csid = get_cachesize_cp15(level << 1); /* select L1 dcache values */
1503 nsets = CPU_CSID_NUMSETS(csid) + 1; 1503 nsets = CPU_CSID_NUMSETS(csid) + 1;
1504 info->dcache_ways = CPU_CSID_ASSOC(csid) + 1; 1504 info->dcache_ways = CPU_CSID_ASSOC(csid) + 1;
1505 info->dcache_line_size = 1U << (CPU_CSID_LEN(csid) + 4); 1505 info->dcache_line_size = 1U << (CPU_CSID_LEN(csid) + 4);
1506 info->dcache_size = info->dcache_line_size * info->dcache_ways * nsets; 1506 info->dcache_size = info->dcache_line_size * info->dcache_ways * nsets;
1507 1507
1508 if (level == 0) { 1508 if (level == 0) {
1509 arm_dcache_log2_assoc = CPU_CSID_ASSOC(csid) + 1; 1509 arm_dcache_log2_assoc = CPU_CSID_ASSOC(csid) + 1;
1510 arm_dcache_log2_linesize = CPU_CSID_LEN(csid) + 4; 1510 arm_dcache_log2_linesize = CPU_CSID_LEN(csid) + 4;
1511 arm_dcache_log2_nsets = 31 - __builtin_clz(nsets); 1511 arm_dcache_log2_nsets = 31 - __builtin_clz(nsets);
1512 } 1512 }
1513 } 1513 }
1514 1514
1515 info->cache_unified = (clidr == 4); 1515 info->cache_unified = (clidr == 4);
1516 1516
1517 if (clidr & 1) { 1517 if (clidr & 1) {
1518 csid = get_cachesize_cp15((level << 1)|CPU_CSSR_InD); /* select L1 icache values */ 1518 csid = get_cachesize_cp15((level << 1)|CPU_CSSR_InD); /* select L1 icache values */
1519 nsets = CPU_CSID_NUMSETS(csid) + 1; 1519 nsets = CPU_CSID_NUMSETS(csid) + 1;
1520 info->icache_ways = CPU_CSID_ASSOC(csid) + 1; 1520 info->icache_ways = CPU_CSID_ASSOC(csid) + 1;
1521 info->icache_line_size = 1U << (CPU_CSID_LEN(csid) + 4); 1521 info->icache_line_size = 1U << (CPU_CSID_LEN(csid) + 4);
1522 info->icache_size = info->icache_line_size * info->icache_ways * nsets; 1522 info->icache_size = info->icache_line_size * info->icache_ways * nsets;
1523 } else { 1523 } else {
1524 info->icache_ways = info->dcache_ways; 1524 info->icache_ways = info->dcache_ways;
1525 info->icache_line_size = info->dcache_line_size; 1525 info->icache_line_size = info->dcache_line_size;
1526 info->icache_size = info->dcache_size; 1526 info->icache_size = info->dcache_size;
1527 } 1527 }
1528} 1528}
1529#endif /* (ARM_MMU_V6 + ARM_MMU_V7) > 0 */ 1529#endif /* (ARM_MMU_V6 + ARM_MMU_V7) > 0 */
1530 1530
1531static void 1531static void
1532get_cachetype_cp15(void) 1532get_cachetype_cp15(void)
1533{ 1533{
1534 u_int ctype, isize, dsize; 1534 u_int ctype, isize, dsize;
1535 u_int multiplier; 1535 u_int multiplier;
1536 1536
1537 __asm volatile("mrc p15, 0, %0, c0, c0, 1" 1537 __asm volatile("mrc p15, 0, %0, c0, c0, 1"
1538 : "=r" (ctype)); 1538 : "=r" (ctype));
1539 1539
1540 /* 1540 /*
1541 * ...and thus spake the ARM ARM: 1541 * ...and thus spake the ARM ARM:
1542 * 1542 *
1543 * If an <opcode2> value corresponding to an unimplemented or 1543 * If an <opcode2> value corresponding to an unimplemented or
1544 * reserved ID register is encountered, the System Control 1544 * reserved ID register is encountered, the System Control
1545 * processor returns the value of the main ID register. 1545 * processor returns the value of the main ID register.
1546 */ 1546 */
1547 if (ctype == cpu_id()) 1547 if (ctype == cpu_id())
1548 goto out; 1548 goto out;
1549 1549
1550#if (ARM_MMU_V6 + ARM_MMU_V7) > 0 1550#if (ARM_MMU_V6 + ARM_MMU_V7) > 0
1551 if (CPU_CT_FORMAT(ctype) == 4) { 1551 if (CPU_CT_FORMAT(ctype) == 4) {
1552 u_int clidr = armreg_clidr_read(); 1552 u_int clidr = armreg_clidr_read();
1553 1553
1554 arm_cache_prefer_mask = PAGE_SIZE; 1554 if (CPU_CT4_L1IPOLICY(ctype) != CPU_CT4_L1_PIPT) {
 1555 arm_cache_prefer_mask = PAGE_SIZE;
 1556 }
1555 arm_pcache.cache_type = CPU_CT_CTYPE_WB14; 1557 arm_pcache.cache_type = CPU_CT_CTYPE_WB14;
1556 1558
1557 get_cacheinfo_clidr(&arm_pcache, 0, clidr & 7); 1559 get_cacheinfo_clidr(&arm_pcache, 0, clidr & 7);
1558 arm_dcache_align = arm_pcache.dcache_line_size; 1560 arm_dcache_align = arm_pcache.dcache_line_size;
1559 clidr >>= 3; 1561 clidr >>= 3;
1560 if (clidr & 7) { 1562 if (clidr & 7) {
1561 get_cacheinfo_clidr(&arm_scache, 1, clidr & 7); 1563 get_cacheinfo_clidr(&arm_scache, 1, clidr & 7);
1562 if (arm_scache.dcache_line_size < arm_dcache_align) 1564 if (arm_scache.dcache_line_size < arm_dcache_align)
1563 arm_dcache_align = arm_scache.dcache_line_size; 1565 arm_dcache_align = arm_scache.dcache_line_size;
1564 } 1566 }
1565 goto out; 1567 goto out;
1566 } 1568 }
1567#endif /* ARM_MMU_V6 + ARM_MMU_V7 > 0 */ 1569#endif /* ARM_MMU_V6 + ARM_MMU_V7 > 0 */
1568 1570
1569 if ((ctype & CPU_CT_S) == 0) 1571 if ((ctype & CPU_CT_S) == 0)
1570 arm_pcache.cache_unified = 1; 1572 arm_pcache.cache_unified = 1;
1571 1573
1572 /* 1574 /*
1573 * If you want to know how this code works, go read the ARM ARM. 1575 * If you want to know how this code works, go read the ARM ARM.
1574 */ 1576 */
1575 1577
1576 arm_pcache.cache_type = CPU_CT_CTYPE(ctype); 1578 arm_pcache.cache_type = CPU_CT_CTYPE(ctype);
1577 1579
1578 if (arm_pcache.cache_unified == 0) { 1580 if (arm_pcache.cache_unified == 0) {
1579 isize = CPU_CT_ISIZE(ctype); 1581 isize = CPU_CT_ISIZE(ctype);
1580 multiplier = (isize & CPU_CT_xSIZE_M) ? 3 : 2; 1582 multiplier = (isize & CPU_CT_xSIZE_M) ? 3 : 2;
1581 arm_pcache.icache_line_size = 1U << (CPU_CT_xSIZE_LEN(isize) + 3); 1583 arm_pcache.icache_line_size = 1U << (CPU_CT_xSIZE_LEN(isize) + 3);
1582 if (CPU_CT_xSIZE_ASSOC(isize) == 0) { 1584 if (CPU_CT_xSIZE_ASSOC(isize) == 0) {
1583 if (isize & CPU_CT_xSIZE_M) 1585 if (isize & CPU_CT_xSIZE_M)
1584 arm_pcache.icache_line_size = 0; /* not present */ 1586 arm_pcache.icache_line_size = 0; /* not present */
1585 else 1587 else
1586 arm_pcache.icache_ways = 1; 1588 arm_pcache.icache_ways = 1;
1587 } else { 1589 } else {
1588 arm_pcache.icache_ways = multiplier << 1590 arm_pcache.icache_ways = multiplier <<
1589 (CPU_CT_xSIZE_ASSOC(isize) - 1); 1591 (CPU_CT_xSIZE_ASSOC(isize) - 1);
1590#if (ARM_MMU_V6 + ARM_MMU_V7) > 0 1592#if (ARM_MMU_V6 + ARM_MMU_V7) > 0
1591 if (CPU_CT_xSIZE_P & isize) 1593 if (CPU_CT_xSIZE_P & isize)
1592 arm_cache_prefer_mask |= 1594 arm_cache_prefer_mask |=
1593 __BIT(9 + CPU_CT_xSIZE_SIZE(isize) 1595 __BIT(9 + CPU_CT_xSIZE_SIZE(isize)
1594 - CPU_CT_xSIZE_ASSOC(isize)) 1596 - CPU_CT_xSIZE_ASSOC(isize))
1595 - PAGE_SIZE; 1597 - PAGE_SIZE;
1596#endif 1598#endif
1597 } 1599 }
1598 arm_pcache.icache_size = multiplier << (CPU_CT_xSIZE_SIZE(isize) + 8); 1600 arm_pcache.icache_size = multiplier << (CPU_CT_xSIZE_SIZE(isize) + 8);
1599 } 1601 }
1600 1602
1601 dsize = CPU_CT_DSIZE(ctype); 1603 dsize = CPU_CT_DSIZE(ctype);
1602 multiplier = (dsize & CPU_CT_xSIZE_M) ? 3 : 2; 1604 multiplier = (dsize & CPU_CT_xSIZE_M) ? 3 : 2;
1603 arm_pcache.dcache_line_size = 1U << (CPU_CT_xSIZE_LEN(dsize) + 3); 1605 arm_pcache.dcache_line_size = 1U << (CPU_CT_xSIZE_LEN(dsize) + 3);
1604 if (CPU_CT_xSIZE_ASSOC(dsize) == 0) { 1606 if (CPU_CT_xSIZE_ASSOC(dsize) == 0) {
1605 if (dsize & CPU_CT_xSIZE_M) 1607 if (dsize & CPU_CT_xSIZE_M)
1606 arm_pcache.dcache_line_size = 0; /* not present */ 1608 arm_pcache.dcache_line_size = 0; /* not present */
1607 else 1609 else
1608 arm_pcache.dcache_ways = 1; 1610 arm_pcache.dcache_ways = 1;
1609 } else { 1611 } else {
1610 arm_pcache.dcache_ways = multiplier << 1612 arm_pcache.dcache_ways = multiplier <<
1611 (CPU_CT_xSIZE_ASSOC(dsize) - 1); 1613 (CPU_CT_xSIZE_ASSOC(dsize) - 1);
1612#if (ARM_MMU_V6 + ARM_MMU_V7) > 0 1614#if (ARM_MMU_V6 + ARM_MMU_V7) > 0
1613 if (CPU_CT_xSIZE_P & dsize) 1615 if (CPU_CT_xSIZE_P & dsize)
1614 arm_cache_prefer_mask |= 1616 arm_cache_prefer_mask |=
1615 __BIT(9 + CPU_CT_xSIZE_SIZE(dsize) 1617 __BIT(9 + CPU_CT_xSIZE_SIZE(dsize)
1616 - CPU_CT_xSIZE_ASSOC(dsize)) - PAGE_SIZE; 1618 - CPU_CT_xSIZE_ASSOC(dsize)) - PAGE_SIZE;
1617#endif 1619#endif
1618 } 1620 }
1619 arm_pcache.dcache_size = multiplier << (CPU_CT_xSIZE_SIZE(dsize) + 8); 1621 arm_pcache.dcache_size = multiplier << (CPU_CT_xSIZE_SIZE(dsize) + 8);
1620 1622
1621 arm_dcache_align = arm_pcache.dcache_line_size; 1623 arm_dcache_align = arm_pcache.dcache_line_size;
1622 1624
1623 arm_dcache_log2_assoc = CPU_CT_xSIZE_ASSOC(dsize) + multiplier - 2; 1625 arm_dcache_log2_assoc = CPU_CT_xSIZE_ASSOC(dsize) + multiplier - 2;
1624 arm_dcache_log2_linesize = CPU_CT_xSIZE_LEN(dsize) + 3; 1626 arm_dcache_log2_linesize = CPU_CT_xSIZE_LEN(dsize) + 3;
1625 arm_dcache_log2_nsets = 6 + CPU_CT_xSIZE_SIZE(dsize) - 1627 arm_dcache_log2_nsets = 6 + CPU_CT_xSIZE_SIZE(dsize) -
1626 CPU_CT_xSIZE_ASSOC(dsize) - CPU_CT_xSIZE_LEN(dsize); 1628 CPU_CT_xSIZE_ASSOC(dsize) - CPU_CT_xSIZE_LEN(dsize);
1627 1629
1628 out: 1630 out:
1629 arm_dcache_align_mask = arm_dcache_align - 1; 1631 arm_dcache_align_mask = arm_dcache_align - 1;
1630} 1632}
1631#endif /* ARM7TDMI || ARM8 || ARM9 || XSCALE */ 1633#endif /* ARM7TDMI || ARM8 || ARM9 || XSCALE */
1632 1634
1633#if defined(CPU_ARM2) || defined(CPU_ARM250) || defined(CPU_ARM3) || \ 1635#if defined(CPU_ARM2) || defined(CPU_ARM250) || defined(CPU_ARM3) || \
1634 defined(CPU_ARM6) || defined(CPU_ARM7) || defined(CPU_SA110) || \ 1636 defined(CPU_ARM6) || defined(CPU_ARM7) || defined(CPU_SA110) || \
1635 defined(CPU_SA1100) || defined(CPU_SA1110) || defined(CPU_IXP12X0) 1637 defined(CPU_SA1100) || defined(CPU_SA1110) || defined(CPU_IXP12X0)
1636/* Cache information for CPUs without cache type registers. */ 1638/* Cache information for CPUs without cache type registers. */
1637struct cachetab { 1639struct cachetab {
1638 uint32_t ct_cpuid; 1640 uint32_t ct_cpuid;
1639 int ct_pcache_type; 1641 int ct_pcache_type;
1640 int ct_pcache_unified; 1642 int ct_pcache_unified;
1641 int ct_pdcache_size; 1643 int ct_pdcache_size;
1642 int ct_pdcache_line_size; 1644 int ct_pdcache_line_size;
1643 int ct_pdcache_ways; 1645 int ct_pdcache_ways;
1644 int ct_picache_size; 1646 int ct_picache_size;
1645 int ct_picache_line_size; 1647 int ct_picache_line_size;
1646 int ct_picache_ways; 1648 int ct_picache_ways;
1647}; 1649};
1648 1650
1649struct cachetab cachetab[] = { 1651struct cachetab cachetab[] = {
1650 /* cpuid, cache type, u, dsiz, ls, wy, isiz, ls, wy */ 1652 /* cpuid, cache type, u, dsiz, ls, wy, isiz, ls, wy */
1651 { CPU_ID_ARM2, 0, 1, 0, 0, 0, 0, 0, 0 }, 1653 { CPU_ID_ARM2, 0, 1, 0, 0, 0, 0, 0, 0 },
1652 { CPU_ID_ARM250, 0, 1, 0, 0, 0, 0, 0, 0 }, 1654 { CPU_ID_ARM250, 0, 1, 0, 0, 0, 0, 0, 0 },
1653 { CPU_ID_ARM3, CPU_CT_CTYPE_WT, 1, 4096, 16, 64, 0, 0, 0 }, 1655 { CPU_ID_ARM3, CPU_CT_CTYPE_WT, 1, 4096, 16, 64, 0, 0, 0 },
1654 { CPU_ID_ARM610, CPU_CT_CTYPE_WT, 1, 4096, 16, 64, 0, 0, 0 }, 1656 { CPU_ID_ARM610, CPU_CT_CTYPE_WT, 1, 4096, 16, 64, 0, 0, 0 },
1655 { CPU_ID_ARM710, CPU_CT_CTYPE_WT, 1, 8192, 32, 4, 0, 0, 0 }, 1657 { CPU_ID_ARM710, CPU_CT_CTYPE_WT, 1, 8192, 32, 4, 0, 0, 0 },
1656 { CPU_ID_ARM7500, CPU_CT_CTYPE_WT, 1, 4096, 16, 4, 0, 0, 0 }, 1658 { CPU_ID_ARM7500, CPU_CT_CTYPE_WT, 1, 4096, 16, 4, 0, 0, 0 },
1657 { CPU_ID_ARM710A, CPU_CT_CTYPE_WT, 1, 8192, 16, 4, 0, 0, 0 }, 1659 { CPU_ID_ARM710A, CPU_CT_CTYPE_WT, 1, 8192, 16, 4, 0, 0, 0 },
1658 { CPU_ID_ARM7500FE, CPU_CT_CTYPE_WT, 1, 4096, 16, 4, 0, 0, 0 }, 1660 { CPU_ID_ARM7500FE, CPU_CT_CTYPE_WT, 1, 4096, 16, 4, 0, 0, 0 },
1659 /* XXX is this type right for SA-1? */ 1661 /* XXX is this type right for SA-1? */
1660 { CPU_ID_SA110, CPU_CT_CTYPE_WB1, 0, 16384, 32, 32, 16384, 32, 32 }, 1662 { CPU_ID_SA110, CPU_CT_CTYPE_WB1, 0, 16384, 32, 32, 16384, 32, 32 },
1661 { CPU_ID_SA1100, CPU_CT_CTYPE_WB1, 0, 8192, 32, 32, 16384, 32, 32 }, 1663 { CPU_ID_SA1100, CPU_CT_CTYPE_WB1, 0, 8192, 32, 32, 16384, 32, 32 },
1662 { CPU_ID_SA1110, CPU_CT_CTYPE_WB1, 0, 8192, 32, 32, 16384, 32, 32 }, 1664 { CPU_ID_SA1110, CPU_CT_CTYPE_WB1, 0, 8192, 32, 32, 16384, 32, 32 },
1663 { CPU_ID_IXP1200, CPU_CT_CTYPE_WB1, 0, 16384, 32, 32, 16384, 32, 32 }, /* XXX */ 1665 { CPU_ID_IXP1200, CPU_CT_CTYPE_WB1, 0, 16384, 32, 32, 16384, 32, 32 }, /* XXX */
1664 { 0, 0, 0, 0, 0, 0, 0, 0} 1666 { 0, 0, 0, 0, 0, 0, 0, 0}
1665}; 1667};
1666 1668
1667static void get_cachetype_table(void); 1669static void get_cachetype_table(void);
1668 1670
1669static void 1671static void
1670get_cachetype_table(void) 1672get_cachetype_table(void)
1671{ 1673{
1672 int i; 1674 int i;
1673 uint32_t cpuid = cpu_id(); 1675 uint32_t cpuid = cpu_id();
1674 1676
1675 for (i = 0; cachetab[i].ct_cpuid != 0; i++) { 1677 for (i = 0; cachetab[i].ct_cpuid != 0; i++) {
1676 if (cachetab[i].ct_cpuid == (cpuid & CPU_ID_CPU_MASK)) { 1678 if (cachetab[i].ct_cpuid == (cpuid & CPU_ID_CPU_MASK)) {
1677 arm_pcache.cache_type = cachetab[i].ct_pcache_type; 1679 arm_pcache.cache_type = cachetab[i].ct_pcache_type;
1678 arm_pcache.cache_unified = cachetab[i].ct_pcache_unified; 1680 arm_pcache.cache_unified = cachetab[i].ct_pcache_unified;
1679 arm_pcache.dcache_size = cachetab[i].ct_pdcache_size; 1681 arm_pcache.dcache_size = cachetab[i].ct_pdcache_size;
1680 arm_pcache.dcache_line_size = 1682 arm_pcache.dcache_line_size =
1681 cachetab[i].ct_pdcache_line_size; 1683 cachetab[i].ct_pdcache_line_size;
1682 arm_pcache.dcache_ways = cachetab[i].ct_pdcache_ways; 1684 arm_pcache.dcache_ways = cachetab[i].ct_pdcache_ways;
1683 arm_pcache.icache_size = cachetab[i].ct_picache_size; 1685 arm_pcache.icache_size = cachetab[i].ct_picache_size;
1684 arm_pcache.icache_line_size = 1686 arm_pcache.icache_line_size =
1685 cachetab[i].ct_picache_line_size; 1687 cachetab[i].ct_picache_line_size;
1686 arm_pcache.icache_ways = cachetab[i].ct_picache_ways; 1688 arm_pcache.icache_ways = cachetab[i].ct_picache_ways;
1687 } 1689 }
1688 } 1690 }
1689 1691
1690 arm_dcache_align = arm_pcache.dcache_line_size; 1692 arm_dcache_align = arm_pcache.dcache_line_size;
1691 arm_dcache_align_mask = arm_dcache_align - 1; 1693 arm_dcache_align_mask = arm_dcache_align - 1;
1692} 1694}
1693 1695
1694#endif /* ARM2 || ARM250 || ARM3 || ARM6 || ARM7 || SA110 || SA1100 || SA1111 || IXP12X0 */ 1696#endif /* ARM2 || ARM250 || ARM3 || ARM6 || ARM7 || SA110 || SA1100 || SA1111 || IXP12X0 */
1695 1697
1696/* 1698/*
1697 * Cannot panic here as we may not have a console yet ... 1699 * Cannot panic here as we may not have a console yet ...
1698 */ 1700 */
1699 1701
1700int 1702int
1701set_cpufuncs(void) 1703set_cpufuncs(void)
1702{ 1704{
1703 if (cputype == 0) { 1705 if (cputype == 0) {
1704 cputype = cpufunc_id(); 1706 cputype = cpufunc_id();
1705 cputype &= CPU_ID_CPU_MASK; 1707 cputype &= CPU_ID_CPU_MASK;
1706 } 1708 }
1707 1709
1708 /* 1710 /*
1709 * NOTE: cpu_do_powersave defaults to off. If we encounter a 1711 * NOTE: cpu_do_powersave defaults to off. If we encounter a
1710 * CPU type where we want to use it by default, then we set it. 1712 * CPU type where we want to use it by default, then we set it.
1711 */ 1713 */
1712#ifdef CPU_ARM2 1714#ifdef CPU_ARM2
1713 if (cputype == CPU_ID_ARM2) { 1715 if (cputype == CPU_ID_ARM2) {
1714 cpufuncs = arm2_cpufuncs; 1716 cpufuncs = arm2_cpufuncs;
1715 get_cachetype_table(); 1717 get_cachetype_table();
1716 return 0; 1718 return 0;
1717 } 1719 }
1718#endif /* CPU_ARM2 */ 1720#endif /* CPU_ARM2 */
1719#ifdef CPU_ARM250 1721#ifdef CPU_ARM250
1720 if (cputype == CPU_ID_ARM250) { 1722 if (cputype == CPU_ID_ARM250) {
1721 cpufuncs = arm250_cpufuncs; 1723 cpufuncs = arm250_cpufuncs;
1722 get_cachetype_table(); 1724 get_cachetype_table();
1723 return 0; 1725 return 0;
1724 } 1726 }
1725#endif 1727#endif
1726#ifdef CPU_ARM3 1728#ifdef CPU_ARM3
1727 if ((cputype & CPU_ID_IMPLEMENTOR_MASK) == CPU_ID_ARM_LTD && 1729 if ((cputype & CPU_ID_IMPLEMENTOR_MASK) == CPU_ID_ARM_LTD &&
1728 (cputype & 0x00000f00) == 0x00000300) { 1730 (cputype & 0x00000f00) == 0x00000300) {
1729 cpufuncs = arm3_cpufuncs; 1731 cpufuncs = arm3_cpufuncs;
1730 get_cachetype_table(); 1732 get_cachetype_table();
1731 return 0; 1733 return 0;
1732 } 1734 }
1733#endif /* CPU_ARM3 */ 1735#endif /* CPU_ARM3 */
1734#ifdef CPU_ARM6 1736#ifdef CPU_ARM6
1735 if ((cputype & CPU_ID_IMPLEMENTOR_MASK) == CPU_ID_ARM_LTD && 1737 if ((cputype & CPU_ID_IMPLEMENTOR_MASK) == CPU_ID_ARM_LTD &&
1736 (cputype & 0x00000f00) == 0x00000600) { 1738 (cputype & 0x00000f00) == 0x00000600) {
1737 cpufuncs = arm6_cpufuncs; 1739 cpufuncs = arm6_cpufuncs;
1738 get_cachetype_table(); 1740 get_cachetype_table();
1739 pmap_pte_init_generic(); 1741 pmap_pte_init_generic();
1740 return 0; 1742 return 0;
1741 } 1743 }
1742#endif /* CPU_ARM6 */ 1744#endif /* CPU_ARM6 */
1743#ifdef CPU_ARM7 1745#ifdef CPU_ARM7
1744 if ((cputype & CPU_ID_IMPLEMENTOR_MASK) == CPU_ID_ARM_LTD && 1746 if ((cputype & CPU_ID_IMPLEMENTOR_MASK) == CPU_ID_ARM_LTD &&
1745 CPU_ID_IS7(cputype) && 1747 CPU_ID_IS7(cputype) &&
1746 (cputype & CPU_ID_7ARCH_MASK) == CPU_ID_7ARCH_V3) { 1748 (cputype & CPU_ID_7ARCH_MASK) == CPU_ID_7ARCH_V3) {
1747 cpufuncs = arm7_cpufuncs; 1749 cpufuncs = arm7_cpufuncs;
1748 get_cachetype_table(); 1750 get_cachetype_table();
1749 pmap_pte_init_generic(); 1751 pmap_pte_init_generic();
1750 return 0; 1752 return 0;
1751 } 1753 }
1752#endif /* CPU_ARM7 */ 1754#endif /* CPU_ARM7 */
1753#ifdef CPU_ARM7TDMI 1755#ifdef CPU_ARM7TDMI
1754 if ((cputype & CPU_ID_IMPLEMENTOR_MASK) == CPU_ID_ARM_LTD && 1756 if ((cputype & CPU_ID_IMPLEMENTOR_MASK) == CPU_ID_ARM_LTD &&
1755 CPU_ID_IS7(cputype) && 1757 CPU_ID_IS7(cputype) &&
1756 (cputype & CPU_ID_7ARCH_MASK) == CPU_ID_7ARCH_V4T) { 1758 (cputype & CPU_ID_7ARCH_MASK) == CPU_ID_7ARCH_V4T) {
1757 cpufuncs = arm7tdmi_cpufuncs; 1759 cpufuncs = arm7tdmi_cpufuncs;
1758 get_cachetype_cp15(); 1760 get_cachetype_cp15();
1759 pmap_pte_init_generic(); 1761 pmap_pte_init_generic();
1760 return 0; 1762 return 0;
1761 } 1763 }
1762#endif 1764#endif
1763#ifdef CPU_ARM8 1765#ifdef CPU_ARM8
1764 if ((cputype & CPU_ID_IMPLEMENTOR_MASK) == CPU_ID_ARM_LTD && 1766 if ((cputype & CPU_ID_IMPLEMENTOR_MASK) == CPU_ID_ARM_LTD &&
1765 (cputype & 0x0000f000) == 0x00008000) { 1767 (cputype & 0x0000f000) == 0x00008000) {
1766 cpufuncs = arm8_cpufuncs; 1768 cpufuncs = arm8_cpufuncs;
1767 get_cachetype_cp15(); 1769 get_cachetype_cp15();
1768 pmap_pte_init_arm8(); 1770 pmap_pte_init_arm8();
1769 return 0; 1771 return 0;
1770 } 1772 }
1771#endif /* CPU_ARM8 */ 1773#endif /* CPU_ARM8 */
1772#ifdef CPU_ARM9 1774#ifdef CPU_ARM9
1773 if (((cputype & CPU_ID_IMPLEMENTOR_MASK) == CPU_ID_ARM_LTD || 1775 if (((cputype & CPU_ID_IMPLEMENTOR_MASK) == CPU_ID_ARM_LTD ||
1774 (cputype & CPU_ID_IMPLEMENTOR_MASK) == CPU_ID_TI) && 1776 (cputype & CPU_ID_IMPLEMENTOR_MASK) == CPU_ID_TI) &&
1775 (cputype & 0x0000f000) == 0x00009000) { 1777 (cputype & 0x0000f000) == 0x00009000) {
1776 cpufuncs = arm9_cpufuncs; 1778 cpufuncs = arm9_cpufuncs;
1777 get_cachetype_cp15(); 1779 get_cachetype_cp15();
1778 arm9_dcache_sets_inc = 1U << arm_dcache_log2_linesize; 1780 arm9_dcache_sets_inc = 1U << arm_dcache_log2_linesize;
1779 arm9_dcache_sets_max = 1781 arm9_dcache_sets_max =
1780 (1U << (arm_dcache_log2_linesize + arm_dcache_log2_nsets)) - 1782 (1U << (arm_dcache_log2_linesize + arm_dcache_log2_nsets)) -
1781 arm9_dcache_sets_inc; 1783 arm9_dcache_sets_inc;
1782 arm9_dcache_index_inc = 1U << (32 - arm_dcache_log2_assoc); 1784 arm9_dcache_index_inc = 1U << (32 - arm_dcache_log2_assoc);
1783 arm9_dcache_index_max = 0U - arm9_dcache_index_inc; 1785 arm9_dcache_index_max = 0U - arm9_dcache_index_inc;
1784#ifdef ARM9_CACHE_WRITE_THROUGH 1786#ifdef ARM9_CACHE_WRITE_THROUGH
1785 pmap_pte_init_arm9(); 1787 pmap_pte_init_arm9();
1786#else 1788#else
1787 pmap_pte_init_generic(); 1789 pmap_pte_init_generic();
1788#endif 1790#endif
1789 return 0; 1791 return 0;
1790 } 1792 }
1791#endif /* CPU_ARM9 */ 1793#endif /* CPU_ARM9 */
1792#if defined(CPU_ARM9E) || defined(CPU_ARM10) 1794#if defined(CPU_ARM9E) || defined(CPU_ARM10)
1793 if (cputype == CPU_ID_ARM926EJS || 1795 if (cputype == CPU_ID_ARM926EJS ||
1794 cputype == CPU_ID_ARM1026EJS) { 1796 cputype == CPU_ID_ARM1026EJS) {
1795 cpufuncs = armv5_ec_cpufuncs; 1797 cpufuncs = armv5_ec_cpufuncs;
1796 get_cachetype_cp15(); 1798 get_cachetype_cp15();
1797 pmap_pte_init_generic(); 1799 pmap_pte_init_generic();
1798 return 0; 1800 return 0;
1799 } 1801 }
1800#endif /* CPU_ARM9E || CPU_ARM10 */ 1802#endif /* CPU_ARM9E || CPU_ARM10 */
1801#if defined(CPU_SHEEVA) 1803#if defined(CPU_SHEEVA)
1802 if (cputype == CPU_ID_MV88SV131 || 1804 if (cputype == CPU_ID_MV88SV131 ||
1803 cputype == CPU_ID_MV88FR571_VD) { 1805 cputype == CPU_ID_MV88FR571_VD) {
1804 cpufuncs = sheeva_cpufuncs; 1806 cpufuncs = sheeva_cpufuncs;
1805 get_cachetype_cp15(); 1807 get_cachetype_cp15();
1806 pmap_pte_init_generic(); 1808 pmap_pte_init_generic();
1807 cpu_do_powersave = 1; /* Enable powersave */ 1809 cpu_do_powersave = 1; /* Enable powersave */
1808 return 0; 1810 return 0;
1809 } 1811 }
1810#endif /* CPU_SHEEVA */ 1812#endif /* CPU_SHEEVA */
1811#ifdef CPU_ARM10 1813#ifdef CPU_ARM10
1812 if (/* cputype == CPU_ID_ARM1020T || */ 1814 if (/* cputype == CPU_ID_ARM1020T || */
1813 cputype == CPU_ID_ARM1020E) { 1815 cputype == CPU_ID_ARM1020E) {
1814 /* 1816 /*
1815 * Select write-through cacheing (this isn't really an 1817 * Select write-through cacheing (this isn't really an
1816 * option on ARM1020T). 1818 * option on ARM1020T).
1817 */ 1819 */
1818 cpufuncs = arm10_cpufuncs; 1820 cpufuncs = arm10_cpufuncs;
1819 get_cachetype_cp15(); 1821 get_cachetype_cp15();
1820 armv5_dcache_sets_inc = 1U << arm_dcache_log2_linesize; 1822 armv5_dcache_sets_inc = 1U << arm_dcache_log2_linesize;
1821 armv5_dcache_sets_max = 1823 armv5_dcache_sets_max =
1822 (1U << (arm_dcache_log2_linesize + arm_dcache_log2_nsets)) - 1824 (1U << (arm_dcache_log2_linesize + arm_dcache_log2_nsets)) -
1823 armv5_dcache_sets_inc; 1825 armv5_dcache_sets_inc;
1824 armv5_dcache_index_inc = 1U << (32 - arm_dcache_log2_assoc); 1826 armv5_dcache_index_inc = 1U << (32 - arm_dcache_log2_assoc);
1825 armv5_dcache_index_max = 0U - armv5_dcache_index_inc; 1827 armv5_dcache_index_max = 0U - armv5_dcache_index_inc;
1826 pmap_pte_init_generic(); 1828 pmap_pte_init_generic();
1827 return 0; 1829 return 0;
1828 } 1830 }
1829#endif /* CPU_ARM10 */ 1831#endif /* CPU_ARM10 */
1830 1832
1831 1833
1832#if defined(CPU_ARM11MPCORE) 1834#if defined(CPU_ARM11MPCORE)
1833 if (cputype == CPU_ID_ARM11MPCORE) { 1835 if (cputype == CPU_ID_ARM11MPCORE) {
1834 cpufuncs = arm11mpcore_cpufuncs; 1836 cpufuncs = arm11mpcore_cpufuncs;
1835 get_cachetype_cp15(); 1837 get_cachetype_cp15();
1836 armv5_dcache_sets_inc = 1U << arm_dcache_log2_linesize; 1838 armv5_dcache_sets_inc = 1U << arm_dcache_log2_linesize;
1837 armv5_dcache_sets_max = (1U << (arm_dcache_log2_linesize + 1839 armv5_dcache_sets_max = (1U << (arm_dcache_log2_linesize +
1838 arm_dcache_log2_nsets)) - armv5_dcache_sets_inc; 1840 arm_dcache_log2_nsets)) - armv5_dcache_sets_inc;
1839 armv5_dcache_index_inc = 1U << (32 - arm_dcache_log2_assoc); 1841 armv5_dcache_index_inc = 1U << (32 - arm_dcache_log2_assoc);
1840 armv5_dcache_index_max = 0U - armv5_dcache_index_inc; 1842 armv5_dcache_index_max = 0U - armv5_dcache_index_inc;
1841 cpu_do_powersave = 1; /* Enable powersave */ 1843 cpu_do_powersave = 1; /* Enable powersave */
1842 pmap_pte_init_arm11mpcore(); 1844 pmap_pte_init_arm11mpcore();
1843 if (arm_cache_prefer_mask) 1845 if (arm_cache_prefer_mask)
1844 uvmexp.ncolors = (arm_cache_prefer_mask >> PGSHIFT) + 1; 1846 uvmexp.ncolors = (arm_cache_prefer_mask >> PGSHIFT) + 1;
1845 1847
1846 return 0; 1848 return 0;
1847 1849
1848 } 1850 }
1849#endif /* CPU_ARM11MPCORE */ 1851#endif /* CPU_ARM11MPCORE */
1850 1852
1851#if defined(CPU_ARM11) 1853#if defined(CPU_ARM11)
1852 if (cputype == CPU_ID_ARM1136JS || 1854 if (cputype == CPU_ID_ARM1136JS ||
1853 cputype == CPU_ID_ARM1136JSR1 || 1855 cputype == CPU_ID_ARM1136JSR1 ||
1854 cputype == CPU_ID_ARM1176JZS) { 1856 cputype == CPU_ID_ARM1176JZS) {
1855 cpufuncs = arm11_cpufuncs; 1857 cpufuncs = arm11_cpufuncs;
1856#if defined(CPU_ARM1136) 1858#if defined(CPU_ARM1136)
1857 if (cputype == CPU_ID_ARM1136JS && 1859 if (cputype == CPU_ID_ARM1136JS &&
1858 cputype == CPU_ID_ARM1136JSR1) { 1860 cputype == CPU_ID_ARM1136JSR1) {
1859 cpufuncs = arm1136_cpufuncs; 1861 cpufuncs = arm1136_cpufuncs;
1860 if (cputype == CPU_ID_ARM1136JS) 1862 if (cputype == CPU_ID_ARM1136JS)
1861 cpufuncs.cf_sleep = arm1136_sleep_rev0; 1863 cpufuncs.cf_sleep = arm1136_sleep_rev0;
1862 } 1864 }
1863#endif 1865#endif
1864#if defined(CPU_ARM1176) 1866#if defined(CPU_ARM1176)
1865 if (cputype == CPU_ID_ARM1176JZS) { 1867 if (cputype == CPU_ID_ARM1176JZS) {
1866 cpufuncs = arm1176_cpufuncs; 1868 cpufuncs = arm1176_cpufuncs;
1867 } 1869 }
1868#endif 1870#endif
1869 cpu_do_powersave = 1; /* Enable powersave */ 1871 cpu_do_powersave = 1; /* Enable powersave */
1870 get_cachetype_cp15(); 1872 get_cachetype_cp15();
1871#ifdef ARM11_CACHE_WRITE_THROUGH 1873#ifdef ARM11_CACHE_WRITE_THROUGH
1872 pmap_pte_init_arm11(); 1874 pmap_pte_init_arm11();
1873#else 1875#else
1874 pmap_pte_init_generic(); 1876 pmap_pte_init_generic();
1875#endif 1877#endif
1876 if (arm_cache_prefer_mask) 1878 if (arm_cache_prefer_mask)
1877 uvmexp.ncolors = (arm_cache_prefer_mask >> PGSHIFT) + 1; 1879 uvmexp.ncolors = (arm_cache_prefer_mask >> PGSHIFT) + 1;
1878 1880
1879 /* 1881 /*
1880 * Start and reset the PMC Cycle Counter. 1882 * Start and reset the PMC Cycle Counter.
1881 */ 1883 */
1882 armreg_pmcrv6_write(ARM11_PMCCTL_E | ARM11_PMCCTL_P | ARM11_PMCCTL_C); 1884 armreg_pmcrv6_write(ARM11_PMCCTL_E | ARM11_PMCCTL_P | ARM11_PMCCTL_C);
1883 return 0; 1885 return 0;
1884 } 1886 }
1885#endif /* CPU_ARM11 */ 1887#endif /* CPU_ARM11 */
1886#ifdef CPU_SA110 1888#ifdef CPU_SA110
1887 if (cputype == CPU_ID_SA110) { 1889 if (cputype == CPU_ID_SA110) {
1888 cpufuncs = sa110_cpufuncs; 1890 cpufuncs = sa110_cpufuncs;
1889 get_cachetype_table(); 1891 get_cachetype_table();
1890 pmap_pte_init_sa1(); 1892 pmap_pte_init_sa1();
1891 return 0; 1893 return 0;
1892 } 1894 }
1893#endif /* CPU_SA110 */ 1895#endif /* CPU_SA110 */
1894#ifdef CPU_SA1100 1896#ifdef CPU_SA1100
1895 if (cputype == CPU_ID_SA1100) { 1897 if (cputype == CPU_ID_SA1100) {
1896 cpufuncs = sa11x0_cpufuncs; 1898 cpufuncs = sa11x0_cpufuncs;
1897 get_cachetype_table(); 1899 get_cachetype_table();
1898 pmap_pte_init_sa1(); 1900 pmap_pte_init_sa1();
1899 1901
1900 /* Use powersave on this CPU. */ 1902 /* Use powersave on this CPU. */
1901 cpu_do_powersave = 1; 1903 cpu_do_powersave = 1;
1902 1904
1903 return 0; 1905 return 0;
1904 } 1906 }
1905#endif /* CPU_SA1100 */ 1907#endif /* CPU_SA1100 */
1906#ifdef CPU_SA1110 1908#ifdef CPU_SA1110
1907 if (cputype == CPU_ID_SA1110) { 1909 if (cputype == CPU_ID_SA1110) {
1908 cpufuncs = sa11x0_cpufuncs; 1910 cpufuncs = sa11x0_cpufuncs;
1909 get_cachetype_table(); 1911 get_cachetype_table();
1910 pmap_pte_init_sa1(); 1912 pmap_pte_init_sa1();
1911 1913
1912 /* Use powersave on this CPU. */ 1914 /* Use powersave on this CPU. */
1913 cpu_do_powersave = 1; 1915 cpu_do_powersave = 1;
1914 1916
1915 return 0; 1917 return 0;
1916 } 1918 }
1917#endif /* CPU_SA1110 */ 1919#endif /* CPU_SA1110 */
1918#ifdef CPU_FA526 1920#ifdef CPU_FA526
1919 if (cputype == CPU_ID_FA526) { 1921 if (cputype == CPU_ID_FA526) {
1920 cpufuncs = fa526_cpufuncs; 1922 cpufuncs = fa526_cpufuncs;
1921 get_cachetype_cp15(); 1923 get_cachetype_cp15();
1922 pmap_pte_init_generic(); 1924 pmap_pte_init_generic();
1923 1925
1924 /* Use powersave on this CPU. */ 1926 /* Use powersave on this CPU. */
1925 cpu_do_powersave = 1; 1927 cpu_do_powersave = 1;
1926 1928
1927 return 0; 1929 return 0;
1928 } 1930 }
1929#endif /* CPU_FA526 */ 1931#endif /* CPU_FA526 */
1930#ifdef CPU_IXP12X0 1932#ifdef CPU_IXP12X0
1931 if (cputype == CPU_ID_IXP1200) { 1933 if (cputype == CPU_ID_IXP1200) {
1932 cpufuncs = ixp12x0_cpufuncs; 1934 cpufuncs = ixp12x0_cpufuncs;
1933 get_cachetype_table(); 1935 get_cachetype_table();
1934 pmap_pte_init_sa1(); 1936 pmap_pte_init_sa1();
1935 return 0; 1937 return 0;
1936 } 1938 }
1937#endif /* CPU_IXP12X0 */ 1939#endif /* CPU_IXP12X0 */
1938#ifdef CPU_XSCALE_80200 1940#ifdef CPU_XSCALE_80200
1939 if (cputype == CPU_ID_80200) { 1941 if (cputype == CPU_ID_80200) {
1940 int rev = cpufunc_id() & CPU_ID_REVISION_MASK; 1942 int rev = cpufunc_id() & CPU_ID_REVISION_MASK;
1941 1943
1942 i80200_icu_init(); 1944 i80200_icu_init();
1943 1945
1944 /* 1946 /*
1945 * Reset the Performance Monitoring Unit to a 1947 * Reset the Performance Monitoring Unit to a
1946 * pristine state: 1948 * pristine state:
1947 * - CCNT, PMN0, PMN1 reset to 0 1949 * - CCNT, PMN0, PMN1 reset to 0
1948 * - overflow indications cleared 1950 * - overflow indications cleared
1949 * - all counters disabled 1951 * - all counters disabled
1950 */ 1952 */
1951 __asm volatile("mcr p14, 0, %0, c0, c0, 0" 1953 __asm volatile("mcr p14, 0, %0, c0, c0, 0"
1952 : 1954 :
1953 : "r" (PMNC_P|PMNC_C|PMNC_PMN0_IF|PMNC_PMN1_IF| 1955 : "r" (PMNC_P|PMNC_C|PMNC_PMN0_IF|PMNC_PMN1_IF|
1954 PMNC_CC_IF)); 1956 PMNC_CC_IF));
1955 1957
1956#if defined(XSCALE_CCLKCFG) 1958#if defined(XSCALE_CCLKCFG)
1957 /* 1959 /*
1958 * Crank CCLKCFG to maximum legal value. 1960 * Crank CCLKCFG to maximum legal value.
1959 */ 1961 */
1960 __asm volatile ("mcr p14, 0, %0, c6, c0, 0" 1962 __asm volatile ("mcr p14, 0, %0, c6, c0, 0"
1961 : 1963 :
1962 : "r" (XSCALE_CCLKCFG)); 1964 : "r" (XSCALE_CCLKCFG));
1963#endif 1965#endif
1964 1966
1965 /* 1967 /*
1966 * XXX Disable ECC in the Bus Controller Unit; we 1968 * XXX Disable ECC in the Bus Controller Unit; we
1967 * don't really support it, yet. Clear any pending 1969 * don't really support it, yet. Clear any pending
1968 * error indications. 1970 * error indications.
1969 */ 1971 */
1970 __asm volatile("mcr p13, 0, %0, c0, c1, 0" 1972 __asm volatile("mcr p13, 0, %0, c0, c1, 0"
1971 : 1973 :
1972 : "r" (BCUCTL_E0|BCUCTL_E1|BCUCTL_EV)); 1974 : "r" (BCUCTL_E0|BCUCTL_E1|BCUCTL_EV));
1973 1975
1974 cpufuncs = xscale_cpufuncs; 1976 cpufuncs = xscale_cpufuncs;
1975#if defined(PERFCTRS) 1977#if defined(PERFCTRS)
1976 xscale_pmu_init(); 1978 xscale_pmu_init();
1977#endif 1979#endif
1978 1980
1979 /* 1981 /*
1980 * i80200 errata: Step-A0 and A1 have a bug where 1982 * i80200 errata: Step-A0 and A1 have a bug where
1981 * D$ dirty bits are not cleared on "invalidate by 1983 * D$ dirty bits are not cleared on "invalidate by
1982 * address". 1984 * address".
1983 * 1985 *
1984 * Workaround: Clean cache line before invalidating. 1986 * Workaround: Clean cache line before invalidating.
1985 */ 1987 */
1986 if (rev == 0 || rev == 1) 1988 if (rev == 0 || rev == 1)
1987 cpufuncs.cf_dcache_inv_range = xscale_cache_purgeD_rng; 1989 cpufuncs.cf_dcache_inv_range = xscale_cache_purgeD_rng;
1988 1990
1989 get_cachetype_cp15(); 1991 get_cachetype_cp15();
1990 pmap_pte_init_xscale(); 1992 pmap_pte_init_xscale();
1991 return 0; 1993 return 0;
1992 } 1994 }
1993#endif /* CPU_XSCALE_80200 */ 1995#endif /* CPU_XSCALE_80200 */
1994#ifdef CPU_XSCALE_80321 1996#ifdef CPU_XSCALE_80321
1995 if (cputype == CPU_ID_80321_400 || cputype == CPU_ID_80321_600 || 1997 if (cputype == CPU_ID_80321_400 || cputype == CPU_ID_80321_600 ||
1996 cputype == CPU_ID_80321_400_B0 || cputype == CPU_ID_80321_600_B0 || 1998 cputype == CPU_ID_80321_400_B0 || cputype == CPU_ID_80321_600_B0 ||
1997 cputype == CPU_ID_80219_400 || cputype == CPU_ID_80219_600) { 1999 cputype == CPU_ID_80219_400 || cputype == CPU_ID_80219_600) {
1998 i80321_icu_init(); 2000 i80321_icu_init();
1999 2001
2000 /* 2002 /*
2001 * Reset the Performance Monitoring Unit to a 2003 * Reset the Performance Monitoring Unit to a
2002 * pristine state: 2004 * pristine state:
2003 * - CCNT, PMN0, PMN1 reset to 0 2005 * - CCNT, PMN0, PMN1 reset to 0
2004 * - overflow indications cleared 2006 * - overflow indications cleared
2005 * - all counters disabled 2007 * - all counters disabled
2006 */ 2008 */
2007 __asm volatile("mcr p14, 0, %0, c0, c0, 0" 2009 __asm volatile("mcr p14, 0, %0, c0, c0, 0"
2008 : 2010 :
2009 : "r" (PMNC_P|PMNC_C|PMNC_PMN0_IF|PMNC_PMN1_IF| 2011 : "r" (PMNC_P|PMNC_C|PMNC_PMN0_IF|PMNC_PMN1_IF|
2010 PMNC_CC_IF)); 2012 PMNC_CC_IF));
2011 2013
2012 cpufuncs = xscale_cpufuncs; 2014 cpufuncs = xscale_cpufuncs;
2013#if defined(PERFCTRS) 2015#if defined(PERFCTRS)
2014 xscale_pmu_init(); 2016 xscale_pmu_init();
2015#endif 2017#endif
2016 2018
2017 get_cachetype_cp15(); 2019 get_cachetype_cp15();
2018 pmap_pte_init_xscale(); 2020 pmap_pte_init_xscale();
2019 return 0; 2021 return 0;
2020 } 2022 }
2021#endif /* CPU_XSCALE_80321 */ 2023#endif /* CPU_XSCALE_80321 */
2022#ifdef __CPU_XSCALE_PXA2XX 2024#ifdef __CPU_XSCALE_PXA2XX
2023 /* ignore core revision to test PXA2xx CPUs */ 2025 /* ignore core revision to test PXA2xx CPUs */
2024 if ((cputype & ~CPU_ID_XSCALE_COREREV_MASK) == CPU_ID_PXA27X || 2026 if ((cputype & ~CPU_ID_XSCALE_COREREV_MASK) == CPU_ID_PXA27X ||
2025 (cputype & ~CPU_ID_XSCALE_COREREV_MASK) == CPU_ID_PXA250 || 2027 (cputype & ~CPU_ID_XSCALE_COREREV_MASK) == CPU_ID_PXA250 ||
2026 (cputype & ~CPU_ID_XSCALE_COREREV_MASK) == CPU_ID_PXA210) { 2028 (cputype & ~CPU_ID_XSCALE_COREREV_MASK) == CPU_ID_PXA210) {
2027 2029
2028 cpufuncs = xscale_cpufuncs; 2030 cpufuncs = xscale_cpufuncs;
2029#if defined(PERFCTRS) 2031#if defined(PERFCTRS)
2030 xscale_pmu_init(); 2032 xscale_pmu_init();
2031#endif 2033#endif
2032 2034
2033 get_cachetype_cp15(); 2035 get_cachetype_cp15();
2034 pmap_pte_init_xscale(); 2036 pmap_pte_init_xscale();
2035 2037
2036 /* Use powersave on this CPU. */ 2038 /* Use powersave on this CPU. */
2037 cpu_do_powersave = 1; 2039 cpu_do_powersave = 1;
2038 2040
2039 return 0; 2041 return 0;
2040 } 2042 }
2041#endif /* __CPU_XSCALE_PXA2XX */ 2043#endif /* __CPU_XSCALE_PXA2XX */
2042#ifdef CPU_XSCALE_IXP425 2044#ifdef CPU_XSCALE_IXP425
2043 if (cputype == CPU_ID_IXP425_533 || cputype == CPU_ID_IXP425_400 || 2045 if (cputype == CPU_ID_IXP425_533 || cputype == CPU_ID_IXP425_400 ||
2044 cputype == CPU_ID_IXP425_266) { 2046 cputype == CPU_ID_IXP425_266) {
2045 ixp425_icu_init(); 2047 ixp425_icu_init();
2046 2048
2047 cpufuncs = xscale_cpufuncs; 2049 cpufuncs = xscale_cpufuncs;
2048#if defined(PERFCTRS) 2050#if defined(PERFCTRS)
2049 xscale_pmu_init(); 2051 xscale_pmu_init();
2050#endif 2052#endif
2051 2053
2052 get_cachetype_cp15(); 2054 get_cachetype_cp15();
2053 pmap_pte_init_xscale(); 2055 pmap_pte_init_xscale();
2054 2056
2055 return 0; 2057 return 0;
2056 } 2058 }
2057#endif /* CPU_XSCALE_IXP425 */ 2059#endif /* CPU_XSCALE_IXP425 */
2058#if defined(CPU_CORTEX) 2060#if defined(CPU_CORTEX)
2059 if (CPU_ID_CORTEX_P(cputype)) { 2061 if (CPU_ID_CORTEX_P(cputype)) {
2060 cpufuncs = cortex_cpufuncs; 2062 cpufuncs = cortex_cpufuncs;
2061 cpu_do_powersave = 1; /* Enable powersave */ 2063 cpu_do_powersave = 1; /* Enable powersave */
2062 get_cachetype_cp15(); 2064 get_cachetype_cp15();
2063 pmap_pte_init_armv7(); 2065 pmap_pte_init_armv7();
2064 if (arm_cache_prefer_mask) 2066 if (arm_cache_prefer_mask)
2065 uvmexp.ncolors = (arm_cache_prefer_mask >> PGSHIFT) + 1; 2067 uvmexp.ncolors = (arm_cache_prefer_mask >> PGSHIFT) + 1;
2066 /* 2068 /*
2067 * Start and reset the PMC Cycle Counter. 2069 * Start and reset the PMC Cycle Counter.
2068 */ 2070 */
2069 armreg_pmcr_write(ARM11_PMCCTL_E | ARM11_PMCCTL_P | ARM11_PMCCTL_C); 2071 armreg_pmcr_write(ARM11_PMCCTL_E | ARM11_PMCCTL_P | ARM11_PMCCTL_C);
2070 armreg_pmcntenset_write(CORTEX_CNTENS_C); 2072 armreg_pmcntenset_write(CORTEX_CNTENS_C);
2071 return 0; 2073 return 0;
2072 } 2074 }
2073#endif /* CPU_CORTEX */ 2075#endif /* CPU_CORTEX */
2074 2076
2075#if defined(CPU_PJ4B) 2077#if defined(CPU_PJ4B)
2076 if ((cputype == CPU_ID_MV88SV581X_V6 || 2078 if ((cputype == CPU_ID_MV88SV581X_V6 ||
2077 cputype == CPU_ID_MV88SV581X_V7 || 2079 cputype == CPU_ID_MV88SV581X_V7 ||
2078 cputype == CPU_ID_MV88SV584X_V7 || 2080 cputype == CPU_ID_MV88SV584X_V7 ||
2079 cputype == CPU_ID_ARM_88SV581X_V6 || 2081 cputype == CPU_ID_ARM_88SV581X_V6 ||
2080 cputype == CPU_ID_ARM_88SV581X_V7) && 2082 cputype == CPU_ID_ARM_88SV581X_V7) &&
2081 (cpu_pfr(0) & ARM_PFR0_THUMBEE_MASK)) { 2083 (cpu_pfr(0) & ARM_PFR0_THUMBEE_MASK)) {
2082 cpufuncs = pj4bv7_cpufuncs; 2084 cpufuncs = pj4bv7_cpufuncs;
2083 get_cachetype_cp15(); 2085 get_cachetype_cp15();
2084 pmap_pte_init_armv7(); 2086 pmap_pte_init_armv7();
2085 return 0; 2087 return 0;
2086 } 2088 }
2087#endif /* CPU_PJ4B */ 2089#endif /* CPU_PJ4B */
2088 2090
2089 /* 2091 /*
2090 * Bzzzz. And the answer was ... 2092 * Bzzzz. And the answer was ...
2091 */ 2093 */
2092 panic("No support for this CPU type (%08x) in kernel", cputype); 2094 panic("No support for this CPU type (%08x) in kernel", cputype);
2093 return(ARCHITECTURE_NOT_PRESENT); 2095 return(ARCHITECTURE_NOT_PRESENT);
2094} 2096}
2095 2097
2096#ifdef CPU_ARM2 2098#ifdef CPU_ARM2
2097u_int arm2_id(void) 2099u_int arm2_id(void)
2098{ 2100{
2099 2101
2100 return CPU_ID_ARM2; 2102 return CPU_ID_ARM2;
2101} 2103}
2102#endif /* CPU_ARM2 */ 2104#endif /* CPU_ARM2 */
2103 2105
2104#ifdef CPU_ARM250 2106#ifdef CPU_ARM250
2105u_int arm250_id(void) 2107u_int arm250_id(void)
2106{ 2108{
2107 2109
2108 return CPU_ID_ARM250; 2110 return CPU_ID_ARM250;
2109} 2111}
2110#endif /* CPU_ARM250 */ 2112#endif /* CPU_ARM250 */
2111 2113
2112/* 2114/*
2113 * Fixup routines for data and prefetch aborts. 2115 * Fixup routines for data and prefetch aborts.
2114 * 2116 *
2115 * Several compile time symbols are used 2117 * Several compile time symbols are used
2116 * 2118 *
2117 * DEBUG_FAULT_CORRECTION - Print debugging information during the 2119 * DEBUG_FAULT_CORRECTION - Print debugging information during the
2118 * correction of registers after a fault. 2120 * correction of registers after a fault.
2119 * ARM6_LATE_ABORT - ARM6 supports both early and late aborts 2121 * ARM6_LATE_ABORT - ARM6 supports both early and late aborts
2120 * when defined should use late aborts 2122 * when defined should use late aborts
2121 */ 2123 */
2122 2124
2123 2125
2124/* 2126/*
2125 * Null abort fixup routine. 2127 * Null abort fixup routine.
2126 * For use when no fixup is required. 2128 * For use when no fixup is required.
2127 */ 2129 */
2128int 2130int
2129cpufunc_null_fixup(void *arg) 2131cpufunc_null_fixup(void *arg)
2130{ 2132{
2131 return(ABORT_FIXUP_OK); 2133 return(ABORT_FIXUP_OK);
2132} 2134}
2133 2135
2134 2136
2135#if defined(CPU_ARM2) || defined(CPU_ARM250) || defined(CPU_ARM3) || \ 2137#if defined(CPU_ARM2) || defined(CPU_ARM250) || defined(CPU_ARM3) || \
2136 defined(CPU_ARM6) || defined(CPU_ARM7) || defined(CPU_ARM7TDMI) 2138 defined(CPU_ARM6) || defined(CPU_ARM7) || defined(CPU_ARM7TDMI)
2137 2139
2138#ifdef DEBUG_FAULT_CORRECTION 2140#ifdef DEBUG_FAULT_CORRECTION
2139#define DFC_PRINTF(x) printf x 2141#define DFC_PRINTF(x) printf x
2140#define DFC_DISASSEMBLE(x) disassemble(x) 2142#define DFC_DISASSEMBLE(x) disassemble(x)
2141#else 2143#else
2142#define DFC_PRINTF(x) /* nothing */ 2144#define DFC_PRINTF(x) /* nothing */
2143#define DFC_DISASSEMBLE(x) /* nothing */ 2145#define DFC_DISASSEMBLE(x) /* nothing */
2144#endif 2146#endif
2145 2147
2146/* 2148/*
2147 * "Early" data abort fixup. 2149 * "Early" data abort fixup.
2148 * 2150 *
2149 * For ARM2, ARM2as, ARM3 and ARM6 (in early-abort mode). Also used 2151 * For ARM2, ARM2as, ARM3 and ARM6 (in early-abort mode). Also used
2150 * indirectly by ARM6 (in late-abort mode) and ARM7[TDMI]. 2152 * indirectly by ARM6 (in late-abort mode) and ARM7[TDMI].
2151 * 2153 *
2152 * In early aborts, we may have to fix up LDM, STM, LDC and STC. 2154 * In early aborts, we may have to fix up LDM, STM, LDC and STC.
2153 */ 2155 */
2154int 2156int
2155early_abort_fixup(void *arg) 2157early_abort_fixup(void *arg)
2156{ 2158{
2157 trapframe_t *frame = arg; 2159 trapframe_t *frame = arg;
2158 u_int fault_pc; 2160 u_int fault_pc;
2159 u_int fault_instruction; 2161 u_int fault_instruction;
2160 int saved_lr = 0; 2162 int saved_lr = 0;
2161 2163
2162 if ((frame->tf_spsr & PSR_MODE) == PSR_SVC32_MODE) { 2164 if ((frame->tf_spsr & PSR_MODE) == PSR_SVC32_MODE) {
2163 2165
2164 /* Ok an abort in SVC mode */ 2166 /* Ok an abort in SVC mode */
2165 2167
2166 /* 2168 /*
2167 * Copy the SVC r14 into the usr r14 - The usr r14 is garbage 2169 * Copy the SVC r14 into the usr r14 - The usr r14 is garbage
2168 * as the fault happened in svc mode but we need it in the 2170 * as the fault happened in svc mode but we need it in the
2169 * usr slot so we can treat the registers as an array of ints 2171 * usr slot so we can treat the registers as an array of ints
2170 * during fixing. 2172 * during fixing.
2171 * NOTE: This PC is in the position but writeback is not 2173 * NOTE: This PC is in the position but writeback is not
2172 * allowed on r15. 2174 * allowed on r15.
2173 * Doing it like this is more efficient than trapping this 2175 * Doing it like this is more efficient than trapping this
2174 * case in all possible locations in the following fixup code. 2176 * case in all possible locations in the following fixup code.
2175 */ 2177 */
2176 2178
2177 saved_lr = frame->tf_usr_lr; 2179 saved_lr = frame->tf_usr_lr;
2178 frame->tf_usr_lr = frame->tf_svc_lr; 2180 frame->tf_usr_lr = frame->tf_svc_lr;
2179 2181
2180 /* 2182 /*
2181 * Note the trapframe does not have the SVC r13 so a fault 2183 * Note the trapframe does not have the SVC r13 so a fault
2182 * from an instruction with writeback to r13 in SVC mode is 2184 * from an instruction with writeback to r13 in SVC mode is
2183 * not allowed. This should not happen as the kstack is 2185 * not allowed. This should not happen as the kstack is
2184 * always valid. 2186 * always valid.
2185 */ 2187 */
2186 } 2188 }
2187 2189
2188 /* Get fault address and status from the CPU */ 2190 /* Get fault address and status from the CPU */
2189 2191
2190 fault_pc = frame->tf_pc; 2192 fault_pc = frame->tf_pc;
2191 fault_instruction = *((volatile unsigned int *)fault_pc); 2193 fault_instruction = *((volatile unsigned int *)fault_pc);
2192 2194
2193 /* Decode the fault instruction and fix the registers as needed */ 2195 /* Decode the fault instruction and fix the registers as needed */
2194 2196
2195 if ((fault_instruction & 0x0e000000) == 0x08000000) { 2197 if ((fault_instruction & 0x0e000000) == 0x08000000) {
2196 int base; 2198 int base;
2197 int loop; 2199 int loop;
2198 int count; 2200 int count;
2199 int *registers = &frame->tf_r0; 2201 int *registers = &frame->tf_r0;
2200 2202
2201 DFC_PRINTF(("LDM/STM\n")); 2203 DFC_PRINTF(("LDM/STM\n"));
2202 DFC_DISASSEMBLE(fault_pc); 2204 DFC_DISASSEMBLE(fault_pc);
2203 if (fault_instruction & (1 << 21)) { 2205 if (fault_instruction & (1 << 21)) {
2204 DFC_PRINTF(("This instruction must be corrected\n")); 2206 DFC_PRINTF(("This instruction must be corrected\n"));
2205 base = (fault_instruction >> 16) & 0x0f; 2207 base = (fault_instruction >> 16) & 0x0f;
2206 if (base == 15) 2208 if (base == 15)
2207 return ABORT_FIXUP_FAILED; 2209 return ABORT_FIXUP_FAILED;
2208 /* Count registers transferred */ 2210 /* Count registers transferred */
2209 count = 0; 2211 count = 0;
2210 for (loop = 0; loop < 16; ++loop) { 2212 for (loop = 0; loop < 16; ++loop) {
2211 if (fault_instruction & (1<<loop)) 2213 if (fault_instruction & (1<<loop))
2212 ++count; 2214 ++count;
2213 } 2215 }
2214 DFC_PRINTF(("%d registers used\n", count)); 2216 DFC_PRINTF(("%d registers used\n", count));
2215 DFC_PRINTF(("Corrected r%d by %d bytes ", 2217 DFC_PRINTF(("Corrected r%d by %d bytes ",
2216 base, count * 4)); 2218 base, count * 4));
2217 if (fault_instruction & (1 << 23)) { 2219 if (fault_instruction & (1 << 23)) {
2218 DFC_PRINTF(("down\n")); 2220 DFC_PRINTF(("down\n"));
2219 registers[base] -= count * 4; 2221 registers[base] -= count * 4;
2220 } else { 2222 } else {
2221 DFC_PRINTF(("up\n")); 2223 DFC_PRINTF(("up\n"));
2222 registers[base] += count * 4; 2224 registers[base] += count * 4;
2223 } 2225 }
2224 } 2226 }
2225 } else if ((fault_instruction & 0x0e000000) == 0x0c000000) { 2227 } else if ((fault_instruction & 0x0e000000) == 0x0c000000) {
2226 int base; 2228 int base;
2227 int offset; 2229 int offset;
2228 int *registers = &frame->tf_r0; 2230 int *registers = &frame->tf_r0;
2229 2231
2230 /* REGISTER CORRECTION IS REQUIRED FOR THESE INSTRUCTIONS */ 2232 /* REGISTER CORRECTION IS REQUIRED FOR THESE INSTRUCTIONS */
2231 2233
2232 DFC_DISASSEMBLE(fault_pc); 2234 DFC_DISASSEMBLE(fault_pc);
2233 2235
2234 /* Only need to fix registers if write back is turned on */ 2236 /* Only need to fix registers if write back is turned on */
2235 2237
2236 if ((fault_instruction & (1 << 21)) != 0) { 2238 if ((fault_instruction & (1 << 21)) != 0) {
2237 base = (fault_instruction >> 16) & 0x0f; 2239 base = (fault_instruction >> 16) & 0x0f;
2238 if (base == 13 && 2240 if (base == 13 &&
2239 (frame->tf_spsr & PSR_MODE) == PSR_SVC32_MODE) 2241 (frame->tf_spsr & PSR_MODE) == PSR_SVC32_MODE)
2240 return ABORT_FIXUP_FAILED; 2242 return ABORT_FIXUP_FAILED;
2241 if (base == 15) 2243 if (base == 15)
2242 return ABORT_FIXUP_FAILED; 2244 return ABORT_FIXUP_FAILED;
2243 2245
2244 offset = (fault_instruction & 0xff) << 2; 2246 offset = (fault_instruction & 0xff) << 2;
2245 DFC_PRINTF(("r%d=%08x\n", base, registers[base])); 2247 DFC_PRINTF(("r%d=%08x\n", base, registers[base]));
2246 if ((fault_instruction & (1 << 23)) != 0) 2248 if ((fault_instruction & (1 << 23)) != 0)
2247 offset = -offset; 2249 offset = -offset;
2248 registers[base] += offset; 2250 registers[base] += offset;
2249 DFC_PRINTF(("r%d=%08x\n", base, registers[base])); 2251 DFC_PRINTF(("r%d=%08x\n", base, registers[base]));
2250 } 2252 }
2251 } else if ((fault_instruction & 0x0e000000) == 0x0c000000) 2253 } else if ((fault_instruction & 0x0e000000) == 0x0c000000)
2252 return ABORT_FIXUP_FAILED; 2254 return ABORT_FIXUP_FAILED;
2253 2255
2254 if ((frame->tf_spsr & PSR_MODE) == PSR_SVC32_MODE) { 2256 if ((frame->tf_spsr & PSR_MODE) == PSR_SVC32_MODE) {
2255 2257
2256 /* Ok an abort in SVC mode */ 2258 /* Ok an abort in SVC mode */
2257 2259
2258 /* 2260 /*
2259 * Copy the SVC r14 into the usr r14 - The usr r14 is garbage 2261 * Copy the SVC r14 into the usr r14 - The usr r14 is garbage
2260 * as the fault happened in svc mode but we need it in the 2262 * as the fault happened in svc mode but we need it in the
2261 * usr slot so we can treat the registers as an array of ints 2263 * usr slot so we can treat the registers as an array of ints
2262 * during fixing. 2264 * during fixing.
2263 * NOTE: This PC is in the position but writeback is not 2265 * NOTE: This PC is in the position but writeback is not
2264 * allowed on r15. 2266 * allowed on r15.
2265 * Doing it like this is more efficient than trapping this 2267 * Doing it like this is more efficient than trapping this
2266 * case in all possible locations in the prior fixup code. 2268 * case in all possible locations in the prior fixup code.
2267 */ 2269 */
2268 2270
2269 frame->tf_svc_lr = frame->tf_usr_lr; 2271 frame->tf_svc_lr = frame->tf_usr_lr;
2270 frame->tf_usr_lr = saved_lr; 2272 frame->tf_usr_lr = saved_lr;
2271 2273
2272 /* 2274 /*
2273 * Note the trapframe does not have the SVC r13 so a fault 2275 * Note the trapframe does not have the SVC r13 so a fault
2274 * from an instruction with writeback to r13 in SVC mode is 2276 * from an instruction with writeback to r13 in SVC mode is
2275 * not allowed. This should not happen as the kstack is 2277 * not allowed. This should not happen as the kstack is
2276 * always valid. 2278 * always valid.
2277 */ 2279 */
2278 } 2280 }
2279 2281
2280 return(ABORT_FIXUP_OK); 2282 return(ABORT_FIXUP_OK);
2281} 2283}
2282#endif /* CPU_ARM2/250/3/6/7 */ 2284#endif /* CPU_ARM2/250/3/6/7 */
2283 2285
2284 2286
2285#if (defined(CPU_ARM6) && defined(ARM6_LATE_ABORT)) || defined(CPU_ARM7) || \ 2287#if (defined(CPU_ARM6) && defined(ARM6_LATE_ABORT)) || defined(CPU_ARM7) || \
2286 defined(CPU_ARM7TDMI) 2288 defined(CPU_ARM7TDMI)
2287/* 2289/*
2288 * "Late" (base updated) data abort fixup 2290 * "Late" (base updated) data abort fixup
2289 * 2291 *
2290 * For ARM6 (in late-abort mode) and ARM7. 2292 * For ARM6 (in late-abort mode) and ARM7.
2291 * 2293 *
2292 * In this model, all data-transfer instructions need fixing up. We defer 2294 * In this model, all data-transfer instructions need fixing up. We defer
2293 * LDM, STM, LDC and STC fixup to the early-abort handler. 2295 * LDM, STM, LDC and STC fixup to the early-abort handler.
2294 */ 2296 */
2295int 2297int
2296late_abort_fixup(void *arg) 2298late_abort_fixup(void *arg)
2297{ 2299{
2298 trapframe_t *frame = arg; 2300 trapframe_t *frame = arg;
2299 u_int fault_pc; 2301 u_int fault_pc;
2300 u_int fault_instruction; 2302 u_int fault_instruction;
2301 int saved_lr = 0; 2303 int saved_lr = 0;
2302 2304
2303 if ((frame->tf_spsr & PSR_MODE) == PSR_SVC32_MODE) { 2305 if ((frame->tf_spsr & PSR_MODE) == PSR_SVC32_MODE) {
2304 2306
2305 /* Ok an abort in SVC mode */ 2307 /* Ok an abort in SVC mode */
2306 2308
2307 /* 2309 /*
2308 * Copy the SVC r14 into the usr r14 - The usr r14 is garbage 2310 * Copy the SVC r14 into the usr r14 - The usr r14 is garbage
2309 * as the fault happened in svc mode but we need it in the 2311 * as the fault happened in svc mode but we need it in the
2310 * usr slot so we can treat the registers as an array of ints 2312 * usr slot so we can treat the registers as an array of ints
2311 * during fixing. 2313 * during fixing.
2312 * NOTE: This PC is in the position but writeback is not 2314 * NOTE: This PC is in the position but writeback is not
2313 * allowed on r15. 2315 * allowed on r15.
2314 * Doing it like this is more efficient than trapping this 2316 * Doing it like this is more efficient than trapping this
2315 * case in all possible locations in the following fixup code. 2317 * case in all possible locations in the following fixup code.
2316 */ 2318 */
2317 2319
2318 saved_lr = frame->tf_usr_lr; 2320 saved_lr = frame->tf_usr_lr;
2319 frame->tf_usr_lr = frame->tf_svc_lr; 2321 frame->tf_usr_lr = frame->tf_svc_lr;
2320 2322
2321 /* 2323 /*
2322 * Note the trapframe does not have the SVC r13 so a fault 2324 * Note the trapframe does not have the SVC r13 so a fault
2323 * from an instruction with writeback to r13 in SVC mode is 2325 * from an instruction with writeback to r13 in SVC mode is
2324 * not allowed. This should not happen as the kstack is 2326 * not allowed. This should not happen as the kstack is
2325 * always valid. 2327 * always valid.
2326 */ 2328 */
2327 } 2329 }
2328 2330
2329 /* Get fault address and status from the CPU */ 2331 /* Get fault address and status from the CPU */
2330 2332
2331 fault_pc = frame->tf_pc; 2333 fault_pc = frame->tf_pc;
2332 fault_instruction = *((volatile unsigned int *)fault_pc); 2334 fault_instruction = *((volatile unsigned int *)fault_pc);
2333 2335
2334 /* Decode the fault instruction and fix the registers as needed */ 2336 /* Decode the fault instruction and fix the registers as needed */
2335 2337
2336 /* Was is a swap instruction ? */ 2338 /* Was is a swap instruction ? */
2337 2339
2338 if ((fault_instruction & 0x0fb00ff0) == 0x01000090) { 2340 if ((fault_instruction & 0x0fb00ff0) == 0x01000090) {
2339 DFC_DISASSEMBLE(fault_pc); 2341 DFC_DISASSEMBLE(fault_pc);
2340 } else if ((fault_instruction & 0x0c000000) == 0x04000000) { 2342 } else if ((fault_instruction & 0x0c000000) == 0x04000000) {
2341 2343
2342 /* Was is a ldr/str instruction */ 2344 /* Was is a ldr/str instruction */
2343 /* This is for late abort only */ 2345 /* This is for late abort only */
2344 2346
2345 int base; 2347 int base;
2346 int offset; 2348 int offset;
2347 int *registers = &frame->tf_r0; 2349 int *registers = &frame->tf_r0;
2348 2350
2349 DFC_DISASSEMBLE(fault_pc); 2351 DFC_DISASSEMBLE(fault_pc);
2350 2352
2351 /* This is for late abort only */ 2353 /* This is for late abort only */
2352 2354
2353 if ((fault_instruction & (1 << 24)) == 0 2355 if ((fault_instruction & (1 << 24)) == 0
2354 || (fault_instruction & (1 << 21)) != 0) { 2356 || (fault_instruction & (1 << 21)) != 0) {
2355 /* postindexed ldr/str with no writeback */ 2357 /* postindexed ldr/str with no writeback */
2356 2358
2357 base = (fault_instruction >> 16) & 0x0f; 2359 base = (fault_instruction >> 16) & 0x0f;
2358 if (base == 13 && 2360 if (base == 13 &&
2359 (frame->tf_spsr & PSR_MODE) == PSR_SVC32_MODE) 2361 (frame->tf_spsr & PSR_MODE) == PSR_SVC32_MODE)
2360 return ABORT_FIXUP_FAILED; 2362 return ABORT_FIXUP_FAILED;
2361 if (base == 15) 2363 if (base == 15)
2362 return ABORT_FIXUP_FAILED; 2364 return ABORT_FIXUP_FAILED;
2363 DFC_PRINTF(("late abt fix: r%d=%08x : ", 2365 DFC_PRINTF(("late abt fix: r%d=%08x : ",
2364 base, registers[base])); 2366 base, registers[base]));
2365 if ((fault_instruction & (1 << 25)) == 0) { 2367 if ((fault_instruction & (1 << 25)) == 0) {
2366 /* Immediate offset - easy */ 2368 /* Immediate offset - easy */
2367 2369
2368 offset = fault_instruction & 0xfff; 2370 offset = fault_instruction & 0xfff;
2369 if ((fault_instruction & (1 << 23))) 2371 if ((fault_instruction & (1 << 23)))
2370 offset = -offset; 2372 offset = -offset;
2371 registers[base] += offset; 2373 registers[base] += offset;
2372 DFC_PRINTF(("imm=%08x ", offset)); 2374 DFC_PRINTF(("imm=%08x ", offset));
2373 } else { 2375 } else {
2374 /* offset is a shifted register */ 2376 /* offset is a shifted register */
2375 int shift; 2377 int shift;
2376 2378
2377 offset = fault_instruction & 0x0f; 2379 offset = fault_instruction & 0x0f;
2378 if (offset == base) 2380 if (offset == base)
2379 return ABORT_FIXUP_FAILED; 2381 return ABORT_FIXUP_FAILED;
2380 2382
2381 /* 2383 /*
2382 * Register offset - hard we have to 2384 * Register offset - hard we have to
2383 * cope with shifts ! 2385 * cope with shifts !
2384 */ 2386 */
2385 offset = registers[offset]; 2387 offset = registers[offset];
2386 2388
2387 if ((fault_instruction & (1 << 4)) == 0) 2389 if ((fault_instruction & (1 << 4)) == 0)
2388 /* shift with amount */ 2390 /* shift with amount */
2389 shift = (fault_instruction >> 7) & 0x1f; 2391 shift = (fault_instruction >> 7) & 0x1f;
2390 else { 2392 else {
2391 /* shift with register */ 2393 /* shift with register */
2392 if ((fault_instruction & (1 << 7)) != 0) 2394 if ((fault_instruction & (1 << 7)) != 0)
2393 /* undefined for now so bail out */ 2395 /* undefined for now so bail out */
2394 return ABORT_FIXUP_FAILED; 2396 return ABORT_FIXUP_FAILED;
2395 shift = ((fault_instruction >> 8) & 0xf); 2397 shift = ((fault_instruction >> 8) & 0xf);
2396 if (base == shift) 2398 if (base == shift)
2397 return ABORT_FIXUP_FAILED; 2399 return ABORT_FIXUP_FAILED;
2398 DFC_PRINTF(("shift reg=%d ", shift)); 2400 DFC_PRINTF(("shift reg=%d ", shift));
2399 shift = registers[shift]; 2401 shift = registers[shift];
2400 } 2402 }
2401 DFC_PRINTF(("shift=%08x ", shift)); 2403 DFC_PRINTF(("shift=%08x ", shift));
2402 switch (((fault_instruction >> 5) & 0x3)) { 2404 switch (((fault_instruction >> 5) & 0x3)) {
2403 case 0 : /* Logical left */ 2405 case 0 : /* Logical left */
2404 offset = (int)(((u_int)offset) << shift); 2406 offset = (int)(((u_int)offset) << shift);
2405 break; 2407 break;
2406 case 1 : /* Logical Right */ 2408 case 1 : /* Logical Right */
2407 if (shift == 0) shift = 32; 2409 if (shift == 0) shift = 32;
2408 offset = (int)(((u_int)offset) >> shift); 2410 offset = (int)(((u_int)offset) >> shift);
2409 break; 2411 break;
2410 case 2 : /* Arithmetic Right */ 2412 case 2 : /* Arithmetic Right */
2411 if (shift == 0) shift = 32; 2413 if (shift == 0) shift = 32;
2412 offset = (int)(((int)offset) >> shift); 2414 offset = (int)(((int)offset) >> shift);
2413 break; 2415 break;
2414 case 3 : /* Rotate right (rol or rxx) */ 2416 case 3 : /* Rotate right (rol or rxx) */
2415 return ABORT_FIXUP_FAILED; 2417 return ABORT_FIXUP_FAILED;
2416 break; 2418 break;
2417 } 2419 }
2418 2420
2419 DFC_PRINTF(("abt: fixed LDR/STR with " 2421 DFC_PRINTF(("abt: fixed LDR/STR with "
2420 "register offset\n")); 2422 "register offset\n"));
2421 if ((fault_instruction & (1 << 23))) 2423 if ((fault_instruction & (1 << 23)))
2422 offset = -offset; 2424 offset = -offset;
2423 DFC_PRINTF(("offset=%08x ", offset)); 2425 DFC_PRINTF(("offset=%08x ", offset));
2424 registers[base] += offset; 2426 registers[base] += offset;
2425 } 2427 }
2426 DFC_PRINTF(("r%d=%08x\n", base, registers[base])); 2428 DFC_PRINTF(("r%d=%08x\n", base, registers[base]));
2427 } 2429 }
2428 } 2430 }
2429 2431
2430 if ((frame->tf_spsr & PSR_MODE) == PSR_SVC32_MODE) { 2432 if ((frame->tf_spsr & PSR_MODE) == PSR_SVC32_MODE) {
2431 2433
2432 /* Ok an abort in SVC mode */ 2434 /* Ok an abort in SVC mode */
2433 2435
2434 /* 2436 /*
2435 * Copy the SVC r14 into the usr r14 - The usr r14 is garbage 2437 * Copy the SVC r14 into the usr r14 - The usr r14 is garbage
2436 * as the fault happened in svc mode but we need it in the 2438 * as the fault happened in svc mode but we need it in the
2437 * usr slot so we can treat the registers as an array of ints 2439 * usr slot so we can treat the registers as an array of ints
2438 * during fixing. 2440 * during fixing.
2439 * NOTE: This PC is in the position but writeback is not 2441 * NOTE: This PC is in the position but writeback is not
2440 * allowed on r15. 2442 * allowed on r15.
2441 * Doing it like this is more efficient than trapping this 2443 * Doing it like this is more efficient than trapping this
2442 * case in all possible locations in the prior fixup code. 2444 * case in all possible locations in the prior fixup code.
2443 */ 2445 */
2444 2446
2445 frame->tf_svc_lr = frame->tf_usr_lr; 2447 frame->tf_svc_lr = frame->tf_usr_lr;
2446 frame->tf_usr_lr = saved_lr; 2448 frame->tf_usr_lr = saved_lr;
2447 2449
2448 /* 2450 /*
2449 * Note the trapframe does not have the SVC r13 so a fault 2451 * Note the trapframe does not have the SVC r13 so a fault
2450 * from an instruction with writeback to r13 in SVC mode is 2452 * from an instruction with writeback to r13 in SVC mode is
2451 * not allowed. This should not happen as the kstack is 2453 * not allowed. This should not happen as the kstack is
2452 * always valid. 2454 * always valid.
2453 */ 2455 */
2454 } 2456 }
2455 2457
2456 /* 2458 /*
2457 * Now let the early-abort fixup routine have a go, in case it 2459 * Now let the early-abort fixup routine have a go, in case it
2458 * was an LDM, STM, LDC or STC that faulted. 2460 * was an LDM, STM, LDC or STC that faulted.
2459 */ 2461 */
2460 2462
2461 return early_abort_fixup(arg); 2463 return early_abort_fixup(arg);
2462} 2464}
2463#endif /* CPU_ARM6(LATE)/7/7TDMI */ 2465#endif /* CPU_ARM6(LATE)/7/7TDMI */
2464 2466
2465/* 2467/*
2466 * CPU Setup code 2468 * CPU Setup code
2467 */ 2469 */
2468 2470
2469#if defined(CPU_ARM6) || defined(CPU_ARM7) || defined(CPU_ARM7TDMI) || \ 2471#if defined(CPU_ARM6) || defined(CPU_ARM7) || defined(CPU_ARM7TDMI) || \
2470 defined(CPU_ARM8) || defined (CPU_ARM9) || defined (CPU_ARM9E) || \ 2472 defined(CPU_ARM8) || defined (CPU_ARM9) || defined (CPU_ARM9E) || \
2471 defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_SA1110) || \ 2473 defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_SA1110) || \
2472 defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \ 2474 defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
2473 defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) || \ 2475 defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) || \
2474 defined(CPU_ARM10) || defined(CPU_ARM11) || \ 2476 defined(CPU_ARM10) || defined(CPU_ARM11) || \
2475 defined(CPU_FA526) || defined(CPU_CORTEX) || defined(CPU_SHEEVA) 2477 defined(CPU_FA526) || defined(CPU_CORTEX) || defined(CPU_SHEEVA)
2476 2478
2477#define IGN 0 2479#define IGN 0
2478#define OR 1 2480#define OR 1
2479#define BIC 2 2481#define BIC 2
2480 2482
2481struct cpu_option { 2483struct cpu_option {
2482 const char *co_name; 2484 const char *co_name;
2483 int co_falseop; 2485 int co_falseop;
2484 int co_trueop; 2486 int co_trueop;
2485 int co_value; 2487 int co_value;
2486}; 2488};
2487 2489
2488static u_int parse_cpu_options(char *, struct cpu_option *, u_int); 2490static u_int parse_cpu_options(char *, struct cpu_option *, u_int);
2489 2491
2490static u_int 2492static u_int
2491parse_cpu_options(char *args, struct cpu_option *optlist, u_int cpuctrl) 2493parse_cpu_options(char *args, struct cpu_option *optlist, u_int cpuctrl)
2492{ 2494{
2493 int integer; 2495 int integer;
2494 2496
2495 if (args == NULL) 2497 if (args == NULL)
2496 return(cpuctrl); 2498 return(cpuctrl);
2497 2499
2498 while (optlist->co_name) { 2500 while (optlist->co_name) {
2499 if (get_bootconf_option(args, optlist->co_name, 2501 if (get_bootconf_option(args, optlist->co_name,
2500 BOOTOPT_TYPE_BOOLEAN, &integer)) { 2502 BOOTOPT_TYPE_BOOLEAN, &integer)) {
2501 if (integer) { 2503 if (integer) {
2502 if (optlist->co_trueop == OR) 2504 if (optlist->co_trueop == OR)
2503 cpuctrl |= optlist->co_value; 2505 cpuctrl |= optlist->co_value;
2504 else if (optlist->co_trueop == BIC) 2506 else if (optlist->co_trueop == BIC)
2505 cpuctrl &= ~optlist->co_value; 2507 cpuctrl &= ~optlist->co_value;
2506 } else { 2508 } else {
2507 if (optlist->co_falseop == OR) 2509 if (optlist->co_falseop == OR)
2508 cpuctrl |= optlist->co_value; 2510 cpuctrl |= optlist->co_value;
2509 else if (optlist->co_falseop == BIC) 2511 else if (optlist->co_falseop == BIC)
2510 cpuctrl &= ~optlist->co_value; 2512 cpuctrl &= ~optlist->co_value;
2511 } 2513 }
2512 } 2514 }
2513 ++optlist; 2515 ++optlist;
2514 } 2516 }
2515 return(cpuctrl); 2517 return(cpuctrl);
2516} 2518}
2517#endif /* CPU_ARM6 || CPU_ARM7 || CPU_ARM7TDMI || CPU_ARM8 || CPU_SA110 */ 2519#endif /* CPU_ARM6 || CPU_ARM7 || CPU_ARM7TDMI || CPU_ARM8 || CPU_SA110 */
2518 2520
2519#if defined (CPU_ARM6) || defined(CPU_ARM7) || defined(CPU_ARM7TDMI) \ 2521#if defined (CPU_ARM6) || defined(CPU_ARM7) || defined(CPU_ARM7TDMI) \
2520 || defined(CPU_ARM8) 2522 || defined(CPU_ARM8)
2521struct cpu_option arm678_options[] = { 2523struct cpu_option arm678_options[] = {
2522#ifdef COMPAT_12 2524#ifdef COMPAT_12
2523 { "nocache", IGN, BIC, CPU_CONTROL_IDC_ENABLE }, 2525 { "nocache", IGN, BIC, CPU_CONTROL_IDC_ENABLE },
2524 { "nowritebuf", IGN, BIC, CPU_CONTROL_WBUF_ENABLE }, 2526 { "nowritebuf", IGN, BIC, CPU_CONTROL_WBUF_ENABLE },
2525#endif /* COMPAT_12 */ 2527#endif /* COMPAT_12 */
2526 { "cpu.cache", BIC, OR, CPU_CONTROL_IDC_ENABLE }, 2528 { "cpu.cache", BIC, OR, CPU_CONTROL_IDC_ENABLE },
2527 { "cpu.nocache", OR, BIC, CPU_CONTROL_IDC_ENABLE }, 2529 { "cpu.nocache", OR, BIC, CPU_CONTROL_IDC_ENABLE },
2528 { "cpu.writebuf", BIC, OR, CPU_CONTROL_WBUF_ENABLE }, 2530 { "cpu.writebuf", BIC, OR, CPU_CONTROL_WBUF_ENABLE },
2529 { "cpu.nowritebuf", OR, BIC, CPU_CONTROL_WBUF_ENABLE }, 2531 { "cpu.nowritebuf", OR, BIC, CPU_CONTROL_WBUF_ENABLE },
2530 { NULL, IGN, IGN, 0 } 2532 { NULL, IGN, IGN, 0 }
2531}; 2533};
2532 2534
2533#endif /* CPU_ARM6 || CPU_ARM7 || CPU_ARM7TDMI || CPU_ARM8 */ 2535#endif /* CPU_ARM6 || CPU_ARM7 || CPU_ARM7TDMI || CPU_ARM8 */
2534 2536
2535#ifdef CPU_ARM6 2537#ifdef CPU_ARM6
2536struct cpu_option arm6_options[] = { 2538struct cpu_option arm6_options[] = {
2537 { "arm6.cache", BIC, OR, CPU_CONTROL_IDC_ENABLE }, 2539 { "arm6.cache", BIC, OR, CPU_CONTROL_IDC_ENABLE },
2538 { "arm6.nocache", OR, BIC, CPU_CONTROL_IDC_ENABLE }, 2540 { "arm6.nocache", OR, BIC, CPU_CONTROL_IDC_ENABLE },
2539 { "arm6.writebuf", BIC, OR, CPU_CONTROL_WBUF_ENABLE }, 2541 { "arm6.writebuf", BIC, OR, CPU_CONTROL_WBUF_ENABLE },
2540 { "arm6.nowritebuf", OR, BIC, CPU_CONTROL_WBUF_ENABLE }, 2542 { "arm6.nowritebuf", OR, BIC, CPU_CONTROL_WBUF_ENABLE },
2541 { NULL, IGN, IGN, 0 } 2543 { NULL, IGN, IGN, 0 }
2542}; 2544};
2543 2545
2544void 2546void
2545arm6_setup(char *args) 2547arm6_setup(char *args)
2546{ 2548{
2547 int cpuctrl, cpuctrlmask; 2549 int cpuctrl, cpuctrlmask;
2548 2550
2549 /* Set up default control registers bits */ 2551 /* Set up default control registers bits */
2550 cpuctrl = CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_32BP_ENABLE 2552 cpuctrl = CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_32BP_ENABLE
2551 | CPU_CONTROL_32BD_ENABLE | CPU_CONTROL_SYST_ENABLE 2553 | CPU_CONTROL_32BD_ENABLE | CPU_CONTROL_SYST_ENABLE
2552 | CPU_CONTROL_IDC_ENABLE | CPU_CONTROL_WBUF_ENABLE; 2554 | CPU_CONTROL_IDC_ENABLE | CPU_CONTROL_WBUF_ENABLE;
2553 cpuctrlmask = CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_32BP_ENABLE 2555 cpuctrlmask = CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_32BP_ENABLE