2013-11-06 17:57:36 +04:00
/*
* Generic barrier definitions , originally based on MN10300 definitions .
2012-03-28 21:30:03 +04:00
*
* It should be possible to use these on really simple architectures ,
* but it serves more as a starting point for new ports .
*
* Copyright ( C ) 2007 Red Hat , Inc . All Rights Reserved .
* Written by David Howells ( dhowells @ redhat . com )
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public Licence
* as published by the Free Software Foundation ; either version
* 2 of the Licence , or ( at your option ) any later version .
*/
# ifndef __ASM_GENERIC_BARRIER_H
# define __ASM_GENERIC_BARRIER_H
# ifndef __ASSEMBLY__
2013-11-06 17:57:36 +04:00
# include <linux/compiler.h>
# ifndef nop
# define nop() asm volatile ("nop")
# endif
2012-03-28 21:30:03 +04:00
/*
2013-11-06 17:57:36 +04:00
* Force strict CPU ordering . And yes , this is required on UP too when we ' re
* talking to devices .
2012-03-28 21:30:03 +04:00
*
2013-11-06 17:57:36 +04:00
* Fall back to compiler barriers if nothing better is provided .
2012-03-28 21:30:03 +04:00
*/
2013-11-06 17:57:36 +04:00
# ifndef mb
# define mb() barrier()
# endif
# ifndef rmb
2012-03-28 21:30:03 +04:00
# define rmb() mb()
2013-11-06 17:57:36 +04:00
# endif
# ifndef wmb
# define wmb() mb()
# endif
# ifndef read_barrier_depends
# define read_barrier_depends() do { } while (0)
# endif
2012-03-28 21:30:03 +04:00
# ifdef CONFIG_SMP
# define smp_mb() mb()
# define smp_rmb() rmb()
# define smp_wmb() wmb()
2013-11-06 17:57:36 +04:00
# define smp_read_barrier_depends() read_barrier_depends()
2012-03-28 21:30:03 +04:00
# else
# define smp_mb() barrier()
# define smp_rmb() barrier()
# define smp_wmb() barrier()
2013-11-06 17:57:36 +04:00
# define smp_read_barrier_depends() do { } while (0)
2012-03-28 21:30:03 +04:00
# endif
2013-11-06 17:57:36 +04:00
# ifndef set_mb
# define set_mb(var, value) do { (var) = (value); mb(); } while (0)
# endif
2012-03-28 21:30:03 +04:00
2013-11-06 17:57:36 +04:00
# define smp_store_release(p, v) \
do { \
compiletime_assert_atomic_type ( * p ) ; \
smp_mb ( ) ; \
ACCESS_ONCE ( * p ) = ( v ) ; \
} while ( 0 )
# define smp_load_acquire(p) \
( { \
typeof ( * p ) ___p1 = ACCESS_ONCE ( * p ) ; \
compiletime_assert_atomic_type ( * p ) ; \
smp_mb ( ) ; \
___p1 ; \
} )
2012-03-28 21:30:03 +04:00
# endif /* !__ASSEMBLY__ */
# endif /* __ASM_GENERIC_BARRIER_H */