Module Name:    src
Committed By:   matt
Date:           Sat Jun 19 19:44:58 UTC 2010

Modified Files:
        src/sys/arch/arm/arm: bus_space_asm_generic.S cpufunc.c
            cpufunc_asm_armv6.S cpufunc_asm_armv7.S
        src/sys/arch/arm/arm32: cpu.c locore.S
        src/sys/arch/arm/conf: files.arm
        src/sys/arch/arm/include: armreg.h cpuconf.h cpufunc.h
        src/sys/arch/arm/omap: omap2_mputmr.c
        src/sys/arch/evbarm/conf: BEAGLEBOARD TISDP2420 std.beagle std.igepv2
Added Files:
        src/sys/arch/arm/arm32: cortex_pmc.c

Log Message:
Cleanup the armv7 changes.  Add ARM_ARCH_7.   Use CPU_CORTEX instead of
CPU_CORTEXA8 everywhere since there more types of Cortex than just the A8.
CPU_CORTEXA8 still exists but causes CPU_CORTEX to be defined.
Add CPU_CORTEXA9 as well.  Use .arch armv7a to get us the isb/dsb
instructions.

Test booted to root device prompt on a Beagleboard.
All ARM kernels successfully test built.


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/arm/bus_space_asm_generic.S
cvs rdiff -u -r1.95 -r1.96 src/sys/arch/arm/arm/cpufunc.c
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/arm/cpufunc_asm_armv6.S
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/arm/cpufunc_asm_armv7.S
cvs rdiff -u -r0 -r1.1 src/sys/arch/arm/arm32/cortex_pmc.c
cvs rdiff -u -r1.73 -r1.74 src/sys/arch/arm/arm32/cpu.c
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/arm/arm32/locore.S
cvs rdiff -u -r1.98 -r1.99 src/sys/arch/arm/conf/files.arm
cvs rdiff -u -r1.42 -r1.43 src/sys/arch/arm/include/armreg.h
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/arm/include/cpuconf.h
cvs rdiff -u -r1.50 -r1.51 src/sys/arch/arm/include/cpufunc.h
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/omap/omap2_mputmr.c
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/evbarm/conf/BEAGLEBOARD
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/evbarm/conf/TISDP2420
cvs rdiff -u -r1.2 -r1.3 src/sys/arch/evbarm/conf/std.beagle
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/evbarm/conf/std.igepv2

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/bus_space_asm_generic.S
diff -u src/sys/arch/arm/arm/bus_space_asm_generic.S:1.5 src/sys/arch/arm/arm/bus_space_asm_generic.S:1.6
--- src/sys/arch/arm/arm/bus_space_asm_generic.S:1.5	Sun Dec 11 12:16:41 2005
+++ src/sys/arch/arm/arm/bus_space_asm_generic.S	Sat Jun 19 19:44:57 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: bus_space_asm_generic.S,v 1.5 2005/12/11 12:16:41 christos Exp $	*/
+/*	$NetBSD: bus_space_asm_generic.S,v 1.6 2010/06/19 19:44:57 matt Exp $	*/
 
 /*
  * Copyright (c) 1997 Causality Limited.
@@ -49,7 +49,7 @@
 	ldrb	r0, [r1, r2]
 	mov	pc, lr
 
-#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6) > 0
+#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6 + ARM_ARCH_7) > 0
 ENTRY(generic_armv4_bs_r_2)
 	ldrh	r0, [r1, r2]
 	mov	pc, lr
@@ -67,7 +67,7 @@
 	strb	r3, [r1, r2]
 	mov	pc, lr
 
-#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6) > 0
+#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6 + ARM_ARCH_7) > 0
 ENTRY(generic_armv4_bs_w_2)
 	strh	r3, [r1, r2]
 	mov	pc, lr
@@ -95,7 +95,7 @@
 
 	mov	pc, lr
 
-#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6) > 0
+#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6 + ARM_ARCH_7) > 0
 ENTRY(generic_armv4_bs_rm_2)
 	add	r0, r1, r2
 	mov	r1, r3
@@ -143,7 +143,7 @@
 
 	mov	pc, lr
 
-#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6) > 0
+#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6 + ARM_ARCH_7) > 0
 ENTRY(generic_armv4_bs_wm_2)
 	add	r0, r1, r2
 	mov	r1, r3
@@ -191,7 +191,7 @@
 
 	mov	pc, lr
 
-#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6) > 0
+#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6 + ARM_ARCH_7) > 0
 ENTRY(generic_armv4_bs_rr_2)
 	add	r0, r1, r2
 	mov	r1, r3
@@ -239,7 +239,7 @@
 
 	mov	pc, lr
 
-#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6) > 0
+#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6 + ARM_ARCH_7) > 0
 ENTRY(generic_armv4_bs_wr_2)
 	add	r0, r1, r2
 	mov	r1, r3
@@ -286,7 +286,7 @@
 
 	mov	pc, lr
 
-#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6) > 0
+#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6 + ARM_ARCH_7) > 0
 ENTRY(generic_armv4_bs_sr_2)
 	add	r0, r1, r2
 	mov	r1, r3
@@ -318,7 +318,7 @@
  * copy region
  */
 
-#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6) > 0
+#if (ARM_ARCH_4 + ARM_ARCH_5 + ARM_ARCH_6 + ARM_ARCH_7) > 0
 ENTRY(generic_armv4_bs_c_2)
 	add	r0, r1, r2
 	ldr	r2, [sp, #0]

Index: src/sys/arch/arm/arm/cpufunc.c
diff -u src/sys/arch/arm/arm/cpufunc.c:1.95 src/sys/arch/arm/arm/cpufunc.c:1.96
--- src/sys/arch/arm/arm/cpufunc.c:1.95	Wed Jun 16 22:06:53 2010
+++ src/sys/arch/arm/arm/cpufunc.c	Sat Jun 19 19:44:57 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpufunc.c,v 1.95 2010/06/16 22:06:53 jmcneill Exp $	*/
+/*	$NetBSD: cpufunc.c,v 1.96 2010/06/19 19:44:57 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.95 2010/06/16 22:06:53 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpufunc.c,v 1.96 2010/06/19 19:44:57 matt Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_cpuoptions.h"
@@ -1081,8 +1081,8 @@
 #endif
 /* CPU_XSCALE_80200 || CPU_XSCALE_80321 || __CPU_XSCALE_PXA2XX || CPU_XSCALE_IXP425 */
 
-#if defined(CPU_CORTEXA8)
-struct cpu_functions cortexa8_cpufuncs = {
+#if defined(CPU_CORTEX)
+struct cpu_functions cortex_cpufuncs = {
 	/* CPU functions */
 
 	.cf_id			= cpufunc_id,
@@ -1139,7 +1139,7 @@
 	.cf_setup		= armv7_setup
 
 };
-#endif /* CPU_CORTEXA8 */
+#endif /* CPU_CORTEX */
 
 
 /*
@@ -1155,7 +1155,7 @@
     defined(CPU_FA526) || \
     defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
     defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) || \
-    defined(CPU_CORTEXA8)
+    defined(CPU_CORTEX)
 static void get_cachetype_cp15(void);
 
 /* Additional cache information local to this file.  Log2 of some of the
@@ -1170,10 +1170,10 @@
 {
     u_int csid;
 
-#if (CPU_CORTEXA8) > 0
+#if (CPU_CORTEX) > 0
+    __asm volatile(".arch\tarmv7a");
     __asm volatile("mcr p15, 2, %0, c0, c0, 0" :: "r" (cssr));
-    /* GAS does not have the ISB instruction ATM */
-    __asm volatile(".word 0xF57FF06F;"); /* sync to the new cssr */
+    __asm volatile("isb");	/* sync to the new cssr */
 #else
     __asm volatile("mcr p15, 1, %0, c0, c0, 2" :: "r" (cssr));
 #endif
@@ -1693,11 +1693,12 @@
 		return 0;
 	}
 #endif /* CPU_XSCALE_IXP425 */
-#if defined(CPU_CORTEXA8)
+#if defined(CPU_CORTEX)
 	if (cputype == CPU_ID_CORTEXA8R1 ||
 	    cputype == CPU_ID_CORTEXA8R2 ||
-	    cputype == CPU_ID_CORTEXA8R3) {
-		cpufuncs = cortexa8_cpufuncs;
+	    cputype == CPU_ID_CORTEXA8R3 ||
+	    cputype == CPU_ID_CORTEXA9R1) {
+		cpufuncs = cortex_cpufuncs;
 		cpu_reset_needs_v4_MMU_disable = 1;	/* V4 or higher */
 		cpu_do_powersave = 1;			/* Enable powersave */
 		get_cachetype_cp15();
@@ -1707,7 +1708,7 @@
 
 		return 0;
 	}
-#endif /* CPU_CORTEXA8 */
+#endif /* CPU_CORTEX */
 	/*
 	 * Bzzzz. And the answer was ...
 	 */
@@ -2094,7 +2095,7 @@
 	defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
 	defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) || \
 	defined(CPU_ARM10) || defined(CPU_ARM11) || defined(CPU_ARM1136) || \
-	defined(CPU_FA526) || defined(CPU_CORTEXA8)
+	defined(CPU_FA526) || defined(CPU_CORTEX)
 
 #define IGN	0
 #define OR	1
@@ -2546,7 +2547,7 @@
 }
 #endif	/* CPU_ARM11 */
 
-#if defined(CPU_CORTEXA8)
+#if defined(CPU_CORTEX)
 struct cpu_option armv7_options[] = {
     { "cpu.cache",      BIC, OR,  (CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE) },
     { "cpu.nocache",    OR,  BIC, (CPU_CONTROL_IC_ENABLE | CPU_CONTROL_DC_ENABLE) },
@@ -2629,18 +2630,20 @@
 
 			for (way = ways; way >= 0; way--) {
 				/* Clean by set/way */
-				u_int sw = (way << wayshift) | (nsets << setshift) |
-					(level << 1);
+				const u_int sw = (way << wayshift)
+				    | (nsets << setshift)
+				    | (level << 1);
 
-				__asm volatile("mcr\tp15, 0, %0, c7, c10, 2" :: "r"(sw));
+				__asm volatile("mcr\tp15, 0, %0, c7, c10, 2"
+				    :: "r"(sw));
 			}
 		}
 	}
 
-	__asm volatile("mcr\tp15, 0, r0, c7, c10, 4"); /* DSB */
-	__asm volatile(".word 0xF57FF06F;");	       /* ISB */
+	__asm volatile("dsb");
+	__asm volatile("isb");
 }
-#endif /* CPU_CORTEXA8 */
+#endif /* CPU_CORTEX */
 
 
 
@@ -2965,7 +2968,7 @@
 #endif /* CPU_IXP12X0 */
 
 #if defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
-    defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) || defined(CPU_CORTEXA8)
+    defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) || defined(CPU_CORTEX)
 struct cpu_option xscale_options[] = {
 #ifdef COMPAT_12
 	{ "branchpredict", 	BIC, OR,  CPU_CONTROL_BPRD_ENABLE },

Index: src/sys/arch/arm/arm/cpufunc_asm_armv6.S
diff -u src/sys/arch/arm/arm/cpufunc_asm_armv6.S:1.2 src/sys/arch/arm/arm/cpufunc_asm_armv6.S:1.3
--- src/sys/arch/arm/arm/cpufunc_asm_armv6.S:1.2	Sun Apr 27 18:58:43 2008
+++ src/sys/arch/arm/arm/cpufunc_asm_armv6.S	Sat Jun 19 19:44:57 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpufunc_asm_armv6.S,v 1.2 2008/04/27 18:58:43 matt Exp $	*/
+/*	$NetBSD: cpufunc_asm_armv6.S,v 1.3 2010/06/19 19:44:57 matt Exp $	*/
 
 /*
  * Copyright (c) 2002, 2005 ARM Limited
@@ -38,6 +38,8 @@
 #include <machine/cpu.h>
 #include <machine/asm.h>
 
+	.arch	armv6
+
 /*
  * Functions to set the MMU Translation Table Base register
  *

Index: src/sys/arch/arm/arm/cpufunc_asm_armv7.S
diff -u src/sys/arch/arm/arm/cpufunc_asm_armv7.S:1.1 src/sys/arch/arm/arm/cpufunc_asm_armv7.S:1.2
--- src/sys/arch/arm/arm/cpufunc_asm_armv7.S:1.1	Wed Jun 16 22:06:53 2010
+++ src/sys/arch/arm/arm/cpufunc_asm_armv7.S	Sat Jun 19 19:44:57 2010
@@ -31,128 +31,137 @@
 #include <machine/cpu.h>
 #include <machine/asm.h>
 
-#define ISB .word 0xF57FF06F;
-#define DMB .word 0xF57FF05F;
-#define DSB .word 0xF57FF04F;
-#define WFI .word 0xC320F003;
-
-#define DCACHE_SIZE		0x00008000
-
 #define entrysize		#32
 
+	.arch	armv7a
+
 
 ENTRY(armv7_cpu_sleep)
-    tst r0, #0x00000000 			@shouldn't sleep 0
-    WFI 
-    RET
+	tst	r0, #0x00000000 	@shouldn't sleep 0
+	wfi
+	RET
+END(armv7_cpu_sleep)
 
 ENTRY(armv7_wait)
-    mrc p15, 0, r0, c2, c0, 0  /* arbitrary read of CP15 */
-    add r0, r0, #0			   /* a stall */
-    RET
+	mrc	p15, 0, r0, c2, c0, 0	@arbitrary read of CP15
+	add	r0, r0, #0		@a stall
+	RET
+END(armv7_wait)
 
 ENTRY(armv7_context_switch)
-    mcr p15, 0, r0, c7, c10, 4  /* drain the write buffer */
-    mcr p15, 0, r0, c2, c0, 0 	/* set the new TTB */
-    mcr p15, 0, r0, c8, c7, 0	/* flush the I+D */
-    RET
+	mcr	p15, 0, r0, c7, c10, 4  @drain the write buffer
+	mcr	p15, 0, r0, c2, c0, 0 	@set the new TTB
+	mcr	p15, 0, r0, c8, c7, 0	@flush the I+D
+	RET
+END(armv7_context_switch)
 
 ENTRY(armv7_tlb_flushID_SE)
-    mcr p15, 0, r0, c8, c7, 1	/* flush I+D tlb single entry */
-    mcr p15, 0, r0, c7, c10, 4  /* drain write buffer */
-    RET
+	mcr	p15, 0, r0, c8, c7, 1	@flush I+D tlb single entry
+	mcr	p15, 0, r0, c7, c10, 4  @drain write buffer
+	RET
+END(armv7_tlb_flushID_SE)
 
 
 ENTRY(armv7_setttb)
 /* Does this even exist on armv7? */
 #ifdef PMAP_CACHE_VIVT
-    stmdb	sp!, {r0, lr}
-    bl _C_LABEL(armv7_idcache_wbinv_all) 	/* Clean the D cache */
-    ldmia	sp!, {r0, lr}
+	stmdb	sp!, {r0, lr}
+	bl	_C_LABEL(armv7_idcache_wbinv_all) @clean the D cache
+	ldmia	sp!, {r0, lr}
 #endif
 
-    mcr p15, 0, r0, c2, c0, 0   /* load new TTB */
-    mcr p15, 0, r0, c8, c7, 0   /* invalidate I+D TLBs */
-    mcr p15, 0, r0, c7, c10, 4  /* drain the write buffer */
+	mcr	p15, 0, r0, c2, c0, 0   @load new TTB
+	mcr	p15, 0, r0, c8, c7, 0   @invalidate I+D TLBs
+	mcr	p15, 0, r0, c7, c10, 4  @drain the write buffer
 
-    RET
+	RET
+END(armv7_setttb)
 
 /* Cache operations. */
 
 /* LINTSTUB: void armv7_icache_sync_range(vaddr_t, vsize_t); */
 ENTRY_NP(armv7_icache_sync_range)
 1:
-    mcr p15, 0, r0, c7, c5, 1		@invalidate the I-Cache line
-    mcr p15, 0, r0, c7, c10, 1		@wb the D-Cache line
-    add r0, r0, entrysize
-    subs r1, r1, entrysize
-    bhi 1b
-
-    mcr p15, 0, r0, c7, c10, 4  	@drain the write buffer, BSB 
-    RET
+	mcr	p15, 0, r0, c7, c5, 1	@invalidate the I-Cache line
+	mcr	p15, 0, r0, c7, c10, 1	@wb the D-Cache line
+	add	r0, r0, entrysize
+	subs	r1, r1, entrysize
+	bhi	1b
+
+	mcr	p15, 0, r0, c7, c10, 4 	@drain the write buffer, BSB 
+	RET
+END(armv7_icache_sync_range)
 
 /* LINTSTUB: void armv7_icache_sync_all(void); */
 ENTRY_NP(armv7_icache_sync_all)
-    /*
-     * We assume that the code here can never be out of sync with the
-     * dcache, so that we can safely flush the Icache and fall through
-     * into the Dcache cleaning code.
-     */
-    stmdb	sp!, {r0, lr}
-    bl _C_LABEL(armv7_idcache_wbinv_all) 	/* Clean the D cache */
-    ldmia	sp!, {r0, lr}
-    mcr p15, 0, r0, c7, c10, 4  			/* drain the write buffer, BSB */
-    RET
+	/*
+	 * We assume that the code here can never be out of sync with the
+	 * dcache, so that we can safely flush the Icache and fall through
+	 * into the Dcache cleaning code.
+	 */
+	stmdb	sp!, {r0, lr}
+	bl	_C_LABEL(armv7_idcache_wbinv_all) @clean the D cache
+	ldmia	sp!, {r0, lr}
+	mcr	p15, 0, r0, c7, c10, 4  @drain the write buffer, BSB
+	RET
+END(armv7_icache_sync_all)
 
 ENTRY(armv7_dcache_wb_range)
 1:
-    mcr p15, 0, r0, c7, c10, 1		@wb the D-Cache
-    add r0, r0, entrysize
-    subs r1, r1, entrysize
-    bhi 1b
-    mcr p15, 0, r0, c7, c10, 4  	@drain the write buffer, BSB 
-    RET
+	mcr	p15, 0, r0, c7, c10, 1	@wb the D-Cache
+	add	r0, r0, entrysize
+	subs	r1, r1, entrysize
+	bhi	1b
+	mcr	p15, 0, r0, c7, c10, 4  @drain the write buffer, BSB 
+	RET
+END(armv7_dcache_wb_range)
 
 /* LINTSTUB: void armv7_dcache_wbinv_range(vaddr_t, vsize_t); */
 ENTRY(armv7_dcache_wbinv_range)
 1:
-    mcr p15, 0, r0, c7, c14, 1		@wb and inv the D-Cache line
-    add r0, r0, entrysize
-    subs r1, r1, entrysize
-    bhi 1b
-    mcr p15, 0, r0, c7, c10, 4  	@drain the write buffer, BSB 
-    RET
+	mcr	p15, 0, r0, c7, c14, 1	@wb and inv the D-Cache line
+	add	r0, r0, entrysize
+	subs	r1, r1, entrysize
+	bhi	1b
+	mcr	p15, 0, r0, c7, c10, 4  @drain the write buffer, BSB 
+	RET
+END(armv7_dcache_wbinv_range)
 
 /* * LINTSTUB: void armv7_dcache_inv_range(vaddr_t, vsize_t); */
 ENTRY(armv7_dcache_inv_range)
 1:
-    mcr	p15, 0, r0, c7, c6, 1		@invalidate the D-Cache line  
-    add r0, r0, entrysize 
-    subs r1, r1, entrysize
-    bhi 1b
-    mcr p15, 0, r0, c7, c10, 4  	@drain the write buffer, BSB 
-    RET
+	mcr	p15, 0, r0, c7, c6, 1	@invalidate the D-Cache line  
+	add	r0, r0, entrysize 
+	subs	r1, r1, entrysize
+	bhi	1b
+
+	mcr	p15, 0, r0, c7, c10, 4  @drain the write buffer, BSB 
+	RET
+END(armv7_dcache_inv_range)
 
 
 ENTRY(armv7_idcache_wbinv_range)
 1:
-    mcr p15, 0, r0, c7, c5, 1		@invalidate the I-Cache line
-    mcr p15, 0, r0, c7, c14, 1 		@wb and inv the D-Cache line
-    add r0, r0, entrysize
-    subs r1, r1, entrysize
-    bhi 1b
-    mcr p15, 0, r0, c7, c10, 4  	@drain the write buffer, BSB 
-    RET
+	mcr	p15, 0, r0, c7, c5, 1	@invalidate the I-Cache line
+	mcr	p15, 0, r0, c7, c14, 1 	@wb and inv the D-Cache line
+	add	r0, r0, entrysize
+	subs	r1, r1, entrysize
+	bhi	1b
+
+	mcr	p15, 0, r0, c7, c10, 4  @drain the write buffer, BSB 
+	RET
+END(armv7_idcache_wbinv_range)
 
 ENTRY_NP(armv7_idcache_wbinv_all)
-    /*
-     * We assume that the code here can never be out of sync with the
-     * dcache, so that we can safely flush the Icache and fall through
-     * into the Dcache purging code.
-     */
-    DMB
-    mcr p15, 0, r0, c7, c5, 0
-    b _C_LABEL(armv7_dcache_wbinv_all)
+	/*
+	 * We assume that the code here can never be out of sync with the
+	 * dcache, so that we can safely flush the Icache and fall through
+	 * into the Dcache purging code.
+	 */
+	dmb
+	mcr	p15, 0, r0, c7, c5, 0
+	b	_C_LABEL(armv7_dcache_wbinv_all)
+END(armv7_idcache_wbinv_all)
 
 /*
  * armv7_dcache_wbinv_all is in cpufunc.c. It's really too long to

Index: src/sys/arch/arm/arm32/cpu.c
diff -u src/sys/arch/arm/arm32/cpu.c:1.73 src/sys/arch/arm/arm32/cpu.c:1.74
--- src/sys/arch/arm/arm32/cpu.c:1.73	Wed Jun 16 22:06:53 2010
+++ src/sys/arch/arm/arm32/cpu.c	Sat Jun 19 19:44:57 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.c,v 1.73 2010/06/16 22:06:53 jmcneill Exp $	*/
+/*	$NetBSD: cpu.c,v 1.74 2010/06/19 19:44:57 matt Exp $	*/
 
 /*
  * Copyright (c) 1995 Mark Brinicombe.
@@ -46,7 +46,7 @@
 
 #include <sys/param.h>
 
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.73 2010/06/16 22:06:53 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.74 2010/06/19 19:44:57 matt Exp $");
 
 #include <sys/systm.h>
 #include <sys/malloc.h>
@@ -184,6 +184,7 @@
 	CPU_CLASS_XSCALE,
 	CPU_CLASS_ARM11J,
 	CPU_CLASS_ARMV4,
+	CPU_CLASS_CORTEX,
 };
 
 static const char * const generic_steppings[16] = {
@@ -406,9 +407,14 @@
 	  pN_steppings },
 	{ CPU_ID_ARM1176JS,	CPU_CLASS_ARM11J,	"ARM1176J-S r0",
 	  pN_steppings },
-	{ CPU_ID_CORTEXA8R1,	CPU_CLASS_ARM11J,	"Cortex-A8 r1",
+
+	{ CPU_ID_CORTEXA8R1,	CPU_CLASS_CORTEX,	"Cortex-A8 r1",
+	  pN_steppings },
+	{ CPU_ID_CORTEXA8R2,	CPU_CLASS_CORTEX,	"Cortex-A8 r2",
+	  pN_steppings },
+	{ CPU_ID_CORTEXA8R3,	CPU_CLASS_CORTEX,	"Cortex-A8 r3",
 	  pN_steppings },
-	{ CPU_ID_CORTEXA8R2,	CPU_CLASS_ARM11J,	"Cortex-A8 r2",
+	{ CPU_ID_CORTEXA9R1,	CPU_CLASS_CORTEX,	"Cortex-A9 r1",
 	  pN_steppings },
 	{ CPU_ID_CORTEXA8R3,	CPU_CLASS_ARM11J,	"Cortex-A8 r3",
 	  pN_steppings },
@@ -425,23 +431,24 @@
 };
 
 const struct cpu_classtab cpu_classes[] = {
-	{ "unknown",	NULL },			/* CPU_CLASS_NONE */
-	{ "ARM2",	"CPU_ARM2" },		/* CPU_CLASS_ARM2 */
-	{ "ARM2as",	"CPU_ARM250" },		/* CPU_CLASS_ARM2AS */
-	{ "ARM3",	"CPU_ARM3" },		/* CPU_CLASS_ARM3 */
-	{ "ARM6",	"CPU_ARM6" },		/* CPU_CLASS_ARM6 */
-	{ "ARM7",	"CPU_ARM7" },		/* CPU_CLASS_ARM7 */
-	{ "ARM7TDMI",	"CPU_ARM7TDMI" },	/* CPU_CLASS_ARM7TDMI */
-	{ "ARM8",	"CPU_ARM8" },		/* CPU_CLASS_ARM8 */
-	{ "ARM9TDMI",	NULL },			/* CPU_CLASS_ARM9TDMI */
-	{ "ARM9E-S",	"CPU_ARM9E" },		/* CPU_CLASS_ARM9ES */
-	{ "ARM9EJ-S",	"CPU_ARM9E" },		/* CPU_CLASS_ARM9EJS */
-	{ "ARM10E",	"CPU_ARM10" },		/* CPU_CLASS_ARM10E */
-	{ "ARM10EJ",	"CPU_ARM10" },		/* CPU_CLASS_ARM10EJ */
-	{ "SA-1",	"CPU_SA110" },		/* CPU_CLASS_SA1 */
-	{ "XScale",	"CPU_XSCALE_..." },	/* CPU_CLASS_XSCALE */
-	{ "ARM11J",	"CPU_ARM11" },		/* CPU_CLASS_ARM11J */
-	{ "ARMv4",	"CPU_ARMV4" },		/* CPU_CLASS_ARMV4 */
+	[CPU_CLASS_NONE] =	{ "unknown",	NULL },
+	[CPU_CLASS_ARM2] =	{ "ARM2",	"CPU_ARM2" },
+	[CPU_CLASS_ARM2AS] =	{ "ARM2as",	"CPU_ARM250" },
+	[CPU_CLASS_ARM3] =	{ "ARM3",	"CPU_ARM3" },
+	[CPU_CLASS_ARM6] =	{ "ARM6",	"CPU_ARM6" },
+	[CPU_CLASS_ARM7] =	{ "ARM7",	"CPU_ARM7" },
+	[CPU_CLASS_ARM7TDMI] =	{ "ARM7TDMI",	"CPU_ARM7TDMI" },
+	[CPU_CLASS_ARM8] =	{ "ARM8",	"CPU_ARM8" },
+	[CPU_CLASS_ARM9TDMI] =	{ "ARM9TDMI",	NULL },
+	[CPU_CLASS_ARM9ES] =	{ "ARM9E-S",	"CPU_ARM9E" },
+	[CPU_CLASS_ARM9EJS] =	{ "ARM9EJ-S",	"CPU_ARM9E" },
+	[CPU_CLASS_ARM10E] =	{ "ARM10E",	"CPU_ARM10" },
+	[CPU_CLASS_ARM10EJ] =	{ "ARM10EJ",	"CPU_ARM10" },
+	[CPU_CLASS_SA1] =	{ "SA-1",	"CPU_SA110" },
+	[CPU_CLASS_XSCALE] =	{ "XScale",	"CPU_XSCALE_..." },
+	[CPU_CLASS_ARM11J] =	{ "ARM11J",	"CPU_ARM11" },
+	[CPU_CLASS_ARMV4] =	{ "ARMv4",	"CPU_ARMV4" },
+	[CPU_CLASS_CORTEX] =	{ "ARMv4",	"CPU_CORTEX" },
 };
 
 /*
@@ -524,6 +531,7 @@
 	case CPU_CLASS_XSCALE:
 	case CPU_CLASS_ARM11J:
 	case CPU_CLASS_ARMV4:
+	case CPU_CLASS_CORTEX:
 		if ((ci->ci_ctrl & CPU_CONTROL_DC_ENABLE) == 0)
 			aprint_normal(" DC disabled");
 		else
@@ -615,6 +623,7 @@
 #endif
 #if defined(CPU_ARM11)
 	case CPU_CLASS_ARM11J:
+	case CPU_CLASS_CORTEX:
 #endif
 #if defined(CPU_FA526)
 	case CPU_CLASS_ARMV4:

Index: src/sys/arch/arm/arm32/locore.S
diff -u src/sys/arch/arm/arm32/locore.S:1.24 src/sys/arch/arm/arm32/locore.S:1.25
--- src/sys/arch/arm/arm32/locore.S:1.24	Thu Aug  7 04:18:21 2008
+++ src/sys/arch/arm/arm32/locore.S	Sat Jun 19 19:44:57 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.S,v 1.24 2008/08/07 04:18:21 matt Exp $	*/
+/*	$NetBSD: locore.S,v 1.25 2010/06/19 19:44:57 matt Exp $	*/
 
 /*
  * Copyright (C) 1994-1997 Mark Brinicombe
@@ -42,7 +42,7 @@
 /* What size should this really be ? It is only used by init_arm() */
 #define INIT_ARM_STACK_SIZE	2048
 
-	RCSID("$NetBSD: locore.S,v 1.24 2008/08/07 04:18:21 matt Exp $")
+	RCSID("$NetBSD: locore.S,v 1.25 2010/06/19 19:44:57 matt Exp $")
 
 /*
  * This is for kvm_mkdb, and should be the address of the beginning
@@ -58,8 +58,13 @@
 	adr	r1, .Lstart
 	ldmia	r1, {r1, r2, sp}	/* Set initial stack and */
 	sub	r2, r2, r1		/* get zero init data */
-	mov	r3, #0
 
+#ifdef PROCESS_ID_IS_CURCPU
+	ldr	r3, .Lcpu_info_store
+	mcr	p15, 0, r3, c13, c0, 4
+#endif
+
+	mov	r3, #0
 .L1:
 	str	r3, [r1], #0x0004	/* Zero the bss */
 	subs	r2, r2, #4
@@ -82,6 +87,11 @@
 	b	_C_LABEL(panic)
 	/* NOTREACHED */
 
+#ifdef PROCESS_ID_IS_CURCPU
+.Lcpu_info_store:	
+	.word	_C_LABEL(cpu_info_store)
+#endif
+
 .Lstart:
 	.word	_edata
 	.word	_end

Index: src/sys/arch/arm/conf/files.arm
diff -u src/sys/arch/arm/conf/files.arm:1.98 src/sys/arch/arm/conf/files.arm:1.99
--- src/sys/arch/arm/conf/files.arm:1.98	Wed Jun 16 22:06:53 2010
+++ src/sys/arch/arm/conf/files.arm	Sat Jun 19 19:44:57 2010
@@ -1,4 +1,4 @@
-#	$NetBSD: files.arm,v 1.98 2010/06/16 22:06:53 jmcneill Exp $
+#	$NetBSD: files.arm,v 1.99 2010/06/19 19:44:57 matt Exp $
 
 # temporary define to allow easy moving to ../arch/arm/arm32
 defflag				ARM32
@@ -8,13 +8,14 @@
 defflag	opt_cputypes.h		CPU_ARM6 CPU_ARM7 CPU_ARM7TDMI CPU_ARM8
 				CPU_ARM9 CPU_ARM9E CPU_ARM10 CPU_ARM11
 				CPU_SA110 CPU_SA1100 CPU_SA1110 CPU_IXP12X0
-				CPU_FA526
+				CPU_FA526 CPU_CORTEX
 				CPU_XSCALE_80200 CPU_XSCALE_80321
 				CPU_XSCALE_PXA250 CPU_XSCALE_PXA270
 				CPU_XSCALE_IXP425 
-				CPU_CORTEXA8
 defflag	opt_cputypes.h		CPU_ARM1136: CPU_ARM11
 defflag	opt_cputypes.h		CPU_ARM1176: CPU_ARM11
+defflag	opt_cputypes.h		CPU_CORTEXA8: CPU_CORTEX
+defflag	opt_cputypes.h		CPU_CORTEXA9: CPU_CORTEX
 defflag opt_cputypes.h		FPU_VFP
 
 defparam opt_cpuoptions.h	XSCALE_CCLKCFG
@@ -26,8 +27,7 @@
 defflag  opt_cpuoptions.h	ARM9_CACHE_WRITE_THROUGH
 defflag  opt_cpuoptions.h	PROCESS_ID_IS_CURLWP
 defflag  opt_cpuoptions.h	PROCESS_ID_IS_CURCPU
-defflag  opt_cpuoptions.h	ARM11_PMC
-defflag  opt_cpuoptions.h	CORTEXA8_PMC
+defflag  opt_cpuoptions.h	ARM11_PMC CORTEX_PMC
 defflag  opt_cpuoptions.h	ARM11_CACHE_WRITE_THROUGH
 
 # Interrupt implementation header definition.
@@ -106,7 +106,7 @@
 file	arch/arm/arm/cpufunc_asm_arm8.S		cpu_arm8
 file	arch/arm/arm/cpufunc_asm_arm9.S		cpu_arm9
 file	arch/arm/arm/cpufunc_asm_arm10.S	cpu_arm9e | cpu_arm10
-file	arch/arm/arm/cpufunc_asm_arm11.S	cpu_arm11 | cpu_cortexa8
+file	arch/arm/arm/cpufunc_asm_arm11.S	cpu_arm11 | cpu_cortex
 file	arch/arm/arm/cpufunc_asm_arm1136.S	cpu_arm1136
 file	arch/arm/arm/cpufunc_asm_armv4.S	cpu_arm9 | cpu_arm9e |
 							cpu_arm10 |
@@ -120,13 +120,11 @@
 							cpu_xscale_ixp425 |
 							cpu_xscale_pxa250 |
 							cpu_xscale_pxa270 |
-							cpu_cortexa8
+							cpu_cortex
 file	arch/arm/arm/cpufunc_asm_armv5.S	cpu_arm10
 file	arch/arm/arm/cpufunc_asm_armv5_ec.S	cpu_arm9e | cpu_arm10
-file	arch/arm/arm/cpufunc_asm_armv6.S	cpu_arm11 | cpu_cortexa8
-file	arch/arm/arm/cpufunc_asm_armv7.S	cpu_cortexa8
-makeoptions	cpu_arm11	"AOPTS.cpufunc_asm_armv6.S"+="-Wa,-march=armv6"
-makeoptions	cpu_cortexa8	"AOPTS.cpufunc_asm_armv6.S"+="-Wa,-march=armv6"
+file	arch/arm/arm/cpufunc_asm_armv6.S	cpu_arm11 | cpu_cortex
+file	arch/arm/arm/cpufunc_asm_armv7.S	cpu_cortex
 file	arch/arm/arm/cpufunc_asm_sa1.S		cpu_sa110 | cpu_sa1100 |
 							cpu_sa1110 |
 							cpu_ixp12x0
@@ -137,7 +135,7 @@
 						    cpu_xscale_ixp425 |
 						    cpu_xscale_pxa250 |
 						    cpu_xscale_pxa270 |
-						    cpu_cortexa8
+						    cpu_cortex
 file	arch/arm/arm/cpufunc_asm_ixp12x0.S	cpu_ixp12x0
 file	arch/arm/arm/fusu.S
 file	arch/arm/arm/idle_machdep.c
@@ -172,7 +170,7 @@
 # files less common to arm32 implementations...
 file	kern/kern_cctr.c			arm11
 file	arch/arm/arm32/arm11_pmc.c		arm11_pmc
-file	arch/arm/arm32/cortexa8_pmc.c		cortexa8_pmc
+file	arch/arm/arm32/cortex_pmc.c		cortex_pmc
 
 # arm32 library functions
 file	arch/arm/arm32/bcopy_page.S		arm32

Index: src/sys/arch/arm/include/armreg.h
diff -u src/sys/arch/arm/include/armreg.h:1.42 src/sys/arch/arm/include/armreg.h:1.43
--- src/sys/arch/arm/include/armreg.h:1.42	Wed Jun 16 22:06:53 2010
+++ src/sys/arch/arm/include/armreg.h	Sat Jun 19 19:44:58 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: armreg.h,v 1.42 2010/06/16 22:06:53 jmcneill Exp $	*/
+/*	$NetBSD: armreg.h,v 1.43 2010/06/19 19:44:58 matt Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Ben Harris
@@ -201,6 +201,7 @@
 #define CPU_ID_CORTEXA8R1	0x411fc080
 #define CPU_ID_CORTEXA8R2	0x412fc080
 #define CPU_ID_CORTEXA8R3	0x413fc080
+#define CPU_ID_CORTEXA9R1	0x411fc090
 #define CPU_ID_SA110		0x4401a100
 #define CPU_ID_SA1100		0x4401a110
 #define	CPU_ID_TI925T		0x54029250
@@ -447,9 +448,9 @@
 #define	ARM11_PMCEVT_RETURN_MISS	38	/* return addr. mispredicted */
 #define	ARM11_PMCEVT_CYCLE		255	/* Increment each cycle */
 
-/* Defines for ARM CORTEXA8 performance counters */
-#define CORTEXA8_CNTENS_C __BIT(31) /* Enables the cycle counter */
-#define CORTEXA8_CNTENC_C __BIT(31) /* Disables the cycle counter */
-#define CORTEXA8_CNTOFL_C __BIT(31)  /* Cycle counter overflow flag */
+/* Defines for ARM CORTEX performance counters */
+#define CORTEX_CNTENS_C __BIT(31)	/* Enables the cycle counter */
+#define CORTEX_CNTENC_C __BIT(31)	/* Disables the cycle counter */
+#define CORTEX_CNTOFL_C __BIT(31)	/* Cycle counter overflow flag */
 
 #endif	/* _ARM_ARMREG_H */

Index: src/sys/arch/arm/include/cpuconf.h
diff -u src/sys/arch/arm/include/cpuconf.h:1.17 src/sys/arch/arm/include/cpuconf.h:1.18
--- src/sys/arch/arm/include/cpuconf.h:1.17	Wed Jun 16 22:06:53 2010
+++ src/sys/arch/arm/include/cpuconf.h	Sat Jun 19 19:44:58 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpuconf.h,v 1.17 2010/06/16 22:06:53 jmcneill Exp $	*/
+/*	$NetBSD: cpuconf.h,v 1.18 2010/06/19 19:44:58 matt Exp $	*/
 
 /*
  * Copyright (c) 2002 Wasabi Systems, Inc.
@@ -71,6 +71,9 @@
 			 defined(CPU_ARM11) +				\
 			 defined(CPU_ARM1136) +				\
 			 defined(CPU_ARM1176) +				\
+			 defined(CPU_CORTEX) +				\
+			 defined(CPU_CORTEXA8) +			\
+			 defined(CPU_CORTEXA9) +			\
 			 defined(CPU_SA110) + defined(CPU_SA1100) +	\
 			 defined(CPU_SA1110) +				\
 			 defined(CPU_FA526) +				\
@@ -125,13 +128,19 @@
 #define ARM_ARCH_6	0
 #endif
 
+#if defined(CPU_CORTEX)
+#define ARM_ARCH_7	1
+#else
+#define ARM_ARCH_7	0
+#endif
+
 #define	ARM_NARCH	(ARM_ARCH_2 + ARM_ARCH_3 + ARM_ARCH_4 + \
-			 ARM_ARCH_5 + ARM_ARCH_6)
+			 ARM_ARCH_5 + ARM_ARCH_6 + ARM_ARCH_7)
 #if ARM_NARCH == 0
 #error ARM_NARCH is 0
 #endif
 
-#if ARM_ARCH_5 || ARM_ARCH_6
+#if ARM_ARCH_5 || ARM_ARCH_6 || ARM_ARCH_7
 /*
  * We could support Thumb code on v4T, but the lack of clean interworking
  * makes that hard.
@@ -198,7 +207,7 @@
 #endif
 
 #if !defined(_KERNEL_OPT) ||						\
-	 defined(CPU_CORTEXA8)
+	 defined(CPU_CORTEX)
 #define	ARM_MMU_V7		1
 #else
 #define	ARM_MMU_V7		0

Index: src/sys/arch/arm/include/cpufunc.h
diff -u src/sys/arch/arm/include/cpufunc.h:1.50 src/sys/arch/arm/include/cpufunc.h:1.51
--- src/sys/arch/arm/include/cpufunc.h:1.50	Wed Jun 16 22:06:53 2010
+++ src/sys/arch/arm/include/cpufunc.h	Sat Jun 19 19:44:58 2010
@@ -409,7 +409,7 @@
 extern unsigned armv5_dcache_index_inc;
 #endif
 
-#if defined(CPU_ARM11) || defined(CPU_CORTEXA8)
+#if defined(CPU_ARM11) || defined(CPU_CORTEX)
 void	arm11_setttb		(u_int);
 
 void	arm11_tlb_flushID_SE	(u_int);
@@ -444,7 +444,7 @@
 void	armv6_idcache_wbinv_range (vaddr_t, vsize_t);
 #endif
 
-#if defined(CPU_CORTEXA8)
+#if defined(CPU_CORTEX)
 void	armv7_setttb(u_int);
 
 void	armv7_icache_sync_range(vaddr_t, vsize_t);
@@ -480,7 +480,8 @@
     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_CORTEXA8)
+    defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) || \
+    defined(CPU_CORTEX)
 
 void	armv4_tlb_flushID	(void);
 void	armv4_tlb_flushI	(void);
@@ -498,7 +499,7 @@
 
 #if defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
     defined(__CPU_XSCALE_PXA2XX) || defined(CPU_XSCALE_IXP425) || \
-    defined(CPU_CORTEXA8)
+    defined(CPU_CORTEX)
 
 void	xscale_cpwait		(void);
 #define	cpu_cpwait()		cpufuncs.cf_cpwait()
@@ -538,7 +539,7 @@
 void	xscale_context_switch	(u_int);
 
 void	xscale_setup		(char *);
-#endif	/* CPU_XSCALE_80200 || CPU_XSCALE_80321 || __CPU_XSCALE_PXA2XX || CPU_XSCALE_IXP425 || CPU_CORTEXA8 */
+#endif	/* CPU_XSCALE_80200 || CPU_XSCALE_80321 || __CPU_XSCALE_PXA2XX || CPU_XSCALE_IXP425 || CPU_CORTEX */
 
 #define tlb_flush	cpu_tlb_flushID
 #define setttb		cpu_setttb

Index: src/sys/arch/arm/omap/omap2_mputmr.c
diff -u src/sys/arch/arm/omap/omap2_mputmr.c:1.2 src/sys/arch/arm/omap/omap2_mputmr.c:1.3
--- src/sys/arch/arm/omap/omap2_mputmr.c:1.2	Wed Jun 16 22:06:54 2010
+++ src/sys/arch/arm/omap/omap2_mputmr.c	Sat Jun 19 19:44:58 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: omap2_mputmr.c,v 1.2 2010/06/16 22:06:54 jmcneill Exp $	*/
+/*	$NetBSD: omap2_mputmr.c,v 1.3 2010/06/19 19:44:58 matt Exp $	*/
 
 /*
  * OMAP 2430 GP timers
@@ -77,7 +77,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: omap2_mputmr.c,v 1.2 2010/06/16 22:06:54 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: omap2_mputmr.c,v 1.3 2010/06/19 19:44:58 matt Exp $");
 
 #include "opt_omap.h"
 #include "opt_cpuoptions.h"
@@ -254,7 +254,7 @@
 	tc_init(&mpu_timecounter);
 }
 
-#if !(defined(ARM11_PMC) || defined(CORTEXA8_PMC))
+#if !(defined(ARM11_PMC) || defined(CORTEX_PMC))
 void
 delay(u_int n)
 {
@@ -288,7 +288,7 @@
 		}
 	}
 }
-#endif /* ARM11_PMC || CORTEXA8_PMC */
+#endif /* ARM11_PMC || CORTEX_PMC */
 
 /*
  * OVF_Rate =

Index: src/sys/arch/evbarm/conf/BEAGLEBOARD
diff -u src/sys/arch/evbarm/conf/BEAGLEBOARD:1.8 src/sys/arch/evbarm/conf/BEAGLEBOARD:1.9
--- src/sys/arch/evbarm/conf/BEAGLEBOARD:1.8	Fri Apr 16 13:48:30 2010
+++ src/sys/arch/evbarm/conf/BEAGLEBOARD	Sat Jun 19 19:44:58 2010
@@ -1,5 +1,5 @@
 #
-#	$NetBSD: BEAGLEBOARD,v 1.8 2010/04/16 13:48:30 pooka Exp $
+#	$NetBSD: BEAGLEBOARD,v 1.9 2010/06/19 19:44:58 matt Exp $
 #
 #	BEAGLEBOARD -- TI OMAP 3530 Eval Board Kernel
 #
@@ -204,8 +204,8 @@
 
 # On-board 16550 UARTs
 com0		at obio2 addr 0x49020000 intr 74 mult 4	# UART3 (console)
-options 	CONSADDR=0x49020000, CONSPEED=57600
-#options 	CONSADDR=0x49020000, CONSPEED=115200
+#options 	CONSADDR=0x49020000, CONSPEED=57600
+options 	CONSADDR=0x49020000, CONSPEED=115200
 
 # Operating System Timer
 omapmputmr0	at obio2 addr 0x49032000 intr 38	# GP Timer 2

Index: src/sys/arch/evbarm/conf/TISDP2420
diff -u src/sys/arch/evbarm/conf/TISDP2420:1.12 src/sys/arch/evbarm/conf/TISDP2420:1.13
--- src/sys/arch/evbarm/conf/TISDP2420:1.12	Fri Apr 16 13:48:30 2010
+++ src/sys/arch/evbarm/conf/TISDP2420	Sat Jun 19 19:44:58 2010
@@ -1,5 +1,5 @@
 #
-#	$NetBSD: TISDP2420,v 1.12 2010/04/16 13:48:30 pooka Exp $
+#	$NetBSD: TISDP2420,v 1.13 2010/06/19 19:44:58 matt Exp $
 #
 #	TISDP2420 -- TI OMAP 2420 Eval Board Kernel
 #
@@ -236,12 +236,6 @@
 ##umass*		at uhub? port ? configuration ? interface ?
 ##wd*		at umass?
 
-# Hardware clocking and power management
-
-options		HWCLOCK
-options		HWCLOCK_MACHINE="<arch/arm/omap/hwclock_omap1.h>"
-options		OMAP_CK_REF_SPEED=12000000
-
 # Pseudo-Devices
 
 # disk/mass storage pseudo-devices

Index: src/sys/arch/evbarm/conf/std.beagle
diff -u src/sys/arch/evbarm/conf/std.beagle:1.2 src/sys/arch/evbarm/conf/std.beagle:1.3
--- src/sys/arch/evbarm/conf/std.beagle:1.2	Fri Jun 18 00:55:06 2010
+++ src/sys/arch/evbarm/conf/std.beagle	Sat Jun 19 19:44:58 2010
@@ -1,4 +1,4 @@
-#	$NetBSD: std.beagle,v 1.2 2010/06/18 00:55:06 jmcneill Exp $
+#	$NetBSD: std.beagle,v 1.3 2010/06/19 19:44:58 matt Exp $
 #
 # standard NetBSD/evbarm for BEAGLEBAORD options
 
@@ -13,10 +13,8 @@
 
 # To support easy transit to ../arch/arm/arm32
 options 	ARM32
-#options 	ARM11_PMC
-#options 	ARM11_PMC_CCNT_HZ=500000000
-options 	CORTEXA8_PMC
-options 	CORTEXA8_CCNT_HZ=720000000
+options 	CORTEX_PMC
+options 	CORTEX_PMC_CCNT_HZ=500000000
 options 	__HAVE_FAST_SOFTINTS		# should be in types.h
 #options 	PROCESS_ID_IS_CURLWP
 options 	KERNEL_BASE_EXT=0x80000000

Index: src/sys/arch/evbarm/conf/std.igepv2
diff -u src/sys/arch/evbarm/conf/std.igepv2:1.1 src/sys/arch/evbarm/conf/std.igepv2:1.2
--- src/sys/arch/evbarm/conf/std.igepv2:1.1	Wed Jun 16 22:06:54 2010
+++ src/sys/arch/evbarm/conf/std.igepv2	Sat Jun 19 19:44:58 2010
@@ -1,4 +1,4 @@
-#	$NetBSD: std.igepv2,v 1.1 2010/06/16 22:06:54 jmcneill Exp $
+#	$NetBSD: std.igepv2,v 1.2 2010/06/19 19:44:58 matt Exp $
 #
 # standard NetBSD/evbarm for IGEPV2 options
 
@@ -13,8 +13,8 @@
 
 # To support easy transit to ../arch/arm/arm32
 options 	ARM32
-options 	CORTEXA8_PMC
-options 	CORTEXA8_CCNT_HZ=720000000
+options 	CORTEX_PMC
+options 	CORTEX_PMC_CCNT_HZ=720000000
 options 	__HAVE_FAST_SOFTINTS		# should be in types.h
 #options 	PROCESS_ID_IS_CURLWP
 options 	KERNEL_BASE_EXT=0x80000000

Added files:

Index: src/sys/arch/arm/arm32/cortex_pmc.c
diff -u /dev/null src/sys/arch/arm/arm32/cortex_pmc.c:1.1
--- /dev/null	Sat Jun 19 19:44:58 2010
+++ src/sys/arch/arm/arm32/cortex_pmc.c	Sat Jun 19 19:44:57 2010
@@ -0,0 +1,149 @@
+/* Copyright (c) 2007 Microsoft
+ * 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 Microsoft
+ *
+ * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC
+ * 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.
+ */
+
+
+/*
+ * support for ARM cortexa8 Performance Monitor Counters
+ * based on arm11_pmc.c
+ */
+
+#include <sys/cdefs.h>
+/* __KERNEL_RCSID(0, "$NetBSD: cortex_pmc.c,v 1.1 2010/06/19 19:44:57 matt Exp $"); */
+#include "opt_perfctrs.h"
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>  
+#include <sys/time.h>
+#include <sys/timetc.h>
+#include <dev/clock_subr.h>
+#include <arm/armreg.h>
+#include <arm/cpufunc.h>
+
+#ifndef CORTEX_PMC_CCNT_HZ
+# define CORTEX_PMC_CCNT_HZ	400000000	/* 400MHz */
+#endif
+
+void cortexa8_pmc_ccnt_init(void);
+
+#define COUNTS_PER_USEC	(CORTEX_PMC_CCNT_HZ / 1000000)
+
+static uint32_t counts_per_wrap = ~0UL;		/* XXX off by 1 */
+
+#define PMNC "c9, c12, 0"
+#define CCNT "c9, c13, 0"
+
+static inline uint32_t
+cortexa8_pmc_ctrl_read(void)
+{
+	uint32_t val;
+
+	__asm volatile ("mrc p15, 0, %0, " PMNC : "=r" (val));
+
+	return val;
+}
+
+static inline void
+cortexa8_pmc_ctrl_write(uint32_t val)
+{
+	__asm volatile ("mcr p15, 0, %0, " PMNC :: "r" (val));
+}
+
+static inline uint32_t
+cortexa8_pmc_ccnt_read(void)
+{
+	uint32_t val;
+
+	__asm volatile ("mrc p15, 0, %0, " CCNT : "=r" (val));
+
+	return val;
+}
+
+static inline void
+cortexa8_pmc_ccnt_write(uint32_t val)
+{
+  __asm volatile ("mcr p15, 0, %0, c9, c12, 2"  :: "r" (CORTEX_CNTENC_C));
+  __asm volatile ("mcr p15, 0, %0, " CCNT :: "r" (val));
+  __asm volatile ("mcr p15, 0, %0, c9, c12, 1" :: "r" (CORTEX_CNTENS_C));
+}
+
+/*
+ * enable the PMC CCNT for delay()
+ */
+void
+cortexa8_pmc_ccnt_init(void)
+{
+  uint32_t val;
+  
+  val = ARM11_PMCCTL_E | ARM11_PMCCTL_P | ARM11_PMCCTL_C;
+	
+  cortexa8_pmc_ctrl_write(val);
+  __asm volatile ("mcr p15, 0, %0, c9, c12, 1" :: "r" (CORTEX_CNTENS_C));
+}
+
+/*
+ * delay - for "at least" arg usec
+ *
+ *	NOTE: at 400MHz we are restricted to (uint32_t)~0 "counts"
+ *	if this is a problem, accumulate counts in LL vars
+ */
+#define DELAY_ARG_LIMIT (((uint32_t)~0) / COUNTS_PER_USEC)	/* about 10 sec */
+void
+delay(u_int arg)
+{
+	uint32_t ctrl;
+	uint32_t cur;
+	uint32_t last;
+	uint32_t delta = 0;
+	uint32_t usecs = 0;
+
+	if (arg > DELAY_ARG_LIMIT)
+		panic("delay: arg %u overflow, limit is %d usec\n", arg, DELAY_ARG_LIMIT);
+
+	last = cortexa8_pmc_ccnt_read();
+	delta = usecs = 0;
+	while (arg > usecs) {
+		cur  = cortexa8_pmc_ccnt_read();
+		
+		/* overflow flag is moved to a separate register
+		   and is not read from PMC Control Register */
+		__asm volatile ("mrc p15, 0, %0, c9, c12, 3" : "=r" (ctrl));
+		if(ctrl & CORTEX_CNTOFL_C){
+		  /* Reset overflow flag for cycle counter in overflow register */
+		  __asm volatile ("mcr p15, 0, %0, c9, c12, 3" :: "r" (CORTEX_CNTOFL_C));
+		  delta += (last + (counts_per_wrap - cur));
+		} else {
+			delta += (cur - last);
+		}
+		last = cur;
+		if (delta >= COUNTS_PER_USEC) {
+			usecs += delta / COUNTS_PER_USEC;
+			delta %= COUNTS_PER_USEC;
+		}
+	}
+}

Reply via email to