1 /* $NetBSD: intr.h,v 1.7 2003/06/16 20:01:00 thorpej Exp $ */
4 * Copyright (c) 1997 Mark Brinicombe.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
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.
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
43 #define INTR_SOLO INTR_MD1
44 typedef int intr_irq_filter_t(void *arg, struct trapframe *tf);
46 typedef int intr_irq_filter_t(void *arg);
49 #define INTR_ISRC_NAMELEN (MAXCOMLEN + 1)
51 typedef void intr_ipi_filter_t(void *arg);
58 #define INTR_ISRCF_REGISTERED 0x01 /* registered in a controller */
59 #define INTR_ISRCF_PERCPU 0x02 /* per CPU interrupt */
60 #define INTR_ISRCF_BOUND 0x04 /* bound to a CPU */
62 /* Interrupt source definition. */
64 device_t isrc_dev; /* where isrc is mapped */
65 intptr_t isrc_xref; /* device reference key */
66 uintptr_t isrc_data; /* device data for isrc */
67 u_int isrc_irq; /* unique identificator */
68 enum intr_isrc_type isrc_type; /* how is isrc decribed */
70 char isrc_name[INTR_ISRC_NAMELEN];
71 uint16_t isrc_nspc_type;
72 uint16_t isrc_nspc_num;
73 enum intr_trigger isrc_trig;
74 enum intr_polarity isrc_pol;
75 cpuset_t isrc_cpu; /* on which CPUs is enabled */
79 struct intr_event * isrc_event;
80 intr_irq_filter_t * isrc_filter;
81 intr_ipi_filter_t * isrc_ipifilter;
85 pcell_t isrc_cells[]; /* leave it last */
89 void intr_irq_set_name(struct intr_irqsrc *isrc, const char *fmt, ...)
92 void intr_irq_dispatch(struct intr_irqsrc *isrc, struct trapframe *tf);
94 #define INTR_IRQ_NSPC_NONE 0
95 #define INTR_IRQ_NSPC_PLAIN 1
96 #define INTR_IRQ_NSPC_IRQ 2
97 #define INTR_IRQ_NSPC_IPI 3
99 u_int intr_namespace_map_irq(device_t dev, uint16_t type, uint16_t num);
101 u_int intr_fdt_map_irq(phandle_t, pcell_t *, u_int);
104 int intr_pic_register(device_t dev, intptr_t xref);
105 int intr_pic_unregister(device_t dev, intptr_t xref);
106 int intr_pic_claim_root(device_t dev, intptr_t xref, intr_irq_filter_t *filter,
107 void *arg, u_int ipicount);
109 int intr_irq_add_handler(device_t dev, driver_filter_t, driver_intr_t, void *,
110 u_int, int, void **);
111 int intr_irq_remove_handler(device_t dev, u_int, void *);
112 int intr_irq_config(u_int, enum intr_trigger, enum intr_polarity);
113 int intr_irq_describe(u_int, void *, const char *);
115 u_int intr_irq_next_cpu(u_int current_cpu, cpuset_t *cpumask);
118 int intr_irq_bind(u_int, int);
120 void intr_ipi_dispatch(struct intr_irqsrc *isrc, struct trapframe *tf);
122 #define AISHF_NOALLOC 0x0001
124 int intr_ipi_set_handler(u_int ipi, const char *name, intr_ipi_filter_t *filter,
125 void *arg, u_int flags);
127 void intr_pic_init_secondary(void);
130 #endif /* _SYS_INTR_H */