summaryrefslogtreecommitdiffstats
path: root/sys/sparc64/sbus
diff options
context:
space:
mode:
authortmm <tmm@FreeBSD.org>2002-03-24 02:50:53 +0000
committertmm <tmm@FreeBSD.org>2002-03-24 02:50:53 +0000
commit6f021cf47c5937b0d64aa35385a519c0b7ab3538 (patch)
tree2e665abb3d115afe854ba801ae241f7d46e15477 /sys/sparc64/sbus
parente70f6b318dd8319c43aa52a83c367f40df3ebe0e (diff)
downloadFreeBSD-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.c72
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);
}
OpenPOWER on IntegriCloud