PERFORCE change 97522 for review
Kip Macy
kmacy at FreeBSD.org
Sat May 20 18:51:52 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=97522
Change 97522 by kmacy at kmacy_storage:sun4v_rwbuf on 2006/05/20 18:50:36
put debug output under -DDEBUG
add interrupt wrapper for doing interrupt reset
Affected files ...
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/nexus.c#9 edit
Differences ...
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/nexus.c#9 (text+ko) ====
@@ -81,6 +81,15 @@
struct rman sc_mem_rman;
};
+typedef struct nexus_id {
+ devhandle_t dh;
+ uint32_t ino;
+ devhandle_t nid_ihdl;
+ driver_intr_t *nid_handler;
+ void *nid_arg;
+
+} nexus_id_t;
+
static device_probe_t nexus_probe;
static device_attach_t nexus_attach;
static bus_print_child_t nexus_print_child;
@@ -246,6 +255,12 @@
ndi->ndi_obdinfo.obd_node = -1;
ndi->ndi_obdinfo.obd_name = strdup(name, M_OFWPROP);
resource_list_init(&ndi->ndi_rl);
+ ndi->ndi_intr_rman.rm_type = RMAN_ARRAY;
+ ndi->ndi_intr_rman.rm_descr = "Interrupts";
+ if (rman_init(&ndi->ndi_intr_rman) != 0 ||
+ rman_manage_region(&ndi->ndi_intr_rman, 0, IV_MAX - 1) != 0)
+ panic("%s: failed to set up rmans.", __func__);
+
device_set_ivars(cdev, ndi);
return (cdev);
@@ -295,6 +310,51 @@
#ifdef SUN4V
+void nexus_intr_reset(void *arg);
+
+void
+nexus_intr_reset(void *arg)
+{
+ nexus_id_t *nidp;
+
+ nidp = (nexus_id_t *)arg;
+
+ hvio_intr_setstate(nidp->nid_ihdl, HV_INTR_IDLE_STATE);
+
+}
+
+
+static void
+nexus_intr_wrapper(void *arg)
+{
+ nexus_id_t *nidp;
+ driver_intr_t *handler;
+ void *harg;
+ int state, valid;
+
+ nidp = (nexus_id_t *)arg;
+#if 1
+ if (nidp->dh == 0x7c0)
+ printf("(%#lx, %#x)", nidp->dh, nidp->ino);
+#endif
+ handler = nidp->nid_handler;
+ harg = nidp->nid_arg;
+
+ (*handler)(harg);
+
+ hvio_intr_setstate(nidp->nid_ihdl, HV_INTR_IDLE_STATE);
+
+#ifdef DEBUG
+ if (nidp->dh == 0x7c0) {
+ hvio_intr_getstate(nidp->nid_ihdl, &state);
+ hvio_intr_getvalid(nidp->nid_ihdl, &valid);
+ printf("i: %#lx, s: %d, v: %d\n", nidp->nid_ihdl, state, valid);
+ }
+#endif
+}
+
+
+
static int
nexus_setup_intr(device_t dev, device_t child, struct resource *res, int flags,
@@ -304,18 +364,20 @@
uint64_t ihdl;
uint64_t ino;
int error, cpuid;
+ nexus_id_t *nidp;
ndi = device_get_ivars(child);
if (res == NULL)
panic("%s: NULL interrupt resource!", __func__);
-
+#ifdef DEBUG
printf("dev=%s child=%s\n", ofw_bus_get_name(dev), ofw_bus_get_name(child));
-
+#endif
ino = rman_get_start(res);
-
+#ifdef DEBUG
printf("child=%s reg=0x%lx ino=0x%lx\n", ofw_bus_get_name(child),
ndi->ndi_devhandle, ino);
+#endif
if (hvio_intr_devino_to_sysino(ndi->ndi_devhandle, (uint32_t)ino,
&ihdl) != H_EOK) {
@@ -347,10 +409,20 @@
if ((error = rman_activate_resource(res)))
goto fail;
+ if ((nidp = malloc(sizeof(nexus_id_t), M_DEVBUF, M_NOWAIT)) == NULL) {
+ printf("failed to allocate nexus_id\n");
+ error = ENOMEM;
+ goto fail;
+ }
+ nidp->nid_ihdl = ihdl;
+ nidp->nid_handler = intr;
+ nidp->nid_arg = arg;
+ nidp->dh = ndi->ndi_devhandle;
+ nidp->ino = ino;
+
error = inthand_add(device_get_nameunit(child), ihdl,
- intr, arg, flags, cookiep);
+ nexus_intr_wrapper, nidp, flags, cookiep);
- printf("inthandler added\n");
fail:
return (error);
@@ -449,6 +521,10 @@
flags &= ~RF_ACTIVE;
rv = rman_reserve_resource(rm, start, end, count, flags, child);
+ if (type == SYS_RES_IRQ && rv == NULL) {
+ printf("%s: start: %ld, end: %ld, flags: %#x\n", __func__,
+ start, end, flags);
+ }
if (rv == NULL)
return (NULL);
if (type == SYS_RES_MEMORY) {
More information about the p4-projects
mailing list