[PATCH 8/9] ARM: pxa: add iwmmx support for PJ4

Haojian Zhuang haojian.zhuang at marvell.com
Mon Nov 8 07:37:49 EST 2010


From: Zhou Zhu <zzhu3 at marvell.com>

iwmmx instructions are also used in PJ4. Add PJ4 support.

Signed-off-by: Zhou Zhu <zzhu3 at marvell.com>
Signed-off-by: Haojian Zhuang <haojian.zhuang at marvell.com>
Cc: Eric Miao <eric.y.miao at gmail.com>
---
 arch/arm/kernel/Makefile     |    3 ++-
 arch/arm/kernel/iwmmxt.S     |   31 +++++++++++++++++++++++++++++--
 arch/arm/kernel/xscale-cp0.c |   21 ++++++++++++++++++++-
 3 files changed, 51 insertions(+), 4 deletions(-)

diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile
index 5b9b268..7a12cd5 100644
--- a/arch/arm/kernel/Makefile
+++ b/arch/arm/kernel/Makefile
@@ -50,10 +50,11 @@ AFLAGS_crunch-bits.o		:= -Wa,-mcpu=ep9312
 obj-$(CONFIG_CPU_XSCALE)	+= xscale-cp0.o
 obj-$(CONFIG_CPU_XSC3)		+= xscale-cp0.o
 obj-$(CONFIG_CPU_MOHAWK)	+= xscale-cp0.o
+obj-$(CONFIG_CPU_PJ4)		+= xscale-cp0.o
 obj-$(CONFIG_IWMMXT)		+= iwmmxt.o
 obj-$(CONFIG_CPU_HAS_PMU)	+= pmu.o
 obj-$(CONFIG_HW_PERF_EVENTS)	+= perf_event.o
-AFLAGS_iwmmxt.o			:= -Wa,-mcpu=iwmmxt
+AFLAGS_iwmmxt.o			:= -Wa,-mcpu=iwmmxt+iwmmxt2
 
 ifneq ($(CONFIG_ARCH_EBSA110),y)
   obj-y		+= io.o
diff --git a/arch/arm/kernel/iwmmxt.S b/arch/arm/kernel/iwmmxt.S
index b63b528..b50d231 100644
--- a/arch/arm/kernel/iwmmxt.S
+++ b/arch/arm/kernel/iwmmxt.S
@@ -58,12 +58,19 @@
 
 ENTRY(iwmmxt_task_enable)
 
+#ifdef CONFIG_CPU_PJ4
+	mrc	p15, 0, r2, c1, c0, 2
+	tst	r2, #0xf			@ CP0 and CP1 accessible?
+	movne	pc, lr				@ if so no business here
+	orr	r2, r2, #0xf			@ enable access to CP0 and CP1
+	mcr	p15, 0, r2, c1, c0, 2
+#else
 	mrc	p15, 0, r2, c15, c1, 0
 	tst	r2, #0x3			@ CP0 and CP1 accessible?
 	movne	pc, lr				@ if so no business here
 	orr	r2, r2, #0x3			@ enable access to CP0 and CP1
 	mcr	p15, 0, r2, c15, c1, 0
-
+#endif
 	ldr	r3, =concan_owner
 	add	r0, r10, #TI_IWMMXT_STATE	@ get task Concan save area
 	ldr	r2, [sp, #60]			@ current task pc value
@@ -179,17 +186,28 @@ ENTRY(iwmmxt_task_disable)
 	teqne	r1, r2				@ or specified one?
 	bne	1f				@ no: quit
 
+#ifdef CONFIG_CPU_PJ4
+	mrc	p15, 0, r4, c1, c0, 2
+	orr	r4, r4, #0xf			@ enable access to CP0 and CP1
+	mcr	p15, 0, r4, c1, c0, 2
+#else
 	mrc	p15, 0, r4, c15, c1, 0
 	orr	r4, r4, #0x3			@ enable access to CP0 and CP1
 	mcr	p15, 0, r4, c15, c1, 0
+#endif
 	mov	r0, #0				@ nothing to load
 	str	r0, [r3]			@ no more current owner
 	mrc	p15, 0, r2, c2, c0, 0
 	mov	r2, r2				@ cpwait
 	bl	concan_save
 
+#ifdef CONFIG_CPU_PJ4
+	bic	r4, r4, #0xf			@ disable access to CP0 and CP1
+	mcr	p15, 0, r4, c1, c0, 2
+#else
 	bic	r4, r4, #0x3			@ disable access to CP0 and CP1
 	mcr	p15, 0, r4, c15, c1, 0
+#endif
 	mrc	p15, 0, r2, c2, c0, 0
 	mov	r2, r2				@ cpwait
 
@@ -277,8 +295,13 @@ ENTRY(iwmmxt_task_restore)
  */
 ENTRY(iwmmxt_task_switch)
 
+#ifdef CONFIG_CPU_PJ4
+	mrc	p15, 0, r1, c1, c0, 2
+	tst	r1, #0xf			@ CP0 and CP1 accessible?
+#else
 	mrc	p15, 0, r1, c15, c1, 0
 	tst	r1, #0x3			@ CP0 and CP1 accessible?
+#endif
 	bne	1f				@ yes: block them for next task
 
 	ldr	r2, =concan_owner
@@ -287,9 +310,13 @@ ENTRY(iwmmxt_task_switch)
 	teq	r2, r3				@ next task owns it?
 	movne	pc, lr				@ no: leave Concan disabled
 
+#ifdef CONFIG_CPU_PJ4
+1:	eor	r1, r1, #0xf			@ flip Concan access
+	mcr	p15, 0, r1, c1, c0, 2
+#else
 1:	eor	r1, r1, #3			@ flip Concan access
 	mcr	p15, 0, r1, c15, c1, 0
-
+#endif
 	mrc	p15, 0, r1, c2, c0, 0
 	sub	pc, lr, r1, lsr #32		@ cpwait and return
 
diff --git a/arch/arm/kernel/xscale-cp0.c b/arch/arm/kernel/xscale-cp0.c
index 1796157..9f48ad2 100644
--- a/arch/arm/kernel/xscale-cp0.c
+++ b/arch/arm/kernel/xscale-cp0.c
@@ -92,10 +92,15 @@ static u32 __init xscale_cp_access_read(void)
 {
 	u32 value;
 
+#ifdef CONFIG_CPU_PJ4
+	__asm__ __volatile__ (
+		"mrc	p15, 0, %0, c1, c0, 2\n\t"
+		: "=r" (value));
+#else
 	__asm__ __volatile__ (
 		"mrc	p15, 0, %0, c15, c1, 0\n\t"
 		: "=r" (value));
-
+#endif
 	return value;
 }
 
@@ -103,12 +108,21 @@ static void __init xscale_cp_access_write(u32 value)
 {
 	u32 temp;
 
+#ifdef CONFIG_CPU_PJ4
+	__asm__ __volatile__ (
+		"mcr	p15, 0, %1, c1, c0, 2\n\t"
+		"mrc	p15, 0, %0, c1, c0, 2\n\t"
+		"mov	%0, %0\n\t"
+		"sub	pc, pc, #4\n\t"
+		: "=r" (temp) : "r" (value));
+#else
 	__asm__ __volatile__ (
 		"mcr	p15, 0, %1, c15, c1, 0\n\t"
 		"mrc	p15, 0, %0, c15, c1, 0\n\t"
 		"mov	%0, %0\n\t"
 		"sub	pc, pc, #4\n\t"
 		: "=r" (temp) : "r" (value));
+#endif
 }
 
 /*
@@ -153,8 +167,13 @@ static int __init xscale_cp0_init(void)
 {
 	u32 cp_access;
 
+#ifdef CONFIG_CPU_PJ4
+	cp_access = xscale_cp_access_read() & ~0xf;
+	xscale_cp_access_write(cp_access | 0xf);
+#else
 	cp_access = xscale_cp_access_read() & ~3;
 	xscale_cp_access_write(cp_access | 1);
+#endif
 
 	if (cpu_has_iwmmxt()) {
 #ifndef CONFIG_IWMMXT
-- 
1.5.6.5




More information about the linux-arm-kernel mailing list