Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 20 Jun 2010 22:29:10 GMT
From:      Jakub Wojciech Klama <jceel@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 180013 for review
Message-ID:  <201006202229.o5KMTAUs096679@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@180013?ac=10

Change 180013 by jceel@jceel on 2010/06/20 22:29:03

	Implement transfer controller error handling in DaVinci EDMA.

Affected files ...

.. //depot/projects/soc2010/jceel_dma/sys/arm/davinci/davinci_edma.c#3 edit
.. //depot/projects/soc2010/jceel_dma/sys/arm/davinci/davinci_edmareg.h#3 edit

Differences ...

==== //depot/projects/soc2010/jceel_dma/sys/arm/davinci/davinci_edma.c#3 (text+ko) ====

@@ -130,6 +130,8 @@
 static void davinci_edma_intr_tcerr0(void *);
 static void davinci_edma_intr_tcerr1(void *);
 
+static void davinci_edma_tcerr(struct davinci_edma_softc *, int);
+
 #define	davinci_edma_lock(sc)			\
 	mtx_lock(&sc->ds_mtx)
 #define	davinci_edma_unlock(sc)			\
@@ -143,6 +145,10 @@
 	bus_space_read_4((_sc)->ds_bst, (_sc)->ds_bsh, DAVINCI_EDMACC_BASE + (_reg))
 #define	davinci_write_edmacc_4(_sc, _reg, _data)	\
 	bus_space_write_4((_sc)->ds_bst, (_sc)->ds_bsh, DAVINCI_EDMACC_BASE + (_reg), (_data))
+#define	davinci_read_edmatc_4(_sc, _tc, _reg)		\
+	bus_space_read_4((_sc)->ds_bst, (_sc)->ds_bsh, DAVINCI_EDMATC ## _tc ## _BASE + (_reg))
+#define	davinci_write_edmatc_4(_sc, _tc, _reg)		\
+	bus_space_write_4((_sc)->ds_bst, (_sc)->ds_bsh, DAVINCI_EDMATC ## _tc ## _BASE + (_reg), (_data))
 #define	davinci_edma_copydesc(_sc, _desc, _idx)		\
 	memcpy((uint8_t *)(DAVINCI_EDMA_BASE + DAVINCI_EDMA_PARAM(_idx)), (_desc), sizeof(param_desc))
 
@@ -419,16 +425,15 @@
 
 			if (xfer->dt_callback != NULL) {
 				xfer->dt_callback(DMAE_TRANSFER_COMPLETED,
+
 				    xfer->dt_callback_arg);
 			}
 			
 			ch->dc_status = 0;
 			davinci_write_edmacc_4(sc, DAVINCI_EDMACC_ICRH, (1 << (chno-32)));
-			ipr &= ~(1 << (chno - 32));
+			iprh &= ~(1 << (chno - 32));
 		}
 	}
-
-	debugf("interrupt servicing done");
 }
 
 static void
@@ -486,14 +491,44 @@
 davinci_edma_intr_tcerr0(void *arg)
 {
 	struct davinci_edma_softc *sc = (struct davinci_edma_softc *)arg;
-	device_printf(sc->ds_dev, "edma_intr_tcerr0\n");
+
+	davinci_edma_tcerr(sc, 0);
 }
 
 static void
 davinci_edma_intr_tcerr1(void *arg)
 {
 	struct davinci_edma_softc *sc = (struct davinci_edma_softc *)arg;
-	device_printf(sc->ds_dev, "edma_intr_tcerr1\n");
+
+	davinci_edma_tcerr(sc, 1);
+}
+
+static void
+davinci_edma_tcerr(struct davinci_edma_softc *sc, int tc)
+{
+	struct davinci_edma_channel *ch;
+	struct dmae_transfer *xfer;
+	uint32_t errstat, errdet;
+	int chno;
+
+	if (tc == 0) {
+		errstat = davinci_read_edmatc_4(sc, 0, DAVINCI_EDMATC_ERRSTAT);
+		errdet = davinci_read_edmatc_4(sc, 0, DAVINCI_EDMATC_ERRDET);
+	} else {
+		errstat = davinci_read_edmatc_4(sc, 1, DAVINCI_EDMATC_ERRSTAT);
+		errdet = davinci_read_edmatc_4(sc, 1, DAVINCI_EDMATC_ERRDET);
+	}
+
+	chno = (errstat >> DAVINCI_EDMATC_ERRDET_TCCSHIFT) & 
+	    DAVINCI_EDMATC_ERRDET_TCCMASK;
+
+	ch = &sc->ds_channels[chno];
+	xfer = dc->dc_xfer;
+
+	if (xfer->dt_callback != NULL) {
+		xfer->dt_callback(DMAE_TRANSFER_ERROR,
+		    xfer->dt_callback_arg);
+	}	
 }
 
 static device_method_t davinci_edma_methods[] = {

==== //depot/projects/soc2010/jceel_dma/sys/arm/davinci/davinci_edmareg.h#3 (text+ko) ====

@@ -110,6 +110,9 @@
 #define	DAVINCI_EDMATC_ERREN		0x124
 #define	DAVINCI_EDMATC_ERRCLR		0x128
 #define	DAVINCI_EDMATC_ERRDET		0x12c
+#define	DAVINCI_EDMATC_ERRDET_TCCSHIFT	8
+#define	DAVINCI_EDMATC_ERRDET_TCCMASK	0x3f
+#define	DAVINCI_EDMATC_ERRDET_STATMASK	0xf
 #define	DAVINCI_EDMATC_ERRCMD		0x130
 /* to be continued... */
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201006202229.o5KMTAUs096679>