diff options
author | 2018-12-29 14:09:00 +0000 | |
---|---|---|
committer | 2018-12-29 14:09:00 +0000 | |
commit | 9f55cdeb1a13662fcea43011df2390546fbee6a7 (patch) | |
tree | 440bac5dd2194c185bcd655ad59dde580643851a | |
parent | The i.MX SD/MMC host controller does not support zero-length DMA (diff) | |
download | wireguard-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.c | 83 |
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, |