1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _ASM_POWERPC_SYNCH_H 3 #define _ASM_POWERPC_SYNCH_H 4 #ifdef __KERNEL__ 5 6 #include <linux/stringify.h> 7 #include <asm/feature-fixups.h> 8 9 #ifndef __ASSEMBLY__ 10 extern unsigned int __start___lwsync_fixup, __stop___lwsync_fixup; 11 extern void do_lwsync_fixups(unsigned long value, void *fixup_start, 12 void *fixup_end); 13 14 static inline void eieio(void) 15 { 16 __asm__ __volatile__ ("eieio" : : : "memory"); 17 } 18 19 static inline void isync(void) 20 { 21 __asm__ __volatile__ ("isync" : : : "memory"); 22 } 23 #endif /* __ASSEMBLY__ */ 24 25 #if defined(__powerpc64__) 26 # define LWSYNC lwsync 27 #elif defined(CONFIG_E500) 28 # define LWSYNC \ 29 START_LWSYNC_SECTION(96); \ 30 sync; \ 31 MAKE_LWSYNC_SECTION_ENTRY(96, __lwsync_fixup); 32 #else 33 # define LWSYNC sync 34 #endif 35 36 #ifdef CONFIG_SMP 37 #define __PPC_ACQUIRE_BARRIER \ 38 START_LWSYNC_SECTION(97); \ 39 isync; \ 40 MAKE_LWSYNC_SECTION_ENTRY(97, __lwsync_fixup); 41 #define PPC_ACQUIRE_BARRIER "\n" stringify_in_c(__PPC_ACQUIRE_BARRIER) 42 #define PPC_RELEASE_BARRIER stringify_in_c(LWSYNC) "\n" 43 #define PPC_ATOMIC_ENTRY_BARRIER "\n" stringify_in_c(sync) "\n" 44 #define PPC_ATOMIC_EXIT_BARRIER "\n" stringify_in_c(sync) "\n" 45 #else 46 #define PPC_ACQUIRE_BARRIER 47 #define PPC_RELEASE_BARRIER 48 #define PPC_ATOMIC_ENTRY_BARRIER 49 #define PPC_ATOMIC_EXIT_BARRIER 50 #endif 51 52 #endif /* __KERNEL__ */ 53 #endif /* _ASM_POWERPC_SYNCH_H */ 54