svn commit: r259691 - user/nwhitehorn/mips_pic_if/mips/beri
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Sat Dec 21 18:01:02 UTC 2013
Author: nwhitehorn
Date: Sat Dec 21 18:01:02 2013
New Revision: 259691
URL: http://svnweb.freebsd.org/changeset/base/259691
Log:
Make this compile, but not work. Some XXX notes at the bottom for what needs
to be implemented, which I couldn't figure out.
Modified:
user/nwhitehorn/mips_pic_if/mips/beri/beri_pic.c
Modified: user/nwhitehorn/mips_pic_if/mips/beri/beri_pic.c
==============================================================================
--- user/nwhitehorn/mips_pic_if/mips/beri/beri_pic.c Sat Dec 21 17:43:23 2013 (r259690)
+++ user/nwhitehorn/mips_pic_if/mips/beri/beri_pic.c Sat Dec 21 18:01:02 2013 (r259691)
@@ -48,7 +48,7 @@ __FBSDID("$FreeBSD$");
#include <dev/fdt/fdt_common.h>
-#include "fdt_ic_if.h"
+#include "pic_if.h"
struct beripic_softc;
@@ -57,27 +57,10 @@ static void bp_write_cfg(struct beripic_
static void bp_detach_resources(device_t);
static char *bp_strconfig(uint64_t, char *, size_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);
-static int beripic_activate_intr(device_t, struct resource *);
-static struct resource *
- beripic_alloc_intr(device_t, device_t, int *, u_long, u_int);
-static int beripic_config_intr(device_t, int, enum intr_trigger,
- enum intr_polarity);
-static int beripic_release_intr(device_t, struct resource *);
-static int beripic_setup_intr(device_t, device_t, struct resource *,
- int, driver_filter_t *, driver_intr_t *, void *, void **);
-static int beripic_teardown_intr(device_t, device_t, struct resource *,
- void *);
-
-static int beripic_filter(void *);
-static void beripic_intr(void *);
-
#define BP_MAX_HARD_IRQS 6
#define BP_FIRST_SOFT 64
@@ -113,29 +96,9 @@ struct beripic_softc {
int bp_nsrcs;
struct rman bp_src_rman;
-#ifdef __mips__
- mips_intrcnt_t *bp_counters;
-#endif
-
struct mtx bp_cfgmtx;
};
-struct beripic_intr_arg {
- driver_filter_t *filter;
- driver_intr_t *intr;
- void *arg;
- struct resource *irq;
-#ifdef __mips__
- mips_intrcnt_t counter;
-#endif
-};
-
-struct beripic_cookie {
- struct beripic_intr_arg *bpia;
- struct resource *hirq;
- void *cookie;
-};
-
#define BP_CFG_MASK_E 0x80000000ull
#define BP_CFG_SHIFT_E 31
#define BP_CFG_MASK_TID 0x7FFFFF00ull /* Depends on CPU */
@@ -231,25 +194,6 @@ bp_config_source(device_t ic, int src, i
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)
{
@@ -266,7 +210,6 @@ beripic_fdt_attach(device_t dev)
{
char configstr[64];
struct beripic_softc *sc;
- struct fdt_ic *fic;
pcell_t nhard, nsoft;
phandle_t ph;
int error, i, src;
@@ -352,7 +295,7 @@ beripic_fdt_attach(device_t dev)
}
sc->bp_nirqs = i;
- ph = ofw_bus_gen_get_node(device_get_parent(dev), dev);
+ ph = ofw_bus_get_node(dev);
#ifndef SMP
sc->bp_nthreads = 1;
@@ -390,15 +333,6 @@ beripic_fdt_attach(device_t dev)
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;
sc->bp_src_rman.rm_type = RMAN_ARRAY;
@@ -436,10 +370,7 @@ beripic_fdt_attach(device_t dev)
bp_config_source(dev, src, 0, 0, 0);
}
- fic = malloc(sizeof(*fic), M_BERIPIC, M_WAITOK|M_ZERO);
- fic->iph = ph;
- fic->dev = dev;
- SLIST_INSERT_HEAD(&fdt_ic_list_head, fic, fdt_ics);
+ mips_register_pic(dev, 0, nhard + nsoft, ph);
return (0);
err:
@@ -448,184 +379,33 @@ err:
return (error);
}
-static struct resource *
-beripic_alloc_intr(device_t ic, device_t child, int *rid, u_long irq,
- u_int flags)
-{
- struct beripic_softc *sc;
- struct resource *rv;
-
- sc = device_get_softc(ic);
-
- rv = rman_reserve_resource(&(sc->bp_src_rman), irq, irq, 1, flags,
- child);
- if (rv == NULL)
- printf("%s: could not reserve source interrupt for %s\n",
- __func__, device_get_nameunit(child));
- rman_set_rid(rv, *rid);
-
- if ((flags & RF_ACTIVE) &&
- beripic_activate_intr(ic, rv) != 0) {
- printf("%s: could not activate interrupt\n", __func__);
- rman_release_resource(rv);
- return (NULL);
- }
-
- return (rv);
-}
-
-static int
-beripic_release_intr(device_t ic, struct resource *r)
-{
-
- return (rman_release_resource(r));
-}
-
-static int
-beripic_activate_intr(device_t ic, struct resource *r)
-{
-
- return (rman_activate_resource(r));
-}
-
-static int
-beripic_deactivate_intr(device_t ic, struct resource *r)
-{
-
- return (rman_deactivate_resource(r));
-}
-
-static int
-beripic_config_intr(device_t dev, int irq, enum intr_trigger trig,
+static void
+beripic_config_intr(device_t dev, u_int irq, enum intr_trigger trig,
enum intr_polarity pol)
{
-
- if (trig != INTR_TRIGGER_CONFORM || pol != INTR_POLARITY_CONFORM)
- return (EINVAL);
-
- return (0);
}
-static int
-beripic_setup_intr(device_t ic, device_t child, struct resource *irq,
- int flags, driver_filter_t *filter, driver_intr_t *intr, void *arg,
- void **cookiep)
+static void
+beripic_enable(device_t ic, u_int irq, u_int vector)
{
struct beripic_softc *sc;
- struct beripic_intr_arg *bpia;
- struct beripic_cookie *bpc;
- int error;
- u_long hirq, src, tid;
+ u_long tid;
sc = device_get_softc(ic);
- src = rman_get_start(irq);
-
- KASSERT(src < sc->bp_nsrcs, ("source (%lu) 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;
-
mtx_lock(&(sc->bp_cfgmtx));
- bpc->hirq = sc->bp_irqs[sc->bp_next_irq];
- hirq = rman_get_start(bpc->hirq);
tid = sc->bp_next_tid;
- error = BUS_SETUP_INTR(device_get_parent(ic), ic, bpc->hirq, flags,
- beripic_filter, intr == NULL ? NULL : beripic_intr, bpia,
- &(bpc->cookie));
- if (error != 0)
- goto err;
-
#ifdef NOTYET
#ifdef SMP
- /* XXX: bind ithread to cpu */
+ /* implement bind operation */
sc->bp_next_tid++;
if (sc->bp_next_tid >= sc->bp_nthreads)
sc->bp_next_tid = 0;
#endif
#endif
- if (sc->bp_next_tid == 0) {
- sc->bp_next_irq++;
- if (sc->bp_next_irq >= sc->bp_nirqs)
- sc->bp_next_irq = 0;
- }
+ bp_config_source(ic, irq, 1, tid, vector);
mtx_unlock(&(sc->bp_cfgmtx));
-
- *cookiep = bpc;
-
- bp_config_source(ic, rman_get_start(irq), 1, tid, hirq);
-
- return (0);
-err:
- free(bpc, M_BERIPIC);
- free(bpia, M_BERIPIC);
-
- return (error);
-}
-
-static int
-beripic_teardown_intr(device_t dev, device_t child, struct resource *irq,
- void *cookie)
-{
- struct beripic_cookie *bpc;
- int error;
-
- bpc = cookie;
-
- bp_config_source(dev, rman_get_start(irq), 0, 0, 0);
-
- free(bpc->bpia, M_BERIPIC);
-
- error = BUS_TEARDOWN_INTR(device_get_parent(dev), dev, bpc->hirq,
- bpc->cookie);
-
- free(bpc, M_BERIPIC);
-
- return (error);
-}
-
-static int
-beripic_filter(void *arg)
-{
- struct beripic_intr_arg *bpic;
-
- bpic = arg;
-
-#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));
-}
-
-static void
-beripic_intr(void *arg)
-{
- struct beripic_intr_arg *bpic;
-
- bpic = arg;
-
- KASSERT(bpic->intr != NULL,
- ("%s installed, but no child intr", __func__));
-
- bpic->intr(bpic->arg);
}
#ifdef SMP
@@ -667,6 +447,30 @@ beripic_clear_ipi(device_t ic, u_int tid
}
#endif
+static void
+beripic_dispatch(device_t dev, struct trapframe *tf)
+{
+ /* XXX figure out which line fired, call mips_dispatch_intr(vector)
+ * for each. Should call this from a filter handler for the beripic's
+ * interrupt
+ */
+}
+
+static void
+beripic_mask(device_t dev, u_int irq)
+{
+}
+
+static void
+beripic_unmask(device_t dev, u_int irq)
+{
+}
+
+static void
+beripic_eoi(device_t dev, u_int irq)
+{
+}
+
devclass_t beripic_devclass;
static device_method_t beripic_fdt_methods[] = {
@@ -674,19 +478,16 @@ static device_method_t beripic_fdt_metho
DEVMETHOD(device_probe, beripic_fdt_probe),
DEVMETHOD(device_attach, beripic_fdt_attach),
- DEVMETHOD(fdt_ic_activate_intr, beripic_activate_intr),
- DEVMETHOD(fdt_ic_alloc_intr, beripic_alloc_intr),
- DEVMETHOD(fdt_ic_config_intr, beripic_config_intr),
- DEVMETHOD(fdt_ic_deactivate_intr, beripic_deactivate_intr),
- DEVMETHOD(fdt_ic_release_intr, beripic_release_intr),
- DEVMETHOD(fdt_ic_setup_intr, beripic_setup_intr),
- DEVMETHOD(fdt_ic_teardown_intr, beripic_teardown_intr),
-
+ /* PIC interface */
+ DEVMETHOD(pic_dispatch, beripic_dispatch),
+ DEVMETHOD(pic_enable, beripic_enable),
+ DEVMETHOD(pic_config, beripic_config_intr),
#ifdef SMP
- DEVMETHOD(fdt_ic_setup_ipi, beripic_setup_ipi),
- DEVMETHOD(fdt_ic_clear_ipi, beripic_clear_ipi),
- DEVMETHOD(fdt_ic_send_ipi, beripic_send_ipi),
+ DEVMETHOD(pic_ipi, beripic_send_ipi),
#endif
+ DEVMETHOD(pic_mask, beripic_mask),
+ DEVMETHOD(pic_unmask, beripic_unmask),
+ DEVMETHOD(pic_eoi, beripic_eoi),
{ 0, 0 },
};
More information about the svn-src-user
mailing list