Module Name:    src
Committed By:   matt
Date:           Sat Sep 22 01:44:13 UTC 2012

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

Log Message:
Before testing for VFP, make sure CP10 is enabled.  (And CP11 for Neon too).


To generate a diff of this commit:
cvs rdiff -u -r1.66 -r1.67 src/sys/arch/arm/include/armreg.h
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/include/vfpreg.h
cvs rdiff -u -r1.5 -r1.6 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.66 src/sys/arch/arm/include/armreg.h:1.67
--- src/sys/arch/arm/include/armreg.h:1.66	Sat Sep 22 00:33:37 2012
+++ src/sys/arch/arm/include/armreg.h	Sat Sep 22 01:44:12 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: armreg.h,v 1.66 2012/09/22 00:33:37 matt Exp $	*/
+/*	$NetBSD: armreg.h,v 1.67 2012/09/22 01:44:12 matt Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Ben Harris
@@ -569,6 +569,9 @@ ARMREG_READ_INLINE(ccsidr, "p15,1,%0,c0,
 ARMREG_READ_INLINE(clidr, "p15,1,%0,c0,c0,1") /* Cache Level ID Register */
 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 */
 /* 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.4 src/sys/arch/arm/include/vfpreg.h:1.5
--- src/sys/arch/arm/include/vfpreg.h:1.4	Thu Aug 16 07:24:25 2012
+++ src/sys/arch/arm/include/vfpreg.h	Sat Sep 22 01:44:12 2012
@@ -1,4 +1,4 @@
-/*      $NetBSD: vfpreg.h,v 1.4 2012/08/16 07:24:25 matt Exp $ */
+/*      $NetBSD: vfpreg.h,v 1.5 2012/09/22 01:44:12 matt Exp $ */
 
 /*
  * Copyright (c) 2008 ARM Ltd
@@ -48,6 +48,7 @@
 #define VFP_FPSID_PART_MSK	0x0000ff00	/* Part number */
 #define VFP_FPSID_PART_VFP10	0x00001000	/* VFP10 */
 #define VFP_FPSID_PART_VFP11	0x00002000	/* VFP11 */
+#define VFP_FPSID_PART_VFP30	0x00003000	/* VFP30 */
 #define VFP_FPSID_VAR_MSK	0x000000f0	/* Variant */
 #define VFP_FPSID_VAR_ARM10	0x000000a0	/* Variant ARM10 */
 #define VFP_FPSID_VAR_ARM11	0x000000b0	/* Variant ARM11 */
@@ -55,6 +56,7 @@
 
 #define FPU_VFP10_ARM10E	0x410001a0	/* Really a VFPv2 part */
 #define FPU_VFP11_ARM11		0x410120b0
+#define FPU_VFP30_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.5 src/sys/arch/arm/vfp/vfp_init.c:1.6
--- src/sys/arch/arm/vfp/vfp_init.c:1.5	Thu Aug 16 18:16:25 2012
+++ src/sys/arch/arm/vfp/vfp_init.c	Sat Sep 22 01:44:12 2012
@@ -1,4 +1,4 @@
-/*      $NetBSD: vfp_init.c,v 1.5 2012/08/16 18:16:25 matt Exp $ */
+/*      $NetBSD: vfp_init.c,v 1.6 2012/09/22 01:44:12 matt Exp $ */
 
 /*
  * Copyright (c) 2008 ARM Ltd
@@ -222,6 +222,23 @@ vfp_attach(void)
 
 	undefined_test = 0;
 
+#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");
+	}
+#endif
+
 	const uint32_t fpsid = read_fpsid();
 
 	remove_coproc_handler(uh);
@@ -241,6 +258,9 @@ vfp_attach(void)
 	case FPU_VFP11_ARM11:
 		model = "VFP11";
 		break;
+	case FPU_VFP30_CORTEXA9:
+		model = "NEON MPE w/ VFP 3.0";
+		break;
 	default:
 		aprint_normal_dev(ci->ci_dev, "unrecognized VFP version %x\n",
 		    fpsid);
@@ -250,7 +270,7 @@ vfp_attach(void)
 
 	if (fpsid != 0) {
 		aprint_normal("vfp%d at %s: %s\n",
-		    curcpu()->ci_dev->dv_unit, curcpu()->ci_dev->dv_xname,
+		    device_unit(curcpu()->ci_dev), device_xname(curcpu()->ci_dev),
 		    model);
 	}
 	evcnt_attach_dynamic(&vfpevent_use, EVCNT_TYPE_MISC, NULL,

Reply via email to