xref: /netbsd-src/sys/arch/alpha/include/intr.h (revision fdecd6a253f999ae92b139670d9e15cc9df4497c)
1 /* $NetBSD: intr.h,v 1.10 1997/07/07 20:37:34 cgd Exp $ */
2 
3 /*
4  * Copyright (c) 1997 Christopher G. Demetriou.  All rights reserved.
5  * Copyright (c) 1996 Carnegie-Mellon University.
6  * All rights reserved.
7  *
8  * Author: Chris G. Demetriou
9  *
10  * Permission to use, copy, modify and distribute this software and
11  * its documentation is hereby granted, provided that both the copyright
12  * notice and this permission notice appear in all copies of the
13  * software, derivative works or modified versions, and any portions
14  * thereof, and that both notices appear in supporting documentation.
15  *
16  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
17  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
18  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
19  *
20  * Carnegie Mellon requests users of this software to return to
21  *
22  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
23  *  School of Computer Science
24  *  Carnegie Mellon University
25  *  Pittsburgh PA 15213-3890
26  *
27  * any improvements or extensions that they make and grant Carnegie the
28  * rights to redistribute these changes.
29  */
30 
31 #ifndef _ALPHA_INTR_H_
32 #define _ALPHA_INTR_H_
33 
34 #include <sys/queue.h>
35 
36 #define	IPL_NONE	0	/* disable only this interrupt */
37 #define	IPL_BIO		1	/* disable block I/O interrupts */
38 #define	IPL_NET		2	/* disable network interrupts */
39 #define	IPL_TTY		3	/* disable terminal interrupts */
40 #define	IPL_CLOCK	4	/* disable clock interrupts */
41 #define	IPL_HIGH	5	/* disable all interrupts */
42 
43 #define	IST_UNUSABLE	-1	/* interrupt cannot be used */
44 #define	IST_NONE	0	/* none (dummy) */
45 #define	IST_PULSE	1	/* pulsed */
46 #define	IST_EDGE	2	/* edge-triggered */
47 #define	IST_LEVEL	3	/* level-triggered */
48 
49 /* IPL-lowering/restoring macros */
50 #define splx(s)								\
51     ((s) == ALPHA_PSL_IPL_0 ? spl0() : alpha_pal_swpipl(s))
52 #define splsoft()               alpha_pal_swpipl(ALPHA_PSL_IPL_SOFT)
53 #define splsoftclock()          splsoft()
54 #define splsoftnet()            splsoft()
55 
56 /* IPL-raising functions/macros */
57 static __inline int _splraise __P((int)) __attribute__ ((unused));
58 static __inline int
59 _splraise(s)
60 	int s;
61 {
62 	int cur = alpha_pal_rdps() & ALPHA_PSL_IPL_MASK;
63 	return (s > cur ? alpha_pal_swpipl(s) : cur);
64 }
65 #define splnet()                _splraise(ALPHA_PSL_IPL_IO)
66 #define splbio()                _splraise(ALPHA_PSL_IPL_IO)
67 #define splimp()                _splraise(ALPHA_PSL_IPL_IO)
68 #define spltty()                _splraise(ALPHA_PSL_IPL_IO)
69 #define splclock()              _splraise(ALPHA_PSL_IPL_CLOCK)
70 #define splstatclock()          _splraise(ALPHA_PSL_IPL_CLOCK)
71 #define splhigh()               _splraise(ALPHA_PSL_IPL_HIGH)
72 
73 /*
74  * simulated software interrupt register
75  */
76 extern u_int64_t ssir;
77 
78 #define	SIR_NET		0x1
79 #define	SIR_CLOCK	0x2
80 
81 #define	setsoftnet()	ssir |= SIR_NET
82 #define	setsoftclock()	ssir |= SIR_CLOCK
83 
84 /*
85  * Alpha shared-interrupt-line common code.
86  */
87 
88 struct alpha_shared_intrhand {
89 	TAILQ_ENTRY(alpha_shared_intrhand)
90 		ih_q;
91 	int	(*ih_fn) __P((void *));
92 	void	*ih_arg;
93 	int	ih_level;
94 };
95 
96 struct alpha_shared_intr {
97 	TAILQ_HEAD(,alpha_shared_intrhand)
98 		intr_q;
99 	int	intr_sharetype;
100 	int	intr_dfltsharetype;
101 	int	intr_nstrays;
102 	int	intr_maxstrays;
103 };
104 
105 struct alpha_shared_intr *alpha_shared_intr_alloc __P((unsigned int));
106 int	alpha_shared_intr_dispatch __P((struct alpha_shared_intr *,
107 	    unsigned int));
108 void	*alpha_shared_intr_establish __P((struct alpha_shared_intr *,
109 	    unsigned int, int, int, int (*)(void *), void *, const char *));
110 int	alpha_shared_intr_get_sharetype __P((struct alpha_shared_intr *,
111 	    unsigned int));
112 int	alpha_shared_intr_isactive __P((struct alpha_shared_intr *,
113 	    unsigned int));
114 void	alpha_shared_intr_set_dfltsharetype __P((struct alpha_shared_intr *,
115 	    unsigned int, int));
116 void	alpha_shared_intr_set_maxstrays __P((struct alpha_shared_intr *,
117 	    unsigned int, int));
118 void	alpha_shared_intr_stray __P((struct alpha_shared_intr *, unsigned int,
119 	    const char *));
120 
121 #endif
122