2012-03-05 11:49:34 +00:00
/*
* Based on arch / arm / include / asm / barrier . h
*
* Copyright ( C ) 2012 ARM Ltd .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# ifndef __ASM_BARRIER_H
# define __ASM_BARRIER_H
# ifndef __ASSEMBLY__
# define sev() asm volatile("sev" : : : "memory")
# define wfe() asm volatile("wfe" : : : "memory")
# define wfi() asm volatile("wfi" : : : "memory")
# define isb() asm volatile("isb" : : : "memory")
2014-05-02 16:24:11 +01:00
# define dmb(opt) asm volatile("dmb " #opt : : : "memory")
# define dsb(opt) asm volatile("dsb " #opt : : : "memory")
2012-03-05 11:49:34 +00:00
2014-05-02 16:24:10 +01:00
# define mb() dsb(sy)
2014-05-02 16:24:11 +01:00
# define rmb() dsb(ld)
# define wmb() dsb(st)
2012-03-05 11:49:34 +00:00
2014-12-11 15:02:06 -08:00
# define dma_rmb() dmb(oshld)
# define dma_wmb() dmb(oshst)
2014-05-02 16:24:11 +01:00
# define smp_mb() dmb(ish)
# define smp_rmb() dmb(ishld)
# define smp_wmb() dmb(ishst)
2013-11-06 14:57:36 +01:00
# define smp_store_release(p, v) \
do { \
compiletime_assert_atomic_type ( * p ) ; \
switch ( sizeof ( * p ) ) { \
2015-04-20 11:14:19 +01:00
case 1 : \
asm volatile ( " stlrb %w1, %0 " \
: " =Q " ( * p ) : " r " ( v ) : " memory " ) ; \
break ; \
case 2 : \
asm volatile ( " stlrh %w1, %0 " \
: " =Q " ( * p ) : " r " ( v ) : " memory " ) ; \
break ; \
2013-11-06 14:57:36 +01:00
case 4 : \
asm volatile ( " stlr %w1, %0 " \
: " =Q " ( * p ) : " r " ( v ) : " memory " ) ; \
break ; \
case 8 : \
asm volatile ( " stlr %1, %0 " \
: " =Q " ( * p ) : " r " ( v ) : " memory " ) ; \
break ; \
} \
} while ( 0 )
# define smp_load_acquire(p) \
( { \
2015-11-18 10:13:08 +00:00
union { typeof ( * p ) __val ; char __c [ 1 ] ; } __u ; \
2013-11-06 14:57:36 +01:00
compiletime_assert_atomic_type ( * p ) ; \
switch ( sizeof ( * p ) ) { \
2015-04-20 11:14:19 +01:00
case 1 : \
asm volatile ( " ldarb %w0, %1 " \
2015-11-18 10:13:08 +00:00
: " =r " ( * ( __u8 * ) __u . __c ) \
: " Q " ( * p ) : " memory " ) ; \
2015-04-20 11:14:19 +01:00
break ; \
case 2 : \
asm volatile ( " ldarh %w0, %1 " \
2015-11-18 10:13:08 +00:00
: " =r " ( * ( __u16 * ) __u . __c ) \
: " Q " ( * p ) : " memory " ) ; \
2015-04-20 11:14:19 +01:00
break ; \
2013-11-06 14:57:36 +01:00
case 4 : \
asm volatile ( " ldar %w0, %1 " \
2015-11-18 10:13:08 +00:00
: " =r " ( * ( __u32 * ) __u . __c ) \
: " Q " ( * p ) : " memory " ) ; \
2013-11-06 14:57:36 +01:00
break ; \
case 8 : \
asm volatile ( " ldar %0, %1 " \
2015-11-18 10:13:08 +00:00
: " =r " ( * ( __u64 * ) __u . __c ) \
: " Q " ( * p ) : " memory " ) ; \
2013-11-06 14:57:36 +01:00
break ; \
} \
2015-11-18 10:13:08 +00:00
__u . __val ; \
2013-11-06 14:57:36 +01:00
} )
2015-12-21 09:22:18 +02:00
# include <asm-generic/barrier.h>
2014-03-13 19:00:37 +01:00
2012-03-05 11:49:34 +00:00
# endif /* __ASSEMBLY__ */
# endif /* __ASM_BARRIER_H */