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