Index: src/sys/amd64/amd64/busdma_machdep.c =================================================================== RCS file: /home/ncvs/src/sys/amd64/amd64/busdma_machdep.c,v retrieving revision 1.79 diff -u -r1.79 busdma_machdep.c --- src/sys/amd64/amd64/busdma_machdep.c 6 Mar 2007 18:28:42 -0000 1.79 +++ src/sys/amd64/amd64/busdma_machdep.c 18 Mar 2007 17:06:12 -0000 @@ -48,6 +48,7 @@ #include #include #include +#include #define MAX_BPAGES 8192 @@ -522,6 +523,9 @@ } else if ((uintptr_t)*vaddr & (dmat->alignment - 1)) { printf("bus_dmamem_alloc failed to align memory properly.\n"); } + if (flags & BUS_DMA_NOCACHE) + pmap_change_attr((vm_offset_t)*vaddr, dmat->maxsize, + PAT_UNCACHEABLE); CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", __func__, dmat, dmat->flags, ENOMEM); return (0); Index: src/sys/i386/i386/busdma_machdep.c =================================================================== RCS file: /home/ncvs/src/sys/i386/i386/busdma_machdep.c,v retrieving revision 1.85 diff -u -r1.85 busdma_machdep.c --- src/sys/i386/i386/busdma_machdep.c 6 Mar 2007 18:28:42 -0000 1.85 +++ src/sys/i386/i386/busdma_machdep.c 18 Mar 2007 17:06:12 -0000 @@ -51,6 +51,7 @@ #include #include #include +#include #define MAX_BPAGES 512 #define BUS_DMA_COULD_BOUNCE BUS_DMA_BUS3 @@ -530,6 +531,9 @@ } else if ((uintptr_t)*vaddr & (dmat->alignment - 1)) { printf("bus_dmamem_alloc failed to align memory properly.\n"); } + if (flags & BUS_DMA_NOCACHE) + pmap_change_attr((vm_offset_t)*vaddr, dmat->maxsize, + PAT_UNCACHEABLE); CTR4(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d", __func__, dmat, dmat->flags, ENOMEM); return (0); Index: src/sys/dev/sound/pci/hda/hdac.c =================================================================== RCS file: /home/ncvs/src/sys/dev/sound/pci/hda/hdac.c,v retrieving revision 1.30 diff -u -r1.30 hdac.c --- src/sys/dev/sound/pci/hda/hdac.c 16 Mar 2007 17:18:17 -0000 1.30 +++ src/sys/dev/sound/pci/hda/hdac.c 18 Mar 2007 15:12:20 -0000 @@ -1166,6 +1166,11 @@ * This function allocate and setup a dma region (struct hdac_dma). * It must be freed by a corresponding hdac_dma_free. ****************************************************************************/ + +#ifndef BUS_DMA_NOCACHE +#define BUS_DMA_NOCACHE BUS_DMA_COHERENT +#endif + static int hdac_dma_alloc(struct hdac_softc *sc, struct hdac_dma *dma, bus_size_t size) { @@ -1203,7 +1208,8 @@ * Allocate DMA memory */ result = bus_dmamem_alloc(dma->dma_tag, (void **)&dma->dma_vaddr, - BUS_DMA_NOWAIT | BUS_DMA_COHERENT, &dma->dma_map); + BUS_DMA_NOWAIT | BUS_DMA_COHERENT | BUS_DMA_NOCACHE | BUS_DMA_ZERO, + &dma->dma_map); if (result != 0) { device_printf(sc->dev, "%s: bus_dmamem_alloc failed (%x)\n", __func__, result); @@ -1221,7 +1227,6 @@ __func__, result); goto fail; } - bzero((void *)dma->dma_vaddr, size); hdac_dma_nocache(dma->dma_vaddr); return (0); @@ -2674,7 +2679,9 @@ return (NULL); } - if (sndbuf_alloc(ch->b, sc->chan_dmat, sc->chan_size) != 0) + if (sndbuf_dmamem_alloc(ch->b, sc->chan_dmat, + BUS_DMA_NOWAIT | BUS_DMA_COHERENT | BUS_DMA_NOCACHE | BUS_DMA_ZERO, + sc->chan_size) != 0) return (NULL); hdac_dma_nocache(ch->b->buf); Index: src/sys/dev/sound/pcm/buffer.c =================================================================== RCS file: /home/ncvs/src/sys/dev/sound/pcm/buffer.c,v retrieving revision 1.32 diff -u -r1.32 buffer.c --- src/sys/dev/sound/pcm/buffer.c 16 Mar 2007 17:13:44 -0000 1.32 +++ src/sys/dev/sound/pcm/buffer.c 18 Mar 2007 15:12:20 -0000 @@ -83,16 +83,18 @@ */ int -sndbuf_alloc(struct snd_dbuf *b, bus_dma_tag_t dmatag, unsigned int size) +sndbuf_dmamem_alloc(struct snd_dbuf *b, bus_dma_tag_t dmatag, int dmaflags, + unsigned int size) { int ret; b->dmatag = dmatag; + b->dmaflags = dmaflags; b->maxsize = size; b->bufsize = b->maxsize; b->buf_addr = 0; b->flags |= SNDBUF_F_MANAGED; - if (bus_dmamem_alloc(b->dmatag, (void **)&b->buf, BUS_DMA_NOWAIT, + if (bus_dmamem_alloc(b->dmatag, (void **)&b->buf, b->dmaflags, &b->dmamap)) return (ENOMEM); if (bus_dmamap_load(b->dmatag, b->dmamap, b->buf, b->maxsize, @@ -105,10 +107,17 @@ ret = sndbuf_resize(b, 2, b->maxsize / 2); if (ret != 0) sndbuf_free(b); + return (ret); } int +sndbuf_alloc(struct snd_dbuf *b, bus_dma_tag_t dmatag, unsigned int size) +{ + return (sndbuf_dmamem_alloc(b, dmatag, BUS_DMA_NOWAIT, size)); +} + +int sndbuf_setup(struct snd_dbuf *b, void *buf, unsigned int size) { if (buf) Index: src/sys/dev/sound/pcm/buffer.h =================================================================== RCS file: /home/ncvs/src/sys/dev/sound/pcm/buffer.h,v retrieving revision 1.14 diff -u -r1.14 buffer.h --- src/sys/dev/sound/pcm/buffer.h 1 Feb 2007 09:46:03 -0000 1.14 +++ src/sys/dev/sound/pcm/buffer.h 18 Mar 2007 15:12:20 -0000 @@ -54,6 +54,7 @@ u_int32_t flags; bus_dmamap_t dmamap; bus_dma_tag_t dmatag; + int dmaflags; u_int32_t buf_addr; struct selinfo sel; struct pcm_channel *channel; @@ -65,6 +66,7 @@ void sndbuf_dump(struct snd_dbuf *b, char *s, u_int32_t what); +int sndbuf_dmamem_alloc(struct snd_dbuf *b, bus_dma_tag_t dmatag, int dmaflags, unsigned int size); int sndbuf_alloc(struct snd_dbuf *b, bus_dma_tag_t dmatag, unsigned int size); int sndbuf_setup(struct snd_dbuf *b, void *buf, unsigned int size); void sndbuf_free(struct snd_dbuf *b);