summaryrefslogtreecommitdiffstats
path: root/sys/sys/interrupt.h
diff options
context:
space:
mode:
authorpiso <piso@FreeBSD.org>2007-05-06 17:02:50 +0000
committerpiso <piso@FreeBSD.org>2007-05-06 17:02:50 +0000
commit25c9d95cb5947382643fdb02dee7a6b99bb639a4 (patch)
treee66c2b004bab077c7727881fe5ffb706d78b575c /sys/sys/interrupt.h
parent5dbec163341730f1769c5939a5e146d429090527 (diff)
downloadFreeBSD-src-25c9d95cb5947382643fdb02dee7a6b99bb639a4.zip
FreeBSD-src-25c9d95cb5947382643fdb02dee7a6b99bb639a4.tar.gz
Bring in the reminaing bits to make interrupt filtering work:
o push much of the i386 and amd64 MD interrupt handling code (intr_machdep.c::intr_execute_handlers()) into MI code (kern_intr.c::ithread_loop()) o move filter handling to kern_intr.c::intr_filter_loop() o factor out the code necessary to mask and ack an interrupt event (intr_machdep.c::intr_eoi_src() and intr_machdep.c::intr_disab_eoi_src()), and make them part of 'struct intr_event', passing them as arguments to kern_intr.c::intr_event_create(). o spawn a private ithread per handler (struct intr_handler::ih_thread) with filter and ithread functions. Approved by: re (implicit?)
Diffstat (limited to 'sys/sys/interrupt.h')
-rw-r--r--sys/sys/interrupt.h21
1 files changed, 21 insertions, 0 deletions
diff --git a/sys/sys/interrupt.h b/sys/sys/interrupt.h
index 9ca87d2..b110374 100644
--- a/sys/sys/interrupt.h
+++ b/sys/sys/interrupt.h
@@ -52,6 +52,7 @@ struct intr_handler {
int ih_need; /* Needs service. */
TAILQ_ENTRY(intr_handler) ih_next; /* Next handler for this event. */
u_char ih_pri; /* Priority of this handler. */
+ struct intr_thread *ih_thread; /* Ithread for filtered handler. */
};
/* Interrupt handle flags kept in ih_flags */
@@ -72,6 +73,10 @@ struct intr_event {
void *ie_source; /* Cookie used by MD code. */
struct intr_thread *ie_thread; /* Thread we are connected to. */
void (*ie_enable)(void *);
+#ifdef INTR_FILTER
+ void (*ie_eoi)(void *);
+ void (*ie_disab)(void *);
+#endif
int ie_flags;
int ie_count; /* Loop counter. */
int ie_warncnt; /* Rate-check interrupt storm warns. */
@@ -113,17 +118,33 @@ extern char intrnames[]; /* string table containing device names */
#ifdef DDB
void db_dump_intr_event(struct intr_event *ie, int handlers);
#endif
+#ifdef INTR_FILTER
+int intr_filter_loop(struct intr_event *ie, struct trapframe *frame,
+ struct intr_thread **ithd);
int intr_event_handle(struct intr_event *ie, struct trapframe *frame);
+#endif
u_char intr_priority(enum intr_type flags);
int intr_event_add_handler(struct intr_event *ie, const char *name,
driver_filter_t filter, driver_intr_t handler, void *arg,
u_char pri, enum intr_type flags, void **cookiep);
+#ifndef INTR_FILTER
int intr_event_create(struct intr_event **event, void *source,
int flags, void (*enable)(void *), const char *fmt, ...)
__printflike(5, 6);
+#else
+int intr_event_create(struct intr_event **event, void *source,
+ int flags, void (*enable)(void *), void (*eoi)(void *),
+ void (*disab)(void *), const char *fmt, ...)
+ __printflike(7, 8);
+#endif
int intr_event_destroy(struct intr_event *ie);
int intr_event_remove_handler(void *cookie);
+#ifndef INTR_FILTER
int intr_event_schedule_thread(struct intr_event *ie);
+#else
+int intr_event_schedule_thread(struct intr_event *ie,
+ struct intr_thread *ithd);
+#endif
void *intr_handler_source(void *cookie);
int swi_add(struct intr_event **eventp, const char *name,
driver_intr_t handler, void *arg, int pri, enum intr_type flags,
OpenPOWER on IntegriCloud