Module Name: src
Committed By: matt
Date: Mon Apr 14 20:50:47 UTC 2014
Modified Files:
src/sys/arch/arm/arm: cpufunc.c cpufunc_asm_sheeva.S
src/sys/arch/arm/conf: files.arm
src/sys/arch/arm/include: armreg.h cpuconf.h cpufunc.h
Added Files:
src/sys/arch/arm/include: cpufunc_proto.h
Log Message:
Support (untested) SHEEVA_L2_CACHE and SHEEVA_L2_CACHE_WT options.
Move prototypes out to <arm/cpufunc.h> to their own file.
Add sdcache routines to cpufunc_asm_sheeva.S
Add code sheeve_setup to init the sdcache and sdcache info.
To generate a diff of this commit:
cvs rdiff -u -r1.145 -r1.146 src/sys/arch/arm/arm/cpufunc.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/arm/cpufunc_asm_sheeva.S
cvs rdiff -u -r1.126 -r1.127 src/sys/arch/arm/conf/files.arm
cvs rdiff -u -r1.96 -r1.97 src/sys/arch/arm/include/armreg.h
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/arm/include/cpuconf.h
cvs rdiff -u -r1.71 -r1.72 src/sys/arch/arm/include/cpufunc.h
cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/include/cpufunc_proto.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/arm/arm/cpufunc.c
diff -u src/sys/arch/arm/arm/cpufunc.c:1.145 src/sys/arch/arm/arm/cpufunc.c:1.146
--- src/sys/arch/arm/arm/cpufunc.c:1.145 Thu Apr 10 02:49:42 2014
+++ src/sys/arch/arm/arm/cpufunc.c Mon Apr 14 20:50:46 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: cpufunc.c,v 1.145 2014/04/10 02:49:42 matt Exp $ */
+/* $NetBSD: cpufunc.c,v 1.146 2014/04/14 20:50:46 matt Exp $ */
/*
* arm7tdmi support code Copyright (c) 2001 John Fremlin
@@ -49,7 +49,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.145 2014/04/10 02:49:42 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.146 2014/04/14 20:50:46 matt Exp $");
#include "opt_compat_netbsd.h"
#include "opt_cpuoptions.h"
@@ -66,8 +66,8 @@ __KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v
#include <uvm/uvm.h>
#include <arm/cpuconf.h>
-#include <arm/cpufunc.h>
#include <arm/locore.h>
+#include <arm/cpufunc_proto.h>
#ifdef CPU_XSCALE_80200
#include <arm/xscale/i80200reg.h>
@@ -1212,8 +1212,7 @@ struct cpu_functions ixp12x0_cpufuncs =
};
#endif /* CPU_IXP12X0 */
-#if defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
- defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425)
+#if defined(CPU_XSCALE)
struct cpu_functions xscale_cpufuncs = {
/* CPU functions */
@@ -1272,8 +1271,7 @@ struct cpu_functions xscale_cpufuncs = {
.cf_setup = xscale_setup
};
-#endif
-/* CPU_XSCALE_80200 || CPU_XSCALE_80321 || __CPU_XSCALE_PXA2XX || CPU_XSCALE_IXP425 */
+#endif /* CPU_XSCALE */
#if defined(CPU_ARMV7)
struct cpu_functions armv7_cpufuncs = {
@@ -3465,8 +3463,7 @@ ixp12x0_setup(char *args)
}
#endif /* CPU_IXP12X0 */
-#if defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
- defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425)
+#if defined(CPU_XSCALE)
struct cpu_option xscale_options[] = {
#ifdef COMPAT_12
{ "branchpredict", BIC, OR, CPU_CONTROL_BPRD_ENABLE },
@@ -3547,7 +3544,7 @@ xscale_setup(char *args)
__asm volatile("mcr p15, 0, %0, c1, c0, 1"
: : "r" (auxctl));
}
-#endif /* CPU_XSCALE_80200 || CPU_XSCALE_80321 || __CPU_XSCALE_PXA2XX || CPU_XSCALE_IXP425 */
+#endif /* CPU_XSCALE */
#if defined(CPU_SHEEVA)
struct cpu_option sheeva_options[] = {
@@ -3565,8 +3562,6 @@ struct cpu_option sheeva_options[] = {
void
sheeva_setup(char *args)
{
- uint32_t sheeva_ext;
-
int cpuctrl = CPU_CONTROL_MMU_ENABLE | CPU_CONTROL_SYST_ENABLE
| CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE
| CPU_CONTROL_WBUF_ENABLE | CPU_CONTROL_BPRD_ENABLE;
@@ -3586,18 +3581,36 @@ sheeva_setup(char *args)
cpuctrl = parse_cpu_options(args, sheeva_options, cpuctrl);
/* Enable DCache Streaming Switch and Write Allocate */
- __asm volatile("mrc p15, 1, %0, c15, c1, 0"
- : "=r" (sheeva_ext));
+ uint32_t sheeva_ext = armreg_sheeva_xctrl_read();
sheeva_ext |= FC_DCACHE_STREAM_EN | FC_WR_ALLOC_EN;
-
- __asm volatile("mcr p15, 1, %0, c15, c1, 0"
- :: "r" (sheeva_ext));
-
- /*
- * Sheeva has L2 Cache. Enable/Disable it here.
- * Really not support yet...
- */
+#ifdef SHEEVA_L2_CACHE
+ sheeva_ext |= FC_L2CACHE_EN;
+ sheeva_ext &= ~FC_L2_PREF_DIS;
+#endif
+
+ armreg_sheeva_xctrl_write(sheeva_ext);
+
+#ifdef SHEEVA_L2_CACHE
+#ifndef SHEEVA_L2_CACHE_WT
+ arm_scache.cache_type = CPU_CT_CTYPE_WB2;
+#elif CPU_CT_CTYPE_WT != 0
+ arm_scache.cache_type = CPU_CT_CTYPE_WT;
+#endif
+ arm_scache.cache_unified = 1;
+ arm_scache.dcache_type = arm_scache.icache_type = CACHE_TYPE_PIPT;
+ arm_scache.dcache_size = arm_scache.icache_size = 256*1024;
+ arm_scache.dcache_ways = arm_scache.icache_ways = 4;
+ arm_scache.dcache_way_size = arm_scache.icache_way_size =
+ arm_scache.dcache_size / arm_scache.dcache_ways;
+ arm_scache.dcache_line_size = arm_scache.icache_line_size = 32;
+ arm_scache.dcache_sets = arm_scache.icache_sets =
+ arm_scache.dcache_way_size / arm_scache.dcache_line_size;
+
+ cpufuncs.cf_sdcache_wb_range = sheeva_sdcache_wb_range;
+ cpufuncs.cf_sdcache_inv_range = sheeva_sdcache_inv_range;
+ cpufuncs.cf_sdcache_wbinv_range = sheeva_sdcache_wbinv_range;
+#endif /* SHEEVA_L2_CACHE */
#ifdef __ARMEB__
cpuctrl |= CPU_CONTROL_BEND_ENABLE;
@@ -3620,5 +3633,8 @@ sheeva_setup(char *args)
/* And again. */
cpu_idcache_wbinv_all();
+#ifdef SHEEVA_L2_CACHE
+ sheeva_sdcache_wbinv_all();
+#endif
}
#endif /* CPU_SHEEVA */
Index: src/sys/arch/arm/arm/cpufunc_asm_sheeva.S
diff -u src/sys/arch/arm/arm/cpufunc_asm_sheeva.S:1.5 src/sys/arch/arm/arm/cpufunc_asm_sheeva.S:1.6
--- src/sys/arch/arm/arm/cpufunc_asm_sheeva.S:1.5 Sun Mar 30 01:15:03 2014
+++ src/sys/arch/arm/arm/cpufunc_asm_sheeva.S Mon Apr 14 20:50:46 2014
@@ -39,17 +39,19 @@
.word _C_LABEL(PAGE_MASK)
ENTRY(sheeva_dcache_wbinv_range)
- str lr, [sp, #-4]!
- mrs lr, cpsr
+ push {r4,r5}
+ mrs r4, cpsr
+ orr r5, r4, #I32_bit | F32_bit
+
/* Start with cache line aligned address */
ldr ip, .Lsheeva_cache_line_size
- ldr ip, [ip]
- sub ip, ip, #1
- and r2, r0, ip
+ ldr r3, [ip]
+ sub r3, r3, #1
+ and r2, r0, r3
add r1, r1, r2
- add r1, r1, ip
- bics r1, r1, ip
- bics r0, r0, ip
+ add r1, r1, r3
+ bic r1, r1, r3
+ bic r0, r0, r3
ldr ip, .Lsheeva_asm_page_mask
and r2, r0, ip
@@ -57,16 +59,13 @@ ENTRY(sheeva_dcache_wbinv_range)
cmp r1, r2
movcc ip, r1
movcs ip, r2
+ sub r2, r0, #1
1:
- add r3, r0, ip
- sub r2, r3, #1
- /* Disable irqs */
- orr r3, lr, #I32_bit | F32_bit
- msr cpsr_c, r3
+ add r2, r2, ip
+ msr cpsr_c, r5 /* Disable irqs */
mcr p15, 5, r0, c15, c15, 0 /* Clean and inv zone start address */
mcr p15, 5, r2, c15, c15, 1 /* Clean and inv zone end address */
- /* Enable irqs */
- msr cpsr_c, lr
+ msr cpsr_c, r4 /* Enable irqs */
add r0, r0, ip
sub r1, r1, ip
@@ -77,21 +76,24 @@ ENTRY(sheeva_dcache_wbinv_range)
bne 1b
mov r0, #0
mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */
- ldr lr, [sp], #4
+ pop {r4, r5}
RET
+END(sheeva_dcache_wbinv_range)
ENTRY(sheeva_dcache_inv_range)
- str lr, [sp, #-4]!
- mrs lr, cpsr
+ push {r4,r5}
+ mrs r4, cpsr
+ orr r5, r4, #I32_bit | F32_bit
+
/* Start with cache line aligned address */
ldr ip, .Lsheeva_cache_line_size
- ldr ip, [ip]
- sub ip, ip, #1
- and r2, r0, ip
+ ldr r3, [ip]
+ sub r3, r3, #1
+ and r2, r0, r3
add r1, r1, r2
- add r1, r1, ip
- bics r1, r1, ip
- bics r0, r0, ip
+ add r1, r1, r3
+ bic r1, r1, r3
+ bic r0, r0, r3
ldr ip, .Lsheeva_asm_page_mask
and r2, r0, ip
@@ -99,16 +101,13 @@ ENTRY(sheeva_dcache_inv_range)
cmp r1, r2
movcc ip, r1
movcs ip, r2
+ sub r2, r0, #1
1:
- add r3, r0, ip
- sub r2, r3, #1
- /* Disable irqs */
- orr r3, lr, #I32_bit | F32_bit
- msr cpsr_c, r3
+ add r2, r2, ip
+ msr cpsr_c, r5 /* Disable irqs */
mcr p15, 5, r0, c15, c14, 0 /* Inv zone start address */
mcr p15, 5, r2, c15, c14, 1 /* Inv zone end address */
- /* Enable irqs */
- msr cpsr_c, lr
+ msr cpsr_c, r4 /* Enable irqs */
add r0, r0, ip
sub r1, r1, ip
@@ -119,21 +118,24 @@ ENTRY(sheeva_dcache_inv_range)
bne 1b
mov r0, #0
mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */
- ldr lr, [sp], #4
+ pop {r4, r5}
RET
+END(sheeva_dcache_inv_range)
ENTRY(sheeva_dcache_wb_range)
- str lr, [sp, #-4]!
- mrs lr, cpsr
+ push {r4,r5}
+ mrs r4, cpsr
+ orr r5, r4, #I32_bit | F32_bit
+
/* Start with cache line aligned address */
ldr ip, .Lsheeva_cache_line_size
- ldr ip, [ip]
- sub ip, ip, #1
- and r2, r0, ip
+ ldr r3, [ip]
+ sub r3, r3, #1
+ and r2, r0, r3
add r1, r1, r2
- add r1, r1, ip
- bics r1, r1, ip
- bics r0, r0, ip
+ add r1, r1, r3
+ bic r1, r1, r3
+ bic r0, r0, r3
ldr ip, .Lsheeva_asm_page_mask
and r2, r0, ip
@@ -141,16 +143,13 @@ ENTRY(sheeva_dcache_wb_range)
cmp r1, r2
movcc ip, r1
movcs ip, r2
+ sub r2, r0, #1
1:
- add r3, r0, ip
- sub r2, r3, #1
- /* Disable irqs */
- orr r3, lr, #I32_bit | F32_bit
- msr cpsr_c, r3
+ add r2, r2, ip
+ msr cpsr_c, r5 /* Disable irqs */
mcr p15, 5, r0, c15, c13, 0 /* Clean zone start address */
mcr p15, 5, r2, c15, c13, 1 /* Clean zone end address */
- /* Enable irqs */
- msr cpsr_c, lr
+ msr cpsr_c, r4 /* Enable irqs */
add r0, r0, ip
sub r1, r1, ip
@@ -161,21 +160,24 @@ ENTRY(sheeva_dcache_wb_range)
bne 1b
mov r0, #0
mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */
- ldr lr, [sp], #4
+ pop {r4, r5}
RET
+END(sheeva_dcache_wb_range)
ENTRY(sheeva_idcache_wbinv_range)
- str lr, [sp, #-4]!
- mrs lr, cpsr
+ push {r4,r5}
+ mrs r4, cpsr
+ orr r5, r4, #I32_bit | F32_bit
+
/* Start with cache line aligned address */
ldr ip, .Lsheeva_cache_line_size
- ldr ip, [ip]
- sub ip, ip, #1
- and r2, r0, ip
+ ldr r3, [ip]
+ sub r3, r3, #1
+ and r2, r0, r3
add r1, r1, r2
- add r1, r1, ip
- bics r1, r1, ip
- bics r0, r0, ip
+ add r1, r1, r3
+ bic r1, r1, r3
+ bic r0, r0, r3
ldr ip, .Lsheeva_asm_page_mask
and r2, r0, ip
@@ -183,27 +185,68 @@ ENTRY(sheeva_idcache_wbinv_range)
cmp r1, r2
movcc ip, r1
movcs ip, r2
+ sub r2, r0, #1
1:
- add r3, r0, ip
- sub r2, r3, #1
- /* Disable irqs */
- orr r3, lr, #I32_bit | F32_bit
- msr cpsr_c, r3
+ add r2, r2, ip
+ msr cpsr_c, r5 /* Disable irqs */
mcr p15, 5, r0, c15, c15, 0 /* Clean and inv zone start address */
mcr p15, 5, r2, c15, c15, 1 /* Clean and inv zone end address */
- /* Enable irqs */
- msr cpsr_c, lr
+ msr cpsr_c, r4 /* Enable irqs */
/* Invalidate and clean icache line by line */
- ldr r3, .Lsheeva_cache_line_size
- ldr r3, [r3]
2:
mcr p15, 0, r0, c7, c5, 1
add r0, r0, r3
cmp r2, r0
bhi 2b
- add r0, r2, #1
+ add r0, r0, ip
+ sub r1, r1, ip
+ cmp r1, #PAGE_SIZE
+ movcc ip, r1
+ movcs ip, #PAGE_SIZE
+ cmp r1, #0
+ bne 1b
+ mov r0, #0
+ mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */
+ pop {r4, r5}
+ RET
+END(sheeva_idcache_wbinv_range)
+
+ENTRY(sheeva_sdcache_wbinv_range)
+ push {r4,r5}
+ mrs r4, cpsr
+ orr r5, r4, #I32_bit | F32_bit
+
+ mov r1, r2 /* ignore paddr_t argument */
+
+ /* Start with cache line aligned address */
+ ldr ip, .Lsheeva_cache_line_size
+ ldr ip, [ip]
+ sub ip, ip, #1
+ and r2, r0, ip
+ add r1, r1, r2
+ add r1, r1, ip
+ bic r1, r1, ip
+ bic r0, r0, ip
+
+ ldr ip, .Lsheeva_asm_page_mask
+ and r2, r0, ip
+ rsb r2, r2, #PAGE_SIZE
+ cmp r1, r2
+ movcc ip, r1
+ movcs ip, r2
+ sub r2, r0, #1
+1:
+ add r2, r2, ip
+ msr cpsr_c, r5 /* Disable irqs */
+ mcr p15, 1, r0, c15, c9, 4 /* Clean L2 zone start address */
+ mcr p15, 1, r2, c15, c9, 5 /* Clean L2 zone end address */
+ mcr p15, 1, r0, c15, c11, 4 /* Inv L2 zone start address */
+ mcr p15, 1, r2, c15, c11, 5 /* Inv L2 zone end address */
+ msr cpsr_c, r4 /* Enable irqs */
+
+ add r0, r0, ip
sub r1, r1, ip
cmp r1, #PAGE_SIZE
movcc ip, r1
@@ -212,8 +255,105 @@ ENTRY(sheeva_idcache_wbinv_range)
bne 1b
mov r0, #0
mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */
- ldr lr, [sp], #4
+ pop {r4, r5}
+ RET
+END(sheeva_sdcache_wbinv_range)
+
+ENTRY(sheeva_sdcache_inv_range)
+ push {r4,r5}
+ mrs r4, cpsr
+ orr r5, r4, #I32_bit | F32_bit
+
+ mov r1, r2 /* ignore paddr_t argument */
+
+ /* Start with cache line aligned address */
+ ldr ip, .Lsheeva_cache_line_size
+ ldr r3, [ip]
+ sub r3, r3, #1
+ and r2, r0, r3
+ add r1, r1, r2
+ add r1, r1, r3
+ bic r1, r1, r3
+ bic r0, r0, r3
+
+ ldr ip, .Lsheeva_asm_page_mask
+ and r2, r0, ip
+ rsb r2, r2, #PAGE_SIZE
+ cmp r1, r2
+ movcc ip, r1
+ movcs ip, r2
+ sub r2, r2, #1
+1:
+ add r2, r2, ip
+ msr cpsr_c, r5 /* Disable irqs */
+ mcr p15, 1, r0, c15, c11, 4 /* Inv L2 zone start address */
+ mcr p15, 1, r2, c15, c11, 5 /* Inv L2 zone end address */
+ msr cpsr_c, r4 /* Enable irqs */
+
+ add r0, r0, ip
+ sub r1, r1, ip
+ cmp r1, #PAGE_SIZE
+ movcc ip, r1
+ movcs ip, #PAGE_SIZE
+ cmp r1, #0
+ bne 1b
+ mov r0, #0
+ mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */
+ pop {r4, r5}
+ RET
+END(sheeva_sdcache_inv_range)
+
+ENTRY(sheeva_sdcache_wb_range)
+ push {r4,r5}
+ mrs r4, cpsr
+ orr r5, r4, #I32_bit | F32_bit
+
+ mov r1, r2 /* ignore paddr_t argument */
+
+ /* Start with cache line aligned address */
+ ldr ip, .Lsheeva_cache_line_size
+ ldr r3, [ip]
+ sub r3, r3, #1
+ and r2, r0, r3
+ add r1, r1, r2
+ add r1, r1, r3
+ bic r1, r1, r3
+ bic r0, r0, r3
+
+ ldr ip, .Lsheeva_asm_page_mask
+ and r2, r0, ip
+ rsb r2, r2, #PAGE_SIZE
+ cmp r1, r2
+ movcc ip, r1
+ movcs ip, r2
+ sub r2, r0, #1
+1:
+ add r2, r2, ip
+ msr cpsr_c, r5 /* Disable irqs */
+ mcr p15, 1, r0, c15, c9, 4 /* Clean L2 zone start address */
+ mcr p15, 1, r2, c15, c9, 5 /* Clean L2 zone end address */
+ msr cpsr_c, r4 /* Enable irqs */
+
+ add r0, r0, ip
+ sub r1, r1, ip
+ cmp r1, #PAGE_SIZE
+ movcc ip, r1
+ movcs ip, #PAGE_SIZE
+ cmp r1, #0
+ bne 1b
+ mov r0, #0
+ mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */
+ pop {r4, r5}
+ RET
+END(sheeva_sdcache_wb_range)
+
+ENTRY(sheeva_sdcache_wbinv_all)
+ mov r0, #0
+ mcr p15, 1, r0, c15, c9, 0 /* Clean L2 */
+ mcr p15, 1, r0, c15, c11, 0 /* Invalidate L2 */
+ mcr p15, 0, r0, c7, c10, 4 /* drain the write buffer */
RET
+END(sheeva_sdcache_wbinv_all)
/*
* CPU sleep
@@ -222,3 +362,4 @@ ENTRY_NP(sheeva_cpu_sleep)
mov r0, #0
mcr p15, 0, r0, c7, c0, 4 /* wait for interrupt */
RET
+END(sheeva_cpu_sleep)
Index: src/sys/arch/arm/conf/files.arm
diff -u src/sys/arch/arm/conf/files.arm:1.126 src/sys/arch/arm/conf/files.arm:1.127
--- src/sys/arch/arm/conf/files.arm:1.126 Sun Mar 30 15:50:51 2014
+++ src/sys/arch/arm/conf/files.arm Mon Apr 14 20:50:47 2014
@@ -1,4 +1,4 @@
-# $NetBSD: files.arm,v 1.126 2014/03/30 15:50:51 matt Exp $
+# $NetBSD: files.arm,v 1.127 2014/04/14 20:50:47 matt Exp $
# temporary define to allow easy moving to ../arch/arm/arm32
defflag ARM32
@@ -64,7 +64,8 @@ defflag opt_cpuoptions.h ARM11_CACHE_WR
defflag opt_cpuoptions.h ARM11_COMPAT_MMU
defflag opt_cpuoptions.h ARM_HAS_VBAR
# use extended small page in compatible MMU mode for ARMv6
-defflag opt_cpuoptions.h ARMV6_EXTENDED_SMALL_PAGE
+defflag opt_cpuoptions.h SHEEVA_L2_CACHE
+defflag opt_cpuoptions.h SHEEVA_L2_CACHE_WT: SHEEVA_L2_CACHE
# Interrupt implementation header definition.
defparam opt_arm_intr_impl.h ARM_INTR_IMPL
Index: src/sys/arch/arm/include/armreg.h
diff -u src/sys/arch/arm/include/armreg.h:1.96 src/sys/arch/arm/include/armreg.h:1.97
--- src/sys/arch/arm/include/armreg.h:1.96 Sun Apr 13 02:23:00 2014
+++ src/sys/arch/arm/include/armreg.h Mon Apr 14 20:50:47 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: armreg.h,v 1.96 2014/04/13 02:23:00 matt Exp $ */
+/* $NetBSD: armreg.h,v 1.97 2014/04/14 20:50:47 matt Exp $ */
/*
* Copyright (c) 1998, 2001 Ben Harris
@@ -1021,6 +1021,9 @@ ARMREG_READ_INLINE(tlbdata1, "p15,3,%0,c
ARMREG_READ_INLINE(tlbdata2, "p15,3,%0,c15,c0,2") /* TLB Data Register 2 (cortex) */
ARMREG_WRITE_INLINE(tlbdataop, "p15,3,%0,c15,c4,2") /* TLB Data Read Operation (cortex) */
+ARMREG_READ_INLINE(sheeva_xctrl, "p15,1,%0,c15,c1,0") /* Sheeva eXtra Control register */
+ARMREG_WRITE_INLINE(sheeva_xctrl, "p15,1,%0,c15,c1,0") /* Sheeva eXtra Control register */
+
#endif /* !__ASSEMBLER__ */
Index: src/sys/arch/arm/include/cpuconf.h
diff -u src/sys/arch/arm/include/cpuconf.h:1.23 src/sys/arch/arm/include/cpuconf.h:1.24
--- src/sys/arch/arm/include/cpuconf.h:1.23 Sun Mar 30 15:50:51 2014
+++ src/sys/arch/arm/include/cpuconf.h Mon Apr 14 20:50:47 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: cpuconf.h,v 1.23 2014/03/30 15:50:51 matt Exp $ */
+/* $NetBSD: cpuconf.h,v 1.24 2014/04/14 20:50:47 matt Exp $ */
/*
* Copyright (c) 2002 Wasabi Systems, Inc.
@@ -80,10 +80,7 @@
defined(CPU_SA1110) + \
defined(CPU_FA526) + \
defined(CPU_IXP12X0) + \
- defined(CPU_XSCALE_80200) + \
- defined(CPU_XSCALE_80321) + \
- defined(__CPU_XSCALE_PXA2XX) + \
- defined(CPU_XSCALE_IXP425)) + \
+ defined(CPU_XSCALE) + \
defined(CPU_SHEEVA))
#else
#define CPU_NTYPES 2
@@ -118,9 +115,7 @@
#if !defined(_KERNEL_OPT) || \
(defined(CPU_ARM9E) || defined(CPU_ARM10) || \
- defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
- defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425)) || \
- defined(CPU_SHEEVA)
+ defined(CPU_XSCALE) || defined(CPU_SHEEVA))
#define ARM_ARCH_5 1
#else
#define ARM_ARCH_5 0
@@ -205,8 +200,7 @@
#endif
#if !defined(_KERNEL_OPT) || \
- (defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
- defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425))
+ defined(CPU_XSCALE)
#define ARM_MMU_XSCALE 1
#else
#define ARM_MMU_XSCALE 0
Index: src/sys/arch/arm/include/cpufunc.h
diff -u src/sys/arch/arm/include/cpufunc.h:1.71 src/sys/arch/arm/include/cpufunc.h:1.72
--- src/sys/arch/arm/include/cpufunc.h:1.71 Mon Apr 7 20:38:52 2014
+++ src/sys/arch/arm/include/cpufunc.h Mon Apr 14 20:50:47 2014
@@ -229,396 +229,6 @@ void cpufunc_domains (u_int);
u_int cpufunc_faultstatus (void);
u_int cpufunc_faultaddress (void);
-#if defined(CPU_ARM2) || defined(CPU_ARM250) || defined(CPU_ARM3)
-void arm3_cache_flush (void);
-#endif /* CPU_ARM2 || CPU_ARM250 || CPU_ARM3 */
-
-#ifdef CPU_ARM2
-u_int arm2_id (void);
-#endif /* CPU_ARM2 */
-
-#ifdef CPU_ARM250
-u_int arm250_id (void);
-#endif
-
-#ifdef CPU_ARM3
-u_int arm3_control (u_int, u_int);
-#endif /* CPU_ARM3 */
-
-#if defined(CPU_ARM6) || defined(CPU_ARM7)
-void arm67_setttb (u_int, bool);
-void arm67_tlb_flush (void);
-void arm67_tlb_purge (vaddr_t);
-void arm67_cache_flush (void);
-void arm67_context_switch (u_int);
-#endif /* CPU_ARM6 || CPU_ARM7 */
-
-#ifdef CPU_ARM6
-void arm6_setup (char *);
-#endif /* CPU_ARM6 */
-
-#ifdef CPU_ARM7
-void arm7_setup (char *);
-#endif /* CPU_ARM7 */
-
-#ifdef CPU_ARM7TDMI
-int arm7_dataabt_fixup (void *);
-void arm7tdmi_setup (char *);
-void arm7tdmi_setttb (u_int, bool);
-void arm7tdmi_tlb_flushID (void);
-void arm7tdmi_tlb_flushID_SE (vaddr_t);
-void arm7tdmi_cache_flushID (void);
-void arm7tdmi_context_switch (u_int);
-#endif /* CPU_ARM7TDMI */
-
-#ifdef CPU_ARM8
-void arm8_setttb (u_int, bool);
-void arm8_tlb_flushID (void);
-void arm8_tlb_flushID_SE (vaddr_t);
-void arm8_cache_flushID (void);
-void arm8_cache_flushID_E (u_int);
-void arm8_cache_cleanID (void);
-void arm8_cache_cleanID_E (u_int);
-void arm8_cache_purgeID (void);
-void arm8_cache_purgeID_E (u_int entry);
-
-void arm8_cache_syncI (void);
-void arm8_cache_cleanID_rng (vaddr_t, vsize_t);
-void arm8_cache_cleanD_rng (vaddr_t, vsize_t);
-void arm8_cache_purgeID_rng (vaddr_t, vsize_t);
-void arm8_cache_purgeD_rng (vaddr_t, vsize_t);
-void arm8_cache_syncI_rng (vaddr_t, vsize_t);
-
-void arm8_context_switch (u_int);
-
-void arm8_setup (char *);
-
-u_int arm8_clock_config (u_int, u_int);
-#endif
-
-#ifdef CPU_FA526
-void fa526_setup (char *);
-void fa526_setttb (u_int, bool);
-void fa526_context_switch (u_int);
-void fa526_cpu_sleep (int);
-void fa526_tlb_flushI_SE (vaddr_t);
-void fa526_tlb_flushID_SE (vaddr_t);
-void fa526_flush_prefetchbuf (void);
-void fa526_flush_brnchtgt_E (u_int);
-
-void fa526_icache_sync_all (void);
-void fa526_icache_sync_range(vaddr_t, vsize_t);
-void fa526_dcache_wbinv_all (void);
-void fa526_dcache_wbinv_range(vaddr_t, vsize_t);
-void fa526_dcache_inv_range (vaddr_t, vsize_t);
-void fa526_dcache_wb_range (vaddr_t, vsize_t);
-void fa526_idcache_wbinv_all(void);
-void fa526_idcache_wbinv_range(vaddr_t, vsize_t);
-#endif
-
-#ifdef CPU_SA110
-void sa110_setup (char *);
-void sa110_context_switch (u_int);
-#endif /* CPU_SA110 */
-
-#if defined(CPU_SA1100) || defined(CPU_SA1110)
-void sa11x0_drain_readbuf (void);
-
-void sa11x0_context_switch (u_int);
-void sa11x0_cpu_sleep (int);
-
-void sa11x0_setup (char *);
-#endif
-
-#if defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_SA1110)
-void sa1_setttb (u_int, bool);
-
-void sa1_tlb_flushID_SE (vaddr_t);
-
-void sa1_cache_flushID (void);
-void sa1_cache_flushI (void);
-void sa1_cache_flushD (void);
-void sa1_cache_flushD_SE (vaddr_t);
-
-void sa1_cache_cleanID (void);
-void sa1_cache_cleanD (void);
-void sa1_cache_cleanD_E (u_int);
-
-void sa1_cache_purgeID (void);
-void sa1_cache_purgeID_E (u_int);
-void sa1_cache_purgeD (void);
-void sa1_cache_purgeD_E (u_int);
-
-void sa1_cache_syncI (void);
-void sa1_cache_cleanID_rng (vaddr_t, vsize_t);
-void sa1_cache_cleanD_rng (vaddr_t, vsize_t);
-void sa1_cache_purgeID_rng (vaddr_t, vsize_t);
-void sa1_cache_purgeD_rng (vaddr_t, vsize_t);
-void sa1_cache_syncI_rng (vaddr_t, vsize_t);
-
-#endif
-
-#ifdef CPU_ARM9
-void arm9_setttb (u_int, bool);
-
-void arm9_tlb_flushID_SE (vaddr_t);
-
-void arm9_icache_sync_all (void);
-void arm9_icache_sync_range (vaddr_t, vsize_t);
-
-void arm9_dcache_wbinv_all (void);
-void arm9_dcache_wbinv_range (vaddr_t, vsize_t);
-void arm9_dcache_inv_range (vaddr_t, vsize_t);
-void arm9_dcache_wb_range (vaddr_t, vsize_t);
-
-void arm9_idcache_wbinv_all (void);
-void arm9_idcache_wbinv_range (vaddr_t, vsize_t);
-
-void arm9_context_switch (u_int);
-
-void arm9_setup (char *);
-
-extern unsigned arm9_dcache_sets_max;
-extern unsigned arm9_dcache_sets_inc;
-extern unsigned arm9_dcache_index_max;
-extern unsigned arm9_dcache_index_inc;
-#endif
-
-#if defined(CPU_ARM9E) || defined(CPU_ARM10) || defined(CPU_SHEEVA)
-void arm10_tlb_flushID_SE (vaddr_t);
-void arm10_tlb_flushI_SE (vaddr_t);
-
-void arm10_context_switch (u_int);
-
-void arm10_setup (char *);
-#endif
-
-#if defined(CPU_ARM9E) || defined (CPU_ARM10) || defined(CPU_SHEEVA)
-void armv5_ec_setttb (u_int, bool);
-
-void armv5_ec_icache_sync_all (void);
-void armv5_ec_icache_sync_range (vaddr_t, vsize_t);
-
-void armv5_ec_dcache_wbinv_all (void);
-void armv5_ec_dcache_wbinv_range (vaddr_t, vsize_t);
-void armv5_ec_dcache_inv_range (vaddr_t, vsize_t);
-void armv5_ec_dcache_wb_range (vaddr_t, vsize_t);
-
-void armv5_ec_idcache_wbinv_all (void);
-void armv5_ec_idcache_wbinv_range (vaddr_t, vsize_t);
-#endif
-
-#if defined (CPU_ARM10) || defined (CPU_ARM11MPCORE)
-void armv5_setttb (u_int, bool);
-
-void armv5_icache_sync_all (void);
-void armv5_icache_sync_range (vaddr_t, vsize_t);
-
-void armv5_dcache_wbinv_all (void);
-void armv5_dcache_wbinv_range (vaddr_t, vsize_t);
-void armv5_dcache_inv_range (vaddr_t, vsize_t);
-void armv5_dcache_wb_range (vaddr_t, vsize_t);
-
-void armv5_idcache_wbinv_all (void);
-void armv5_idcache_wbinv_range (vaddr_t, vsize_t);
-
-extern unsigned armv5_dcache_sets_max;
-extern unsigned armv5_dcache_sets_inc;
-extern unsigned armv5_dcache_index_max;
-extern unsigned armv5_dcache_index_inc;
-#endif
-
-#if defined(CPU_ARM11MPCORE)
-void arm11mpcore_setup (char *);
-#endif
-
-#if defined(CPU_ARM11)
-#if defined(ARM_MMU_EXTENDED)
-void arm11_setttb (u_int, tlb_asid_t);
-void arm11_context_switch (u_int, tlb_asid_t);
-#else
-void arm11_setttb (u_int, bool);
-void arm11_context_switch (u_int);
-#endif
-
-void arm11_cpu_sleep (int);
-void arm11_setup (char *string);
-void arm11_tlb_flushID (void);
-void arm11_tlb_flushI (void);
-void arm11_tlb_flushD (void);
-void arm11_tlb_flushID_SE (vaddr_t);
-void arm11_tlb_flushI_SE (vaddr_t);
-void arm11_tlb_flushD_SE (vaddr_t);
-
-void armv11_dcache_wbinv_all (void);
-void armv11_idcache_wbinv_all(void);
-
-void arm11_drain_writebuf (void);
-void arm11_sleep (int);
-
-void armv6_setttb (u_int, bool);
-
-void armv6_icache_sync_all (void);
-void armv6_icache_sync_range (vaddr_t, vsize_t);
-
-void armv6_dcache_wbinv_all (void);
-void armv6_dcache_wbinv_range (vaddr_t, vsize_t);
-void armv6_dcache_inv_range (vaddr_t, vsize_t);
-void armv6_dcache_wb_range (vaddr_t, vsize_t);
-
-void armv6_idcache_wbinv_all (void);
-void armv6_idcache_wbinv_range (vaddr_t, vsize_t);
-#endif
-
-#if defined(CPU_ARMV7)
-#if defined(ARM_MMU_EXTENDED)
-void armv7_setttb(u_int, tlb_asid_t);
-void armv7_context_switch(u_int, tlb_asid_t);
-#else
-void armv7_setttb(u_int, bool);
-void armv7_context_switch(u_int);
-#endif
-
-void armv7_icache_sync_range(vaddr_t, vsize_t);
-void armv7_icache_sync_all(void);
-
-void armv7_dcache_inv_range(vaddr_t, vsize_t);
-void armv7_dcache_wb_range(vaddr_t, vsize_t);
-void armv7_dcache_wbinv_range(vaddr_t, vsize_t);
-void armv7_dcache_wbinv_all(void);
-
-void armv7_idcache_wbinv_range(vaddr_t, vsize_t);
-void armv7_idcache_wbinv_all(void);
-
-void armv7_tlb_flushID(void);
-void armv7_tlb_flushI(void);
-void armv7_tlb_flushD(void);
-
-void armv7_tlb_flushID_SE(vaddr_t);
-void armv7_tlb_flushI_SE(vaddr_t);
-void armv7_tlb_flushD_SE(vaddr_t);
-
-void armv7_cpu_sleep(int);
-void armv7_drain_writebuf(void);
-void armv7_setup(char *string);
-#endif /* CPU_ARMV7 */
-
-#if defined(CPU_PJ4B)
-#if defined(ARM_MMU_EXTENDED)
-void pj4b_setttb(u_int, tlb_asid_t);
-void pj4b_context_switch(u_int, tlb_asid_t);
-#else
-void pj4b_setttb(u_int, bool);
-void pj4b_context_switch(u_int);
-#endif
-void pj4b_tlb_flushID(void);
-void pj4b_tlb_flushID_SE(vaddr_t);
-
-void pj4b_icache_sync_range(vm_offset_t, vm_size_t);
-void pj4b_idcache_wbinv_range(vm_offset_t, vm_size_t);
-void pj4b_dcache_wbinv_range(vm_offset_t, vm_size_t);
-void pj4b_dcache_inv_range(vm_offset_t, vm_size_t);
-void pj4b_dcache_wb_range(vm_offset_t, vm_size_t);
-
-void pj4b_drain_writebuf(void);
-void pj4b_drain_readbuf(void);
-void pj4b_flush_brnchtgt_all(void);
-void pj4b_flush_brnchtgt_va(u_int);
-void pj4b_sleep(int);
-
-void pj4bv7_setup(char *string);
-void pj4b_config(void);
-
-#endif /* CPU_PJ4B */
-
-#if defined(CPU_ARM1136) || defined(CPU_ARM1176)
-void arm11x6_idcache_wbinv_all (void);
-void arm11x6_dcache_wbinv_all (void);
-void arm11x6_icache_sync_all (void);
-void arm11x6_flush_prefetchbuf (void);
-void arm11x6_icache_sync_range (vaddr_t, vsize_t);
-void arm11x6_idcache_wbinv_range (vaddr_t, vsize_t);
-void arm11x6_setup (char *string);
-void arm11x6_sleep (int); /* no ref. for errata */
-#endif
-#if defined(CPU_ARM1136)
-void arm1136_sleep_rev0 (int); /* for errata 336501 */
-#endif
-
-
-#if defined(CPU_ARM9) || defined(CPU_ARM9E) || defined(CPU_ARM10) || \
- defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_SA1110) || \
- defined(CPU_FA526) || \
- defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
- defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) || \
- defined(CPU_SHEEVA)
-
-void armv4_tlb_flushID (void);
-void armv4_tlb_flushI (void);
-void armv4_tlb_flushD (void);
-void armv4_tlb_flushD_SE (vaddr_t);
-
-void armv4_drain_writebuf (void);
-#endif
-
-#if defined(CPU_IXP12X0)
-void ixp12x0_drain_readbuf (void);
-void ixp12x0_context_switch (u_int);
-void ixp12x0_setup (char *);
-#endif
-
-#if defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
- defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425)
-
-void xscale_cpwait (void);
-#define cpu_cpwait() cpufuncs.cf_cpwait()
-
-void xscale_cpu_sleep (int);
-
-u_int xscale_control (u_int, u_int);
-
-void xscale_setttb (u_int, bool);
-
-void xscale_tlb_flushID_SE (vaddr_t);
-
-void xscale_cache_flushID (void);
-void xscale_cache_flushI (void);
-void xscale_cache_flushD (void);
-void xscale_cache_flushD_SE (vaddr_t);
-
-void xscale_cache_cleanID (void);
-void xscale_cache_cleanD (void);
-void xscale_cache_cleanD_E (u_int);
-
-void xscale_cache_clean_minidata (void);
-
-void xscale_cache_purgeID (void);
-void xscale_cache_purgeID_E (u_int);
-void xscale_cache_purgeD (void);
-void xscale_cache_purgeD_E (u_int);
-
-void xscale_cache_syncI (void);
-void xscale_cache_cleanID_rng (vaddr_t, vsize_t);
-void xscale_cache_cleanD_rng (vaddr_t, vsize_t);
-void xscale_cache_purgeID_rng (vaddr_t, vsize_t);
-void xscale_cache_purgeD_rng (vaddr_t, vsize_t);
-void xscale_cache_syncI_rng (vaddr_t, vsize_t);
-void xscale_cache_flushD_rng (vaddr_t, vsize_t);
-
-void xscale_context_switch (u_int);
-
-void xscale_setup (char *);
-#endif /* CPU_XSCALE_80200 || CPU_XSCALE_80321 || __CPU_XSCALE_PXA2XX || CPU_XSCALE_IXP425 */
-
-#if defined(CPU_SHEEVA)
-void sheeva_dcache_wbinv_range (vaddr_t, vsize_t);
-void sheeva_dcache_inv_range (vaddr_t, vsize_t);
-void sheeva_dcache_wb_range (vaddr_t, vsize_t);
-void sheeva_idcache_wbinv_range (vaddr_t, vsize_t);
-void sheeva_setup(char *);
-void sheeva_cpu_sleep(int);
-#endif
-
#define tlb_flush cpu_tlb_flushID
#define setttb cpu_setttb
#define drain_writebuf cpu_drain_writebuf
Added files:
Index: src/sys/arch/arm/include/cpufunc_proto.h
diff -u /dev/null src/sys/arch/arm/include/cpufunc_proto.h:1.1
--- /dev/null Mon Apr 14 20:50:47 2014
+++ src/sys/arch/arm/include/cpufunc_proto.h Mon Apr 14 20:50:47 2014
@@ -0,0 +1,443 @@
+/* cpufunc.h,v 1.40.22.4 2007/11/08 10:59:33 matt Exp */
+
+/*
+ * Copyright (c) 1997 Mark Brinicombe.
+ * Copyright (c) 1997 Causality Limited
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Causality Limited.
+ * 4. The name of Causality Limited may not be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY CAUSALITY LIMITED ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL CAUSALITY LIMITED BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * RiscBSD kernel project
+ *
+ * cpufunc.h
+ *
+ * Prototypes for cpu, mmu and tlb related functions.
+ */
+
+#ifndef _ARM_CPUFUNC_PROTO_H_
+#define _ARM_CPUFUNC_PROTO_H_
+
+#ifdef _KERNEL
+
+#include <sys/types.h>
+#include <arm/armreg.h>
+#include <arm/cpuconf.h>
+
+#if defined(CPU_ARM2) || defined(CPU_ARM250) || defined(CPU_ARM3)
+void arm3_cache_flush (void);
+#endif /* CPU_ARM2 || CPU_ARM250 || CPU_ARM3 */
+
+#ifdef CPU_ARM2
+u_int arm2_id (void);
+#endif /* CPU_ARM2 */
+
+#ifdef CPU_ARM250
+u_int arm250_id (void);
+#endif
+
+#ifdef CPU_ARM3
+u_int arm3_control (u_int, u_int);
+#endif /* CPU_ARM3 */
+
+#if defined(CPU_ARM6) || defined(CPU_ARM7)
+void arm67_setttb (u_int, bool);
+void arm67_tlb_flush (void);
+void arm67_tlb_purge (vaddr_t);
+void arm67_cache_flush (void);
+void arm67_context_switch (u_int);
+#endif /* CPU_ARM6 || CPU_ARM7 */
+
+#ifdef CPU_ARM6
+void arm6_setup (char *);
+#endif /* CPU_ARM6 */
+
+#ifdef CPU_ARM7
+void arm7_setup (char *);
+#endif /* CPU_ARM7 */
+
+#ifdef CPU_ARM7TDMI
+int arm7_dataabt_fixup (void *);
+void arm7tdmi_setup (char *);
+void arm7tdmi_setttb (u_int, bool);
+void arm7tdmi_tlb_flushID (void);
+void arm7tdmi_tlb_flushID_SE (vaddr_t);
+void arm7tdmi_cache_flushID (void);
+void arm7tdmi_context_switch (u_int);
+#endif /* CPU_ARM7TDMI */
+
+#ifdef CPU_ARM8
+void arm8_setttb (u_int, bool);
+void arm8_tlb_flushID (void);
+void arm8_tlb_flushID_SE (vaddr_t);
+void arm8_cache_flushID (void);
+void arm8_cache_flushID_E (u_int);
+void arm8_cache_cleanID (void);
+void arm8_cache_cleanID_E (u_int);
+void arm8_cache_purgeID (void);
+void arm8_cache_purgeID_E (u_int entry);
+
+void arm8_cache_syncI (void);
+void arm8_cache_cleanID_rng (vaddr_t, vsize_t);
+void arm8_cache_cleanD_rng (vaddr_t, vsize_t);
+void arm8_cache_purgeID_rng (vaddr_t, vsize_t);
+void arm8_cache_purgeD_rng (vaddr_t, vsize_t);
+void arm8_cache_syncI_rng (vaddr_t, vsize_t);
+
+void arm8_context_switch (u_int);
+
+void arm8_setup (char *);
+
+u_int arm8_clock_config (u_int, u_int);
+#endif
+
+#ifdef CPU_FA526
+void fa526_setup (char *);
+void fa526_setttb (u_int, bool);
+void fa526_context_switch (u_int);
+void fa526_cpu_sleep (int);
+void fa526_tlb_flushI_SE (vaddr_t);
+void fa526_tlb_flushID_SE (vaddr_t);
+void fa526_flush_prefetchbuf (void);
+void fa526_flush_brnchtgt_E (u_int);
+
+void fa526_icache_sync_all (void);
+void fa526_icache_sync_range(vaddr_t, vsize_t);
+void fa526_dcache_wbinv_all (void);
+void fa526_dcache_wbinv_range(vaddr_t, vsize_t);
+void fa526_dcache_inv_range (vaddr_t, vsize_t);
+void fa526_dcache_wb_range (vaddr_t, vsize_t);
+void fa526_idcache_wbinv_all(void);
+void fa526_idcache_wbinv_range(vaddr_t, vsize_t);
+#endif
+
+#ifdef CPU_SA110
+void sa110_setup (char *);
+void sa110_context_switch (u_int);
+#endif /* CPU_SA110 */
+
+#if defined(CPU_SA1100) || defined(CPU_SA1110)
+void sa11x0_drain_readbuf (void);
+
+void sa11x0_context_switch (u_int);
+void sa11x0_cpu_sleep (int);
+
+void sa11x0_setup (char *);
+#endif
+
+#if defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_SA1110)
+void sa1_setttb (u_int, bool);
+
+void sa1_tlb_flushID_SE (vaddr_t);
+
+void sa1_cache_flushID (void);
+void sa1_cache_flushI (void);
+void sa1_cache_flushD (void);
+void sa1_cache_flushD_SE (vaddr_t);
+
+void sa1_cache_cleanID (void);
+void sa1_cache_cleanD (void);
+void sa1_cache_cleanD_E (u_int);
+
+void sa1_cache_purgeID (void);
+void sa1_cache_purgeID_E (u_int);
+void sa1_cache_purgeD (void);
+void sa1_cache_purgeD_E (u_int);
+
+void sa1_cache_syncI (void);
+void sa1_cache_cleanID_rng (vaddr_t, vsize_t);
+void sa1_cache_cleanD_rng (vaddr_t, vsize_t);
+void sa1_cache_purgeID_rng (vaddr_t, vsize_t);
+void sa1_cache_purgeD_rng (vaddr_t, vsize_t);
+void sa1_cache_syncI_rng (vaddr_t, vsize_t);
+
+#endif
+
+#ifdef CPU_ARM9
+void arm9_setttb (u_int, bool);
+
+void arm9_tlb_flushID_SE (vaddr_t);
+
+void arm9_icache_sync_all (void);
+void arm9_icache_sync_range (vaddr_t, vsize_t);
+
+void arm9_dcache_wbinv_all (void);
+void arm9_dcache_wbinv_range (vaddr_t, vsize_t);
+void arm9_dcache_inv_range (vaddr_t, vsize_t);
+void arm9_dcache_wb_range (vaddr_t, vsize_t);
+
+void arm9_idcache_wbinv_all (void);
+void arm9_idcache_wbinv_range (vaddr_t, vsize_t);
+
+void arm9_context_switch (u_int);
+
+void arm9_setup (char *);
+
+extern unsigned arm9_dcache_sets_max;
+extern unsigned arm9_dcache_sets_inc;
+extern unsigned arm9_dcache_index_max;
+extern unsigned arm9_dcache_index_inc;
+#endif
+
+#if defined(CPU_ARM9E) || defined(CPU_ARM10) || defined(CPU_SHEEVA)
+void arm10_tlb_flushID_SE (vaddr_t);
+void arm10_tlb_flushI_SE (vaddr_t);
+
+void arm10_context_switch (u_int);
+
+void arm10_setup (char *);
+#endif
+
+#if defined(CPU_ARM9E) || defined (CPU_ARM10) || defined(CPU_SHEEVA)
+void armv5_ec_setttb (u_int, bool);
+
+void armv5_ec_icache_sync_all (void);
+void armv5_ec_icache_sync_range (vaddr_t, vsize_t);
+
+void armv5_ec_dcache_wbinv_all (void);
+void armv5_ec_dcache_wbinv_range (vaddr_t, vsize_t);
+void armv5_ec_dcache_inv_range (vaddr_t, vsize_t);
+void armv5_ec_dcache_wb_range (vaddr_t, vsize_t);
+
+void armv5_ec_idcache_wbinv_all (void);
+void armv5_ec_idcache_wbinv_range (vaddr_t, vsize_t);
+#endif
+
+#if defined (CPU_ARM10) || defined (CPU_ARM11MPCORE)
+void armv5_setttb (u_int, bool);
+
+void armv5_icache_sync_all (void);
+void armv5_icache_sync_range (vaddr_t, vsize_t);
+
+void armv5_dcache_wbinv_all (void);
+void armv5_dcache_wbinv_range (vaddr_t, vsize_t);
+void armv5_dcache_inv_range (vaddr_t, vsize_t);
+void armv5_dcache_wb_range (vaddr_t, vsize_t);
+
+void armv5_idcache_wbinv_all (void);
+void armv5_idcache_wbinv_range (vaddr_t, vsize_t);
+
+extern unsigned armv5_dcache_sets_max;
+extern unsigned armv5_dcache_sets_inc;
+extern unsigned armv5_dcache_index_max;
+extern unsigned armv5_dcache_index_inc;
+#endif
+
+#if defined(CPU_ARM11MPCORE)
+void arm11mpcore_setup (char *);
+#endif
+
+#if defined(CPU_ARM11)
+#if defined(ARM_MMU_EXTENDED)
+void arm11_setttb (u_int, tlb_asid_t);
+void arm11_context_switch (u_int, tlb_asid_t);
+#else
+void arm11_setttb (u_int, bool);
+void arm11_context_switch (u_int);
+#endif
+
+void arm11_cpu_sleep (int);
+void arm11_setup (char *string);
+void arm11_tlb_flushID (void);
+void arm11_tlb_flushI (void);
+void arm11_tlb_flushD (void);
+void arm11_tlb_flushID_SE (vaddr_t);
+void arm11_tlb_flushI_SE (vaddr_t);
+void arm11_tlb_flushD_SE (vaddr_t);
+
+void armv11_dcache_wbinv_all (void);
+void armv11_idcache_wbinv_all(void);
+
+void arm11_drain_writebuf (void);
+void arm11_sleep (int);
+
+void armv6_setttb (u_int, bool);
+
+void armv6_icache_sync_all (void);
+void armv6_icache_sync_range (vaddr_t, vsize_t);
+
+void armv6_dcache_wbinv_all (void);
+void armv6_dcache_wbinv_range (vaddr_t, vsize_t);
+void armv6_dcache_inv_range (vaddr_t, vsize_t);
+void armv6_dcache_wb_range (vaddr_t, vsize_t);
+
+void armv6_idcache_wbinv_all (void);
+void armv6_idcache_wbinv_range (vaddr_t, vsize_t);
+#endif
+
+#if defined(CPU_ARMV7)
+#if defined(ARM_MMU_EXTENDED)
+void armv7_setttb(u_int, tlb_asid_t);
+void armv7_context_switch(u_int, tlb_asid_t);
+#else
+void armv7_setttb(u_int, bool);
+void armv7_context_switch(u_int);
+#endif
+
+void armv7_icache_sync_range(vaddr_t, vsize_t);
+void armv7_icache_sync_all(void);
+
+void armv7_dcache_inv_range(vaddr_t, vsize_t);
+void armv7_dcache_wb_range(vaddr_t, vsize_t);
+void armv7_dcache_wbinv_range(vaddr_t, vsize_t);
+void armv7_dcache_wbinv_all(void);
+
+void armv7_idcache_wbinv_range(vaddr_t, vsize_t);
+void armv7_idcache_wbinv_all(void);
+
+void armv7_tlb_flushID(void);
+void armv7_tlb_flushI(void);
+void armv7_tlb_flushD(void);
+
+void armv7_tlb_flushID_SE(vaddr_t);
+void armv7_tlb_flushI_SE(vaddr_t);
+void armv7_tlb_flushD_SE(vaddr_t);
+
+void armv7_cpu_sleep(int);
+void armv7_drain_writebuf(void);
+void armv7_setup(char *string);
+#endif /* CPU_ARMV7 */
+
+#if defined(CPU_PJ4B)
+#if defined(ARM_MMU_EXTENDED)
+void pj4b_setttb(u_int, tlb_asid_t);
+void pj4b_context_switch(u_int, tlb_asid_t);
+#else
+void pj4b_setttb(u_int, bool);
+void pj4b_context_switch(u_int);
+#endif
+void pj4b_tlb_flushID(void);
+void pj4b_tlb_flushID_SE(vaddr_t);
+
+void pj4b_icache_sync_range(vm_offset_t, vm_size_t);
+void pj4b_idcache_wbinv_range(vm_offset_t, vm_size_t);
+void pj4b_dcache_wbinv_range(vm_offset_t, vm_size_t);
+void pj4b_dcache_inv_range(vm_offset_t, vm_size_t);
+void pj4b_dcache_wb_range(vm_offset_t, vm_size_t);
+
+void pj4b_drain_writebuf(void);
+void pj4b_drain_readbuf(void);
+void pj4b_flush_brnchtgt_all(void);
+void pj4b_flush_brnchtgt_va(u_int);
+void pj4b_sleep(int);
+
+void pj4bv7_setup(char *string);
+void pj4b_config(void);
+
+#endif /* CPU_PJ4B */
+
+#if defined(CPU_ARM1136) || defined(CPU_ARM1176)
+void arm11x6_idcache_wbinv_all (void);
+void arm11x6_dcache_wbinv_all (void);
+void arm11x6_icache_sync_all (void);
+void arm11x6_flush_prefetchbuf (void);
+void arm11x6_icache_sync_range (vaddr_t, vsize_t);
+void arm11x6_idcache_wbinv_range (vaddr_t, vsize_t);
+void arm11x6_setup (char *string);
+void arm11x6_sleep (int); /* no ref. for errata */
+#endif
+#if defined(CPU_ARM1136)
+void arm1136_sleep_rev0 (int); /* for errata 336501 */
+#endif
+
+
+#if defined(CPU_ARM9) || defined(CPU_ARM9E) || defined(CPU_ARM10) || \
+ defined(CPU_SA110) || defined(CPU_SA1100) || defined(CPU_SA1110) || \
+ defined(CPU_FA526) || defined(CPU_XSCALE) || defined(CPU_SHEEVA)
+
+void armv4_tlb_flushID (void);
+void armv4_tlb_flushI (void);
+void armv4_tlb_flushD (void);
+void armv4_tlb_flushD_SE (vaddr_t);
+
+void armv4_drain_writebuf (void);
+#endif
+
+#if defined(CPU_IXP12X0)
+void ixp12x0_drain_readbuf (void);
+void ixp12x0_context_switch (u_int);
+void ixp12x0_setup (char *);
+#endif
+
+#if defined(CPU_XSCALE)
+void xscale_cpwait (void);
+#define cpu_cpwait() cpufuncs.cf_cpwait()
+
+void xscale_cpu_sleep (int);
+
+u_int xscale_control (u_int, u_int);
+
+void xscale_setttb (u_int, bool);
+
+void xscale_tlb_flushID_SE (vaddr_t);
+
+void xscale_cache_flushID (void);
+void xscale_cache_flushI (void);
+void xscale_cache_flushD (void);
+void xscale_cache_flushD_SE (vaddr_t);
+
+void xscale_cache_cleanID (void);
+void xscale_cache_cleanD (void);
+void xscale_cache_cleanD_E (u_int);
+
+void xscale_cache_clean_minidata (void);
+
+void xscale_cache_purgeID (void);
+void xscale_cache_purgeID_E (u_int);
+void xscale_cache_purgeD (void);
+void xscale_cache_purgeD_E (u_int);
+
+void xscale_cache_syncI (void);
+void xscale_cache_cleanID_rng (vaddr_t, vsize_t);
+void xscale_cache_cleanD_rng (vaddr_t, vsize_t);
+void xscale_cache_purgeID_rng (vaddr_t, vsize_t);
+void xscale_cache_purgeD_rng (vaddr_t, vsize_t);
+void xscale_cache_syncI_rng (vaddr_t, vsize_t);
+void xscale_cache_flushD_rng (vaddr_t, vsize_t);
+
+void xscale_context_switch (u_int);
+
+void xscale_setup (char *);
+#endif /* CPU_XSCALE */
+
+#if defined(CPU_SHEEVA)
+void sheeva_dcache_wbinv_range (vaddr_t, vsize_t);
+void sheeva_dcache_inv_range (vaddr_t, vsize_t);
+void sheeva_dcache_wb_range (vaddr_t, vsize_t);
+void sheeva_idcache_wbinv_range (vaddr_t, vsize_t);
+void sheeva_setup(char *);
+void sheeva_cpu_sleep(int);
+
+void sheeva_sdcache_inv_range(vaddr_t, paddr_t, vsize_t);
+void sheeva_sdcache_wb_range(vaddr_t, paddr_t, vsize_t);
+void sheeva_sdcache_wbinv_range(vaddr_t, paddr_t, vsize_t);
+void sheeva_sdcache_wbinv_all(void);
+#endif
+
+#endif /* _KERNEL */
+
+#endif /* _ARM_CPUFUNC_PROTO_H_ */