Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/arm Only use CPACR register for ARM11 and CORTEX co...



details:   https://anonhg.NetBSD.org/src/rev/a55e5ddb8e03
branches:  trunk
changeset: 781679:a55e5ddb8e03
user:      matt <matt%NetBSD.org@localhost>
date:      Sat Sep 22 19:45:53 2012 +0000

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

diffstat:

 sys/arch/arm/include/armreg.h |  17 ++++++++++++--
 sys/arch/arm/include/vfpreg.h |  10 +++++++-
 sys/arch/arm/vfp/vfp_init.c   |  49 +++++++++++++++++++++++++-----------------
 3 files changed, 51 insertions(+), 25 deletions(-)

diffs (145 lines):

diff -r 05dacf96331d -r a55e5ddb8e03 sys/arch/arm/include/armreg.h
--- a/sys/arch/arm/include/armreg.h     Sat Sep 22 14:27:24 2012 +0000
+++ b/sys/arch/arm/include/armreg.h     Sat Sep 22 19:45:53 2012 +0000
@@ -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(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 */
diff -r 05dacf96331d -r a55e5ddb8e03 sys/arch/arm/include/vfpreg.h
--- a/sys/arch/arm/include/vfpreg.h     Sat Sep 22 14:27:24 2012 +0000
+++ b/sys/arch/arm/include/vfpreg.h     Sat Sep 22 19:45:53 2012 +0000
@@ -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 */
diff -r 05dacf96331d -r a55e5ddb8e03 sys/arch/arm/vfp/vfp_init.c
--- a/sys/arch/arm/vfp/vfp_init.c       Sat Sep 22 14:27:24 2012 +0000
+++ b/sys/arch/arm/vfp/vfp_init.c       Sat Sep 22 19:45:53 2012 +0000
@@ -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 @@
 {
        struct cpu_info * const ci = curcpu();
        const char *model = NULL;
-       void *uh;
-
-       uh = install_coproc_handler(VFP_COPROC, vfp_test);
-
-       undefined_test = 0;
+       bool vfp_p = false;
 
 #ifdef FPU_VFP
-       uint32_t cpacr = armreg_cpacr_read();
-       cpacr &= ~__BITS(21,20);
-       cpacr &= ~__BITS(23,22);
+       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);
 
-       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");
+               /*
+                * 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);
+
+               /*
+                * 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 @@
        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",



Home | Main Index | Thread Index | Old Index