Module Name:    src
Committed By:   mlelstv
Date:           Sun Aug  9 13:06:44 UTC 2015

Modified Files:
        src/sys/arch/arm/broadcom: bcm2835_dmac.c bcm2835_dmac.h bcm2835_emmc.c

Log Message:
Invoke callback routine for all DMA interrupts.
Pass status and error bits to callback instead of filtering them early.
Adjust the current only callback routine in the EMMC driver.


To generate a diff of this commit:
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/arm/broadcom/bcm2835_dmac.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/broadcom/bcm2835_dmac.h
cvs rdiff -u -r1.27 -r1.28 src/sys/arch/arm/broadcom/bcm2835_emmc.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/broadcom/bcm2835_dmac.c
diff -u src/sys/arch/arm/broadcom/bcm2835_dmac.c:1.12 src/sys/arch/arm/broadcom/bcm2835_dmac.c:1.13
--- src/sys/arch/arm/broadcom/bcm2835_dmac.c:1.12	Sun Aug  2 16:46:12 2015
+++ src/sys/arch/arm/broadcom/bcm2835_dmac.c	Sun Aug  9 13:06:44 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: bcm2835_dmac.c,v 1.12 2015/08/02 16:46:12 jmcneill Exp $ */
+/* $NetBSD: bcm2835_dmac.c,v 1.13 2015/08/09 13:06:44 mlelstv Exp $ */
 
 /*-
  * Copyright (c) 2014 Jared D. McNeill <[email protected]>
@@ -29,7 +29,7 @@
 #include "opt_ddb.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bcm2835_dmac.c,v 1.12 2015/08/02 16:46:12 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bcm2835_dmac.c,v 1.13 2015/08/09 13:06:44 mlelstv Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -53,7 +53,7 @@ struct bcm_dmac_channel {
 	struct bcm_dmac_softc *ch_sc;
 	void *ch_ih;
 	uint8_t ch_index;
-	void (*ch_callback)(void *);
+	void (*ch_callback)(uint32_t, uint32_t, void *);
 	void *ch_callbackarg;
 	uint32_t ch_debug;
 };
@@ -165,23 +165,26 @@ bcm_dmac_intr(void *priv)
 {
 	struct bcm_dmac_channel *ch = priv;
 	struct bcm_dmac_softc *sc = ch->ch_sc;
-	uint32_t cs;
+	uint32_t cs, ce;
 
 	cs = DMAC_READ(sc, DMAC_CS(ch->ch_index));
-	if (!(cs & DMAC_CS_INTMASK))
-		return 0;
-
 	DMAC_WRITE(sc, DMAC_CS(ch->ch_index), cs);
+	cs &= DMAC_CS_INT | DMAC_CS_END | DMAC_CS_ERROR;
+
+	ce = DMAC_READ(sc, DMAC_DEBUG(ch->ch_index));
+	ce &= DMAC_DEBUG_READ_ERROR | DMAC_DEBUG_FIFO_ERROR
+	    | DMAC_DEBUG_READ_LAST_NOT_SET_ERROR;
+	DMAC_WRITE(sc, DMAC_DEBUG(ch->ch_index), ce);
 
 	if (ch->ch_callback)
-		ch->ch_callback(ch->ch_callbackarg);
+		ch->ch_callback(cs, ce, ch->ch_callbackarg);
 
 	return 1;
 }
 
 struct bcm_dmac_channel *
-bcm_dmac_alloc(enum bcm_dmac_type type, int ipl, void (*cb)(void *),
-    void *cbarg)
+bcm_dmac_alloc(enum bcm_dmac_type type, int ipl,
+    void (*cb)(uint32_t, uint32_t, void *), void *cbarg)
 {
 	struct bcm_dmac_softc *sc;
 	struct bcm_dmac_channel *ch = NULL;

Index: src/sys/arch/arm/broadcom/bcm2835_dmac.h
diff -u src/sys/arch/arm/broadcom/bcm2835_dmac.h:1.3 src/sys/arch/arm/broadcom/bcm2835_dmac.h:1.4
--- src/sys/arch/arm/broadcom/bcm2835_dmac.h:1.3	Fri Sep 12 19:33:45 2014
+++ src/sys/arch/arm/broadcom/bcm2835_dmac.h	Sun Aug  9 13:06:44 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: bcm2835_dmac.h,v 1.3 2014/09/12 19:33:45 jakllsch Exp $ */
+/* $NetBSD: bcm2835_dmac.h,v 1.4 2015/08/09 13:06:44 mlelstv Exp $ */
 
 /*-
  * Copyright (c) 2014 Jared D. McNeill <[email protected]>
@@ -102,7 +102,7 @@ enum bcm_dmac_type {
 struct bcm_dmac_channel;
 
 struct bcm_dmac_channel *bcm_dmac_alloc(enum bcm_dmac_type, int,
-					void (*)(void *), void *);
+				void (*)(uint32_t, uint32_t, void *), void *);
 void bcm_dmac_free(struct bcm_dmac_channel *);
 void bcm_dmac_set_conblk_addr(struct bcm_dmac_channel *, bus_addr_t);
 int bcm_dmac_transfer(struct bcm_dmac_channel *);

Index: src/sys/arch/arm/broadcom/bcm2835_emmc.c
diff -u src/sys/arch/arm/broadcom/bcm2835_emmc.c:1.27 src/sys/arch/arm/broadcom/bcm2835_emmc.c:1.28
--- src/sys/arch/arm/broadcom/bcm2835_emmc.c:1.27	Sun Aug  9 13:03:10 2015
+++ src/sys/arch/arm/broadcom/bcm2835_emmc.c	Sun Aug  9 13:06:44 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: bcm2835_emmc.c,v 1.27 2015/08/09 13:03:10 mlelstv Exp $	*/
+/*	$NetBSD: bcm2835_emmc.c,v 1.28 2015/08/09 13:06:44 mlelstv Exp $	*/
 
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bcm2835_emmc.c,v 1.27 2015/08/09 13:03:10 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bcm2835_emmc.c,v 1.28 2015/08/09 13:06:44 mlelstv Exp $");
 
 #include "bcmdmac.h"
 
@@ -82,7 +82,7 @@ static void bcmemmc_attach(device_t, dev
 static void bcmemmc_attach_i(device_t);
 #if NBCMDMAC > 0
 static int bcmemmc_xfer_data_dma(struct sdhc_softc *, struct sdmmc_command *);
-static void bcmemmc_dma_done(void *);
+static void bcmemmc_dma_done(uint32_t, uint32_t, void *);
 #endif
 
 CFATTACH_DECL_NEW(bcmemmc, sizeof(struct bcmemmc_softc),
@@ -331,14 +331,19 @@ bcmemmc_xfer_data_dma(struct sdhc_softc 
 }
 
 static void
-bcmemmc_dma_done(void *arg)
+bcmemmc_dma_done(uint32_t status, uint32_t error, void *arg)
 {
 	struct bcmemmc_softc * const sc = arg;
 	kmutex_t *plock = sdhc_host_lock(sc->sc_hosts[0]);
 
+	if (status != (DMAC_CS_INT|DMAC_CS_END))
+		device_printf(sc->sc.sc_dev, "status %#x error %#x\n",
+			status,error);
+
 	mutex_enter(plock);
 	KASSERT(sc->sc_state == EMMC_DMA_STATE_BUSY);
-	sc->sc_state = EMMC_DMA_STATE_IDLE;
+	if (status & DMAC_CS_END)
+		sc->sc_state = EMMC_DMA_STATE_IDLE;
 	cv_broadcast(&sc->sc_cv);
 	mutex_exit(plock);
 }

Reply via email to