From 27cbbd88a297ee95096971d969fc28f1f2c7a09c Mon Sep 17 00:00:00 2001 From: scottl Date: Wed, 29 Jan 2003 07:25:27 +0000 Subject: Implement bus_dmamem_alloc_size() and bus_dmamem_free_size() as counterparts to bus_dmamem_alloc() and bus_dmamem_free(). This allows the caller to specify the size of the allocation instead of it defaulting to the max_size field of the busdma tag. This is intended to aid in converting drivers to busdma. Lots of hardware cannot understand scatter/gather lists, which forces the driver to copy the i/o buffers to a single contiguous region before sending it to the hardware. Without these new methods, this would require a new busdma tag for each operation, or a complex internal allocator/cache for each driver. Allocations greater than PAGE_SIZE are rounded up to the next PAGE_SIZE by contigmalloc(), so this is not suitable for multiple static allocations that would be better served by a single fixed-length subdivided allocation. Reviewed by: jake (sparc64) --- sys/sparc64/sbus/sbus.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'sys/sparc64/sbus') diff --git a/sys/sparc64/sbus/sbus.c b/sys/sparc64/sbus/sbus.c index d76efb5..2689090 100644 --- a/sys/sparc64/sbus/sbus.c +++ b/sys/sparc64/sbus/sbus.c @@ -244,8 +244,12 @@ static int sbus_dmamap_load_uio(bus_dma_tag_t, bus_dma_tag_t, bus_dmamap_t, 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_size(bus_dma_tag_t, bus_dma_tag_t, void **, int, + bus_dmamap_t *, bus_size_t size); static int sbus_dmamem_alloc(bus_dma_tag_t, bus_dma_tag_t, void **, int, bus_dmamap_t *); +static void sbus_dmamem_free_size(bus_dma_tag_t, bus_dma_tag_t, void *, + bus_dmamap_t, bus_size_t); static void sbus_dmamem_free(bus_dma_tag_t, bus_dma_tag_t, void *, bus_dmamap_t); @@ -349,7 +353,9 @@ sbus_probe(device_t dev) 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_size = sbus_dmamem_alloc_size; sc->sc_cdmatag->dt_dmamem_alloc = sbus_dmamem_alloc; + sc->sc_cdmatag->dt_dmamem_free_size = sbus_dmamem_free_size; sc->sc_cdmatag->dt_dmamem_free = sbus_dmamem_free; /* XXX: register as root dma tag (kluge). */ sparc64_root_dma_tag = sc->sc_cdmatag; @@ -988,6 +994,16 @@ sbus_dmamap_sync(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat, bus_dmamap_t map, } static int +sbus_dmamem_alloc_size(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat, void **vaddr, + int flags, bus_dmamap_t *mapp, bus_size_t size) +{ + struct sbus_softc *sc = (struct sbus_softc *)pdmat->cookie; + + return (iommu_dvmamem_alloc_size(pdmat, ddmat, &sc->sc_is, vaddr, flags, + mapp, size)); +} + +static int sbus_dmamem_alloc(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat, void **vaddr, int flags, bus_dmamap_t *mapp) { @@ -998,6 +1014,15 @@ sbus_dmamem_alloc(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat, void **vaddr, } static void +sbus_dmamem_free_size(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat, void *vaddr, + bus_dmamap_t map, bus_size_t size) +{ + struct sbus_softc *sc = (struct sbus_softc *)pdmat->cookie; + + iommu_dvmamem_free_size(pdmat, ddmat, &sc->sc_is, vaddr, map, size); +} + +static void sbus_dmamem_free(bus_dma_tag_t pdmat, bus_dma_tag_t ddmat, void *vaddr, bus_dmamap_t map) { -- cgit v1.1