Commit | Line | Data |
---|---|---|
93ea02bb PZ |
1 | /* |
2 | * Generic barrier definitions, originally based on MN10300 definitions. | |
885df91c DH |
3 | * |
4 | * It should be possible to use these on really simple architectures, | |
5 | * but it serves more as a starting point for new ports. | |
6 | * | |
7 | * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. | |
8 | * Written by David Howells (dhowells@redhat.com) | |
9 | * | |
10 | * This program is free software; you can redistribute it and/or | |
11 | * modify it under the terms of the GNU General Public Licence | |
12 | * as published by the Free Software Foundation; either version | |
13 | * 2 of the Licence, or (at your option) any later version. | |
14 | */ | |
15 | #ifndef __ASM_GENERIC_BARRIER_H | |
16 | #define __ASM_GENERIC_BARRIER_H | |
17 | ||
18 | #ifndef __ASSEMBLY__ | |
19 | ||
93ea02bb PZ |
20 | #include <linux/compiler.h> |
21 | ||
22 | #ifndef nop | |
23 | #define nop() asm volatile ("nop") | |
24 | #endif | |
885df91c DH |
25 | |
26 | /* | |
93ea02bb PZ |
27 | * Force strict CPU ordering. And yes, this is required on UP too when we're |
28 | * talking to devices. | |
885df91c | 29 | * |
93ea02bb | 30 | * Fall back to compiler barriers if nothing better is provided. |
885df91c DH |
31 | */ |
32 | ||
93ea02bb PZ |
33 | #ifndef mb |
34 | #define mb() barrier() | |
35 | #endif | |
36 | ||
37 | #ifndef rmb | |
885df91c | 38 | #define rmb() mb() |
93ea02bb PZ |
39 | #endif |
40 | ||
41 | #ifndef wmb | |
42 | #define wmb() mb() | |
43 | #endif | |
44 | ||
45 | #ifndef read_barrier_depends | |
46 | #define read_barrier_depends() do { } while (0) | |
47 | #endif | |
885df91c DH |
48 | |
49 | #ifdef CONFIG_SMP | |
50 | #define smp_mb() mb() | |
51 | #define smp_rmb() rmb() | |
52 | #define smp_wmb() wmb() | |
93ea02bb | 53 | #define smp_read_barrier_depends() read_barrier_depends() |
885df91c DH |
54 | #else |
55 | #define smp_mb() barrier() | |
56 | #define smp_rmb() barrier() | |
57 | #define smp_wmb() barrier() | |
93ea02bb | 58 | #define smp_read_barrier_depends() do { } while (0) |
885df91c DH |
59 | #endif |
60 | ||
93ea02bb PZ |
61 | #ifndef set_mb |
62 | #define set_mb(var, value) do { (var) = (value); mb(); } while (0) | |
63 | #endif | |
885df91c | 64 | |
47933ad4 PZ |
65 | #define smp_store_release(p, v) \ |
66 | do { \ | |
67 | compiletime_assert_atomic_type(*p); \ | |
68 | smp_mb(); \ | |
69 | ACCESS_ONCE(*p) = (v); \ | |
70 | } while (0) | |
71 | ||
72 | #define smp_load_acquire(p) \ | |
73 | ({ \ | |
74 | typeof(*p) ___p1 = ACCESS_ONCE(*p); \ | |
75 | compiletime_assert_atomic_type(*p); \ | |
76 | smp_mb(); \ | |
77 | ___p1; \ | |
78 | }) | |
79 | ||
885df91c DH |
80 | #endif /* !__ASSEMBLY__ */ |
81 | #endif /* __ASM_GENERIC_BARRIER_H */ |