diff options
author | tmm <tmm@FreeBSD.org> | 2003-01-06 21:59:54 +0000 |
---|---|---|
committer | tmm <tmm@FreeBSD.org> | 2003-01-06 21:59:54 +0000 |
commit | 64ef30fddd206a400119c7364e525bdcd940a3de (patch) | |
tree | 62a440f3b650bf019a90f1a972512d13433ad63a /sys/sparc64/pci | |
parent | eabf06862c56aaa33ce08be99f7aefa90a80fd4b (diff) | |
download | FreeBSD-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/pci')
-rw-r--r-- | sys/sparc64/pci/psycho.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/sys/sparc64/pci/psycho.c b/sys/sparc64/pci/psycho.c index 5e454c0..30205c8 100644 --- a/sys/sparc64/pci/psycho.c +++ b/sys/sparc64/pci/psycho.c @@ -106,6 +106,10 @@ static int psycho_dmamap_create(bus_dma_tag_t, bus_dma_tag_t, int, static int psycho_dmamap_destroy(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t); static int psycho_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 psycho_dmamap_load_mbuf(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t, + struct mbuf *, bus_dmamap_callback2_t *, void *, int); +static int psycho_dmamap_load_uio(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t, + struct uio *, bus_dmamap_callback2_t *, void *, int); static void psycho_dmamap_unload(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t); static void psycho_dmamap_sync(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t, bus_dmasync_op_t); @@ -489,6 +493,8 @@ psycho_attach(device_t dev) sc->sc_dmat->dt_dmamap_create = psycho_dmamap_create; sc->sc_dmat->dt_dmamap_destroy = psycho_dmamap_destroy; sc->sc_dmat->dt_dmamap_load = psycho_dmamap_load; + sc->sc_dmat->dt_dmamap_load_mbuf = psycho_dmamap_load_mbuf; + sc->sc_dmat->dt_dmamap_load_uio = psycho_dmamap_load_uio; sc->sc_dmat->dt_dmamap_unload = psycho_dmamap_unload; sc->sc_dmat->dt_dmamap_sync = psycho_dmamap_sync; sc->sc_dmat->dt_dmamem_alloc = psycho_dmamem_alloc; @@ -1361,6 +1367,30 @@ psycho_dmamap_load(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat, bus_dmamap_t map, callback, callback_arg, flags)); } +static int +psycho_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 psycho_softc *sc; + + sc = (struct psycho_softc *)pdmat->dt_cookie; + return (iommu_dvmamap_load_mbuf(pdmat, ddmat, sc->sc_is, map, m, + callback, callback_arg, flags)); +} + +static int +psycho_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 psycho_softc *sc; + + sc = (struct psycho_softc *)pdmat->dt_cookie; + return (iommu_dvmamap_load_uio(pdmat, ddmat, sc->sc_is, map, uio, + callback, callback_arg, flags)); +} + static void psycho_dmamap_unload(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat, bus_dmamap_t map) { |