xref: /netbsd-src/sys/external/bsd/drm2/include/linux/spinlock.h (revision 946379e7b37692fc43f68eb0d1c10daa0a7f3b6c)
1 /*	$NetBSD: spinlock.h,v 1.6 2015/01/01 01:15:42 mrg Exp $	*/
2 
3 /*-
4  * Copyright (c) 2013 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Taylor R. Campbell.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #ifndef _LINUX_SPINLOCK_H_
33 #define _LINUX_SPINLOCK_H_
34 
35 #include <sys/cdefs.h>
36 #include <sys/mutex.h>
37 
38 #define	__acquires(lock)	/* XXX lockdep stuff */
39 #define	__releases(lock)	/* XXX lockdep stuff */
40 
41 typedef struct spinlock {
42 	kmutex_t sl_lock;
43 } spinlock_t;
44 
45 static inline int
46 spin_is_locked(spinlock_t *spinlock)
47 {
48 	return mutex_owned(&spinlock->sl_lock);
49 }
50 
51 static inline void
52 spin_lock(spinlock_t *spinlock)
53 {
54 	mutex_enter(&spinlock->sl_lock);
55 }
56 
57 static inline void
58 spin_unlock(spinlock_t *spinlock)
59 {
60 	mutex_exit(&spinlock->sl_lock);
61 }
62 
63 static inline void
64 spin_lock_irq(spinlock_t *spinlock)
65 {
66 	spin_lock(spinlock);
67 }
68 
69 static inline void
70 spin_unlock_irq(spinlock_t *spinlock)
71 {
72 	spin_unlock(spinlock);
73 }
74 
75 /* Must be a macro because the second argument is to be assigned.  */
76 #define	spin_lock_irqsave(SPINLOCK, FLAGS)				\
77 	do {								\
78 		(FLAGS) = 0;						\
79 		mutex_enter(&((spinlock_t *)(SPINLOCK))->sl_lock);	\
80 	} while (0)
81 
82 static inline void
83 spin_unlock_irqrestore(spinlock_t *spinlock, unsigned long __unused flags)
84 {
85 	mutex_exit(&spinlock->sl_lock);
86 }
87 
88 static inline void
89 spin_lock_init(spinlock_t *spinlock)
90 {
91 	/* XXX What's the right IPL?  IPL_DRM...?  */
92 	mutex_init(&spinlock->sl_lock, MUTEX_DEFAULT, IPL_VM);
93 }
94 
95 /*
96  * XXX Linux doesn't ever destroy spin locks, it seems.  We'll have to
97  * kludge it up.
98  */
99 
100 static inline void
101 spin_lock_destroy(spinlock_t *spinlock)
102 {
103 	mutex_destroy(&spinlock->sl_lock);
104 }
105 
106 /* This is a macro to make the panic message clearer.  */
107 #define	assert_spin_locked(spinlock)	\
108 	KASSERT(mutex_owned(&(spinlock)->sl_lock))
109 
110 /*
111  * Linux rwlocks are reader/writer spin locks.  We implement them as
112  * normal spin locks without reader/writer semantics for expedience.
113  * If that turns out to not work, adapting to reader/writer semantics
114  * shouldn't be too hard.
115  */
116 
117 #define	rwlock_t		spinlock_t
118 #define	rwlock_init		spin_lock_init
119 #define	rwlock_destroy		spin_lock_destroy
120 #define	write_lock_irq		spin_lock_irq
121 #define	write_unlock_irq	spin_unlock_irq
122 #define	read_lock		spin_lock
123 #define	read_unlock		spin_unlock
124 
125 #endif  /* _LINUX_SPINLOCK_H_ */
126