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