intr.h revision 1.13
1/* 	$NetBSD: intr.h,v 1.13 2010/04/17 13:36:21 nonaka 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 _HPCARM_INTR_H_
37#define _HPCARM_INTR_H_
38
39#ifdef _KERNEL
40
41#ifdef __HAVE_FAST_SOFTINTS
42#define IPL_NONE	0
43#define IPL_SOFTCLOCK	1
44#define IPL_SOFTBIO	2
45#define IPL_SOFTNET	3
46#define IPL_SOFTSERIAL	4
47#define IPL_VM		5
48#define IPL_SCHED	6
49#define IPL_HIGH	7
50
51#define NIPL		8
52#else
53#define IPL_NONE	0
54#define IPL_SOFTCLOCK	IPL_NONE
55#define IPL_SOFTBIO	IPL_NONE
56#define IPL_SOFTNET	IPL_NONE
57#define IPL_SOFTSERIAL	IPL_NONE
58#define IPL_VM		1
59#define IPL_SCHED	2
60#define IPL_HIGH	3
61
62#define NIPL		4
63#endif
64
65#define	IST_UNUSABLE	-1	/* interrupt cannot be used */
66#define	IST_NONE	0	/* none (dummy) */
67#define	IST_PULSE	1	/* pulsed */
68#define	IST_EDGE	2	/* edge-triggered */
69#define	IST_LEVEL	3	/* level-triggered */
70
71#define	IST_LEVEL_LOW	IST_LEVEL
72#define	IST_LEVEL_HIGH	4
73#define	IST_EDGE_FALLING IST_EDGE
74#define	IST_EDGE_RISING	5
75#define	IST_EDGE_BOTH	6
76
77#ifdef __OLD_INTERRUPT_CODE	/* XXX XXX XXX */
78
79#include <machine/irqhandler.h>
80#include <arm/arm32/psl.h>
81
82#else	/* !__OLD_INTERRUPT_CODE */
83
84#define	__NEWINTR	/* enables new hooks in cpu_fork()/cpu_switch() */
85
86#ifndef _LOCORE
87
88#include <sys/device.h>
89#include <sys/queue.h>
90
91#if defined(_LKM)
92
93int	_splraise(int);
94int	_spllower(int);
95void	splx(int);
96void	_setsoftintr(int);
97
98#else	/* _LKM */
99
100#include "opt_arm_intr_impl.h"
101
102#if defined(ARM_INTR_IMPL)
103
104/*
105 * Each board needs to define the following functions:
106 *
107 * int	_splraise(int);
108 * int	_spllower(int);
109 * void	splx(int);
110 * void	_setsoftintr(int);
111 *
112 * These may be defined as functions, static inline functions, or macros,
113 * but there must be a _spllower() and splx() defined as functions callable
114 * from assembly language (for cpu_switch()).  However, since it's quite
115 * useful to be able to inline splx(), you could do something like the
116 * following:
117 *
118 * in <boardtype>_intr.h:
119 * 	static inline int
120 *	boardtype_splx(int spl)
121 *	{...}
122 *
123 *	#define splx(nspl)	boardtype_splx(nspl)
124 *	...
125 * and in boardtype's machdep code:
126 *
127 *	...
128 *	#undef splx
129 *	int
130 *	splx(int spl)
131 *	{
132 *		return boardtype_splx(spl);
133 *	}
134 */
135
136#include ARM_INTR_IMPL
137
138#else	/* ARM_INTR_IMPL */
139
140#error ARM_INTR_IMPL not defined.
141
142#endif	/* ARM_INTR_IMPL */
143
144#endif	/* _LKM */
145
146#define splsoft()	_splraise(IPL_SOFT)
147
148typedef uint8_t ipl_t;
149typedef struct {
150	ipl_t _ipl;
151} ipl_cookie_t;
152
153static inline ipl_cookie_t
154makeiplcookie(ipl_t ipl)
155{
156
157	return (ipl_cookie_t){._ipl = ipl};
158}
159
160static inline int
161splraiseipl(ipl_cookie_t icookie)
162{
163
164	return _splraise(icookie._ipl);
165}
166
167#define	spl0()		_spllower(IPL_NONE)
168
169#include <sys/spl.h>
170
171#endif	/* ! _LOCORE */
172
173#endif	/* __OLD_INTERRUPT_CODE */
174
175#endif	/* _KERNEL */
176
177#endif	/* _HPCARM_INTR_H */
178