diff options
author | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2017-06-24 14:17:25 -0500 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2017-06-26 14:28:58 +1000 |
commit | b137ad45d298644a3c34047b2072b74bc7ec9c26 (patch) | |
tree | 958f611f5d812069204bb010750b7b6d99af453e /asm | |
parent | 2c44b08555be662bc993401412317db253385d4a (diff) | |
download | skiboot-b137ad45d298644a3c34047b2072b74bc7ec9c26.zip skiboot-b137ad45d298644a3c34047b2072b74bc7ec9c26.tar.gz skiboot-b137ad45d298644a3c34047b2072b74bc7ec9c26.tar.bz2 |
Add "cleanup_global_tlb" for P9 and later
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@kernel.crashing.org>
Signed-off-by: Michael Neuling <mikey@neuling.org>
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'asm')
-rw-r--r-- | asm/misc.S | 60 |
1 files changed, 60 insertions, 0 deletions
@@ -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 |