From owner-p4-projects@FreeBSD.ORG Wed Dec 20 00:35:32 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 15C6B16A554; Wed, 20 Dec 2006 00:35:32 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id BAD4716A514 for ; Wed, 20 Dec 2006 00:35:31 +0000 (UTC) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.FreeBSD.org (Postfix) with ESMTP id B2CEA43CD4 for ; Wed, 20 Dec 2006 00:35:07 +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 kBK0YW7a077216 for ; Wed, 20 Dec 2006 00:34:32 GMT (envelope-from piso@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id kBK0YWtc077213 for perforce@freebsd.org; Wed, 20 Dec 2006 00:34:32 GMT (envelope-from piso@freebsd.org) Date: Wed, 20 Dec 2006 00:34:32 GMT Message-Id: <200612200034.kBK0YWtc077213@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 111968 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: Wed, 20 Dec 2006 00:35:32 -0000 http://perforce.freebsd.org/chv.cgi?CH=111968 Change 111968 by piso@piso_newluxor on 2006/12/20 00:34:26 Teach them about filters. Affected files ... .. //depot/projects/soc2006/intr_filter/sparc64/fhc/fhc.c#4 edit .. //depot/projects/soc2006/intr_filter/sparc64/pci/psycho.c#7 edit .. //depot/projects/soc2006/intr_filter/sparc64/sbus/sbus.c#7 edit Differences ... ==== //depot/projects/soc2006/intr_filter/sparc64/fhc/fhc.c#4 (text+ko) ==== @@ -50,6 +50,7 @@ #include struct fhc_clr { + driver_filter_t *fc_filter; driver_intr_t *fc_func; void *fc_arg; void *fc_cookie; @@ -62,6 +63,7 @@ struct resource_list fdi_rl; }; +static int fhc_filter_stub(void *); static void fhc_intr_stub(void *); static void fhc_led_func(void *, int); static int fhc_print_res(struct fhc_devinfo *); @@ -238,9 +240,7 @@ fc = malloc(sizeof(*fc), M_DEVBUF, M_WAITOK | M_ZERO); if (fc == NULL) return (0); - /* - * XXX_FILTER this code doesn't take care of filters. - */ + fc->fc_filter = filter; fc->fc_func = func; fc->fc_arg = arg; fc->fc_bt = bt; @@ -249,7 +249,7 @@ bus_space_write_4(bt, bh, FHC_IMAP, inr); bus_space_read_4(bt, bh, FHC_IMAP); - error = bus_generic_setup_intr(bus, child, r, flags, filter, + error = bus_generic_setup_intr(bus, child, r, flags, fhc_filter_stub, fhc_intr_stub, fc, cookiep); if (error != 0) { free(fc, M_DEVBUF); @@ -279,15 +279,28 @@ return (error); } +static int +fhc_filter_stub(void *arg) +{ + struct fhc_clr *fc = arg; + int res; + + if (fc->fc_filter != NULL) + res = fc->fc_filter(fc->fc_arg); + else + res = FILTER_HANDLED | FILTER_SCHEDULE_THREAD; + + bus_space_write_4(fc->fc_bt, fc->fc_bh, FHC_ICLR, 0x0); + bus_space_read_4(fc->fc_bt, fc->fc_bh, FHC_ICLR); + return (res); +} + static void fhc_intr_stub(void *arg) { struct fhc_clr *fc = arg; fc->fc_func(fc->fc_arg); - - bus_space_write_4(fc->fc_bt, fc->fc_bh, FHC_ICLR, 0x0); - bus_space_read_4(fc->fc_bt, fc->fc_bh, FHC_ICLR); } struct resource * ==== //depot/projects/soc2006/intr_filter/sparc64/pci/psycho.c#7 (text+ko) ==== @@ -83,6 +83,7 @@ int, void *); static int psycho_find_intrmap(struct psycho_softc *, int, bus_addr_t *, bus_addr_t *, u_long *); +static int psycho_filter_stub(void *); static void psycho_intr_stub(void *); static bus_space_tag_t psycho_alloc_bus_tag(struct psycho_softc *, int); @@ -177,6 +178,7 @@ struct psycho_clr { struct psycho_softc *pci_sc; bus_addr_t pci_clr; /* clear register */ + driver_filter_t *pci_filter; driver_intr_t *pci_handler; /* handler to call */ void *pci_arg; /* argument for the handler */ void *pci_cookie; /* parent bus int. cookie */ @@ -940,6 +942,20 @@ return (ENOENT); } +static int +psycho_filter_stub(void *arg) +{ + struct psycho_clr *pc = arg; + int res; + + if (pc->pci_filter != NULL) + res = pc->pci_filter(pc->pci_arg); + else + res = FILTER_HANDLED | FILTER_SCHEDULE_THREAD; + PSYCHO_WRITE8(pc->pci_sc, pc->pci_clr, 0); + return (res); +} + /* Write to the correct clr register, and call the actual handler. */ static void psycho_intr_stub(void *arg) @@ -947,7 +963,6 @@ struct psycho_clr *pc = arg; pc->pci_handler(pc->pci_arg); - PSYCHO_WRITE8(pc->pci_sc, pc->pci_clr, 0); } static int @@ -988,18 +1003,16 @@ device_printf(dev, "%s: INO %d, map %#lx, clr %#lx\n", __func__, ino, (u_long)intrmapptr, (u_long)intrclrptr); #endif - /* - * XXX_FILTER this code doesn't take care of filters. - */ pc->pci_sc = sc; pc->pci_arg = arg; + pc->pci_filter = filter; pc->pci_handler = intr; pc->pci_clr = intrclrptr; /* Disable the interrupt while we fiddle with it */ mr = PSYCHO_READ8(sc, intrmapptr); PSYCHO_WRITE8(sc, intrmapptr, mr & ~INTMAP_V); error = BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, - filter, psycho_intr_stub, pc, cookiep); + psycho_filter_stub, psycho_intr_stub, pc, cookiep); if (error != 0) { free(pc, M_DEVBUF); return (error); ==== //depot/projects/soc2006/intr_filter/sparc64/sbus/sbus.c#7 (text+ko) ==== @@ -181,6 +181,7 @@ struct sbus_clr { struct sbus_softc *scl_sc; bus_addr_t scl_clr; /* clear register */ + driver_filter_t *scl_filter; driver_intr_t *scl_handler; /* handler to call */ void *scl_arg; /* argument for the handler */ void *scl_cookie; /* parent bus int. cookie */ @@ -209,6 +210,7 @@ static struct sbus_devinfo * sbus_setup_dinfo(device_t, struct sbus_softc *, phandle_t); static void sbus_destroy_dinfo(struct sbus_devinfo *); +static int sbus_filter_stub(void *); static void sbus_intr_stub(void *); static bus_space_tag_t sbus_alloc_bustag(struct sbus_softc *); static int sbus_overtemp(void *); @@ -634,6 +636,21 @@ return (&sdi->sdi_rl); } +static int +sbus_filter_stub(void *arg) +{ + struct sbus_clr *scl; + int res; + + scl = (struct sbus_clr *)arg; + if (scl->scl_handler != NULL) + res = scl->scl_filter(scl->scl_arg); + else + res = FILTER_HANDLED | FILTER_SCHEDULE_THREAD; + SYSIO_WRITE8(scl->scl_sc, scl->scl_clr, 0); + return (res); +} + /* Write to the correct clr register, and call the actual handler. */ static void sbus_intr_stub(void *arg) @@ -642,7 +659,6 @@ scl = (struct sbus_clr *)arg; scl->scl_handler(scl->scl_arg); - SYSIO_WRITE8(scl->scl_sc, scl->scl_clr, 0); } static int @@ -693,17 +709,15 @@ panic("%s: IRQ not found!", __func__); } - /* - * XXX_FILTER this code doesn't take care of filters. - */ scl->scl_sc = sc; scl->scl_arg = arg; + scl->scl_filter = filter; scl->scl_handler = intr; scl->scl_clr = intrclrptr; /* Disable the interrupt while we fiddle with it */ SYSIO_WRITE8(sc, intrmapptr, intrmap & ~INTMAP_V); error = BUS_SETUP_INTR(device_get_parent(dev), child, ires, flags, - filter, sbus_intr_stub, scl, cookiep); + sbus_filter_stub, sbus_intr_stub, scl, cookiep); if (error != 0) { free(scl, M_DEVBUF); return (error);