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>