summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpatrick <patrick@openbsd.org>2018-12-29 14:09:00 +0000
committerpatrick <patrick@openbsd.org>2018-12-29 14:09:00 +0000
commit9f55cdeb1a13662fcea43011df2390546fbee6a7 (patch)
tree440bac5dd2194c185bcd655ad59dde580643851a
parentThe i.MX SD/MMC host controller does not support zero-length DMA (diff)
downloadwireguard-openbsd-9f55cdeb1a13662fcea43011df2390546fbee6a7.tar.xz
wireguard-openbsd-9f55cdeb1a13662fcea43011df2390546fbee6a7.zip
Remove the hand-rolled maximum segment size handling in sximmc(4)
since we now have the possibility to specify it in the attach args. ok kettenis@
-rw-r--r--sys/dev/fdt/sximmc.c83
1 files changed, 35 insertions, 48 deletions
diff --git a/sys/dev/fdt/sximmc.c b/sys/dev/fdt/sximmc.c
index c9840b34d8a..73a2a0159d9 100644
--- a/sys/dev/fdt/sximmc.c
+++ b/sys/dev/fdt/sximmc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: sximmc.c,v 1.7 2018/12/04 11:25:48 kettenis Exp $ */
+/* $OpenBSD: sximmc.c,v 1.8 2018/12/29 14:09:00 patrick Exp $ */
/* $NetBSD: awin_mmc.c,v 1.23 2015/11/14 10:32:40 bouyer Exp $ */
/*-
@@ -255,7 +255,6 @@ struct sximmc_softc {
uint32_t sc_fifo_reg;
uint32_t sc_dma_ftrglevel;
- uint32_t sc_idma_xferlen;
bus_dma_segment_t sc_idma_segs[1];
int sc_idma_nsegs;
bus_size_t sc_idma_size;
@@ -307,13 +306,6 @@ sximmc_idma_setup(struct sximmc_softc *sc)
{
int error;
- if (OF_is_compatible(sc->sc_node, "allwinner,sun4i-a10-mmc") ||
- OF_is_compatible(sc->sc_node, "allwinner,sun50i-a64-emmc")) {
- sc->sc_idma_xferlen = 0x2000;
- } else {
- sc->sc_idma_xferlen = 0x10000;
- }
-
sc->sc_idma_ndesc = SXIMMC_NDESC;
sc->sc_idma_size = sizeof(struct sximmc_idma_descriptor) *
sc->sc_idma_ndesc;
@@ -450,6 +442,13 @@ sximmc_attach(struct device *parent, struct device *self, void *aux)
saa.caps |= SMC_CAPS_DMA;
}
+ if (OF_is_compatible(sc->sc_node, "allwinner,sun4i-a10-mmc") ||
+ OF_is_compatible(sc->sc_node, "allwinner,sun50i-a64-emmc")) {
+ saa.max_seg = 0x2000;
+ } else {
+ saa.max_seg = 0x10000;
+ }
+
sc->sc_sdmmc_dev = config_found(self, &saa, NULL);
}
@@ -839,51 +838,39 @@ sximmc_dma_prepare(struct sximmc_softc *sc, struct sdmmc_command *cmd)
{
struct sximmc_idma_descriptor *dma = (void *)sc->sc_idma_desc;
bus_addr_t desc_paddr = sc->sc_idma_map->dm_segs[0].ds_addr;
- bus_size_t off;
- int desc, resid, seg;
uint32_t val;
+ int seg;
+
+ if (sc->sc_idma_ndesc < cmd->c_dmamap->dm_nsegs) {
+ printf("%s: not enough descriptors for %d byte transfer!\n",
+ sc->sc_dev.dv_xname, cmd->c_datalen);
+ return EIO;
+ }
- desc = 0;
for (seg = 0; seg < cmd->c_dmamap->dm_nsegs; seg++) {
bus_addr_t paddr = cmd->c_dmamap->dm_segs[seg].ds_addr;
bus_size_t len = cmd->c_dmamap->dm_segs[seg].ds_len;
- resid = min(len, cmd->c_resid);
- off = 0;
- while (resid > 0) {
- if (desc == sc->sc_idma_ndesc)
- break;
- len = min(sc->sc_idma_xferlen, resid);
- dma[desc].dma_buf_size = htole32(len);
- dma[desc].dma_buf_addr = htole32(paddr + off);
- dma[desc].dma_config = htole32(SXIMMC_IDMA_CONFIG_CH |
- SXIMMC_IDMA_CONFIG_OWN);
- cmd->c_resid -= len;
- resid -= len;
- off += len;
- if (desc == 0) {
- dma[desc].dma_config |=
- htole32(SXIMMC_IDMA_CONFIG_FD);
- }
- if (cmd->c_resid == 0) {
- dma[desc].dma_config |=
- htole32(SXIMMC_IDMA_CONFIG_LD);
- dma[desc].dma_config |=
- htole32(SXIMMC_IDMA_CONFIG_ER);
- dma[desc].dma_next = 0;
- } else {
- dma[desc].dma_config |=
- htole32(SXIMMC_IDMA_CONFIG_DIC);
- dma[desc].dma_next = htole32(
- desc_paddr + ((desc+1) *
- sizeof(struct sximmc_idma_descriptor)));
- }
- ++desc;
+ dma[seg].dma_buf_size = htole32(len);
+ dma[seg].dma_buf_addr = htole32(paddr);
+ dma[seg].dma_config = htole32(SXIMMC_IDMA_CONFIG_CH |
+ SXIMMC_IDMA_CONFIG_OWN);
+ if (seg == 0) {
+ dma[seg].dma_config |=
+ htole32(SXIMMC_IDMA_CONFIG_FD);
+ }
+ if (seg == cmd->c_dmamap->dm_nsegs - 1) {
+ dma[seg].dma_config |=
+ htole32(SXIMMC_IDMA_CONFIG_LD);
+ dma[seg].dma_config |=
+ htole32(SXIMMC_IDMA_CONFIG_ER);
+ dma[seg].dma_next = 0;
+ } else {
+ dma[seg].dma_config |=
+ htole32(SXIMMC_IDMA_CONFIG_DIC);
+ dma[seg].dma_next = htole32(
+ desc_paddr + ((seg + 1) *
+ sizeof(struct sximmc_idma_descriptor)));
}
- }
- if (desc == sc->sc_idma_ndesc) {
- printf("%s: not enough descriptors for %d byte transfer!\n",
- sc->sc_dev.dv_xname, cmd->c_datalen);
- return EIO;
}
bus_dmamap_sync(sc->sc_dmat, sc->sc_idma_map, 0,