Skip to contentSkip to conversation

mach-shmobile: Invalidate caches when booting secondary cores

PATCH In review Magnus Damm 2 participants 4 messages May 9, 2012 – May 10, 2012

Subsystems (4)
lore
Share & tools
lore

Magnus Damm

author maintainer
#0 lore raw

PATCH 1/1 mach-shmobile: Invalidate caches when booting secondary cores

From: Magnus Damm <[email protected]>

Make sure L1 caches are invalidated when booting secondary cores. Needed to boot all mach-shmobile SMP systems that are using Cortex-A9 including sh73a0, r8a7779 and EMEV2.

Thanks to imx and tegra guys for actual code.

---

This should really be moved into a common location. Feel free to point me in the right direction and I will be happy to submit a patch that unifies the code.

Tested on EMEV2.

 arch/arm/mach-shmobile/headsmp.S |   57 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 56 insertions(+), 1 deletion(-)
arch/arm/mach-shmobile/headsmp.S +56 -1
@@ -16,6 +16,59 @@
 
 	__CPUINIT
 
+/* Cache invalidation nicked from arch/arm/mach-imx/head-v7.S, thanks!
+ *
+ * The secondary kernel init calls v7_flush_dcache_all before it enables
+ * the L1; however, the L1 comes out of reset in an undefined state, so
+ * the clean + invalidate performed by v7_flush_dcache_all causes a bunch
+ * of cache lines with uninitialized data and uninitialized tags to get
+ * written out to memory, which does really unpleasant things to the main
+ * processor.  We fix this by performing an invalidate, rather than a
+ * clean + invalidate, before jumping into the kernel.
+ *
+ * This funciton is cloned from arch/arm/mach-tegra/headsmp.S, and needs
+ * to be called for both secondary cores startup and primary core resume
+ * procedures.  Ideally, it should be moved into arch/arm/mm/cache-v7.S.
+ */
+ENTRY(v7_invalidate_l1)
+	mov	r0, #0
+	mcr	p15, 0, r0, c7, c5, 0	@ invalidate I cache
+	mcr	p15, 2, r0, c0, c0, 0
+	mrc	p15, 1, r0, c0, c0, 0
+
+	ldr	r1, =0x7fff
+	and	r2, r1, r0, lsr #13
+
+	ldr	r1, =0x3ff
+
+	and	r3, r1, r0, lsr #3	@ NumWays - 1
+	add	r2, r2, #1		@ NumSets
+
+	and	r0, r0, #0x7
+	add	r0, r0, #4	@ SetShift
+
+	clz	r1, r3		@ WayShift
+	add	r4, r3, #1	@ NumWays
+1:	sub	r2, r2, #1	@ NumSets--
+	mov	r3, r4		@ Temp = NumWays
+2:	subs	r3, r3, #1	@ Temp--
+	mov	r5, r3, lsl r1
+	mov	r6, r2, lsl r0
+	orr	r5, r5, r6	@ Reg = (Temp<<WayShift)|(NumSets<<SetShift)
+	mcr	p15, 0, r5, c7, c6, 2
+	bgt	2b
+	cmp	r2, #0
+	bgt	1b
+	dsb
+	isb
+	mov	pc, lr
+ENDPROC(v7_invalidate_l1)
+
+ENTRY(shmobile_invalidate_start)
+	bl	v7_invalidate_l1
+	b	secondary_startup
+ENDPROC(shmobile_invalidate_start)
+
 /*
  * Reset vector for secondary CPUs.
  * This will be mapped at address 0 by SBAR register.
@@ -24,4 +77,6 @@
 	.align  12
 ENTRY(shmobile_secondary_vector)
 	ldr     pc, 1f
-1:	.long   secondary_startup - PAGE_OFFSET + PLAT_PHYS_OFFSET
+1:	.long   shmobile_invalidate_start - PAGE_OFFSET + PLAT_PHYS_OFFSET
+ENDPROC(shmobile_secondary_vector)
+
author maintainer
#1 lore raw
Quoted 8 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Make sure L1 caches are invalidated when booting secondary cores. Needed to boot all mach-shmobile SMP systems that are using Cortex-A9 including sh73a0, r8a7779 and EMEV2.

Thanks to imx and tegra guys for actual code.

Quoted 8 lines

---

 This should really be moved into a common location. Feel free to point me in the right direction and I will be happy to submit a patch that unifies the code.

 Tested on EMEV2.

Now also successfully tested on the r8a7779 Marzen board.

/ magnus

Tested-by on v1 1/1
#2 lore raw
In reply to Magnus Damm

Hi
At Thu, 10 May 2012 14:21:29 +0900,

Quoted 13 lines · Magnus
Quoted 11 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Make sure L1 caches are invalidated when booting secondary cores. Needed to boot all mach-shmobile SMP systems that are using Cortex-A9 including sh73a0, r8a7779 and EMEV2.

Thanks to imx and tegra guys for actual code.

---

Quoted 7 lines
Quoted 5 lines

 This should really be moved into a common location. Feel free to point me in the right direction and I will be happy to submit a patch that unifies the code.

 Tested on EMEV2.

Now also successfully tested on the r8a7779 Marzen board.

I used this patch on KZM9G board. it allows SMP boot.

Best regards
---
Kuninori Morimoto

author maintainer
#3 lore raw
In reply to Magnus Damm
Quoted 19 lines · Kuninori Morimoto

At Thu, 10 May 2012 14:21:29 +0900,

Quoted 17 lines · Magnus
Quoted 15 lines · Magnus Damm

From: Magnus Damm <[email protected]>

Make sure L1 caches are invalidated when booting secondary cores. Needed to boot all mach-shmobile SMP systems that are using Cortex-A9 including sh73a0, r8a7779 and EMEV2.

Thanks to imx and tegra guys for actual code.

---

 This should really be moved into a common location. Feel free to point me in the right direction and I will be happy to submit a patch that unifies the code.

Quoted 7 lines
Quoted 3 lines
Quoted 1 line

 Tested on EMEV2.

Now also successfully tested on the r8a7779 Marzen board.

I used this patch on KZM9G board. it allows SMP boot.

Thanks for testing, Morimoto-san.

Since KZM9G is based on sh73a0 we have now tested all mach-shmobile SMP SoCs with this patch.

Rafael, please pick up!

Cheers,

/ magnus