diff options
author | tmm <tmm@FreeBSD.org> | 2002-03-24 02:50:53 +0000 |
---|---|---|
committer | tmm <tmm@FreeBSD.org> | 2002-03-24 02:50:53 +0000 |
commit | 6f021cf47c5937b0d64aa35385a519c0b7ab3538 (patch) | |
tree | 2e665abb3d115afe854ba801ae241f7d46e15477 /sys/sparc64/sbus | |
parent | e70f6b318dd8319c43aa52a83c367f40df3ebe0e (diff) | |
download | FreeBSD-src-6f021cf47c5937b0d64aa35385a519c0b7ab3538.zip FreeBSD-src-6f021cf47c5937b0d64aa35385a519c0b7ab3538.tar.gz |
Revamp the busdma implementation a bit:
- change the IOMMU support code so that it supports overcommittting the
available DVMA memory, while still allocating as lazily as possible.
This is achieved by limiting the preallocation, and deferring the
allocation to map load time when it fails. In the latter case, the
DVMA memory reserved for unloaded maps can be stolen to free up enough
memory for loading a map.
- allow NULL settings in the method tables, and search the parent tags
until an appropriate implementation is found. This allows to remove some
kluges in the old implementation.
Diffstat (limited to 'sys/sparc64/sbus')
-rw-r--r-- | sys/sparc64/sbus/sbus.c | 72 |
1 files changed, 40 insertions, 32 deletions
diff --git a/sys/sparc64/sbus/sbus.c b/sys/sparc64/sbus/sbus.c index d55a767..8825630 100644 --- a/sys/sparc64/sbus/sbus.c +++ b/sys/sparc64/sbus/sbus.c @@ -231,14 +231,18 @@ static void sbus_pwrfail(void *); /* * DVMA routines */ -static int sbus_dmamap_create(bus_dma_tag_t, int, bus_dmamap_t *); -static int sbus_dmamap_destroy(bus_dma_tag_t, bus_dmamap_t); -static int sbus_dmamap_load(bus_dma_tag_t, bus_dmamap_t, void *, bus_size_t, - bus_dmamap_callback_t *, void *, int); -static void sbus_dmamap_unload(bus_dma_tag_t, bus_dmamap_t); -static void sbus_dmamap_sync(bus_dma_tag_t, bus_dmamap_t, bus_dmasync_op_t); -static int sbus_dmamem_alloc(bus_dma_tag_t, void **, int, bus_dmamap_t *); -static void sbus_dmamem_free(bus_dma_tag_t, void *, bus_dmamap_t); +static int sbus_dmamap_create(bus_dma_tag_t, bus_dma_tag_t, int, + bus_dmamap_t *); +static int sbus_dmamap_destroy(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t); +static int sbus_dmamap_load(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t, void *, + bus_size_t, bus_dmamap_callback_t *, void *, int); +static void sbus_dmamap_unload(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t); +static void sbus_dmamap_sync(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t, + bus_dmasync_op_t); +static int sbus_dmamem_alloc(bus_dma_tag_t, bus_dma_tag_t, void **, int, + bus_dmamap_t *); +static void sbus_dmamem_free(bus_dma_tag_t, bus_dma_tag_t, void *, + bus_dmamap_t); static device_method_t sbus_methods[] = { /* Device interface */ @@ -909,62 +913,66 @@ sbus_alloc_bustag(struct sbus_softc *sc) } static int -sbus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp) +sbus_dmamap_create(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat, int flags, + bus_dmamap_t *mapp) { - struct sbus_softc *sc = (struct sbus_softc *)dmat->cookie; + struct sbus_softc *sc = (struct sbus_softc *)pdmat->cookie; - return (iommu_dvmamap_create(dmat, &sc->sc_is, flags, mapp)); + return (iommu_dvmamap_create(pdmat, ddmat, &sc->sc_is, flags, mapp)); } static int -sbus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) +sbus_dmamap_destroy(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat, bus_dmamap_t map) { - struct sbus_softc *sc = (struct sbus_softc *)dmat->cookie; + struct sbus_softc *sc = (struct sbus_softc *)pdmat->cookie; - return (iommu_dvmamap_destroy(dmat, &sc->sc_is, map)); + return (iommu_dvmamap_destroy(pdmat, ddmat, &sc->sc_is, map)); } static int -sbus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, - bus_size_t buflen, bus_dmamap_callback_t *callback, void *callback_arg, - int flags) +sbus_dmamap_load(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat, bus_dmamap_t map, + void *buf, bus_size_t buflen, bus_dmamap_callback_t *callback, + void *callback_arg, int flags) { - struct sbus_softc *sc = (struct sbus_softc *)dmat->cookie; + struct sbus_softc *sc = (struct sbus_softc *)pdmat->cookie; - return (iommu_dvmamap_load(dmat, &sc->sc_is, map, buf, buflen, callback, - callback_arg, flags)); + return (iommu_dvmamap_load(pdmat, ddmat, &sc->sc_is, map, buf, buflen, + callback, callback_arg, flags)); } static void -sbus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map) +sbus_dmamap_unload(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat, bus_dmamap_t map) { - struct sbus_softc *sc = (struct sbus_softc *)dmat->cookie; + struct sbus_softc *sc = (struct sbus_softc *)pdmat->cookie; - iommu_dvmamap_unload(dmat, &sc->sc_is, map); + iommu_dvmamap_unload(pdmat, ddmat, &sc->sc_is, map); } static void -sbus_dmamap_sync(bus_dma_tag_t dmat, bus_dmamap_t map, +sbus_dmamap_sync(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat, bus_dmamap_t map, bus_dmasync_op_t op) { - struct sbus_softc *sc = (struct sbus_softc *)dmat->cookie; + struct sbus_softc *sc = (struct sbus_softc *)pdmat->cookie; - iommu_dvmamap_sync(dmat, &sc->sc_is, map, op); + iommu_dvmamap_sync(pdmat, ddmat, &sc->sc_is, map, op); } static int -sbus_dmamem_alloc(bus_dma_tag_t dmat, void **vaddr, int flags, bus_dmamap_t *mapp) +sbus_dmamem_alloc(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat, void **vaddr, + int flags, bus_dmamap_t *mapp) { - struct sbus_softc *sc = (struct sbus_softc *)dmat->cookie; + struct sbus_softc *sc = (struct sbus_softc *)pdmat->cookie; - return (iommu_dvmamem_alloc(dmat, &sc->sc_is, vaddr, flags, mapp)); + return (iommu_dvmamem_alloc(pdmat, ddmat, &sc->sc_is, vaddr, flags, + mapp)); } static void -sbus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) +sbus_dmamem_free(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat, void *vaddr, + bus_dmamap_t map) { - struct sbus_softc *sc = (struct sbus_softc *)dmat->cookie; + struct sbus_softc *sc = (struct sbus_softc *)pdmat->cookie; - iommu_dvmamem_free(dmat, &sc->sc_is, vaddr, map); + iommu_dvmamem_free(pdmat, ddmat, &sc->sc_is, vaddr, map); } |