aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-alpha
diff options
context:
space:
mode:
authorKyle McMartin <kyle@parisc-linux.org>2005-10-26 23:28:40 -0400
committerKyle McMartin <kyle@parisc-linux.org>2005-10-26 23:28:40 -0400
commite0f998930eb67c49f2862c58a45262ad0bc03eca (patch)
treed2bc6cbe11a00a05f96da01b1d4ac27adaabd546 /include/asm-alpha
parent6958ae318bb1af5e0b77968384700fb184fb8893 (diff)
parent7a4ed937aa44acdeb8c6ba671509dc7b54b09d3a (diff)
Auto-update from upstream
Diffstat (limited to 'include/asm-alpha')
-rw-r--r--include/asm-alpha/atomic.h14
-rw-r--r--include/asm-alpha/barrier.h34
-rw-r--r--include/asm-alpha/system.h31
3 files changed, 45 insertions, 34 deletions
diff --git a/include/asm-alpha/atomic.h b/include/asm-alpha/atomic.h
index 1b383e3cb68..20ac3d95ecd 100644
--- a/include/asm-alpha/atomic.h
+++ b/include/asm-alpha/atomic.h
@@ -1,6 +1,8 @@
1#ifndef _ALPHA_ATOMIC_H 1#ifndef _ALPHA_ATOMIC_H
2#define _ALPHA_ATOMIC_H 2#define _ALPHA_ATOMIC_H
3 3
4#include <asm/barrier.h>
5
4/* 6/*
5 * Atomic operations that C can't guarantee us. Useful for 7 * Atomic operations that C can't guarantee us. Useful for
6 * resource counting etc... 8 * resource counting etc...
@@ -100,18 +102,19 @@ static __inline__ void atomic64_sub(long i, atomic64_t * v)
100static __inline__ long atomic_add_return(int i, atomic_t * v) 102static __inline__ long atomic_add_return(int i, atomic_t * v)
101{ 103{
102 long temp, result; 104 long temp, result;
105 smp_mb();
103 __asm__ __volatile__( 106 __asm__ __volatile__(
104 "1: ldl_l %0,%1\n" 107 "1: ldl_l %0,%1\n"
105 " addl %0,%3,%2\n" 108 " addl %0,%3,%2\n"
106 " addl %0,%3,%0\n" 109 " addl %0,%3,%0\n"
107 " stl_c %0,%1\n" 110 " stl_c %0,%1\n"
108 " beq %0,2f\n" 111 " beq %0,2f\n"
109 " mb\n"
110 ".subsection 2\n" 112 ".subsection 2\n"
111 "2: br 1b\n" 113 "2: br 1b\n"
112 ".previous" 114 ".previous"
113 :"=&r" (temp), "=m" (v->counter), "=&r" (result) 115 :"=&r" (temp), "=m" (v->counter), "=&r" (result)
114 :"Ir" (i), "m" (v->counter) : "memory"); 116 :"Ir" (i), "m" (v->counter) : "memory");
117 smp_mb();
115 return result; 118 return result;
116} 119}
117 120
@@ -120,54 +123,57 @@ static __inline__ long atomic_add_return(int i, atomic_t * v)
120static __inline__ long atomic64_add_return(long i, atomic64_t * v) 123static __inline__ long atomic64_add_return(long i, atomic64_t * v)
121{ 124{
122 long temp, result; 125 long temp, result;
126 smp_mb();
123 __asm__ __volatile__( 127 __asm__ __volatile__(
124 "1: ldq_l %0,%1\n" 128 "1: ldq_l %0,%1\n"
125 " addq %0,%3,%2\n" 129 " addq %0,%3,%2\n"
126 " addq %0,%3,%0\n" 130 " addq %0,%3,%0\n"
127 " stq_c %0,%1\n" 131 " stq_c %0,%1\n"
128 " beq %0,2f\n" 132 " beq %0,2f\n"
129 " mb\n"
130 ".subsection 2\n" 133 ".subsection 2\n"
131 "2: br 1b\n" 134 "2: br 1b\n"
132 ".previous" 135 ".previous"
133 :"=&r" (temp), "=m" (v->counter), "=&r" (result) 136 :"=&r" (temp), "=m" (v->counter), "=&r" (result)
134 :"Ir" (i), "m" (v->counter) : "memory"); 137 :"Ir" (i), "m" (v->counter) : "memory");
138 smp_mb();
135 return result; 139 return result;
136} 140}
137 141
138static __inline__ long atomic_sub_return(int i, atomic_t * v) 142static __inline__ long atomic_sub_return(int i, atomic_t * v)
139{ 143{
140 long temp, result; 144 long temp, result;
145 smp_mb();
141 __asm__ __volatile__( 146 __asm__ __volatile__(
142 "1: ldl_l %0,%1\n" 147 "1: ldl_l %0,%1\n"
143 " subl %0,%3,%2\n" 148 " subl %0,%3,%2\n"
144 " subl %0,%3,%0\n" 149 " subl %0,%3,%0\n"
145 " stl_c %0,%1\n" 150 " stl_c %0,%1\n"
146 " beq %0,2f\n" 151 " beq %0,2f\n"
147 " mb\n"
148 ".subsection 2\n" 152 ".subsection 2\n"
149 "2: br 1b\n" 153 "2: br 1b\n"
150 ".previous" 154 ".previous"
151 :"=&r" (temp), "=m" (v->counter), "=&r" (result) 155 :"=&r" (temp), "=m" (v->counter), "=&r" (result)
152 :"Ir" (i), "m" (v->counter) : "memory"); 156 :"Ir" (i), "m" (v->counter) : "memory");
157 smp_mb();
153 return result; 158 return result;
154} 159}
155 160
156static __inline__ long atomic64_sub_return(long i, atomic64_t * v) 161static __inline__ long atomic64_sub_return(long i, atomic64_t * v)
157{ 162{
158 long temp, result; 163 long temp, result;
164 smp_mb();
159 __asm__ __volatile__( 165 __asm__ __volatile__(
160 "1: ldq_l %0,%1\n" 166 "1: ldq_l %0,%1\n"
161 " subq %0,%3,%2\n" 167 " subq %0,%3,%2\n"
162 " subq %0,%3,%0\n" 168 " subq %0,%3,%0\n"
163 " stq_c %0,%1\n" 169 " stq_c %0,%1\n"
164 " beq %0,2f\n" 170 " beq %0,2f\n"
165 " mb\n"
166 ".subsection 2\n" 171 ".subsection 2\n"
167 "2: br 1b\n" 172 "2: br 1b\n"
168 ".previous" 173 ".previous"
169 :"=&r" (temp), "=m" (v->counter), "=&r" (result) 174 :"=&r" (temp), "=m" (v->counter), "=&r" (result)
170 :"Ir" (i), "m" (v->counter) : "memory"); 175 :"Ir" (i), "m" (v->counter) : "memory");
176 smp_mb();
171 return result; 177 return result;
172} 178}
173 179
diff --git a/include/asm-alpha/barrier.h b/include/asm-alpha/barrier.h
new file mode 100644
index 00000000000..229c83fe77c
--- /dev/null
+++ b/include/asm-alpha/barrier.h
@@ -0,0 +1,34 @@
1#ifndef __BARRIER_H
2#define __BARRIER_H
3
4#define mb() \
5__asm__ __volatile__("mb": : :"memory")
6
7#define rmb() \
8__asm__ __volatile__("mb": : :"memory")
9
10#define wmb() \
11__asm__ __volatile__("wmb": : :"memory")
12
13#define read_barrier_depends() \
14__asm__ __volatile__("mb": : :"memory")
15
16#ifdef CONFIG_SMP
17#define smp_mb() mb()
18#define smp_rmb() rmb()
19#define smp_wmb() wmb()
20#define smp_read_barrier_depends() read_barrier_depends()
21#else
22#define smp_mb() barrier()
23#define smp_rmb() barrier()
24#define smp_wmb() barrier()
25#define smp_read_barrier_depends() barrier()
26#endif
27
28#define set_mb(var, value) \
29do { var = value; mb(); } while (0)
30
31#define set_wmb(var, value) \
32do { var = value; wmb(); } while (0)
33
34#endif /* __BARRIER_H */
diff --git a/include/asm-alpha/system.h b/include/asm-alpha/system.h
index bdb4d66418f..050e86d1289 100644
--- a/include/asm-alpha/system.h
+++ b/include/asm-alpha/system.h
@@ -4,6 +4,7 @@
4#include <linux/config.h> 4#include <linux/config.h>
5#include <asm/pal.h> 5#include <asm/pal.h>
6#include <asm/page.h> 6#include <asm/page.h>
7#include <asm/barrier.h>
7 8
8/* 9/*
9 * System defines.. Note that this is included both from .c and .S 10 * System defines.. Note that this is included both from .c and .S
@@ -139,36 +140,6 @@ extern void halt(void) __attribute__((noreturn));
139struct task_struct; 140struct task_struct;
140extern struct task_struct *alpha_switch_to(unsigned long, struct task_struct*); 141extern struct task_struct *alpha_switch_to(unsigned long, struct task_struct*);
141 142
142#define mb() \
143__asm__ __volatile__("mb": : :"memory")
144
145#define rmb() \
146__asm__ __volatile__("mb": : :"memory")
147
148#define wmb() \
149__asm__ __volatile__("wmb": : :"memory")
150
151#define read_barrier_depends() \
152__asm__ __volatile__("mb": : :"memory")
153
154#ifdef CONFIG_SMP
155#define smp_mb() mb()
156#define smp_rmb() rmb()
157#define smp_wmb() wmb()
158#define smp_read_barrier_depends() read_barrier_depends()
159#else
160#define smp_mb() barrier()
161#define smp_rmb() barrier()
162#define smp_wmb() barrier()
163#define smp_read_barrier_depends() barrier()
164#endif
165
166#define set_mb(var, value) \
167do { var = value; mb(); } while (0)
168
169#define set_wmb(var, value) \
170do { var = value; wmb(); } while (0)
171
172#define imb() \ 143#define imb() \
173__asm__ __volatile__ ("call_pal %0 #imb" : : "i" (PAL_imb) : "memory") 144__asm__ __volatile__ ("call_pal %0 #imb" : : "i" (PAL_imb) : "memory")
174 145