intr.h revision 1.17
1/* $NetBSD: intr.h,v 1.17 1998/09/25 22:06:33 thorpej 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#define	IPL_SERIAL	6	/* disable serial interrupts */
43
44#define	IST_UNUSABLE	-1	/* interrupt cannot be used */
45#define	IST_NONE	0	/* none (dummy) */
46#define	IST_PULSE	1	/* pulsed */
47#define	IST_EDGE	2	/* edge-triggered */
48#define	IST_LEVEL	3	/* level-triggered */
49
50#ifdef	_KERNEL
51
52/* IPL-lowering/restoring macros */
53#define splx(s)								\
54    ((s) == ALPHA_PSL_IPL_0 ? spl0() : alpha_pal_swpipl(s))
55#define splsoft()               alpha_pal_swpipl(ALPHA_PSL_IPL_SOFT)
56#define splsoftserial()		splsoft()
57#define splsoftclock()		splsoft()
58#define splsoftnet()		splsoft()
59
60/* IPL-raising functions/macros */
61static __inline int _splraise __P((int)) __attribute__ ((unused));
62static __inline int
63_splraise(s)
64	int s;
65{
66	int cur = alpha_pal_rdps() & ALPHA_PSL_IPL_MASK;
67	return (s > cur ? alpha_pal_swpipl(s) : cur);
68}
69#define splnet()                _splraise(ALPHA_PSL_IPL_IO)
70#define splbio()                _splraise(ALPHA_PSL_IPL_IO)
71#define splimp()                _splraise(ALPHA_PSL_IPL_IO)
72#define spltty()                _splraise(ALPHA_PSL_IPL_IO)
73#define splserial()             _splraise(ALPHA_PSL_IPL_IO)
74#define splclock()              _splraise(ALPHA_PSL_IPL_CLOCK)
75#define splstatclock()          _splraise(ALPHA_PSL_IPL_CLOCK)
76#define splhigh()               _splraise(ALPHA_PSL_IPL_HIGH)
77
78#define spllpt()		spltty()
79
80/*
81 * simulated software interrupt register
82 */
83extern u_int64_t ssir;
84
85#define	SIR_NET		0x1
86#define	SIR_CLOCK	0x2
87#define	SIR_SERIAL	0x4
88
89#define	setsoftnet()	ssir |= SIR_NET
90#define	setsoftclock()	ssir |= SIR_CLOCK
91#define	setsoftserial()	ssir |= SIR_SERIAL
92
93/*
94 * Alpha shared-interrupt-line common code.
95 */
96
97struct alpha_shared_intrhand {
98	TAILQ_ENTRY(alpha_shared_intrhand)
99		ih_q;
100	int	(*ih_fn) __P((void *));
101	void	*ih_arg;
102	int	ih_level;
103	unsigned int ih_num;
104};
105
106struct alpha_shared_intr {
107	TAILQ_HEAD(,alpha_shared_intrhand)
108		intr_q;
109	int	intr_sharetype;
110	int	intr_dfltsharetype;
111	int	intr_nstrays;
112	int	intr_maxstrays;
113};
114
115#define	ALPHA_SHARED_INTR_DISABLE(asi, num)				\
116	((asi)[num].intr_maxstrays != 0 &&				\
117	 (asi)[num].intr_nstrays == (asi)[num].intr_maxstrays)
118
119struct alpha_shared_intr *alpha_shared_intr_alloc __P((unsigned int));
120int	alpha_shared_intr_dispatch __P((struct alpha_shared_intr *,
121	    unsigned int));
122void	*alpha_shared_intr_establish __P((struct alpha_shared_intr *,
123	    unsigned int, int, int, int (*)(void *), void *, const char *));
124void	alpha_shared_intr_disestablish __P((struct alpha_shared_intr *,
125	    void *, const char *));
126int	alpha_shared_intr_get_sharetype __P((struct alpha_shared_intr *,
127	    unsigned int));
128int	alpha_shared_intr_isactive __P((struct alpha_shared_intr *,
129	    unsigned int));
130void	alpha_shared_intr_set_dfltsharetype __P((struct alpha_shared_intr *,
131	    unsigned int, int));
132void	alpha_shared_intr_set_maxstrays __P((struct alpha_shared_intr *,
133	    unsigned int, int));
134void	alpha_shared_intr_stray __P((struct alpha_shared_intr *, unsigned int,
135	    const char *));
136
137#endif /* _KERNEL */
138#endif /* ! _ALPHA_INTR_H_ */
139