PERFORCE change 180013 for review
Jakub Wojciech Klama
jceel at FreeBSD.org
Sun Jun 20 22:29:13 UTC 2010
http://p4web.freebsd.org/@@180013?ac=10
Change 180013 by jceel at 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... */
More information about the p4-projects
mailing list