Re: [PATCH 2/2] arm: Make VFPv3 usable on ARMv6

2010-07-01 Thread Tony Lindgren
* Catalin Marinas catalin.mari...@arm.com [100625 16:44]:
 On Wed, 2010-06-23 at 08:57 +0100, Tony Lindgren wrote:
  MVFR0 and MVFR1 are only available starting with ARM1136 r1p0 release
  according to B.5 VFP changes in DDI0211F_arm1136_r1p0_trm.pdf. This is
  also when TLS register got added, so we can use HAS_TLS also to test for
  MVFR0 and MVFR1.
  
  Otherwise VFPFMRX and VFPFMXR access fails and we get:
  
  Internal error: Oops - undefined instruction: 0 [#1]
  PC is at no_old_VFP_process+0x8/0x3c
  LR is at __und_svc+0x48/0x80
  ...
  
  Signed-off-by: Tony Lindgren t...@atomide.com
 
 The new version looks fine to me.
 
 Acked-by: Catalin Marinas catalin.mari...@arm.com

Thanks. Added your ack and posted to Russell's patch system:

http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=6203/1

Regards,

Tony
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/2] arm: Make VFPv3 usable on ARMv6

2010-06-25 Thread Catalin Marinas
On Wed, 2010-06-23 at 08:57 +0100, Tony Lindgren wrote:
 MVFR0 and MVFR1 are only available starting with ARM1136 r1p0 release
 according to B.5 VFP changes in DDI0211F_arm1136_r1p0_trm.pdf. This is
 also when TLS register got added, so we can use HAS_TLS also to test for
 MVFR0 and MVFR1.
 
 Otherwise VFPFMRX and VFPFMXR access fails and we get:
 
 Internal error: Oops - undefined instruction: 0 [#1]
 PC is at no_old_VFP_process+0x8/0x3c
 LR is at __und_svc+0x48/0x80
 ...
 
 Signed-off-by: Tony Lindgren t...@atomide.com

The new version looks fine to me.

Acked-by: Catalin Marinas catalin.mari...@arm.com

-- 
Catalin

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/2] arm: Make VFPv3 usable on ARMv6

2010-06-23 Thread Tony Lindgren
* Tony Lindgren t...@atomide.com [100622 16:15]:
 * Catalin Marinas catalin.mari...@arm.com [100622 15:53]:
  On Mon, 2010-06-21 at 14:51 +0100, Tony Lindgren wrote:
   diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c
   index 315a540..19ba626 100644
   --- a/arch/arm/vfp/vfpmodule.c
   +++ b/arch/arm/vfp/vfpmodule.c
   @@ -549,10 +549,14 @@ static int __init vfp_init(void)
   /*
* Check for the presence of the Advanced SIMD
* load/store instructions, integer and single
   -* precision floating point operations.
   +* precision floating point operations. Only check
   +* for NEON if the hardware has TLS register as the
   +* MVFR registers got added in ARM1136 r1p0 with TLS.
*/
   -   if ((fmrx(MVFR1)  0x000fff00) == 0x00011100)
   -   elf_hwcap |= HWCAP_NEON;
   +   if (elf_hwcap  HWCAP_TLS) {
   +   if ((fmrx(MVFR1)  0x000fff00) == 0x00011100)
   +   elf_hwcap |= HWCAP_NEON;
   +   }
  
  MVFR should be available with the new CPU id format:
  
  ((read_cpuid_id()  0x000f) == 0x000f)
  
  I think that would be a cleaner test than relying on the TLS presence.
 
 OK, thanks that's better. Will update accordingly and repost.

Here's this one updated. Using your better MVFR check also removes the
dependency to the previous patch.

Regards,

Tony
From: Tony Lindgren t...@atomide.com
Date: Mon, 21 Jun 2010 16:33:28 +0300
Subject: [PATCH] arm: Make VFPv3 usable on ARMv6

MVFR0 and MVFR1 are only available starting with ARM1136 r1p0 release
according to B.5 VFP changes in DDI0211F_arm1136_r1p0_trm.pdf. This is
also when TLS register got added, so we can use HAS_TLS also to test for
MVFR0 and MVFR1.

Otherwise VFPFMRX and VFPFMXR access fails and we get:

Internal error: Oops - undefined instruction: 0 [#1]
PC is at no_old_VFP_process+0x8/0x3c
LR is at __und_svc+0x48/0x80
...

Signed-off-by: Tony Lindgren t...@atomide.com

diff --git a/arch/arm/include/asm/vfpmacros.h b/arch/arm/include/asm/vfpmacros.h
index 422f3cc..3d5fc41 100644
--- a/arch/arm/include/asm/vfpmacros.h
+++ b/arch/arm/include/asm/vfpmacros.h
@@ -3,6 +3,8 @@
  *
  * Assembler-only file containing VFP macros and register definitions.
  */
+#include asm/hwcap.h
+
 #include vfp.h
 
 @ Macros to allow building with old toolkits (with no VFP support)
@@ -22,12 +24,20 @@
 	LDC	p11, cr0, [\base],#32*4		@ FLDMIAD \base!, {d0-d15}
 #endif
 #ifdef CONFIG_VFPv3
+#if __LINUX_ARM_ARCH__ = 6
+	ldr	\tmp, =elf_hwcap		@ may not have MVFR regs
+	ldr	\tmp, [\tmp, #0]
+	tst	\tmp, #HWCAP_VFPv3D16
+	ldceq	p11, cr0, [\base],#32*4		@ FLDMIAD \base!, {d16-d31}
+	addne	\base, \base, #32*4		@ step over unused register space
+#else
 	VFPFMRX	\tmp, MVFR0			@ Media and VFP Feature Register 0
 	and	\tmp, \tmp, #MVFR0_A_SIMD_MASK	@ A_SIMD field
 	cmp	\tmp, #2			@ 32 x 64bit registers?
 	ldceql	p11, cr0, [\base],#32*4		@ FLDMIAD \base!, {d16-d31}
 	addne	\base, \base, #32*4		@ step over unused register space
 #endif
+#endif
 	.endm
 
 	@ write all the working registers out of the VFP
@@ -38,10 +48,18 @@
 	STC	p11, cr0, [\base],#32*4		@ FSTMIAD \base!, {d0-d15}
 #endif
 #ifdef CONFIG_VFPv3
+#if __LINUX_ARM_ARCH__ = 6
+	ldr	\tmp, =elf_hwcap		@ may not have MVFR regs
+	ldr	\tmp, [\tmp, #0]
+	tst	\tmp, #HWCAP_VFPv3D16
+	stceq	p11, cr0, [\base],#32*4		@ FSTMIAD \base!, {d16-d31}
+	addne	\base, \base, #32*4		@ step over unused register space
+#else
 	VFPFMRX	\tmp, MVFR0			@ Media and VFP Feature Register 0
 	and	\tmp, \tmp, #MVFR0_A_SIMD_MASK	@ A_SIMD field
 	cmp	\tmp, #2			@ 32 x 64bit registers?
 	stceql	p11, cr0, [\base],#32*4		@ FSTMIAD \base!, {d16-d31}
 	addne	\base, \base, #32*4		@ step over unused register space
 #endif
+#endif
 	.endm
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c
index 315a540..8063a32 100644
--- a/arch/arm/vfp/vfpmodule.c
+++ b/arch/arm/vfp/vfpmodule.c
@@ -15,6 +15,7 @@
 #include linux/sched.h
 #include linux/init.h
 
+#include asm/cputype.h
 #include asm/thread_notify.h
 #include asm/vfp.h
 
@@ -549,10 +550,13 @@ static int __init vfp_init(void)
 		/*
 		 * Check for the presence of the Advanced SIMD
 		 * load/store instructions, integer and single
-		 * precision floating point operations.
+		 * precision floating point operations. Only check
+		 * for NEON if the hardware has the MVFR registers.
 		 */
-		if ((fmrx(MVFR1)  0x000fff00) == 0x00011100)
-			elf_hwcap |= HWCAP_NEON;
+		if ((read_cpuid_id()  0x000f) == 0x000f) {
+			if ((fmrx(MVFR1)  0x000fff00) == 0x00011100)
+elf_hwcap |= HWCAP_NEON;
+		}
 #endif
 	}
 	return 0;


Re: [PATCH 2/2] arm: Make VFPv3 usable on ARMv6

2010-06-22 Thread Catalin Marinas
On Mon, 2010-06-21 at 14:51 +0100, Tony Lindgren wrote:
 diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c
 index 315a540..19ba626 100644
 --- a/arch/arm/vfp/vfpmodule.c
 +++ b/arch/arm/vfp/vfpmodule.c
 @@ -549,10 +549,14 @@ static int __init vfp_init(void)
 /*
  * Check for the presence of the Advanced SIMD
  * load/store instructions, integer and single
 -* precision floating point operations.
 +* precision floating point operations. Only check
 +* for NEON if the hardware has TLS register as the
 +* MVFR registers got added in ARM1136 r1p0 with TLS.
  */
 -   if ((fmrx(MVFR1)  0x000fff00) == 0x00011100)
 -   elf_hwcap |= HWCAP_NEON;
 +   if (elf_hwcap  HWCAP_TLS) {
 +   if ((fmrx(MVFR1)  0x000fff00) == 0x00011100)
 +   elf_hwcap |= HWCAP_NEON;
 +   }

MVFR should be available with the new CPU id format:

((read_cpuid_id()  0x000f) == 0x000f)

I think that would be a cleaner test than relying on the TLS presence.

-- 
Catalin

--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/2] arm: Make VFPv3 usable on ARMv6

2010-06-22 Thread Tony Lindgren
* Catalin Marinas catalin.mari...@arm.com [100622 15:53]:
 On Mon, 2010-06-21 at 14:51 +0100, Tony Lindgren wrote:
  diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c
  index 315a540..19ba626 100644
  --- a/arch/arm/vfp/vfpmodule.c
  +++ b/arch/arm/vfp/vfpmodule.c
  @@ -549,10 +549,14 @@ static int __init vfp_init(void)
  /*
   * Check for the presence of the Advanced SIMD
   * load/store instructions, integer and single
  -* precision floating point operations.
  +* precision floating point operations. Only check
  +* for NEON if the hardware has TLS register as the
  +* MVFR registers got added in ARM1136 r1p0 with TLS.
   */
  -   if ((fmrx(MVFR1)  0x000fff00) == 0x00011100)
  -   elf_hwcap |= HWCAP_NEON;
  +   if (elf_hwcap  HWCAP_TLS) {
  +   if ((fmrx(MVFR1)  0x000fff00) == 0x00011100)
  +   elf_hwcap |= HWCAP_NEON;
  +   }
 
 MVFR should be available with the new CPU id format:
 
   ((read_cpuid_id()  0x000f) == 0x000f)
 
 I think that would be a cleaner test than relying on the TLS presence.

OK, thanks that's better. Will update accordingly and repost.

Tony
--
To unsubscribe from this list: send the line unsubscribe linux-omap in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html