summaryrefslogtreecommitdiffstats
path: root/sys/sys/interrupt.h
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2008-03-14 19:41:48 +0000
committerjhb <jhb@FreeBSD.org>2008-03-14 19:41:48 +0000
commit9c113163fb2bb182d320f0228312c13601341163 (patch)
treec7c725651b1ad4c07a8fe93c253676ef3d6d5279 /sys/sys/interrupt.h
parent33dfb1706b9985093bf2f15b13b6d6fcf86e117f (diff)
downloadFreeBSD-src-9c113163fb2bb182d320f0228312c13601341163.zip
FreeBSD-src-9c113163fb2bb182d320f0228312c13601341163.tar.gz
Add preliminary support for binding interrupts to CPUs:
- Add a new intr_event method ie_assign_cpu() that is invoked when the MI code wishes to bind an interrupt source to an individual CPU. The MD code may reject the binding with an error. If an assign_cpu function is not provided, then the kernel assumes the platform does not support binding interrupts to CPUs and fails all requests to do so. - Bind ithreads to CPUs on their next execution loop once an interrupt event is bound to a CPU. Only shared ithreads are bound. We currently leave private ithreads for drivers using filters + ithreads in the INTR_FILTER case unbound. - A new intr_event_bind() routine is used to bind an interrupt event to a CPU. - Implement binding on amd64 and i386 by way of the existing pic_assign_cpu PIC method. - For x86, provide a 'intr_bind(IRQ, cpu)' wrapper routine that looks up an interrupt source and binds its interrupt event to the specified CPU. MI code can currently (ab)use this by doing: intr_bind(rman_get_start(irq_res), cpu); however, I plan to add a truly MI interface (probably a bus_bind_intr(9)) where the implementation in the x86 nexus(4) driver would end up calling intr_bind() internally. Requested by: kmacy, gallatin, jeff Tested on: {amd64, i386} x {regular, INTR_FILTER}
Diffstat (limited to 'sys/sys/interrupt.h')
-rw-r--r--sys/sys/interrupt.h13
1 files changed, 9 insertions, 4 deletions
diff --git a/sys/sys/interrupt.h b/sys/sys/interrupt.h
index b110374..54cd0e4 100644
--- a/sys/sys/interrupt.h
+++ b/sys/sys/interrupt.h
@@ -73,6 +73,7 @@ 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 *);
+ int (*ie_assign_cpu)(void *, u_char);
#ifdef INTR_FILTER
void (*ie_eoi)(void *);
void (*ie_disab)(void *);
@@ -81,6 +82,7 @@ struct intr_event {
int ie_count; /* Loop counter. */
int ie_warncnt; /* Rate-check interrupt storm warns. */
struct timeval ie_warntm;
+ u_char ie_cpu; /* CPU this event is bound to. */
};
/* Interrupt event flags kept in ie_flags. */
@@ -127,15 +129,18 @@ 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);
+int intr_event_bind(struct intr_event *ie, u_char cpu);
#ifndef INTR_FILTER
int intr_event_create(struct intr_event **event, void *source,
- int flags, void (*enable)(void *), const char *fmt, ...)
- __printflike(5, 6);
+ int flags, void (*enable)(void *),
+ int (*assign_cpu)(void *, u_char), const char *fmt, ...)
+ __printflike(6, 7);
#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);
+ void (*disab)(void *), int (*assign_cpu)(void *, u_char),
+ const char *fmt, ...)
+ __printflike(8, 9);
#endif
int intr_event_destroy(struct intr_event *ie);
int intr_event_remove_handler(void *cookie);
OpenPOWER on IntegriCloud