From owner-p4-projects@FreeBSD.ORG Sat Jun 24 11:35:35 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 4C64216A4A7; Sat, 24 Jun 2006 11:35:35 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 0D32A16A49A for ; Sat, 24 Jun 2006 11:35:35 +0000 (UTC) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id C21A543D49 for ; Sat, 24 Jun 2006 11:35:31 +0000 (GMT) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k5OBZV3n038140 for ; Sat, 24 Jun 2006 11:35:31 GMT (envelope-from piso@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k5OBZVZU038137 for perforce@freebsd.org; Sat, 24 Jun 2006 11:35:31 GMT (envelope-from piso@freebsd.org) Date: Sat, 24 Jun 2006 11:35:31 GMT Message-Id: <200606241135.k5OBZVZU038137@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to piso@freebsd.org using -f From: Paolo Pisati To: Perforce Change Reviews Cc: Subject: PERFORCE change 99929 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 24 Jun 2006 11:35:35 -0000 http://perforce.freebsd.org/chv.cgi?CH=99929 Change 99929 by piso@piso_newluxor on 2006/06/24 11:34:33 Convert some bus_setup_intr() methods to the interrupt filter model: for now i just converted nexus on i386. Next step: reconvert all the previous marked drivers with FIX_INTR_FILTER to be real filters. Affected files ... .. //depot/projects/soc2006/intr_filter/i386/i386/intr_machdep.c#5 edit .. //depot/projects/soc2006/intr_filter/i386/i386/nexus.c#2 edit .. //depot/projects/soc2006/intr_filter/i386/include/intr_machdep.h#2 edit .. //depot/projects/soc2006/intr_filter/i386/isa/clock.c#3 edit .. //depot/projects/soc2006/intr_filter/kern/kern_intr.c#4 edit .. //depot/projects/soc2006/intr_filter/sys/interrupt.h#3 edit Differences ... ==== //depot/projects/soc2006/intr_filter/i386/i386/intr_machdep.c#5 (text+ko) ==== @@ -112,8 +112,8 @@ } int -intr_add_handler(const char *name, int vector, driver_intr_t handler, - void *arg, enum intr_type flags, void **cookiep) +intr_add_handler(const char *name, int vector, driver_filter_t filter, + driver_intr_t handler, void *arg, enum intr_type flags, void **cookiep) { struct intsrc *isrc; int error; @@ -121,8 +121,8 @@ isrc = intr_lookup_source(vector); if (isrc == NULL) return (EINVAL); - error = intr_event_add_handler(isrc->is_event, name, handler, arg, - intr_priority(flags), flags, cookiep); + error = intr_event_add_handler(isrc->is_event, name, filter, handler, + arg, intr_priority(flags), flags, cookiep); if (error == 0) { intrcnt_updatename(isrc); mtx_lock_spin(&intr_table_lock); ==== //depot/projects/soc2006/intr_filter/i386/i386/nexus.c#2 (text+ko) ==== @@ -97,7 +97,7 @@ static int nexus_release_resource(device_t, device_t, int, int, struct resource *); static int nexus_setup_intr(device_t, device_t, struct resource *, int flags, - void (*)(void *), void *, void **); + driver_filter_t, void (*)(void *), void *, void **); static int nexus_teardown_intr(device_t, device_t, struct resource *, void *); static struct resource_list *nexus_get_reslist(device_t dev, device_t child); @@ -477,7 +477,8 @@ */ static int nexus_setup_intr(device_t bus, device_t child, struct resource *irq, - int flags, void (*ihand)(void *), void *arg, void **cookiep) + int flags, driver_filter_t filter, void (*ihand)(void *), + void *arg, void **cookiep) { int error; @@ -497,7 +498,7 @@ return (error); error = intr_add_handler(device_get_nameunit(child), - rman_get_start(irq), ihand, arg, flags, cookiep); + rman_get_start(irq), filter, ihand, arg, flags, cookiep); return (error); } ==== //depot/projects/soc2006/intr_filter/i386/include/intr_machdep.h#2 (text+ko) ==== @@ -124,8 +124,8 @@ #else #define intr_add_cpu(apic_id) #endif -int intr_add_handler(const char *name, int vector, driver_intr_t handler, - void *arg, enum intr_type flags, void **cookiep); +int intr_add_handler(const char *name, int vector, driver_filter_t filter, + driver_intr_t handler, void *arg, enum intr_type flags, void **cookiep); int intr_config_intr(int vector, enum intr_trigger trig, enum intr_polarity pol); void intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame); ==== //depot/projects/soc2006/intr_filter/i386/isa/clock.c#3 (text+ko) ==== @@ -824,8 +824,7 @@ * timecounter to user a simpler algorithm. */ if (!using_lapic_timer) { - // XXX - FIX_INTR_FILTER - intr_add_handler("clk", 0, (driver_intr_t *)clkintr, NULL, + intr_add_handler("clk", 0, (driver_filter_t *)clkintr, NULL, NULL, INTR_TYPE_CLK | INTR_FAST, NULL); i8254_intsrc = intr_lookup_source(0); if (i8254_intsrc != NULL) @@ -859,8 +858,7 @@ /* Enable periodic interrupts from the RTC. */ rtc_statusb |= RTCSB_PINTR; - // XXX - FIX_INTR_FILTER - intr_add_handler("rtc", 8, (driver_intr_t *)rtcintr, NULL, + intr_add_handler("rtc", 8, (driver_filter_t *)rtcintr, NULL, NULL, INTR_TYPE_CLK | INTR_FAST, NULL); writertc(RTC_STATUSB, rtc_statusb); ==== //depot/projects/soc2006/intr_filter/kern/kern_intr.c#4 (text+ko) ==== @@ -323,8 +323,8 @@ int intr_event_add_handler(struct intr_event *ie, const char *name, - driver_intr_t handler, void *arg, u_char pri, enum intr_type flags, - void **cookiep) + driver_filter_t filter, driver_intr_t handler, void *arg, u_char pri, + enum intr_type flags, void **cookiep) { struct intr_handler *ih, *temp_ih; struct intr_thread *it; @@ -334,6 +334,7 @@ /* Allocate and populate an interrupt handler structure. */ ih = malloc(sizeof(struct intr_handler), M_ITHREAD, M_WAITOK | M_ZERO); + ih->ih_filter = filter; ih->ih_handler = handler; ih->ih_argument = arg; ih->ih_name = name; @@ -568,7 +569,7 @@ if (eventp != NULL) *eventp = ie; } - return (intr_event_add_handler(ie, name, handler, arg, + return (intr_event_add_handler(ie, name, NULL, handler, arg, (pri * RQ_PPQ) + PI_SOFT, flags, cookiep)); /* XXKSE.. think of a better way to get separate queues */ } @@ -789,8 +790,8 @@ */ arg = ((ih->ih_argument == NULL) ? frame : ih->ih_argument); - CTR4(KTR_INTR, "%s: exec %p(%p) for %s", __func__, - ih->ih_handler, arg, ih->ih_name); + CTR5(KTR_INTR, "%s: exec %p/%p(%p) for %s", __func__, + ih->ih_filter, ih->ih_handler, arg, ih->ih_name); if (ih->ih_flags & IH_FAST) { // XXX - actually should call ih_filter()... ==== //depot/projects/soc2006/intr_filter/sys/interrupt.h#3 (text+ko) ==== @@ -43,6 +43,7 @@ * together. */ struct intr_handler { + driver_filter_t *ih_filter; /* Filter function. */ driver_intr_t *ih_handler; /* Handler function. */ void *ih_argument; /* Argument to pass to handler. */ int ih_flags; @@ -115,7 +116,7 @@ int intr_filter_loop(struct intr_event *ie, struct trapframe *frame); u_char intr_priority(enum intr_type flags); int intr_event_add_handler(struct intr_event *ie, const char *name, - driver_intr_t handler, void *arg, u_char pri, enum intr_type flags, + driver_filter_t filter, driver_intr_t handler, void *arg, u_char pri, enum intr_type flags, void **cookiep); int intr_event_create(struct intr_event **event, void *source, int flags, void (*enable)(void *), const char *fmt, ...)