1f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg/* spinlock.h: 64-bit Sparc spinlock support.
2f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg *
3f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
4f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg */
5f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
6f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#ifndef __SPARC64_SPINLOCK_H
7f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#define __SPARC64_SPINLOCK_H
8f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
9f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#ifndef __ASSEMBLY__
10f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
11f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg/* To get debugging spinlocks which detect and catch
12f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg * deadlock situations, set CONFIG_DEBUG_SPINLOCK
13f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg * and rebuild your kernel.
14f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg */
15f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
1664f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller/* Because we play games to save cycles in the non-contention case, we
1764f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller * need to be extra careful about branch targets into the "spinning"
1864f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller * code.  They live in their own section, but the newer V9 branches
1964f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller * have a shorter range than the traditional 32-bit sparc branch
2064f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller * variants.  The rule is that the branches that go into and out of
2164f2dde3f743c8a1ad8c0a1aa74166c1034afd92David S. Miller * the spinner sections must be pre-V9 branches.
22f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg */
23f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
240199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixner#define arch_spin_is_locked(lp)	((lp)->lock != 0)
25f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
260199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixner#define arch_spin_unlock_wait(lp)	\
27f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	do {	rmb();			\
28f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	} while((lp)->lock)
29f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
300199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixnerstatic inline void arch_spin_lock(arch_spinlock_t *lock)
31f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
32f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	unsigned long tmp;
33f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
34f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__(
35f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1:	ldstub		[%1], %0\n"
36f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brnz,pn		%0, 2f\n"
37f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
38f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	.subsection	2\n"
39f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2:	ldub		[%1], %0\n"
40f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brnz,pt		%0, 2b\n"
41f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
42f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	ba,a,pt		%%xcc, 1b\n"
43f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	.previous"
44f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "=&r" (tmp)
45f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock)
46f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
47f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
48f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
490199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixnerstatic inline int arch_spin_trylock(arch_spinlock_t *lock)
50f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
51f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	unsigned long result;
52f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
53f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__(
54f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	ldstub		[%1], %0\n"
55f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "=r" (result)
56f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock)
57f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
58f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
59f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	return (result == 0UL);
60f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
61f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
620199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixnerstatic inline void arch_spin_unlock(arch_spinlock_t *lock)
63f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
64f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__(
65f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	stb		%%g0, [%0]"
66f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: /* No outputs */
67f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock)
68f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
69f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
70f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
710199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixnerstatic inline void arch_spin_lock_flags(arch_spinlock_t *lock, unsigned long flags)
72f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
73f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	unsigned long tmp1, tmp2;
74f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
75f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__(
76f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1:	ldstub		[%2], %0\n"
77f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brnz,pn		%0, 2f\n"
78f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
79f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	.subsection	2\n"
80f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2:	rdpr		%%pil, %1\n"
81f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	wrpr		%3, %%pil\n"
82f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"3:	ldub		[%2], %0\n"
83f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brnz,pt		%0, 3b\n"
84f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
85f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	ba,pt		%%xcc, 1b\n"
86f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 wrpr		%1, %%pil\n"
87f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	.previous"
88f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "=&r" (tmp1), "=&r" (tmp2)
89f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r"(lock), "r"(flags)
90f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
91f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
92f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
93f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg/* Multi-reader locks, these are much saner than the 32-bit Sparc ones... */
94f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
95fb3a6bbc912b12347614e5742c7c61416cdb0ca0Thomas Gleixnerstatic void inline arch_read_lock(arch_rwlock_t *lock)
96f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
97f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	unsigned long tmp1, tmp2;
98f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
99f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__ (
100f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1:	ldsw		[%2], %0\n"
101f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brlz,pn		%0, 2f\n"
102f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"4:	 add		%0, 1, %1\n"
103f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cas		[%2], %0, %1\n"
104f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cmp		%0, %1\n"
105f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	bne,pn		%%icc, 1b\n"
106f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
107f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	.subsection	2\n"
108f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2:	ldsw		[%2], %0\n"
109f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brlz,pt		%0, 2b\n"
110f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
111f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	ba,a,pt		%%xcc, 4b\n"
112f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	.previous"
113f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "=&r" (tmp1), "=&r" (tmp2)
114f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock)
115f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
116f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
117f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
118fb3a6bbc912b12347614e5742c7c61416cdb0ca0Thomas Gleixnerstatic int inline arch_read_trylock(arch_rwlock_t *lock)
119f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
120f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	int tmp1, tmp2;
121f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
122f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__ (
123f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1:	ldsw		[%2], %0\n"
124f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brlz,a,pn	%0, 2f\n"
125f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 mov		0, %0\n"
126f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	add		%0, 1, %1\n"
127f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cas		[%2], %0, %1\n"
128f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cmp		%0, %1\n"
129f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	bne,pn		%%icc, 1b\n"
130f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 mov		1, %0\n"
131f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2:"
132f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "=&r" (tmp1), "=&r" (tmp2)
133f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock)
134f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
135f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
136f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	return tmp1;
137f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
138f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
139fb3a6bbc912b12347614e5742c7c61416cdb0ca0Thomas Gleixnerstatic void inline arch_read_unlock(arch_rwlock_t *lock)
140f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
141f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	unsigned long tmp1, tmp2;
142f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
143f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__(
144f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1:	lduw	[%2], %0\n"
145f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	sub	%0, 1, %1\n"
146f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cas	[%2], %0, %1\n"
147f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cmp	%0, %1\n"
148f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	bne,pn	%%xcc, 1b\n"
149f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop"
150f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "=&r" (tmp1), "=&r" (tmp2)
151f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock)
152f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
153f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
154f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
155fb3a6bbc912b12347614e5742c7c61416cdb0ca0Thomas Gleixnerstatic void inline arch_write_lock(arch_rwlock_t *lock)
156f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
157f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	unsigned long mask, tmp1, tmp2;
158f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
159f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	mask = 0x80000000UL;
160f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
161f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__(
162f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1:	lduw		[%2], %0\n"
163f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brnz,pn		%0, 2f\n"
164f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"4:	 or		%0, %3, %1\n"
165f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cas		[%2], %0, %1\n"
166f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cmp		%0, %1\n"
167f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	bne,pn		%%icc, 1b\n"
168f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
169f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	.subsection	2\n"
170f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2:	lduw		[%2], %0\n"
171f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brnz,pt		%0, 2b\n"
172f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
173f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	ba,a,pt		%%xcc, 4b\n"
174f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	.previous"
175f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "=&r" (tmp1), "=&r" (tmp2)
176f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock), "r" (mask)
177f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
178f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
179f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
180fb3a6bbc912b12347614e5742c7c61416cdb0ca0Thomas Gleixnerstatic void inline arch_write_unlock(arch_rwlock_t *lock)
181f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
182f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__(
183f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	stw		%%g0, [%0]"
184f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: /* no outputs */
185f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock)
186f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
187f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
188f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
189fb3a6bbc912b12347614e5742c7c61416cdb0ca0Thomas Gleixnerstatic int inline arch_write_trylock(arch_rwlock_t *lock)
190f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg{
191f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	unsigned long mask, tmp1, tmp2, result;
192f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
193f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	mask = 0x80000000UL;
194f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
195f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	__asm__ __volatile__(
196f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	mov		0, %2\n"
197f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"1:	lduw		[%3], %0\n"
198f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	brnz,pn		%0, 2f\n"
199f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 or		%0, %4, %1\n"
200f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cas		[%3], %0, %1\n"
201f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	cmp		%0, %1\n"
202f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	bne,pn		%%icc, 1b\n"
203f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	 nop\n"
204f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"	mov		1, %2\n"
205f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg"2:"
206f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "=&r" (tmp1), "=&r" (tmp2), "=&r" (result)
207f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "r" (lock), "r" (mask)
208f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	: "memory");
209f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
210f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg	return result;
211f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg}
212f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
213e5931943d02bf751b1ec849c0d2ade23d76a8d41Thomas Gleixner#define arch_read_lock_flags(p, f) arch_read_lock(p)
214e5931943d02bf751b1ec849c0d2ade23d76a8d41Thomas Gleixner#define arch_write_lock_flags(p, f) arch_write_lock(p)
215e5931943d02bf751b1ec849c0d2ade23d76a8d41Thomas Gleixner
216e5931943d02bf751b1ec849c0d2ade23d76a8d41Thomas Gleixner#define arch_read_can_lock(rw)		(!((rw)->lock & 0x80000000UL))
217e5931943d02bf751b1ec849c0d2ade23d76a8d41Thomas Gleixner#define arch_write_can_lock(rw)	(!(rw)->lock)
218f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
2190199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixner#define arch_spin_relax(lock)	cpu_relax()
2200199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixner#define arch_read_relax(lock)	cpu_relax()
2210199c4e68d1f02894bdefe4b5d9e9ee4aedd8d62Thomas Gleixner#define arch_write_relax(lock)	cpu_relax()
222f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
223f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#endif /* !(__ASSEMBLY__) */
224f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg
225f5e706ad886b6a5eb59637830110b09ccebf01c5Sam Ravnborg#endif /* !(__SPARC64_SPINLOCK_H) */
226