[BACK]Return to vchi_bsd.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / external / bsd / vchiq / dist / interface / compat

Annotation of src/sys/external/bsd/vchiq/dist/interface/compat/vchi_bsd.h, Revision 1.9.2.1

1.1       jmcneill    1: /*-
                      2:  * Copyright (c) 2010 Max Khon <fjoe@freebsd.org>
                      3:  * Copyright (c) 2012 Oleksandr Tymoshenko <gonzo@bluezbox.com>
                      4:  * Copyright (c) 2013 Jared D. McNeill <jmcneill@invisible.ca>
                      5:  * All rights reserved.
                      6:  *
                      7:  * Redistribution and use in source and binary forms, with or without
                      8:  * modification, are permitted provided that the following conditions
                      9:  * are met:
                     10:  * 1. Redistributions of source code must retain the above copyright
                     11:  *    notice, this list of conditions and the following disclaimer.
                     12:  * 2. Redistributions in binary form must reproduce the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer in the
                     14:  *    documentation and/or other materials provided with the distribution.
                     15:  *
                     16:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
                     17:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
                     18:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
                     19:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
                     20:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     21:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     22:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     23:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     24:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     25:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     26:  * SUCH DAMAGE.
                     27:  */
                     28: #ifndef __VCHI_NETBSD_H__
                     29: #define __VCHI_NETBSD_H__
                     30:
                     31: #include <sys/systm.h>
                     32: #include <sys/param.h>
                     33: #include <sys/bus.h>
                     34: #include <sys/conf.h>
                     35: #include <sys/lock.h>
                     36: #include <sys/kernel.h>
                     37: #include <sys/kthread.h>
                     38: #include <sys/mutex.h>
                     39: #include <sys/malloc.h>
                     40: #include <sys/proc.h>
                     41: #include <sys/types.h>
                     42: #include <sys/ioccom.h>
                     43: #include <sys/atomic.h>
                     44: #include <sys/rwlock.h>
                     45: #include <sys/callout.h>
                     46:
1.7       skrll      47: #include <linux/completion.h>
                     48:
1.1       jmcneill   49: /*
                     50:  * Copy from/to user API
                     51:  */
                     52: #define copy_from_user(to, from, n)    copyin((from), (to), (n))
                     53: #define copy_to_user(to, from, n)      copyout((from), (to), (n))
                     54:
                     55: /*
                     56:  * Atomic API
                     57:  */
                     58: typedef volatile unsigned int atomic_t;
                     59:
                     60: #define atomic_set(p, v)       (*(p) = (v))
1.3       skrll      61: #define atomic_read(p)         (*(volatile int *)(p))
1.1       jmcneill   62: #define atomic_inc(p)          atomic_inc_uint(p)
                     63: #define atomic_dec(p)          atomic_dec_uint(p)
                     64: #define atomic_dec_and_test(p) (atomic_dec_uint_nv(p) == 0)
                     65: #define        atomic_inc_return(v)    atomic_inc_uint_nv(v)
                     66: #define        atomic_dec_return(v)    atomic_dec_uint_nv(v)
                     67: #define atomic_add(v, p)       atomic_add_int(p, v)
                     68: #define atomic_sub(v, p)       atomic_add_int(p, -(v))
                     69: #define atomic_add_return(v, p)        atomic_add_int_nv(p, v)
                     70: #define atomic_sub_return(v, p)        atomic_add_int_nv(p, -(v))
                     71: #define atomic_xchg(p, v)      atomic_swap_uint(p, v)
1.2       jmcneill   72: #define atomic_cmpxchg(p, oldv, newv) atomic_cas_uint(p, oldv, newv)
1.1       jmcneill   73:
                     74: #define ATOMIC_INIT(v)         (v)
                     75:
                     76: /*
                     77:  * Spinlock API
                     78:  */
                     79: typedef kmutex_t spinlock_t;
                     80:
                     81: /*
                     82:  * NB: Need to initialize these at attach time!
                     83:  */
                     84: #define DEFINE_SPINLOCK(name)  kmutex_t name
                     85:
1.8       jmcneill   86: #define spin_lock_init(lock)   mutex_init(lock, MUTEX_DEFAULT, IPL_SCHED)
1.1       jmcneill   87: #define spin_lock_destroy(lock)        mutex_destroy(lock)
                     88: #define spin_lock(lock)                mutex_spin_enter(lock)
                     89: #define spin_unlock(lock)      mutex_spin_exit(lock)
                     90:
                     91: /*
                     92:  * Mutex API
                     93:  */
                     94: struct mutex {
                     95:        kmutex_t        mtx;
                     96: };
                     97:
                     98: #define        lmutex_init(lock)       mutex_init(&(lock)->mtx, MUTEX_DEFAULT, IPL_NONE)
                     99: #define lmutex_destroy(lock)   mutex_destroy(&(lock)->mtx)
                    100: #define        lmutex_lock(lock)       mutex_enter(&(lock)->mtx)
                    101: #define        lmutex_lock_interruptible(lock) (mutex_enter(&(lock)->mtx),0)
                    102: #define        lmutex_unlock(lock)     mutex_exit(&(lock)->mtx)
                    103:
                    104: /*
                    105:  * Rwlock API
                    106:  */
1.3       skrll     107: typedef kmutex_t rwlock_t;
                    108:
                    109: #define DEFINE_RWLOCK(name)    kmutex_t name
1.1       jmcneill  110:
1.8       jmcneill  111: #define rwlock_init(rwlock)    mutex_init(rwlock, MUTEX_DEFAULT, IPL_SCHED)
1.3       skrll     112: #define read_lock(rwlock)      mutex_spin_enter(rwlock)
                    113: #define read_unlock(rwlock)    mutex_spin_exit(rwlock)
                    114:
                    115: #define write_lock(rwlock)     mutex_spin_enter(rwlock)
                    116: #define write_unlock(rwlock)   mutex_spin_exit(rwlock)
1.1       jmcneill  117:
                    118: #define read_lock_bh(rwlock)   read_lock(rwlock)
                    119: #define read_unlock_bh(rwlock) read_unlock(rwlock)
                    120: #define write_lock_bh(rwlock)  write_lock(rwlock)
                    121: #define write_unlock_bh(rwlock)        write_unlock(rwlock)
                    122:
                    123: /*
                    124:  * Timer API
                    125:  */
                    126: struct timer_list {
                    127:        kmutex_t mtx;
                    128:        callout_t callout;
                    129:
                    130:        unsigned long expires;
                    131:        void (*function)(unsigned long);
                    132:        unsigned long data;
                    133: };
                    134:
                    135: void init_timer(struct timer_list *t);
                    136: void setup_timer(struct timer_list *t, void (*function)(unsigned long), unsigned long data);
                    137: void mod_timer(struct timer_list *t, unsigned long expires);
                    138: void add_timer(struct timer_list *t);
                    139: int del_timer(struct timer_list *t);
                    140: int del_timer_sync(struct timer_list *t);
                    141:
                    142: /*
                    143:  * Semaphore API
                    144:  */
                    145: struct semaphore {
                    146:        kmutex_t        mtx;
                    147:        kcondvar_t      cv;
                    148:        int             value;
                    149:        int             waiters;
                    150: };
                    151:
                    152: /*
                    153:  * NB: Need to initialize these at attach time!
                    154:  */
                    155: #define        DEFINE_SEMAPHORE(name)  struct semaphore name
                    156:
                    157: void sema_sysinit(void *arg);
                    158: void _sema_init(struct semaphore *s, int value);
                    159: void _sema_destroy(struct semaphore *s);
                    160: void down(struct semaphore *s);
                    161: int down_interruptible(struct semaphore *s);
                    162: int down_trylock(struct semaphore *s);
                    163: void up(struct semaphore *s);
                    164:
                    165: /*
                    166:  * Logging and assertions API
                    167:  */
                    168: void rlprintf(int pps, const char *fmt, ...)
                    169:        __printflike(2, 3);
                    170:
                    171: void
                    172: device_rlprintf(int pps, device_t dev, const char *fmt, ...)
                    173:        __printflike(3, 4);
                    174:
                    175: #define might_sleep()
                    176:
                    177: #define WARN(condition, msg)                           \
                    178: ({                                                     \
                    179:        int __ret_warn_on = !!(condition);              \
                    180:        if (unlikely(__ret_warn_on))                    \
                    181:                printf((msg));                          \
                    182:        unlikely(__ret_warn_on);                        \
                    183: })
                    184:
                    185:
                    186:
                    187: #define WARN_ON(condition)                             \
                    188: ({                                                     \
                    189:        int __ret_warn_on = !!(condition);              \
                    190:        if (unlikely(__ret_warn_on))                    \
                    191:                printf("WARN_ON: " #condition "\n");    \
                    192:        unlikely(__ret_warn_on);                        \
                    193: })
                    194:
                    195: #define WARN_ON_ONCE(condition) ({                     \
                    196:        static int __warned;                            \
                    197:        int __ret_warn_once = !!(condition);            \
                    198:                                                        \
                    199:        if (unlikely(__ret_warn_once))                  \
                    200:                if (WARN_ON(!__warned))                 \
                    201:                        __warned = 1;                   \
                    202:        unlikely(__ret_warn_once);                      \
                    203: })
                    204:
                    205: #define BUG_ON(cond)                                   \
                    206:        do {                                            \
                    207:                if (cond)                               \
                    208:                        panic("BUG_ON: " #cond);        \
                    209:        } while (0)
                    210:
                    211: #define BUG()                                          \
                    212:        do {                                            \
                    213:                panic("BUG: %s:%d", __FILE__, __LINE__);        \
                    214:        } while (0)
                    215:
                    216: #define vchiq_static_assert(cond) CTASSERT(cond)
                    217:
                    218: #define KERN_EMERG     "<0>"   /* system is unusable                   */
                    219: #define KERN_ALERT     "<1>"   /* action must be taken immediately     */
                    220: #define KERN_CRIT      "<2>"   /* critical conditions                  */
                    221: #define KERN_ERR       "<3>"   /* error conditions                     */
                    222: #define KERN_WARNING   "<4>"   /* warning conditions                   */
                    223: #define KERN_NOTICE    "<5>"   /* normal but significant condition     */
                    224: #define KERN_INFO      "<6>"   /* informational                        */
                    225: #define KERN_DEBUG     "<7>"   /* debug-level messages                 */
                    226: #define KERN_CONT      ""
                    227:
                    228: #define printk(fmt, args...)           printf(fmt, ##args)
                    229: #define vprintk(fmt, args)             vprintf(fmt, args)
                    230:
                    231: /*
                    232:  * Malloc API
                    233:  */
                    234: #define GFP_KERNEL     0
                    235: #define GFP_ATOMIC     0
                    236:
                    237: MALLOC_DECLARE(M_VCHI);
                    238:
                    239: #define kmalloc(size, flags)   malloc((size), M_VCHI, M_NOWAIT | M_ZERO)
                    240: #define kcalloc(n, size, flags)        malloc((n) * (size), M_VCHI, M_NOWAIT | M_ZERO)
                    241: #define kzalloc(a, b)          kcalloc(1, (a), (b))
                    242: #define kfree(p)               do { if (p) free(p, M_VCHI); } while (0)
                    243:
                    244: /*
                    245:  * Kernel module API
                    246:  */
                    247: #define __init
                    248: #define __exit
                    249: #define __devinit
                    250: #define __devexit
                    251: #define __devinitdata
                    252:
                    253: /*
                    254:  * Time API
                    255:  */
                    256: #if 1
                    257: /* emulate jiffies */
1.5       skrll     258: static inline unsigned long
                    259: _jiffies(void)
1.1       jmcneill  260: {
                    261:        struct timeval tv;
                    262:
                    263:        microuptime(&tv);
                    264:        return tvtohz(&tv);
                    265: }
                    266:
1.5       skrll     267: static inline unsigned long
                    268: msecs_to_jiffies(unsigned long msecs)
1.1       jmcneill  269: {
                    270:        struct timeval tv;
                    271:
                    272:        tv.tv_sec = msecs / 1000000UL;
                    273:        tv.tv_usec = msecs % 1000000UL;
                    274:        return tvtohz(&tv);
                    275: }
                    276:
                    277: #define jiffies                        _jiffies()
                    278: #else
                    279: #define jiffies                        ticks
                    280: #endif
                    281: #define HZ                     hz
                    282:
                    283: #define udelay(usec)           DELAY(usec)
                    284: #define mdelay(msec)           DELAY((msec) * 1000)
                    285:
                    286: #define schedule_timeout(jiff) kpause("dhdslp", false, jiff, NULL)
                    287:
                    288: #if defined(msleep)
                    289: #undef msleep
                    290: #endif
                    291: #define msleep(msec)           mdelay(msec)
                    292:
                    293: #define time_after(a, b)       ((a) > (b))
                    294: #define time_after_eq(a, b)    ((a) >= (b))
                    295: #define time_before(a, b)      time_after((b), (a))
                    296:
                    297: /*
1.3       skrll     298:  * kthread API (we use lwp)
1.1       jmcneill  299:  */
                    300: typedef lwp_t * VCHIQ_THREAD_T;
                    301:
                    302: VCHIQ_THREAD_T vchiq_thread_create(int (*threadfn)(void *data),
                    303:                                    void *data,
                    304:                                    const char namefmt[], ...);
                    305: void set_user_nice(VCHIQ_THREAD_T p, int nice);
                    306: void wake_up_process(VCHIQ_THREAD_T p);
                    307:
                    308: /*
                    309:  * Proc APIs
                    310:  */
                    311: void flush_signals(VCHIQ_THREAD_T);
                    312: int fatal_signal_pending(VCHIQ_THREAD_T);
                    313:
                    314: /*
                    315:  * Misc API
                    316:  */
                    317:
                    318: #define __user
                    319:
                    320: #define        current                 curlwp
                    321: #define EXPORT_SYMBOL(x)
                    322: #define PAGE_ALIGN(addr)       round_page(addr)
                    323:
                    324: typedef        void    irqreturn_t;
                    325: typedef        off_t   loff_t;
                    326:
                    327: #define BCM2835_MBOX_CHAN_VCHIQ        3
                    328: #define bcm_mbox_write bcmmbox_write
                    329:
1.9.2.1 ! skrll     330: #define mb      membar_sync
        !           331: #define wmb     membar_producer
        !           332: #define rmb     membar_consumer
1.1       jmcneill  333: #define dsb    membar_producer
                    334:
1.9.2.1 ! skrll     335: #ifdef MULTIPROCESSOR
        !           336: #  define       smp_mb                          mb
        !           337: #  define       smp_wmb                         wmb
        !           338: #  define       smp_rmb                         rmb
        !           339: #else
        !           340: #  define       smp_mb()                        do {} while (0)
        !           341: #  define       smp_wmb()                       do {} while (0)
        !           342: #  define       smp_rmb()                       do {} while (0)
        !           343: #endif
1.6       skrll     344:
1.1       jmcneill  345: #define device_print_prettyname(dev)   device_printf((dev), "")
                    346:
                    347: #endif /* __VCHI_NETBSD_H__ */

CVSweb <webmaster@jp.NetBSD.org>