summaryrefslogtreecommitdiff
path: root/sys/arch/acorn32/include/irqhandler.h
blob: 50d996392655c904eb8094e55aac2506f9d016ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
/*	$NetBSD: irqhandler.h,v 1.9 2009/03/14 14:45:51 dsl Exp $	*/

/*
 * Copyright (c) 1994-1996 Mark Brinicombe.
 * Copyright (c) 1994 Brini.
 * All rights reserved.
 *
 * This code is derived from software written for Brini by Mark Brinicombe
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *	This product includes software developed by Mark Brinicombe
 *	for the NetBSD Project.
 * 4. The name of the company nor the name of the author may be used to
 *    endorse or promote products derived from this software without specific
 *    prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * IRQ related stuff (defines + structures)
 *
 * Created      : 30/09/94
 */

#ifndef _ARM32_IRQHANDLER_H_
#define _ARM32_IRQHANDLER_H_

#if defined(_KERNEL_OPT)
#include "iomd.h"
#endif

#ifndef _LOCORE
#include <sys/types.h>
#endif /* _LOCORE */

/* Define the IRQ bits */

/*
 * XXX this is really getting rather horrible.
 * Shortly to be replaced with system specific interrupt tables and handling
 */

#if NIOMD > 0

/* Only for ARM7500 : */

/*#define IRQ_PRINTER	0x00*/
#define IRQ_INT2	0x00
/*#define IRQ_RESERVED0	0x01*/
#define IRQ_BUTTON	0x02
#define IRQ_NINT1	0x02
#define IRQ_FLYBACK	0x03
#define IRQ_NPOR	0x04
#define IRQ_TIMER0	0x05
#define IRQ_TIMER1 	0x06
#define IRQ_SOFTINT	0x07

#define IRQ_DREQ3	0x08
#define IRQ_NINT8	0x08
/*#define IRQ_HD1	0x09*/
#define IRQ_INT7	0x09
/*#define IRQ_HD	IRQ_HD1*/
#define IRQ_DREQ2	0x0A
#define	IRQ_NINT6	0x0A
#define IRQ_INT5	0x0B
/*#define IRQ_FLOPPY	0x0C*/
#define IRQ_NINT4	0x0C
/*#define IRQ_SERIAL	0x0D*/
#define IRQ_NINT3	0x0D
#define IRQ_KBDTX	0x0E
#define IRQ_KBDRX	0x0F

#define IRQ_IRQ3	0x10
#define IRQ_IRQ4	0x11
#define IRQ_IRQ5	0x12
#define IRQ_IRQ6	0x13
#define IRQ_IRQ7	0x14
#define IRQ_IRQ9	0x15
#define IRQ_IRQ10	0x16
#define IRQ_IRQ11	0x17

#define IRQ_IOP0	0x10
#define IRQ_IOP1	0x11
#define IRQ_IOP2	0x12
#define IRQ_IOP3	0x13
#define IRQ_IOP4	0x14
#define IRQ_IOP5	0x15
#define IRQ_IOP6	0x16
#define IRQ_IOP7	0x17

#define IRQ_MSDRX	0x18
#define IRQ_MSDTX	0x19
#define IRQ_ATOD	0x1A
#define IRQ_NEVENT1	0x1B
#define IRQ_CLOCK	0x1B
#define IRQ_NEVENT2	0x1C
#define IRQ_PANIC	0x1C
/*#define IRQ_RESERVED2	0x1D*/
/*#define IRQ_RESERVED3	0x1E*/


/*
 * Note that Sound DMA IRQ is on the 31st vector.
 * It's not part of the IRQD.
 */
#define IRQ_SDMA	0x1F

/* Several interrupts are different between the A7000 and RC7500 */
#ifdef RC7500

#define IRQ_FIQDOWN	0x07
#define IRQ_ETHERNET	0x0B
#define IRQ_HD2		IRQ_IRQ11

#else	/* RC7500 */

/*#define IRQ_RESERVED1	0x07 */
#define IRQ_EXTENDED	0x0B
#define IRQ_PODULE	0x0D

#endif	/* RC7500 */




/* for non ARM7500 machines : */

/*#define IRQ_PRINTER	0x00*/
/*#define IRQ_RESERVED0	0x01*/
/*#define IRQ_FLOPPYIDX	0x02*/
#define IRQ_FLYBACK	0x03
#define IRQ_POR		0x04
#define IRQ_TIMER0	0x05
#define IRQ_TIMER1	0x06
/*#define IRQ_RESERVED1	0x07*/

/*#define IRQ_RESERVED2	0x08*/
/*#define IRQ_HD	0x09*/
/*#define IRQ_SERIAL	0x0A*/
#define IRQ_EXTENDED	0x0B
/*#define IRQ_FLOPPY	0x0C*/
#define IRQ_PODULE	0x0D
#define IRQ_KBDTX	0x0E
#define IRQ_KBDRX	0x0F

#define IRQ_DMACH0	0x10
#define IRQ_DMACH1	0x11
#define IRQ_DMACH2	0x12
#define IRQ_DMACH3	0x13
#define IRQ_DMASCH0	0x14
#define IRQ_DMASCH1	0x15
/*#define IRQ_RESERVED3	0x16*/
/*#define IRQ_RESERVED4	0x17*/



#endif	/* NIOMD > 0 */

#define IRQ_VSYNC	IRQ_FLYBACK	/* Aliased */
#define IRQ_NETSLOT	IRQ_EXTENDED

#define IRQ_INSTRUCT	-1
#define NIRQS		0x20

#include <machine/intr.h>

#ifndef _LOCORE
typedef struct irqhandler {
	int (*ih_func)(void *arg);/* handler function */
	void *ih_arg;			/* Argument to handler */
	int ih_level;			/* Interrupt level */
	int ih_num;			/* Interrupt number (for accounting) */
	const char *ih_name;		/* Name of interrupt (for vmstat -i) */
	u_int ih_flags;			/* Interrupt flags */
	u_int ih_maskaddr;		/* mask address for expansion cards */
	u_int ih_maskbits;		/* interrupt bit for expansion cards */
	struct irqhandler *ih_next;	/* next handler */
} irqhandler_t;

#ifdef _KERNEL
extern u_int irqmasks[NIPL];
extern irqhandler_t *irqhandlers[NIRQS];

void irq_init(void);
int irq_claim(int, irqhandler_t *);
int irq_release(int, irqhandler_t *);
void *intr_claim(int irq, int level, const char *name, int (*func)(void *), void *arg);
int intr_release(void *ih);
void irq_setmasks(void);
void disable_irq(int);
void enable_irq(int);
void stray_irqhandler(u_int);
#endif	/* _KERNEL */
#endif	/* _LOCORE */

#define IRQ_FLAG_ACTIVE 0x00000001	/* This is the active handler in list */

#endif	/* _ARM32_IRQHANDLER_H_ */

/* End of irqhandler.h */