Module Name:    src
Committed By:   matt
Date:           Sat Sep 22 19:45:54 UTC 2012

Modified Files:
        src/sys/arch/arm/include: armreg.h vfpreg.h
        src/sys/arch/arm/vfp: vfp_init.c

Log Message:
Only use CPACR register for ARM11 and CORTEX cores.
Add VFP ids for other CORTEX CPUs.


To generate a diff of this commit:
cvs rdiff -u -r1.67 -r1.68 src/sys/arch/arm/include/armreg.h
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/arm/include/vfpreg.h
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/vfp/vfp_init.c

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/include/armreg.h
diff -u src/sys/arch/arm/include/armreg.h:1.67 src/sys/arch/arm/include/armreg.h:1.68
--- src/sys/arch/arm/include/armreg.h:1.67	Sat Sep 22 01:44:12 2012
+++ src/sys/arch/arm/include/armreg.h	Sat Sep 22 19:45:53 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: armreg.h,v 1.67 2012/09/22 01:44:12 matt Exp $	*/
+/*	$NetBSD: armreg.h,v 1.68 2012/09/22 19:45:53 matt Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Ben Harris
@@ -321,6 +321,15 @@
 
 #define CPU_CONTROL_IDC_ENABLE	CPU_CONTROL_DC_ENABLE
 
+/* ARMv6/ARMv7 Co-Processor Access Control Register (CP15, 0, c1, c0, 2) */
+#define	CPACR_V7_ASEDIS		0x80000000 /* Disable Advanced SIMD Ext. */
+#define	CPACR_V7_D32DIS		0x40000000 /* Disable VFP regs 15-31 */
+#define	CPACR_CPn(n)		(3 << (2*n))
+#define	CPACR_NOACCESS		0 /* reset value */
+#define	CPACR_PRIVED		1 /* Privileged mode access */
+#define	CPACR_RESERVED		2
+#define	CPACR_ALL		3 /* Privileged and User mode access */
+
 /* ARM11x6 Auxiliary Control Register (CP15 register 1, opcode2 1) */
 #define	ARM11X6_AUXCTL_RS	0x00000001 /* return stack */
 #define	ARM11X6_AUXCTL_DB	0x00000002 /* dynamic branch prediction */
@@ -570,8 +579,10 @@ ARMREG_READ_INLINE(clidr, "p15,1,%0,c0,c
 ARMREG_READ_INLINE(csselr, "p15,2,%0,c0,c0,0") /* Cache Size Selection Register */
 ARMREG_WRITE_INLINE(csselr, "p15,2,%0,c0,c0,0") /* Cache Size Selection Register */
 /* c1 registers */
-ARMREG_READ_INLINE(cpacr, "p15,0,%0,c1,c0,2") /* Co-Processor Access Register */
-ARMREG_WRITE_INLINE(cpacr, "p15,0,%0,c1,c0,2") /* Co-Processor Access Register */
+ARMREG_READ_INLINE(auxctl, "p15,0,%0,c1,c0,1") /* Auxiliary Control Register */
+ARMREG_WRITE_INLINE(auxctl, "p15,0,%0,c1,c0,1") /* Auxiliary Control Register */
+ARMREG_READ_INLINE(cpacr, "p15,0,%0,c1,c0,2") /* Co-Processor Access Control Register */
+ARMREG_WRITE_INLINE(cpacr, "p15,0,%0,c1,c0,2") /* Co-Processor Access Control Register */
 /* c2 registers */
 ARMREG_READ_INLINE(ttbr, "p15,0,%0,c2,c0,0") /* Translation Table Base Register 0 */
 ARMREG_WRITE_INLINE(ttbr, "p15,0,%0,c2,c0,0") /* Translation Table Base Register 0 */

Index: src/sys/arch/arm/include/vfpreg.h
diff -u src/sys/arch/arm/include/vfpreg.h:1.5 src/sys/arch/arm/include/vfpreg.h:1.6
--- src/sys/arch/arm/include/vfpreg.h:1.5	Sat Sep 22 01:44:12 2012
+++ src/sys/arch/arm/include/vfpreg.h	Sat Sep 22 19:45:53 2012
@@ -1,4 +1,4 @@
-/*      $NetBSD: vfpreg.h,v 1.5 2012/09/22 01:44:12 matt Exp $ */
+/*      $NetBSD: vfpreg.h,v 1.6 2012/09/22 19:45:53 matt Exp $ */
 
 /*
  * Copyright (c) 2008 ARM Ltd
@@ -45,6 +45,9 @@
 #define VFP_FPSID_ARCH_MSK	0x000f0000	/* Architecture */
 #define VFP_FPSID_ARCH_V1	0x00000000	/* Arch VFPv1 */
 #define VFP_FPSID_ARCH_V2	0x00010000	/* Arch VFPv2 */
+#define VFP_FPSID_ARCH_V3_2	0x00020000	/* Arch VFPv3 (subarch v2) */
+#define VFP_FPSID_ARCH_V3	0x00030000	/* Arch VFPv3 (no subarch) */
+#define VFP_FPSID_ARCH_V3_3	0x00040000	/* Arch VFPv3 (subarch v3) */
 #define VFP_FPSID_PART_MSK	0x0000ff00	/* Part number */
 #define VFP_FPSID_PART_VFP10	0x00001000	/* VFP10 */
 #define VFP_FPSID_PART_VFP11	0x00002000	/* VFP11 */
@@ -56,7 +59,10 @@
 
 #define FPU_VFP10_ARM10E	0x410001a0	/* Really a VFPv2 part */
 #define FPU_VFP11_ARM11		0x410120b0
-#define FPU_VFP30_CORTEXA9	0x41033090
+#define FPU_VFP_CORTEXA5	0x41023050
+#define FPU_VFP_CORTEXA7	0x41023070
+#define FPU_VFP_CORTEXA8	0x410330c0
+#define FPU_VFP_CORTEXA9	0x41033090
 
 #define VFP_FPEXC_EX		0x80000000	/* Exception status bit */
 #define VFP_FPEXC_EN		0x40000000	/* VFP Enable bit */

Index: src/sys/arch/arm/vfp/vfp_init.c
diff -u src/sys/arch/arm/vfp/vfp_init.c:1.6 src/sys/arch/arm/vfp/vfp_init.c:1.7
--- src/sys/arch/arm/vfp/vfp_init.c:1.6	Sat Sep 22 01:44:12 2012
+++ src/sys/arch/arm/vfp/vfp_init.c	Sat Sep 22 19:45:54 2012
@@ -1,4 +1,4 @@
-/*      $NetBSD: vfp_init.c,v 1.6 2012/09/22 01:44:12 matt Exp $ */
+/*      $NetBSD: vfp_init.c,v 1.7 2012/09/22 19:45:54 matt Exp $ */
 
 /*
  * Copyright (c) 2008 ARM Ltd
@@ -216,29 +216,35 @@ vfp_attach(void)
 {
 	struct cpu_info * const ci = curcpu();
 	const char *model = NULL;
-	void *uh;
+	bool vfp_p = false;
 
-	uh = install_coproc_handler(VFP_COPROC, vfp_test);
+#ifdef FPU_VFP
+	if (CPU_ID_ARM11_P(curcpu()->ci_arm_cpuid)
+	    || CPU_ID_CORTEX_P(curcpu()->ci_arm_cpuid)) {
+		const uint32_t cpacr_vfp = CPACR_CPn(VFP_COPROC);
+		const uint32_t cpacr_vfp2 = CPACR_CPn(VFP_COPROC2);
 
-	undefined_test = 0;
+		/*
+		 * We first need to enable access to the coprocessors.
+		 */
+		uint32_t cpacr = armreg_cpacr_read();
+		cpacr |= __SHIFTIN(CPACR_ALL, cpacr_vfp);
+		cpacr |= __SHIFTIN(CPACR_ALL, cpacr_vfp2);
+		armreg_cpacr_write(cpacr);
 
-#ifdef FPU_VFP
-	uint32_t cpacr = armreg_cpacr_read();
-	cpacr &= ~__BITS(21,20);
-	cpacr &= ~__BITS(23,22);
-
-	cpacr |= __SHIFTIN(1, __BITS(21,20));
-	cpacr |= __SHIFTIN(1, __BITS(23,22));
-	armreg_cpacr_write(cpacr);
-	cpacr = armreg_cpacr_read();
-	if ((cpacr & __BITS(23,22)) == 0) {
-		aprint_normal_dev(ci->ci_dev, "NEON not present\n");
-	}
-	if ((cpacr & __BITS(21,20)) == 0) {
-		aprint_normal_dev(ci->ci_dev, "VFP not present\n");
+		/*
+		 * If we could enable them, then they exist.
+		 */
+		cpacr = armreg_cpacr_read();
+		vfp_p = __SHIFTOUT(cpacr, cpacr_vfp2) != CPACR_NOACCESS
+		    || __SHIFTOUT(cpacr, cpacr_vfp) != CPACR_NOACCESS;
 	}
 #endif
 
+	void *uh = install_coproc_handler(VFP_COPROC, vfp_test);
+
+	undefined_test = 0;
+
 	const uint32_t fpsid = read_fpsid();
 
 	remove_coproc_handler(uh);
@@ -258,8 +264,11 @@ vfp_attach(void)
 	case FPU_VFP11_ARM11:
 		model = "VFP11";
 		break;
-	case FPU_VFP30_CORTEXA9:
-		model = "NEON MPE w/ VFP 3.0";
+	case FPU_VFP_CORTEXA5:
+	case FPU_VFP_CORTEXA7:
+	case FPU_VFP_CORTEXA8:
+	case FPU_VFP_CORTEXA9:
+		model = "NEON MPE (VFP 3.0+)";
 		break;
 	default:
 		aprint_normal_dev(ci->ci_dev, "unrecognized VFP version %x\n",

Reply via email to