PERFORCE change 111968 for review
Paolo Pisati
piso at FreeBSD.org
Tue Dec 19 16:35:32 PST 2006
http://perforce.freebsd.org/chv.cgi?CH=111968
Change 111968 by piso at 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 <sparc64/sbus/ofw_sbus.h>
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);
More information about the p4-projects
mailing list