On Sat, Dec 30, 2017 at 08:39:42PM +0200, Artturi Alm wrote: > Hi, > > porting sdhc driver(bcm2835_emmc.c) from NetBSD does lack something > like this, among possibly few other (small?) changes, but consider this > as a step towards. > > Comments? to keep changes minimal/safe/easy to review like below, or to > backport in bigger chunks? > > -Artturi >
Hi, while working out the second step i came to a conclusion, that the diff should work in theory like below, and be easier to review w/o the use of SHF_USE_DMA flag. any comments? -Artturi diff --git a/sys/dev/sdmmc/sdhc.c b/sys/dev/sdmmc/sdhc.c index c242a600d4a..f65790ff581 100644 --- a/sys/dev/sdmmc/sdhc.c +++ b/sys/dev/sdmmc/sdhc.c @@ -187,6 +187,10 @@ sdhc_host_found(struct sdhc_softc *sc, bus_space_tag_t iot, /* Use DMA if the host system and the controller support it. */ if (usedma && ISSET(caps, SDHC_ADMA2_SUPP)) SET(hp->flags, SHF_USE_DMA); + if (!usedma) + sc->sc_extdma_transfer = NULL; + else if (sc->sc_extdma_transfer) + CLR(hp->flags, SHF_USE_DMA); /* * Determine the base clock frequency. (2.2.24) @@ -302,6 +306,8 @@ sdhc_host_found(struct sdhc_softc *sc, bus_space_tag_t iot, saa.dmat = sc->sc_dmat; if (ISSET(hp->flags, SHF_USE_DMA)) saa.caps |= SMC_CAPS_DMA; + else if (sc->sc_extdma_transfer) + saa.caps |= SMC_CAPS_DMA; if (ISSET(caps, SDHC_HIGH_SPEED_SUPP)) saa.caps |= SMC_CAPS_SD_HIGHSPEED; @@ -939,6 +945,16 @@ sdhc_transfer_data(struct sdhc_host *hp, struct sdmmc_command *cmd) if (cmd->c_dmamap) { int status; + if (sc->sc_extdma_transfer != NULL) { + error = sc->sc_extdma_transfer(sc, cmd); + if (error == 0 && !sdhc_wait_intr(hp, + SDHC_TRANSFER_COMPLETE, SDHC_DMA_TIMEOUT)) { + DPRINTF(1,("%s: timeout\n", __func__)); + error = ETIMEDOUT; + } + goto done; + } + error = 0; for (;;) { status = sdhc_wait_intr(hp, diff --git a/sys/dev/sdmmc/sdhcvar.h b/sys/dev/sdmmc/sdhcvar.h index 9d4d759a2bc..5c0f462cfe6 100644 --- a/sys/dev/sdmmc/sdhcvar.h +++ b/sys/dev/sdmmc/sdhcvar.h @@ -22,6 +22,7 @@ #include <machine/bus.h> struct sdhc_host; +struct sdmmc_command; struct sdhc_softc { struct device sc_dev; @@ -33,6 +34,7 @@ struct sdhc_softc { int (*sc_card_detect)(struct sdhc_softc *); int (*sc_signal_voltage)(struct sdhc_softc *, int); + int (*sc_extdma_transfer)(struct sdhc_softc *, struct sdmmc_command *); }; /* Host controller functions called by the attachment driver. */