2005-09-22 23:20:04 +04:00
# ifndef _ASM_POWERPC_SYNCH_H
# define _ASM_POWERPC_SYNCH_H
2005-12-17 00:43:46 +03:00
# ifdef __KERNEL__
2005-09-22 23:20:04 +04:00
2006-01-13 07:37:17 +03:00
# include <linux/stringify.h>
2008-07-01 19:16:40 +04:00
# include <asm/feature-fixups.h>
2006-01-13 07:37:17 +03:00
2008-11-11 20:50:48 +03:00
# if defined(__powerpc64__) || defined(CONFIG_PPC_E500MC)
# define __SUBARCH_HAS_LWSYNC
# endif
2008-07-01 19:16:40 +04:00
# ifndef __ASSEMBLY__
extern unsigned int __start___lwsync_fixup , __stop___lwsync_fixup ;
extern void do_lwsync_fixups ( unsigned long value , void * fixup_start ,
void * fixup_end ) ;
static inline void eieio ( void )
{
__asm__ __volatile__ ( " eieio " : : : " memory " ) ;
}
static inline void isync ( void )
{
__asm__ __volatile__ ( " isync " : : : " memory " ) ;
}
# endif /* __ASSEMBLY__ */
2005-09-22 23:20:04 +04:00
2008-07-01 19:16:40 +04:00
# if defined(__powerpc64__)
2005-09-22 23:20:04 +04:00
# define LWSYNC lwsync
2008-07-01 19:16:40 +04:00
# elif defined(CONFIG_E500)
# define LWSYNC \
START_LWSYNC_SECTION ( 96 ) ; \
sync ; \
MAKE_LWSYNC_SECTION_ENTRY ( 96 , __lwsync_fixup ) ;
2005-09-22 23:20:04 +04:00
# else
# define LWSYNC sync
# endif
# ifdef CONFIG_SMP
2010-02-10 04:10:25 +03:00
# define __PPC_ACQUIRE_BARRIER \
START_LWSYNC_SECTION ( 97 ) ; \
isync ; \
MAKE_LWSYNC_SECTION_ENTRY ( 97 , __lwsync_fixup ) ;
# define PPC_ACQUIRE_BARRIER "\n" stringify_in_c(__PPC_ACQUIRE_BARRIER)
2010-02-10 04:04:06 +03:00
# define PPC_RELEASE_BARRIER stringify_in_c(LWSYNC) "\n"
2005-09-22 23:20:04 +04:00
# else
2010-02-10 04:04:06 +03:00
# define PPC_ACQUIRE_BARRIER
# define PPC_RELEASE_BARRIER
2005-09-22 23:20:04 +04:00
# endif
2005-12-17 00:43:46 +03:00
# endif /* __KERNEL__ */
2005-09-22 23:20:04 +04:00
# endif /* _ASM_POWERPC_SYNCH_H */