svn commit: r283138 - head/sys/arm/ti

Rui Paulo rpaulo at FreeBSD.org
Wed May 20 06:23:02 UTC 2015


Author: rpaulo
Date: Wed May 20 06:23:01 2015
New Revision: 283138
URL: https://svnweb.freebsd.org/changeset/base/283138

Log:
  ti_pruss: pass the correct IRQ to userland.
  
  Also, fix several problems with the kqueue notification.
  
  Submitted by:	Manuel Stühn freebsdnewbie at freenet.de

Modified:
  head/sys/arm/ti/ti_pruss.c
  head/sys/arm/ti/ti_pruss.h

Modified: head/sys/arm/ti/ti_pruss.c
==============================================================================
--- head/sys/arm/ti/ti_pruss.c	Wed May 20 05:49:52 2015	(r283137)
+++ head/sys/arm/ti/ti_pruss.c	Wed May 20 06:23:01 2015	(r283138)
@@ -70,7 +70,8 @@ static void 			ti_pruss_kq_read_detach(s
 static int 			ti_pruss_kq_read_event(struct knote *, long);
 static d_kqfilter_t		ti_pruss_kqfilter;
 
-#define	TI_PRUSS_IRQS	8
+#define	TI_PRUSS_IRQS		8
+
 struct ti_pruss_softc {
 	struct mtx		sc_mtx;
 	struct resource 	*sc_mem_res;
@@ -119,6 +120,7 @@ static struct resource_spec ti_pruss_irq
 	{ SYS_RES_IRQ,	    7,  RF_ACTIVE },
 	{ -1,               0,  0 }
 };
+CTASSERT(TI_PRUSS_IRQS == nitems(ti_pruss_irq_spec) - 1);
 
 static struct ti_pruss_irq_arg {
 	int 		       irq;
@@ -166,6 +168,7 @@ ti_pruss_attach(device_t dev)
 	sc = device_get_softc(dev);
 	rid = 0;
 	mtx_init(&sc->sc_mtx, "TI PRUSS", NULL, MTX_DEF);
+	knlist_init_mtx(&sc->sc_selinfo.si_note, &sc->sc_mtx);
 	sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
 	    RF_ACTIVE);
 	if (sc->sc_mem_res == NULL) {
@@ -219,6 +222,9 @@ ti_pruss_detach(device_t dev)
 			    rman_get_rid(sc->sc_irq_res[i]),
 			    sc->sc_irq_res[i]);
 	}
+	knlist_clear(&sc->sc_selinfo.si_note, 0);
+	knlist_destroy(&sc->sc_selinfo.si_note);
+	mtx_destroy(&sc->sc_mtx);
 	if (sc->sc_mem_res)
 		bus_release_resource(dev, SYS_RES_MEMORY, rman_get_rid(sc->sc_mem_res),
 		    sc->sc_mem_res);
@@ -231,13 +237,23 @@ ti_pruss_detach(device_t dev)
 static void
 ti_pruss_intr(void *arg)
 {
-	struct ti_pruss_irq_arg *iap;
-	struct ti_pruss_softc *sc;
-
-	iap = arg;
-	sc = iap->sc;
-	DPRINTF("interrupt %p", sc);
-	KNOTE_UNLOCKED(&sc->sc_selinfo.si_note, iap->irq);
+	int val;
+	struct ti_pruss_irq_arg *iap = arg;
+	struct ti_pruss_softc *sc = iap->sc;
+	/*
+	 * Interrupts pr1_host_intr[0:7] are mapped to 
+	 * Host-2 to Host-9 of PRU-ICSS IRQ-controller.
+	 */
+	const int pru_int = iap->irq + 2;
+	const int pru_int_mask = (1 << pru_int);
+
+	val = ti_pruss_reg_read(sc, PRUSS_AM33XX_INTC + PRUSS_INTC_HIER);
+	DPRINTF("interrupt %p, %d", sc, pru_int);
+	if (!(val & pru_int_mask))
+		return;
+ 	ti_pruss_reg_write(sc, PRUSS_AM33XX_INTC + PRUSS_INTC_HIDISR, 
+	    pru_int);
+	KNOTE_UNLOCKED(&sc->sc_selinfo.si_note, pru_int);
 }
 
 static int

Modified: head/sys/arm/ti/ti_pruss.h
==============================================================================
--- head/sys/arm/ti/ti_pruss.h	Wed May 20 05:49:52 2015	(r283137)
+++ head/sys/arm/ti/ti_pruss.h	Wed May 20 06:23:01 2015	(r283138)
@@ -33,4 +33,8 @@
 #define	PRUSS_AM33XX_REV	0x4e82A900
 #define	PRUSS_AM33XX_INTC	0x20000
 
+#define PRUSS_INTC_HIER		0x1500
+#define PRUSS_INTC_HIDISR	0x0038
+#define PRUSS_INTC_HIPIR_BASE	0x0900
+
 #endif /* _TI_PRUSS_H_ */


More information about the svn-src-head mailing list