xref: /netbsd-src/sys/arch/evbarm/include/intr.h (revision 8a8f936f250a330d54f8a24ed0e92aadf9743a7b)
1 /* 	$NetBSD: intr.h,v 1.2 2001/09/05 17:00:20 matt Exp $	*/
2 
3 /*
4  * Copyright (c) 1997 Mark Brinicombe.
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  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *	This product includes software developed by Mark Brinicombe
18  *	for the NetBSD Project.
19  * 4. The name of the company nor the name of the author may be used to
20  *    endorse or promote products derived from this software without specific
21  *    prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
24  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26  * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  */
35 
36 #ifndef _EVBARM_INTR_H_
37 #define _EVBARM_INTR_H_
38 
39 /* Define the various Interrupt Priority Levels */
40 
41 /* Interrupt Priority Levels are mutually exclusive. */
42 
43 #define	IPL_NONE	0	/* no interrupts blocked */
44 #define	IPL_SOFT	1	/* generic soft interrupts */
45 #define	IPL_SOFTCLOCK	2	/* clock soft interrupts */
46 #define	IPL_SOFTNET	3	/* network soft interrupts */
47 #define	IPL_SOFTSERIAL	4	/* serial soft interrupts */
48 #define IPL_BIO		5	/* block I/O */
49 #define IPL_NET		6	/* network */
50 #define IPL_TTY		7	/* terminal */
51 #define IPL_IMP		8	/* memory allocation */
52 #define IPL_AUDIO	9	/* audio */
53 #define IPL_CLOCK	10	/* clock */
54 #define IPL_SERIAL	11	/* serial */
55 #define IPL_PERF	12	/* peformance monitoring unit */
56 #define IPL_HIGH	13	/* blocks all interrupts */
57 
58 #define IPL_LEVELS	14
59 
60 #define	IST_UNUSABLE	-1	/* interrupt cannot be used */
61 #define	IST_NONE	0	/* none (dummy) */
62 #define	IST_PULSE	1	/* pulsed */
63 #define	IST_EDGE	2	/* edge-triggered */
64 #define	IST_LEVEL	3	/* level-triggered */
65 
66 #if defined (_KERNEL) && !defined(_LOCORE)
67 #include <sys/queue.h>
68 #include <sys/device.h>
69 
70 extern int _splraise(int);
71 extern int _spllower(int);
72 extern int _splget(int);
73 extern int _splset(int);
74 extern int _splnone(void);
75 extern void _softintrset(int);
76 extern int _softintrclr(int);
77 
78 #define	splsoftclock()		_splraise(IPL_SOFTCLOCK)
79 #define	splsoftnet()		_splraise(IPL_SOFTNET)
80 #define	splsoftserial()		_splraise(IPL_SOFTSERIAL)
81 #define	splbio()		_splraise(IPL_BIO)
82 #define	splnet()		_splraise(IPL_NET)
83 #define	spltty()		_splraise(IPL_TTY)
84 #define	splvm()			_splraise(IPL_IMP)
85 #define	splaudio()		_splraise(IPL_AUDIO)
86 #define	splclock()		_splraise(IPL_CLOCK)
87 #define	splserial()		_splraise(IPL_SERIAL)
88 #define	splhigh()		_splraise(IPL_HIGH)
89 #define	spl0()			(void) _splnone()
90 #define	splx(s)			(void) _splset(s)
91 
92 #define	spllock()		splhigh()
93 #define	splsched()		splclock()
94 #define	splstatclock()		splclock()
95 
96 #define	spllowersoftclock()	_spllower(IPL_SOFTCLOCK)
97 
98 #define	setsoftclock()		_softintrset(IPL_SOFTCLOCK)
99 #define	setsoftnet()		_softintrset(IPL_SOFTNET)
100 #define	setsoftserial()		_softintrset(IPL_SOFTSERIAL)
101 
102 #define	_SPL_0			IPL_NONE
103 
104 struct intrsource {
105 	void *is_cookie;
106 	LIST_ENTRY(evbarm_intrsource) is_link;
107 	void *(*is_establish)(void *, int, int, int (*)(void *), void *);
108 	void (*is_disestablish)(void *, void *);
109 
110 	void (*is_setmask)(int);
111 };
112 
113 #define	intr_establish(src, irq, type, func, arg) \
114 	(((src)->is_establish)((src)->is_cookie, irq, type, func, arg))
115 #define	intr_disestablish(src, ih) \
116 	(((src)->is_disestablish)((src)->is_cookie, ih))
117 
118 struct irqhandler {
119 	LIST_ENTRY(intrhandler) ih_ipllink;
120 	LIST_ENTRY(intrhandler) ih_srclink;
121 	int (*ih_func)(void *);
122 	void *ih_arg;
123 	int ih_flags;
124 	int ih_ipl;
125 	struct evcnt ih_ev;
126 };
127 
128 struct fiqhandler {
129 	void (*fh_func)(void);	/* handler function */
130 	size_t fh_size;		/* Size of handler function */
131 	register_t fh_r8;	/* FIQ mode r8 */
132 	register_t fh_r9;	/* FIQ mode r9 */
133 	register_t fh_r10;	/* FIQ mode r10 */
134 	register_t fh_r11;	/* FIQ mode r11 */
135 	register_t fh_r12;	/* FIQ mode r12 */
136 	register_t fh_r13;	/* FIQ mode r13 */
137 };
138 
139 #endif	/* _KERNEL */
140 
141 #endif	/* _EVBARM_INTR_H */
142