barrier.h 1.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * Copyright IBM Corp. 1999, 2009
 *
 * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
 */

#ifndef __ASM_BARRIER_H
#define __ASM_BARRIER_H

/*
 * Force strict CPU ordering.
 * And yes, this is required on UP too when we're talking
 * to devices.
 */

16
#ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
17
/* Fast-BCR without checkpoint synchronization */
18
#define __ASM_BARRIER "bcr 14,0\n"
19
#else
20
#define __ASM_BARRIER "bcr 15,0\n"
21
#endif
22

23 24
#define mb() do {  asm volatile(__ASM_BARRIER : : : "memory"); } while (0)

25 26
#define rmb()				mb()
#define wmb()				mb()
27 28
#define dma_rmb()			rmb()
#define dma_wmb()			wmb()
29 30 31
#define smp_mb()			mb()
#define smp_rmb()			rmb()
#define smp_wmb()			wmb()
32 33 34

#define read_barrier_depends()		do { } while (0)
#define smp_read_barrier_depends()	do { } while (0)
P
Peter Zijlstra 已提交
35 36 37

#define smp_mb__before_atomic()		smp_mb()
#define smp_mb__after_atomic()		smp_mb()
38

39
#define set_mb(var, value)		do { var = value; mb(); } while (0)
40

41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
#define smp_store_release(p, v)						\
do {									\
	compiletime_assert_atomic_type(*p);				\
	barrier();							\
	ACCESS_ONCE(*p) = (v);						\
} while (0)

#define smp_load_acquire(p)						\
({									\
	typeof(*p) ___p1 = ACCESS_ONCE(*p);				\
	compiletime_assert_atomic_type(*p);				\
	barrier();							\
	___p1;								\
})

56
#endif /* __ASM_BARRIER_H */