.. | .. |
---|
3 | 3 | #define _ASM_POWERPC_SYNCH_H |
---|
4 | 4 | #ifdef __KERNEL__ |
---|
5 | 5 | |
---|
| 6 | +#include <asm/cputable.h> |
---|
6 | 7 | #include <asm/feature-fixups.h> |
---|
7 | | -#include <asm/asm-const.h> |
---|
| 8 | +#include <asm/ppc-opcode.h> |
---|
8 | 9 | |
---|
9 | 10 | #ifndef __ASSEMBLY__ |
---|
10 | 11 | extern unsigned int __start___lwsync_fixup, __stop___lwsync_fixup; |
---|
.. | .. |
---|
20 | 21 | { |
---|
21 | 22 | __asm__ __volatile__ ("isync" : : : "memory"); |
---|
22 | 23 | } |
---|
| 24 | + |
---|
| 25 | +static inline void ppc_after_tlbiel_barrier(void) |
---|
| 26 | +{ |
---|
| 27 | + asm volatile("ptesync": : :"memory"); |
---|
| 28 | + /* |
---|
| 29 | + * POWER9, POWER10 need a cp_abort after tlbiel to ensure the copy is |
---|
| 30 | + * invalidated correctly. If this is not done, the paste can take data |
---|
| 31 | + * from the physical address that was translated at copy time. |
---|
| 32 | + * |
---|
| 33 | + * POWER9 in practice does not need this, because address spaces with |
---|
| 34 | + * accelerators mapped will use tlbie (which does invalidate the copy) |
---|
| 35 | + * to invalidate translations. It's not possible to limit POWER10 this |
---|
| 36 | + * way due to local copy-paste. |
---|
| 37 | + */ |
---|
| 38 | + asm volatile(ASM_FTR_IFSET(PPC_CP_ABORT, "", %0) : : "i" (CPU_FTR_ARCH_31) : "memory"); |
---|
| 39 | +} |
---|
23 | 40 | #endif /* __ASSEMBLY__ */ |
---|
24 | 41 | |
---|
25 | 42 | #if defined(__powerpc64__) |
---|