PERFORCE change 225861 for review
Brooks Davis
brooks at FreeBSD.org
Fri Mar 22 18:48:15 UTC 2013
http://p4web.freebsd.org/@@225861?ac=10
Change 225861 by brooks at brooks_zenith on 2013/03/22 18:47:50
Add (mips only) per-source interrupt statistics to beripic.
Reduce verbosity a bit.
Affected files ...
.. //depot/projects/ctsrd/beribsd/src/sys/mips/beri/beri_pic.c#2 edit
Differences ...
==== //depot/projects/ctsrd/beribsd/src/sys/mips/beri/beri_pic.c#2 (text+ko) ====
@@ -58,6 +58,9 @@
static char *bp_strconfig(uint64_t, char *, size_t);
static void bp_print_config(device_t);
static void bp_config_source(device_t, int, int, u_long, u_long);
+#ifdef __mips__
+static void bp_set_counter_name(device_t, device_t, int);
+#endif
static int beripic_fdt_probe(device_t);
static int beripic_fdt_attach(device_t);
@@ -110,6 +113,10 @@
int bp_nsrcs;
struct rman bp_src_rman;
+#ifdef __mips__
+ mips_intrcnt_t *bp_counters;
+#endif
+
struct mtx bp_cfgmtx;
};
@@ -118,6 +125,9 @@
driver_intr_t *intr;
void *arg;
struct resource *irq;
+#ifdef __mips__
+ mips_intrcnt_t counter;
+#endif
/* XXX counter */
};
@@ -234,7 +244,7 @@
{
char configstr[64];
struct beripic_softc *sc;
- uint64_t config, oconfig;
+ uint64_t config;
sc = device_get_softc(ic);
@@ -243,16 +253,31 @@
config |= tid << BP_CFG_SHIFT_TID;
config |= irq << BP_CFG_SHIFT_IRQ;
- oconfig = bp_read_cfg(sc, src);
- if (oconfig != 0 && config != 0)
- device_printf(ic, "src %d previous config: %s\n",
- src, bp_strconfig(oconfig, configstr, sizeof(configstr)));
if (bootverbose)
device_printf(ic, "src %d: %s\n", src,
bp_strconfig(config, configstr, sizeof(configstr)));
bp_write_cfg(sc, src, config);
}
+#ifdef __mips__
+static void
+bp_set_counter_name(device_t ic, device_t child, int src)
+{
+ struct beripic_softc *sc;
+ char name[MAXCOMLEN + 1];
+
+ sc = device_get_softc(ic);
+
+ if (snprintf(name, sizeof(name), "bp%dsrc%d%s%s%s",
+ device_get_unit(ic), src, src < sc->bp_nhard ? "" : "s",
+ child == NULL ? "" : " ",
+ child == NULL ? " " : device_get_nameunit(child)) >= sizeof(name))
+ name[sizeof(name) - 2] = '+';
+
+ mips_intrcnt_setname(sc->bp_counters[src], name);
+}
+#endif
+
static int
beripic_fdt_probe(device_t dev)
{
@@ -387,6 +412,15 @@
if (bootverbose)
device_printf(dev, "%d hard and %d soft sources\n",
sc->bp_nhard, sc->bp_nsoft);
+
+#ifdef __mips__
+ sc->bp_counters = malloc(sizeof(*sc->bp_counters) * sc->bp_nsrcs,
+ M_BERIPIC, M_WAITOK|M_ZERO);
+ for (i = 0; i < sc->bp_nsrcs; i++) {
+ sc->bp_counters[i] = mips_intrcnt_create("");
+ bp_set_counter_name(dev, NULL, i);
+ }
+#endif
sc->bp_src_rman.rm_start = 0;
sc->bp_src_rman.rm_end = sc->bp_nsrcs - 1;
@@ -492,19 +526,24 @@
struct beripic_intr_arg *bpia;
struct beripic_cookie *bpc;
int error;
- u_long hirq, tid;
+ u_long hirq, src, tid;
sc = device_get_softc(ic);
- KASSERT(rman_get_start(irq) < sc->bp_nsrcs,
- ("source (%ul) out of range 0-%d", rman_get_start(irq),
- rman_get_start(irq) - 1));
+ src = rman_get_start(irq);
+
+ KASSERT(src < sc->bp_nsrcs, ("source (%ul) out of range 0-%d",
+ src, sc->bp_nsrcs - 1));
bpia = malloc(sizeof(*bpia), M_BERIPIC, M_WAITOK|M_ZERO);
bpia->filter = filter;
bpia->intr = intr;
bpia->arg = arg;
bpia->irq = irq;
+#ifdef __mips__
+ bpia->counter = sc->bp_counters[src];
+ bp_set_counter_name(ic, child, src);
+#endif
bpc = malloc(sizeof(*bpc), M_BERIPIC, M_WAITOK|M_ZERO);
bpc->bpia = bpia;
@@ -514,13 +553,9 @@
hirq = rman_get_start(bpc->hirq);
tid = sc->bp_next_tid;
-device_printf(ic, "allocated irq %lu tid %lu to %s who requsted %lu\n",
- hirq, tid, device_get_nameunit(child), rman_get_start(irq));
-
- /* XXX: should add a filter that checks IP state */
error = BUS_SETUP_INTR(device_get_parent(ic), ic, bpc->hirq, flags,
- filter == NULL ? NULL : beripic_filter,
- intr == NULL ? NULL : beripic_intr, bpia, &(bpc->cookie));
+ beripic_filter, intr == NULL ? NULL : beripic_intr, bpia,
+ &(bpc->cookie));
if (error != 0)
goto err;
@@ -577,8 +612,14 @@
bpic = arg;
- KASSERT(bpic->filter != NULL,
- ("%s installed, but no child filter", __func__));
+#ifdef __mips__
+ mips_intrcnt_inc(bpic->counter);
+#endif
+
+ /* XXX: Add a check that our source is high */
+
+ if (bpic->filter == NULL)
+ return (FILTER_SCHEDULE_THREAD);
return (bpic->filter(bpic->arg));
}
More information about the p4-projects
mailing list