summaryrefslogtreecommitdiffstats
path: root/sys/sparc64/sbus
diff options
context:
space:
mode:
authortmm <tmm@FreeBSD.org>2003-01-06 21:59:54 +0000
committertmm <tmm@FreeBSD.org>2003-01-06 21:59:54 +0000
commit64ef30fddd206a400119c7364e525bdcd940a3de (patch)
tree62a440f3b650bf019a90f1a972512d13433ad63a /sys/sparc64/sbus
parenteabf06862c56aaa33ce08be99f7aefa90a80fd4b (diff)
downloadFreeBSD-src-64ef30fddd206a400119c7364e525bdcd940a3de.zip
FreeBSD-src-64ef30fddd206a400119c7364e525bdcd940a3de.tar.gz
Change the iommu code to be able to handle more than one DVMA area per
map. Use this new feature to implement iommu_dvmamap_load_mbuf() and iommu_dvmamap_load_uio() functions in terms of a new helper function, iommu_dvmamap_load_buffer(). Reimplement the iommu_dvmamap_load() to use it, too. This requires some changes to the map format; in addition to that, remove unused or redundant members. Add SBus and Psycho wrappers for the new functions, and make them available through the respective DMA tags.
Diffstat (limited to 'sys/sparc64/sbus')
-rw-r--r--sys/sparc64/sbus/sbus.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/sys/sparc64/sbus/sbus.c b/sys/sparc64/sbus/sbus.c
index f050c7c..16b846b 100644
--- a/sys/sparc64/sbus/sbus.c
+++ b/sys/sparc64/sbus/sbus.c
@@ -237,6 +237,10 @@ static int sbus_dmamap_create(bus_dma_tag_t, bus_dma_tag_t, int,
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 int sbus_dmamap_load_mbuf(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t,
+ struct mbuf *, bus_dmamap_callback2_t *, void *, int);
+static int sbus_dmamap_load_uio(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t,
+ struct uio *, bus_dmamap_callback2_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);
@@ -341,6 +345,8 @@ sbus_probe(device_t dev)
sc->sc_cdmatag->dt_dmamap_create = sbus_dmamap_create;
sc->sc_cdmatag->dt_dmamap_destroy = sbus_dmamap_destroy;
sc->sc_cdmatag->dt_dmamap_load = sbus_dmamap_load;
+ sc->sc_cdmatag->dt_dmamap_load_mbuf = sbus_dmamap_load_mbuf;
+ sc->sc_cdmatag->dt_dmamap_load_uio = sbus_dmamap_load_uio;
sc->sc_cdmatag->dt_dmamap_unload = sbus_dmamap_unload;
sc->sc_cdmatag->dt_dmamap_sync = sbus_dmamap_sync;
sc->sc_cdmatag->dt_dmamem_alloc = sbus_dmamem_alloc;
@@ -942,6 +948,28 @@ sbus_dmamap_load(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat, bus_dmamap_t map,
callback, callback_arg, flags));
}
+static int
+sbus_dmamap_load_mbuf(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat,
+ bus_dmamap_t map, struct mbuf *m, bus_dmamap_callback2_t *callback,
+ void *callback_arg, int flags)
+{
+ struct sbus_softc *sc = (struct sbus_softc *)pdmat->dt_cookie;
+
+ return (iommu_dvmamap_load_mbuf(pdmat, ddmat, &sc->sc_is, map, m,
+ callback, callback_arg, flags));
+}
+
+static int
+sbus_dmamap_load_uio(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat,
+ bus_dmamap_t map, struct uio *uio, bus_dmamap_callback2_t *callback,
+ void *callback_arg, int flags)
+{
+ struct sbus_softc *sc = (struct sbus_softc *)pdmat->dt_cookie;
+
+ return (iommu_dvmamap_load_uio(pdmat, ddmat, &sc->sc_is, map, uio,
+ callback, callback_arg, flags));
+}
+
static void
sbus_dmamap_unload(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat, bus_dmamap_t map)
{
OpenPOWER on IntegriCloud