Module Name: src Committed By: thorpej Date: Fri Aug 21 03:53:18 UTC 2009
Modified Files: src/sys/arch/ews4800mips/conf: files.ews4800mips src/sys/arch/ews4800mips/ews4800mips: bus_dma.c Log Message: Use bus_dmamem_common. To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/arch/ews4800mips/conf/files.ews4800mips cvs rdiff -u -r1.9 -r1.10 src/sys/arch/ews4800mips/ews4800mips/bus_dma.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/ews4800mips/conf/files.ews4800mips diff -u src/sys/arch/ews4800mips/conf/files.ews4800mips:1.3 src/sys/arch/ews4800mips/conf/files.ews4800mips:1.4 --- src/sys/arch/ews4800mips/conf/files.ews4800mips:1.3 Wed Feb 20 21:43:34 2008 +++ src/sys/arch/ews4800mips/conf/files.ews4800mips Fri Aug 21 03:53:18 2009 @@ -1,4 +1,4 @@ -# $NetBSD: files.ews4800mips,v 1.3 2008/02/20 21:43:34 drochner Exp $ +# $NetBSD: files.ews4800mips,v 1.4 2009/08/21 03:53:18 thorpej Exp $ maxpartitions 16 @@ -21,6 +21,8 @@ file arch/ews4800mips/ews4800mips/sector.c disk file arch/ews4800mips/ews4800mips/vtoc.c disk +file common/bus_dma/bus_dmamem_common.c + file arch/ews4800mips/ews4800mips/cons_machdep.c file dev/cons.c Index: src/sys/arch/ews4800mips/ews4800mips/bus_dma.c diff -u src/sys/arch/ews4800mips/ews4800mips/bus_dma.c:1.9 src/sys/arch/ews4800mips/ews4800mips/bus_dma.c:1.10 --- src/sys/arch/ews4800mips/ews4800mips/bus_dma.c:1.9 Wed Jun 4 12:41:41 2008 +++ src/sys/arch/ews4800mips/ews4800mips/bus_dma.c Fri Aug 21 03:53:18 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: bus_dma.c,v 1.9 2008/06/04 12:41:41 ad Exp $ */ +/* $NetBSD: bus_dma.c,v 1.10 2009/08/21 03:53:18 thorpej Exp $ */ /* * Copyright (c) 1998 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.9 2008/06/04 12:41:41 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.10 2009/08/21 03:53:18 thorpej Exp $"); /* #define BUS_DMA_DEBUG */ #include <sys/param.h> @@ -45,6 +45,8 @@ #include <machine/bus.h> #include <machine/sbdvar.h> +#include <common/bus_dma/bus_dmamem_common.h> + #include <uvm/uvm_extern.h> extern paddr_t kvtophys(vaddr_t); /* XXX */ @@ -539,57 +541,11 @@ int flags) { extern paddr_t avail_start, avail_end; - vaddr_t curaddr, lastaddr; - psize_t high; - struct vm_page *m; - struct pglist mlist; - int curseg, error; - - /* Always round the size. */ - size = round_page(size); - - high = avail_end - PAGE_SIZE; - - /* - * Allocate pages from the VM system. - */ - error = uvm_pglistalloc(size, avail_start, high, alignment, boundary, - &mlist, nsegs, (flags & BUS_DMA_NOWAIT) == 0); - if (error) - return error; - - /* - * Compute the location, size, and number of segments actually - * returned by the VM code. - */ - m = mlist.tqh_first; - curseg = 0; - lastaddr = segs[curseg].ds_addr = VM_PAGE_TO_PHYS(m); - segs[curseg].ds_len = PAGE_SIZE; - m = m->pageq.queue.tqe_next; - - for (; m != NULL; m = m->pageq.queue.tqe_next) { - curaddr = VM_PAGE_TO_PHYS(m); -#ifdef DIAGNOSTIC - if (curaddr < avail_start || curaddr >= high) { - printf("uvm_pglistalloc returned non-sensical" - " address 0x%lx\n", curaddr); - panic("_bus_dmamem_alloc"); - } -#endif - if (curaddr == (lastaddr + PAGE_SIZE)) - segs[curseg].ds_len += PAGE_SIZE; - else { - curseg++; - segs[curseg].ds_addr = curaddr; - segs[curseg].ds_len = PAGE_SIZE; - } - lastaddr = curaddr; - } - *rsegs = curseg + 1; - - return 0; + return (_bus_dmamem_alloc_range_common(t, size, alignment, boundary, + segs, nsegs, rsegs, flags, + avail_start /*low*/, + avail_end - PAGE_SIZE /*high*/)); } /* @@ -599,25 +555,8 @@ void _bus_dmamem_free(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs) { - struct vm_page *m; - bus_addr_t addr; - struct pglist mlist; - int curseg; - - /* - * Build a list of pages to free back to the VM system. - */ - TAILQ_INIT(&mlist); - for (curseg = 0; curseg < nsegs; curseg++) { - for (addr = segs[curseg].ds_addr; - addr < (segs[curseg].ds_addr + segs[curseg].ds_len); - addr += PAGE_SIZE) { - m = PHYS_TO_VM_PAGE(addr); - TAILQ_INSERT_TAIL(&mlist, m, pageq.queue); - } - } - uvm_pglistfree(&mlist); + _bus_dmamem_free_common(t, segs, nsegs); } /* @@ -628,11 +567,6 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, size_t size, void **kvap, int flags) { - vaddr_t va; - bus_addr_t addr; - int curseg; - const uvm_flag_t kmflags = - (flags & BUS_DMA_NOWAIT) != 0 ? UVM_KMF_NOWAIT : 0; /* * If we're only mapping 1 segment, use KSEG0 or KSEG1, to avoid @@ -646,31 +580,8 @@ return 0; } - size = round_page(size); - - va = uvm_km_alloc(kernel_map, size, 0, UVM_KMF_VAONLY | kmflags); - - if (va == 0) - return (ENOMEM); - - *kvap = (void *)va; - - for (curseg = 0; curseg < nsegs; curseg++) { - for (addr = segs[curseg].ds_addr; - addr < (segs[curseg].ds_addr + segs[curseg].ds_len); - addr += PAGE_SIZE, va += PAGE_SIZE, size -= PAGE_SIZE) { - if (size == 0) - panic("_bus_dmamem_map: size botch"); - pmap_enter(pmap_kernel(), va, addr, - VM_PROT_READ | VM_PROT_WRITE, - VM_PROT_READ | VM_PROT_WRITE | PMAP_WIRED); - - /* XXX Do something about COHERENT here. */ - } - } - pmap_update(pmap_kernel()); - - return 0; + /* XXX BUS_DMA_COHERENT */ + return (_bus_dmamem_map_common(t, segs, nsegs, size, kvap, flags, 0)); } /* @@ -681,11 +592,6 @@ _bus_dmamem_unmap(bus_dma_tag_t t, void *kva, size_t size) { -#ifdef DIAGNOSTIC - if ((u_long)kva & PGOFSET) - panic("_bus_dmamem_unmap"); -#endif - /* * Nothing to do if we mapped it with KSEG0 or KSEG1 (i.e. * not in KSEG2). @@ -694,10 +600,7 @@ kva < (void *)MIPS_KSEG2_START) return; - size = round_page(size); - pmap_remove(pmap_kernel(), (vaddr_t)kva, (vaddr_t)kva + size); - pmap_update(pmap_kernel()); - uvm_km_free(kernel_map, (vaddr_t)kva, size, UVM_KMF_VAONLY); + _bus_dmamem_unmap_common(t, kva, size); } /* @@ -708,26 +611,11 @@ _bus_dmamem_mmap(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, off_t off, int prot, int flags) { - int i; - - for (i = 0; i < nsegs; i++) { -#ifdef DIAGNOSTIC - if (off & PGOFSET) - panic("_bus_dmamem_mmap: offset unaligned"); - if (segs[i].ds_addr & PGOFSET) - panic("_bus_dmamem_mmap: segment unaligned"); - if (segs[i].ds_len & PGOFSET) - panic("_bus_dmamem_mmap: segment size not multiple" - " of page size"); -#endif - if (off >= segs[i].ds_len) { - off -= segs[i].ds_len; - continue; - } - - return mips_btop((char *)segs[i].ds_addr + off); - } + bus_addr_t rv; - /* Page not found. */ - return -1; + rv = _bus_dmamem_mmap_common(t, segs, nsegs, off, prot, flags); + if (rv == (bus_addr_t)-1) + return (-1); + + return (mips_btop((char *)rv)); }