[Skiboot] [PATCH v2 20/23] Add "cleanup_global_tlb" for P9 and later

Michael Neuling mikey at neuling.org
Sun Jun 25 05:17:25 AEST 2017


From: Benjamin Herrenschmidt <benh at kernel.crashing.org>

Uses broadcast TLBIE's to cleanup the TLB on all cores and on
the nest MMU

By default this works with older binutils but there is a version (in
 #defines) that requires newer binutils and which documents what the
instructions are.

Signed-off-by: Benjamin Herrenschmidt <benh at kernel.crashing.org>
Signed-off-by: Michael Neuling <mikey at neuling.org>
---
 asm/misc.S        | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 include/skiboot.h |  1 +
 2 files changed, 61 insertions(+)

diff --git a/asm/misc.S b/asm/misc.S
index 4c9eee974f..381590b9d5 100644
--- a/asm/misc.S
+++ b/asm/misc.S
@@ -19,6 +19,8 @@
 #include <processor.h>
 #include <stack.h>
 
+#define OLD_BINUTILS 1
+
 	.section ".text","ax"
 	.balign	0x10
 
@@ -63,3 +65,61 @@ cleanup_local_tlb:
 	bdnz	1b
 	ptesync
 	blr
+
+	.global cleanup_global_tlb
+cleanup_global_tlb:
+
+	/* Only supported on P9 for now */
+	mfspr	%r3,SPR_PVR
+	srdi	%r3,%r3,16
+	cmpwi	cr0,%r3,PVR_TYPE_P9
+	bnelr
+
+	/* Sync out previous updates */
+	ptesync
+
+#ifndef OLD_BINUTILS
+	.machine "power9"
+#endif
+	/* Lead RB with IS=11 */
+	li	%r3,3
+	sldi	%r3,%r3,10
+	li	%r0,0
+
+	/* Blow up radix partition scoped translations */
+#ifdef OLD_BINUTILS
+	.long   0x7c0b1a64
+#else
+	tlbie	%r3, %r0 /* rs */, 2 /* ric */, 1 /* prs */, 1 /* r */
+#endif
+	eieio
+	tlbsync
+	ptesync
+#ifdef OLD_BINUTILS
+	.long   0x7c091a64
+#else
+	tlbie	%r3, %r0 /* rs */, 2 /* ric */, 0 /* prs */, 1 /* r */
+#endif
+	eieio
+	tlbsync
+	ptesync
+
+	/* Blow up hash partition scoped translations */
+#ifdef OLD_BINUTILS
+	.long   0x7c0a1a64
+#else
+	tlbie	%r3, %r0 /* rs */, 2 /* ric */, 1 /* prs */, 0 /* r */
+#endif
+	eieio
+	tlbsync
+	ptesync
+#ifdef OLD_BINUTILS
+	.long   0x7c081a64
+#else
+	tlbie	%r3, %r0 /* rs */, 2 /* ric */, 0 /* prs */, 0 /* r */
+#endif
+	eieio
+	tlbsync
+	ptesync
+
+	blr
diff --git a/include/skiboot.h b/include/skiboot.h
index 87d8503f52..1a153b0218 100644
--- a/include/skiboot.h
+++ b/include/skiboot.h
@@ -204,6 +204,7 @@ extern void fast_reboot(void);
 extern void __noreturn __secondary_cpu_entry(void);
 extern void __noreturn load_and_boot_kernel(bool is_reboot);
 extern void cleanup_local_tlb(void);
+extern void cleanup_global_tlb(void);
 extern void init_shared_sprs(void);
 extern void init_replicated_sprs(void);
 extern bool start_preload_kernel(void);
-- 
2.11.0



More information about the Skiboot mailing list