Home | History | Annotate | Line # | Download | only in include
intr.h revision 1.16.26.3
      1  1.16.26.3      yamt /*	$NetBSD: intr.h,v 1.16.26.3 2007/09/03 14:26:04 yamt Exp $	*/
      2        1.1  takemura 
      3        1.1  takemura /*
      4        1.1  takemura  * Copyright (c) 1998 Jonathan Stone.  All rights reserved.
      5        1.1  takemura  *
      6        1.1  takemura  * Redistribution and use in source and binary forms, with or without
      7        1.1  takemura  * modification, are permitted provided that the following conditions
      8        1.1  takemura  * are met:
      9        1.1  takemura  * 1. Redistributions of source code must retain the above copyright
     10        1.1  takemura  *    notice, this list of conditions and the following disclaimer.
     11        1.1  takemura  * 2. Redistributions in binary form must reproduce the above copyright
     12        1.1  takemura  *    notice, this list of conditions and the following disclaimer in the
     13        1.1  takemura  *    documentation and/or other materials provided with the distribution.
     14        1.1  takemura  * 3. All advertising materials mentioning features or use of this software
     15        1.1  takemura  *    must display the following acknowledgement:
     16        1.1  takemura  *	This product includes software developed by Jonathan Stone for
     17        1.1  takemura  *      the NetBSD Project.
     18        1.1  takemura  * 4. The name of the author may not be used to endorse or promote products
     19        1.1  takemura  *    derived from this software without specific prior written permission.
     20        1.1  takemura  *
     21        1.1  takemura  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     22        1.1  takemura  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     23        1.1  takemura  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     24        1.1  takemura  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     25        1.1  takemura  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     26        1.1  takemura  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     27        1.1  takemura  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     28        1.1  takemura  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     29        1.1  takemura  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     30        1.1  takemura  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     31        1.1  takemura  */
     32        1.1  takemura 
     33        1.1  takemura #ifndef _HPCMIPS_INTR_H_
     34        1.1  takemura #define _HPCMIPS_INTR_H_
     35        1.1  takemura 
     36       1.11     enami #include <sys/device.h>
     37       1.11     enami #include <sys/lock.h>
     38       1.11     enami #include <sys/queue.h>
     39       1.11     enami 
     40        1.1  takemura #define	IPL_NONE	0	/* disable only this interrupt */
     41       1.11     enami #define	IPL_SOFT	1	/* generic software interrupts (SI 0) */
     42       1.11     enami #define	IPL_SOFTCLOCK	2	/* clock software interrupts (SI 0) */
     43       1.11     enami #define	IPL_SOFTNET	3	/* network software interrupts (SI 1) */
     44       1.11     enami #define	IPL_SOFTSERIAL	4	/* serial software interrupts (SI 1) */
     45       1.11     enami #define	IPL_BIO		5	/* disable block I/O interrupts */
     46       1.11     enami #define	IPL_NET		6	/* disable network interrupts */
     47       1.11     enami #define	IPL_TTY		7	/* disable terminal interrupts */
     48  1.16.26.1      yamt #define	IPL_LPT		IPL_TTY
     49  1.16.26.1      yamt #define	IPL_VM		IPL_TTY
     50       1.11     enami #define	IPL_SERIAL	7	/* disable serial hardware interrupts */
     51       1.11     enami #define	IPL_CLOCK	8	/* disable clock interrupts */
     52  1.16.26.1      yamt #define	IPL_STATCLOCK	IPL_CLOCK
     53  1.16.26.1      yamt #define	IPL_SCHED	IPL_CLOCK
     54        1.1  takemura #define	IPL_HIGH	8	/* disable all interrupts */
     55  1.16.26.1      yamt #define	IPL_LOCK	IPL_HIGH
     56        1.1  takemura 
     57       1.11     enami #define	_IPL_N		9
     58       1.11     enami 
     59       1.11     enami #define	_IPL_SI0_FIRST	IPL_SOFT
     60       1.11     enami #define	_IPL_SI0_LAST	IPL_SOFTCLOCK
     61       1.11     enami 
     62       1.11     enami #define	_IPL_SI1_FIRST	IPL_SOFTNET
     63       1.11     enami #define	_IPL_SI1_LAST	IPL_SOFTSERIAL
     64       1.11     enami 
     65  1.16.26.1      yamt #define	SI_SOFT		0
     66  1.16.26.1      yamt #define	SI_SOFTCLOCK	1
     67  1.16.26.1      yamt #define	SI_SOFTNET	2
     68  1.16.26.1      yamt #define	SI_SOFTSERIAL	3
     69  1.16.26.1      yamt 
     70  1.16.26.1      yamt #define	SI_NQUEUES	4
     71  1.16.26.1      yamt 
     72  1.16.26.1      yamt #define	SI_QUEUENAMES {							\
     73       1.11     enami 	"misc",								\
     74       1.11     enami 	"clock",							\
     75       1.11     enami 	"net",								\
     76       1.11     enami 	"serial",							\
     77       1.11     enami }
     78       1.11     enami 
     79        1.1  takemura /* Interrupt sharing types. */
     80       1.11     enami #define	IST_UNUSABLE	-1	/* interrupt cannot be used */
     81        1.1  takemura #define	IST_NONE	0	/* none */
     82        1.1  takemura #define	IST_PULSE	1	/* pulsed */
     83        1.1  takemura #define	IST_EDGE	2	/* edge-triggered */
     84        1.1  takemura #define	IST_LEVEL	3	/* level-triggered */
     85        1.1  takemura 
     86        1.1  takemura #ifdef _KERNEL
     87        1.1  takemura #ifndef _LOCORE
     88        1.1  takemura #include <mips/cpuregs.h>
     89  1.16.26.3      yamt #include <mips/locore.h>
     90        1.1  takemura 
     91       1.13       uch extern const u_int32_t *ipl_sr_bits;
     92  1.16.26.1      yamt extern const u_int32_t ipl_si_to_sr[SI_NQUEUES];
     93       1.11     enami 
     94       1.13       uch void	intr_init(void);
     95        1.1  takemura 
     96       1.13       uch #define	spl0()		(void) _spllower(0)
     97       1.13       uch #define	splx(s)		(void) _splset(s)
     98        1.1  takemura 
     99       1.13       uch #define	splsoft()	_splraise(ipl_sr_bits[IPL_SOFT])
    100        1.1  takemura 
    101  1.16.26.1      yamt typedef int ipl_t;
    102  1.16.26.1      yamt typedef struct {
    103  1.16.26.1      yamt 	ipl_t _sr;
    104  1.16.26.1      yamt } ipl_cookie_t;
    105  1.16.26.1      yamt 
    106  1.16.26.1      yamt static inline ipl_cookie_t
    107  1.16.26.1      yamt makeiplcookie(ipl_t ipl)
    108  1.16.26.1      yamt {
    109  1.16.26.1      yamt 
    110  1.16.26.1      yamt 	return (ipl_cookie_t){._sr = ipl_sr_bits[ipl]};
    111  1.16.26.1      yamt }
    112  1.16.26.1      yamt 
    113  1.16.26.1      yamt static inline int
    114  1.16.26.1      yamt splraiseipl(ipl_cookie_t icookie)
    115  1.16.26.1      yamt {
    116  1.16.26.1      yamt 
    117  1.16.26.1      yamt 	return _splraise(icookie._sr);
    118  1.16.26.1      yamt }
    119  1.16.26.1      yamt 
    120  1.16.26.1      yamt #include <sys/spl.h>
    121  1.16.26.1      yamt 
    122        1.5       uch /*
    123        1.5       uch  * software simulated interrupt
    124        1.5       uch  */
    125       1.11     enami #define	setsoft(x)							\
    126       1.11     enami do {									\
    127  1.16.26.1      yamt 	_setsoftintr(ipl_si_to_sr[(x)]);				\
    128       1.11     enami } while (0)
    129       1.11     enami 
    130       1.11     enami struct hpcmips_soft_intrhand {
    131       1.11     enami 	TAILQ_ENTRY(hpcmips_soft_intrhand)
    132       1.11     enami 		sih_q;
    133       1.11     enami 	struct hpcmips_soft_intr *sih_intrhead;
    134       1.11     enami 	void	(*sih_fn)(void *);
    135       1.11     enami 	void	*sih_arg;
    136       1.11     enami 	int	sih_pending;
    137       1.11     enami };
    138       1.11     enami 
    139       1.11     enami struct hpcmips_soft_intr {
    140       1.11     enami 	TAILQ_HEAD(, hpcmips_soft_intrhand)
    141       1.11     enami 		softintr_q;
    142       1.11     enami 	struct evcnt softintr_evcnt;
    143       1.11     enami 	struct simplelock softintr_slock;
    144  1.16.26.1      yamt 	unsigned long softintr_siq;
    145       1.11     enami };
    146        1.5       uch 
    147       1.13       uch void	softintr_init(void);
    148       1.15       uch void	softintr(u_int32_t);
    149       1.11     enami void	*softintr_establish(int, void (*)(void *), void *);
    150       1.11     enami void	softintr_disestablish(void *);
    151       1.11     enami void	softintr_dispatch(void);
    152       1.11     enami 
    153       1.11     enami #define	softintr_schedule(arg)						\
    154       1.11     enami do {									\
    155       1.11     enami 	struct hpcmips_soft_intrhand *__sih = (arg);			\
    156       1.11     enami 	struct hpcmips_soft_intr *__si = __sih->sih_intrhead;		\
    157       1.11     enami 	int __s;							\
    158       1.11     enami 									\
    159       1.11     enami 	__s = splhigh();						\
    160       1.11     enami 	simple_lock(&__si->softintr_slock);				\
    161       1.11     enami 	if (__sih->sih_pending == 0) {					\
    162       1.11     enami 		TAILQ_INSERT_TAIL(&__si->softintr_q, __sih, sih_q);	\
    163       1.11     enami 		__sih->sih_pending = 1;					\
    164  1.16.26.1      yamt 		setsoft(__si->softintr_siq);				\
    165       1.11     enami 	}								\
    166       1.11     enami 	simple_unlock(&__si->softintr_slock);				\
    167       1.11     enami 	splx(__s);							\
    168       1.11     enami } while (0)
    169        1.5       uch 
    170       1.11     enami /* XXX For legacy software interrupts. */
    171       1.11     enami extern struct hpcmips_soft_intrhand *softnet_intrhand;
    172        1.5       uch 
    173       1.11     enami #define	setsoftnet()	softintr_schedule(softnet_intrhand)
    174        1.1  takemura 
    175        1.1  takemura #endif /* !_LOCORE */
    176        1.1  takemura #endif /* _KERNEL */
    177        1.1  takemura 
    178        1.1  takemura #endif /* !_HPCMIPS_INTR_H_ */
    179