intr.h revision 1.5
1/*	$NetBSD: intr.h,v 1.5 2010/04/25 12:26:07 kiyohara Exp $ */
2
3/*-
4 * Copyright (c) 2007 Michael Lorenz
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 *
16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <sys/cdefs.h>
30__KERNEL_RCSID(0, "$NetBSD: intr.h,v 1.5 2010/04/25 12:26:07 kiyohara Exp $");
31
32#ifndef POWERPC_INTR_MACHDEP_H
33#define POWERPC_INTR_MACHDEP_H
34
35void *intr_establish(int, int, int, int (*)(void *), void *);
36void intr_disestablish(void *);
37const char *intr_typename(int);
38void genppc_cpu_configure(void);
39
40/* Interrupt priority `levels'. */
41#define	IPL_NONE	0	/* nothing */
42#define	IPL_SOFTCLOCK	1	/* timeouts */
43#define	IPL_SOFTBIO	2	/* block I/O */
44#define	IPL_SOFTNET	3	/* protocol stacks */
45#define	IPL_SOFTSERIAL	4	/* serial */
46#define	IPL_VM		5	/* memory allocation */
47#define	IPL_SCHED	6
48#define	IPL_HIGH	7	/* everything */
49#define	NIPL		8
50
51/* Interrupt sharing types. */
52#define	IST_NONE	0	/* none */
53#define	IST_PULSE	1	/* pulsed */
54#define	IST_EDGE	2	/* edge-triggered */
55#define	IST_LEVEL	3	/* level-triggered */
56
57#ifndef _LOCORE
58/*
59 * Interrupt handler chains.  intr_establish() inserts a handler into
60 * the list.  The handler is called with its (single) argument.
61 */
62struct intrhand {
63	int	(*ih_fun)(void *);
64	void	*ih_arg;
65	struct	intrhand *ih_next;
66	int	ih_level;
67	int	ih_irq;
68};
69
70int splraise(int);
71int spllower(int);
72void splx(int);
73void softintr(int);
74
75typedef u_int imask_t;
76extern imask_t imask[];
77
78#define NVIRQ		32	/* 32 virtual IRQs */
79#define NIRQ		128	/* up to 128 HW IRQs */
80
81#define HWIRQ_MAX       (NVIRQ - 5 - 1)
82#define HWIRQ_MASK      0x07ffffff
83
84#define MS_PENDING(p)	(31 - cntlzw(p))
85
86/* Soft interrupt masks. */
87#define SIR_CLOCK	27
88#define SIR_BIO		28
89#define SIR_NET		29
90#define SIR_SERIAL	30
91#define SPL_CLOCK	31
92
93#define setsoftclock()	softintr(SIR_CLOCK)
94#define setsoftbio()	softintr(SIR_BIO)
95#define setsoftnet()	softintr(SIR_NET)
96#define setsoftserial()	softintr(SIR_SERIAL)
97
98#define spl0()		spllower(0)
99
100typedef int ipl_t;
101typedef struct {
102	ipl_t _ipl;
103} ipl_cookie_t;
104
105static inline ipl_cookie_t
106makeiplcookie(ipl_t ipl)
107{
108
109	return (ipl_cookie_t){._ipl = ipl};
110}
111
112static inline int
113splraiseipl(ipl_cookie_t icookie)
114{
115
116	return splraise(imask[icookie._ipl]);
117}
118
119#include <sys/spl.h>
120
121#endif /* _LOCORE */
122
123#endif /* POWERPC_INTR_MACHDEP_H */
124