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