xref: /netbsd-src/sys/external/bsd/vchiq/dist/interface/compat/vchi_bsd.h (revision c28e63064c85baa5e9da3c47b437e79fed8e668e)
1d0c4f7d9Sjmcneill /*-
2d0c4f7d9Sjmcneill  * Copyright (c) 2010 Max Khon <fjoe@freebsd.org>
3d0c4f7d9Sjmcneill  * Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@bluezbox.com>
4d0c4f7d9Sjmcneill  * Copyright (c) 2013 Jared D. McNeill <jmcneill@invisible.ca>
5d0c4f7d9Sjmcneill  * All rights reserved.
6d0c4f7d9Sjmcneill  *
7d0c4f7d9Sjmcneill  * Redistribution and use in source and binary forms, with or without
8d0c4f7d9Sjmcneill  * modification, are permitted provided that the following conditions
9d0c4f7d9Sjmcneill  * are met:
10d0c4f7d9Sjmcneill  * 1. Redistributions of source code must retain the above copyright
11d0c4f7d9Sjmcneill  *    notice, this list of conditions and the following disclaimer.
12d0c4f7d9Sjmcneill  * 2. Redistributions in binary form must reproduce the above copyright
13d0c4f7d9Sjmcneill  *    notice, this list of conditions and the following disclaimer in the
14d0c4f7d9Sjmcneill  *    documentation and/or other materials provided with the distribution.
15d0c4f7d9Sjmcneill  *
16d0c4f7d9Sjmcneill  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17d0c4f7d9Sjmcneill  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18d0c4f7d9Sjmcneill  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19d0c4f7d9Sjmcneill  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20d0c4f7d9Sjmcneill  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21d0c4f7d9Sjmcneill  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22d0c4f7d9Sjmcneill  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23d0c4f7d9Sjmcneill  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24d0c4f7d9Sjmcneill  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25d0c4f7d9Sjmcneill  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26d0c4f7d9Sjmcneill  * SUCH DAMAGE.
27d0c4f7d9Sjmcneill  */
28d0c4f7d9Sjmcneill #ifndef __VCHI_NETBSD_H__
29d0c4f7d9Sjmcneill #define __VCHI_NETBSD_H__
30d0c4f7d9Sjmcneill 
31d0c4f7d9Sjmcneill #include <sys/systm.h>
32d0c4f7d9Sjmcneill #include <sys/param.h>
33d0c4f7d9Sjmcneill #include <sys/bus.h>
34d0c4f7d9Sjmcneill #include <sys/conf.h>
35d0c4f7d9Sjmcneill #include <sys/lock.h>
36d0c4f7d9Sjmcneill #include <sys/kernel.h>
37d0c4f7d9Sjmcneill #include <sys/kthread.h>
38d0c4f7d9Sjmcneill #include <sys/mutex.h>
39d0c4f7d9Sjmcneill #include <sys/malloc.h>
40d0c4f7d9Sjmcneill #include <sys/proc.h>
41d0c4f7d9Sjmcneill #include <sys/types.h>
42d0c4f7d9Sjmcneill #include <sys/ioccom.h>
43d0c4f7d9Sjmcneill #include <sys/atomic.h>
44d0c4f7d9Sjmcneill #include <sys/rwlock.h>
45d0c4f7d9Sjmcneill #include <sys/callout.h>
46d0c4f7d9Sjmcneill 
471099eb26Sskrll #include <linux/completion.h>
48*c28e6306Smartin #include <linux/types.h>
49bf05a4f1Smaya #include <asm/barrier.h>
501099eb26Sskrll 
51d0c4f7d9Sjmcneill /*
52d0c4f7d9Sjmcneill  * Copy from/to user API
53d0c4f7d9Sjmcneill  */
54d0c4f7d9Sjmcneill #define copy_from_user(to, from, n)	copyin((from), (to), (n))
55d0c4f7d9Sjmcneill #define copy_to_user(to, from, n)	copyout((from), (to), (n))
56d0c4f7d9Sjmcneill 
57d0c4f7d9Sjmcneill /*
58d0c4f7d9Sjmcneill  * Atomic API
59d0c4f7d9Sjmcneill  */
60d0c4f7d9Sjmcneill typedef volatile unsigned int atomic_t;
61d0c4f7d9Sjmcneill 
62d0c4f7d9Sjmcneill #define atomic_set(p, v)	(*(p) = (v))
63618a9dc6Sskrll #define atomic_read(p)		(*(volatile int *)(p))
64d0c4f7d9Sjmcneill #define atomic_inc(p)		atomic_inc_uint(p)
65d0c4f7d9Sjmcneill #define atomic_dec(p)		atomic_dec_uint(p)
66d0c4f7d9Sjmcneill #define atomic_dec_and_test(p)	(atomic_dec_uint_nv(p) == 0)
67d0c4f7d9Sjmcneill #define	atomic_inc_return(v)	atomic_inc_uint_nv(v)
68d0c4f7d9Sjmcneill #define	atomic_dec_return(v)	atomic_dec_uint_nv(v)
69d0c4f7d9Sjmcneill #define atomic_add(v, p)	atomic_add_int(p, v)
70d0c4f7d9Sjmcneill #define atomic_sub(v, p)	atomic_add_int(p, -(v))
71d0c4f7d9Sjmcneill #define atomic_add_return(v, p)	atomic_add_int_nv(p, v)
72d0c4f7d9Sjmcneill #define atomic_sub_return(v, p)	atomic_add_int_nv(p, -(v))
73d0c4f7d9Sjmcneill #define atomic_xchg(p, v)	atomic_swap_uint(p, v)
744aac15c9Sjmcneill #define atomic_cmpxchg(p, oldv, newv) atomic_cas_uint(p, oldv, newv)
75d0c4f7d9Sjmcneill 
76d0c4f7d9Sjmcneill #define ATOMIC_INIT(v)		(v)
77d0c4f7d9Sjmcneill 
78d0c4f7d9Sjmcneill /*
79d0c4f7d9Sjmcneill  * Spinlock API
80d0c4f7d9Sjmcneill  */
81d0c4f7d9Sjmcneill typedef kmutex_t spinlock_t;
82d0c4f7d9Sjmcneill 
83d0c4f7d9Sjmcneill /*
84d0c4f7d9Sjmcneill  * NB: Need to initialize these at attach time!
85d0c4f7d9Sjmcneill  */
86d0c4f7d9Sjmcneill #define DEFINE_SPINLOCK(name)	kmutex_t name
87d0c4f7d9Sjmcneill 
885fcdcb15Sskrll #define spin_lock_init(lock)	mutex_init(lock, MUTEX_DEFAULT, IPL_VM)
89d0c4f7d9Sjmcneill #define spin_lock_destroy(lock)	mutex_destroy(lock)
90d0c4f7d9Sjmcneill #define spin_lock(lock)		mutex_spin_enter(lock)
91d0c4f7d9Sjmcneill #define spin_unlock(lock)	mutex_spin_exit(lock)
92d0c4f7d9Sjmcneill 
93d0c4f7d9Sjmcneill /*
94d0c4f7d9Sjmcneill  * Mutex API
95d0c4f7d9Sjmcneill  */
96d0c4f7d9Sjmcneill struct mutex {
97d0c4f7d9Sjmcneill 	kmutex_t	mtx;
98d0c4f7d9Sjmcneill };
99d0c4f7d9Sjmcneill 
100d0c4f7d9Sjmcneill #define	lmutex_init(lock)	mutex_init(&(lock)->mtx, MUTEX_DEFAULT, IPL_NONE)
101d0c4f7d9Sjmcneill #define lmutex_destroy(lock)	mutex_destroy(&(lock)->mtx)
102d0c4f7d9Sjmcneill #define	lmutex_lock(lock)	mutex_enter(&(lock)->mtx)
103d0c4f7d9Sjmcneill #define	lmutex_lock_interruptible(lock)	(mutex_enter(&(lock)->mtx),0)
104d0c4f7d9Sjmcneill #define	lmutex_unlock(lock)	mutex_exit(&(lock)->mtx)
105d0c4f7d9Sjmcneill 
106d0c4f7d9Sjmcneill /*
107d0c4f7d9Sjmcneill  * Rwlock API
108d0c4f7d9Sjmcneill  */
109618a9dc6Sskrll typedef kmutex_t rwlock_t;
110d0c4f7d9Sjmcneill 
111618a9dc6Sskrll #define DEFINE_RWLOCK(name)	kmutex_t name
112d0c4f7d9Sjmcneill 
1135fcdcb15Sskrll #define rwlock_init(rwlock)	mutex_init(rwlock, MUTEX_DEFAULT, IPL_VM)
114618a9dc6Sskrll #define read_lock(rwlock)	mutex_spin_enter(rwlock)
115618a9dc6Sskrll #define read_unlock(rwlock)	mutex_spin_exit(rwlock)
116618a9dc6Sskrll 
117618a9dc6Sskrll #define write_lock(rwlock)	mutex_spin_enter(rwlock)
118618a9dc6Sskrll #define write_unlock(rwlock)	mutex_spin_exit(rwlock)
119d0c4f7d9Sjmcneill 
120d0c4f7d9Sjmcneill #define read_lock_bh(rwlock)	read_lock(rwlock)
121d0c4f7d9Sjmcneill #define read_unlock_bh(rwlock)	read_unlock(rwlock)
122d0c4f7d9Sjmcneill #define write_lock_bh(rwlock)	write_lock(rwlock)
123d0c4f7d9Sjmcneill #define write_unlock_bh(rwlock)	write_unlock(rwlock)
124d0c4f7d9Sjmcneill 
125d0c4f7d9Sjmcneill /*
126d0c4f7d9Sjmcneill  * Timer API
127d0c4f7d9Sjmcneill  */
128d0c4f7d9Sjmcneill struct timer_list {
129d0c4f7d9Sjmcneill 	kmutex_t mtx;
130d0c4f7d9Sjmcneill 	callout_t callout;
131d0c4f7d9Sjmcneill 
132d0c4f7d9Sjmcneill 	unsigned long expires;
133d0c4f7d9Sjmcneill 	void (*function)(unsigned long);
134d0c4f7d9Sjmcneill 	unsigned long data;
135d0c4f7d9Sjmcneill };
136d0c4f7d9Sjmcneill 
137d0c4f7d9Sjmcneill void init_timer(struct timer_list *t);
138d0c4f7d9Sjmcneill void setup_timer(struct timer_list *t, void (*function)(unsigned long), unsigned long data);
139d0c4f7d9Sjmcneill void mod_timer(struct timer_list *t, unsigned long expires);
140d0c4f7d9Sjmcneill void add_timer(struct timer_list *t);
141d0c4f7d9Sjmcneill int del_timer(struct timer_list *t);
142d0c4f7d9Sjmcneill int del_timer_sync(struct timer_list *t);
143d0c4f7d9Sjmcneill 
144d0c4f7d9Sjmcneill /*
145d0c4f7d9Sjmcneill  * Semaphore API
146d0c4f7d9Sjmcneill  */
147d0c4f7d9Sjmcneill struct semaphore {
148d0c4f7d9Sjmcneill 	kmutex_t	mtx;
149d0c4f7d9Sjmcneill 	kcondvar_t	cv;
150d0c4f7d9Sjmcneill 	int		value;
151d0c4f7d9Sjmcneill 	int		waiters;
152d0c4f7d9Sjmcneill };
153d0c4f7d9Sjmcneill 
154d0c4f7d9Sjmcneill /*
155d0c4f7d9Sjmcneill  * NB: Need to initialize these at attach time!
156d0c4f7d9Sjmcneill  */
157d0c4f7d9Sjmcneill #define	DEFINE_SEMAPHORE(name)	struct semaphore name
158d0c4f7d9Sjmcneill 
159d0c4f7d9Sjmcneill void sema_sysinit(void *arg);
160d0c4f7d9Sjmcneill void _sema_init(struct semaphore *s, int value);
161d0c4f7d9Sjmcneill void _sema_destroy(struct semaphore *s);
162d0c4f7d9Sjmcneill void down(struct semaphore *s);
163d0c4f7d9Sjmcneill int down_interruptible(struct semaphore *s);
164d0c4f7d9Sjmcneill int down_trylock(struct semaphore *s);
165d0c4f7d9Sjmcneill void up(struct semaphore *s);
166d0c4f7d9Sjmcneill 
167d0c4f7d9Sjmcneill /*
168d0c4f7d9Sjmcneill  * Logging and assertions API
169d0c4f7d9Sjmcneill  */
170d0c4f7d9Sjmcneill void rlprintf(int pps, const char *fmt, ...)
171d0c4f7d9Sjmcneill 	__printflike(2, 3);
172d0c4f7d9Sjmcneill 
173d0c4f7d9Sjmcneill void
174d0c4f7d9Sjmcneill device_rlprintf(int pps, device_t dev, const char *fmt, ...)
175d0c4f7d9Sjmcneill 	__printflike(3, 4);
176d0c4f7d9Sjmcneill 
177d0c4f7d9Sjmcneill #define vchiq_static_assert(cond) CTASSERT(cond)
178d0c4f7d9Sjmcneill 
179d0c4f7d9Sjmcneill /*
180d0c4f7d9Sjmcneill  * Kernel module API
181d0c4f7d9Sjmcneill  */
182d0c4f7d9Sjmcneill #define __init
183d0c4f7d9Sjmcneill #define __exit
184d0c4f7d9Sjmcneill #define __devinit
185d0c4f7d9Sjmcneill #define __devexit
186d0c4f7d9Sjmcneill #define __devinitdata
187d0c4f7d9Sjmcneill 
188d0c4f7d9Sjmcneill /*
189d0c4f7d9Sjmcneill  * Time API
190d0c4f7d9Sjmcneill  */
191d0c4f7d9Sjmcneill #if 1
192d0c4f7d9Sjmcneill /* emulate jiffies */
193ba5d403fSskrll static inline unsigned long
_jiffies(void)194ba5d403fSskrll _jiffies(void)
195d0c4f7d9Sjmcneill {
196d0c4f7d9Sjmcneill 	struct timeval tv;
197d0c4f7d9Sjmcneill 
198d0c4f7d9Sjmcneill 	microuptime(&tv);
199d0c4f7d9Sjmcneill 	return tvtohz(&tv);
200d0c4f7d9Sjmcneill }
201d0c4f7d9Sjmcneill 
202ba5d403fSskrll static inline unsigned long
msecs_to_jiffies(unsigned long msecs)203ba5d403fSskrll msecs_to_jiffies(unsigned long msecs)
204d0c4f7d9Sjmcneill {
205d0c4f7d9Sjmcneill 	struct timeval tv;
206d0c4f7d9Sjmcneill 
207d0c4f7d9Sjmcneill 	tv.tv_sec = msecs / 1000000UL;
208d0c4f7d9Sjmcneill 	tv.tv_usec = msecs % 1000000UL;
209d0c4f7d9Sjmcneill 	return tvtohz(&tv);
210d0c4f7d9Sjmcneill }
211d0c4f7d9Sjmcneill 
212d0c4f7d9Sjmcneill #define jiffies			_jiffies()
213d0c4f7d9Sjmcneill #else
214d0c4f7d9Sjmcneill #define jiffies			ticks
215d0c4f7d9Sjmcneill #endif
216d0c4f7d9Sjmcneill #define HZ			hz
217d0c4f7d9Sjmcneill 
218d0c4f7d9Sjmcneill #define udelay(usec)		DELAY(usec)
219d0c4f7d9Sjmcneill #define mdelay(msec)		DELAY((msec) * 1000)
220d0c4f7d9Sjmcneill 
221d0c4f7d9Sjmcneill #define schedule_timeout(jiff)	kpause("dhdslp", false, jiff, NULL)
222d0c4f7d9Sjmcneill 
223d0c4f7d9Sjmcneill #if defined(msleep)
224d0c4f7d9Sjmcneill #undef msleep
225d0c4f7d9Sjmcneill #endif
226d0c4f7d9Sjmcneill #define msleep(msec)		mdelay(msec)
227d0c4f7d9Sjmcneill 
228d0c4f7d9Sjmcneill #define time_after(a, b)	((a) > (b))
229d0c4f7d9Sjmcneill #define time_after_eq(a, b)	((a) >= (b))
230d0c4f7d9Sjmcneill #define time_before(a, b)	time_after((b), (a))
231d0c4f7d9Sjmcneill 
232d0c4f7d9Sjmcneill /*
233618a9dc6Sskrll  * kthread API (we use lwp)
234d0c4f7d9Sjmcneill  */
235d0c4f7d9Sjmcneill typedef lwp_t * VCHIQ_THREAD_T;
236d0c4f7d9Sjmcneill 
237d0c4f7d9Sjmcneill VCHIQ_THREAD_T vchiq_thread_create(int (*threadfn)(void *data),
238d0c4f7d9Sjmcneill                                    void *data,
239d0c4f7d9Sjmcneill                                    const char namefmt[], ...);
240d0c4f7d9Sjmcneill void set_user_nice(VCHIQ_THREAD_T p, int nice);
241d0c4f7d9Sjmcneill void wake_up_process(VCHIQ_THREAD_T p);
242d0c4f7d9Sjmcneill 
243d0c4f7d9Sjmcneill /*
244d0c4f7d9Sjmcneill  * Proc APIs
245d0c4f7d9Sjmcneill  */
246d0c4f7d9Sjmcneill void flush_signals(VCHIQ_THREAD_T);
247d0c4f7d9Sjmcneill int fatal_signal_pending(VCHIQ_THREAD_T);
248d0c4f7d9Sjmcneill 
249d0c4f7d9Sjmcneill /*
250d0c4f7d9Sjmcneill  * Misc API
251d0c4f7d9Sjmcneill  */
252d0c4f7d9Sjmcneill 
253d0c4f7d9Sjmcneill #define __user
254d0c4f7d9Sjmcneill 
255d0c4f7d9Sjmcneill #define	current			curlwp
256d0c4f7d9Sjmcneill #define PAGE_ALIGN(addr)	round_page(addr)
257d0c4f7d9Sjmcneill 
258d0c4f7d9Sjmcneill typedef	void	irqreturn_t;
259d0c4f7d9Sjmcneill 
260d0c4f7d9Sjmcneill #define BCM2835_MBOX_CHAN_VCHIQ	3
261d0c4f7d9Sjmcneill #define bcm_mbox_write	bcmmbox_write
262d0c4f7d9Sjmcneill 
263d0c4f7d9Sjmcneill #define device_print_prettyname(dev)	device_printf((dev), "")
264d0c4f7d9Sjmcneill 
265d0c4f7d9Sjmcneill #endif /* __VCHI_NETBSD_H__ */
266