Thu Feb 20 17:38:42 2014 UTC ()
armv7 doens't need to use the arm11 routines anymore.


(matt)
diff -r1.137 -r1.138 src/sys/arch/arm/arm/cpufunc.c

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

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