Module Name: src Committed By: matt Date: Sun Sep 6 22:58:59 UTC 2009
Modified Files: src/sys/arch/mips/mips [matt-nb5-mips64]: bus_dma.c Log Message: Don't refer to KSEG2 anymore. If LP64 kernel, use XKPHYS for addresses that don't fit in into KSEG0/KSEG1. To generate a diff of this commit: cvs rdiff -u -r1.22.16.2 -r1.22.16.3 src/sys/arch/mips/mips/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/mips/mips/bus_dma.c diff -u src/sys/arch/mips/mips/bus_dma.c:1.22.16.2 src/sys/arch/mips/mips/bus_dma.c:1.22.16.3 --- src/sys/arch/mips/mips/bus_dma.c:1.22.16.2 Fri Aug 21 17:35:43 2009 +++ src/sys/arch/mips/mips/bus_dma.c Sun Sep 6 22:58:59 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: bus_dma.c,v 1.22.16.2 2009/08/21 17:35:43 matt Exp $ */ +/* $NetBSD: bus_dma.c,v 1.22.16.3 2009/09/06 22:58:59 matt Exp $ */ /*- * Copyright (c) 1997, 1998, 2001 The NetBSD Foundation, Inc. @@ -32,7 +32,7 @@ #include <sys/cdefs.h> /* RCS ID & Copyright macro defns */ -__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.22.16.2 2009/08/21 17:35:43 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.22.16.3 2009/09/06 22:58:59 matt Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -263,9 +263,13 @@ * * XXX Check TLB entries for cache-inhibit bits? */ - if (buf >= (void *)MIPS_KSEG1_START && - buf < (void *)MIPS_KSEG2_START) + if (MIPS_KSEG1_P(buf)) map->_dm_flags |= MIPS_DMAMAP_COHERENT; +#ifdef _LP64 + else if (MIPS_XKPHYS_P((vaddr_t)buf) + && MIPS_XKPHYS_TO_CCA((vaddr_t)buf) == CCA_UNCACHED) + map->_dm_flags |= MIPS_DMAMAP_COHERENT; +#endif } return (error); } @@ -652,6 +656,17 @@ * TLB thrashing. */ if (nsegs == 1) { +#ifdef _LP64 + if (segs[0].ds_addr + segs[0].ds_len > MIPS_PHYS_MASK) { + unsigned long cca; + if (flags & BUS_DMA_COHERENT) + cca = CCA_UNCACHED; + else + cca = CCA_CACHEABLE; + *kvap = (void *)MIPS_PHYS_TO_XKPHYS(segs[0].ds_addr, + cca); + } else +#endif if (flags & BUS_DMA_COHERENT) *kvap = (void *)MIPS_PHYS_TO_KSEG1(segs[0].ds_addr); else @@ -699,11 +714,14 @@ /* * Nothing to do if we mapped it with KSEG0 or KSEG1 (i.e. - * not in KSEG2). + * not in KSEG2 or XKSEG). */ - if (kva >= (void *)MIPS_KSEG0_START && - kva < (void *)MIPS_KSEG2_START) + if (MIPS_KSEG0_P(kva) || MIPS_KSEG1_P(kva)) return; +#ifdef _LP64 + if (MIPS_XKPHYS_P((vaddr_t)kva)) + return; +#endif size = round_page(size); pmap_remove(pmap_kernel(), (vaddr_t)kva, (vaddr_t)kva + size);