Module Name:    src
Committed By:   matt
Date:           Mon Oct 22 15:01:18 UTC 2012

Modified Files:
        src/sys/arch/arm/arm32: bus_dma.c

Log Message:
Only call cpu_{,s}dcache_inv_range if len > 0


To generate a diff of this commit:
cvs rdiff -u -r1.64 -r1.65 src/sys/arch/arm/arm32/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/arm/arm32/bus_dma.c
diff -u src/sys/arch/arm/arm32/bus_dma.c:1.64 src/sys/arch/arm/arm32/bus_dma.c:1.65
--- src/sys/arch/arm/arm32/bus_dma.c:1.64	Sun Oct 21 10:22:40 2012
+++ src/sys/arch/arm/arm32/bus_dma.c	Mon Oct 22 15:01:18 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: bus_dma.c,v 1.64 2012/10/21 10:22:40 matt Exp $	*/
+/*	$NetBSD: bus_dma.c,v 1.65 2012/10/22 15:01:18 matt Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@@ -33,7 +33,7 @@
 #define _ARM32_BUS_DMA_PRIVATE
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.64 2012/10/21 10:22:40 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.65 2012/10/22 15:01:18 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -741,8 +741,10 @@ _bus_dmamap_sync_segment(vaddr_t va, pad
 		}
 		misalignment = len & line_mask;
 		len -= misalignment;
-		cpu_dcache_inv_range(va, len);
-		cpu_sdcache_inv_range(va, pa, len);
+		if (len > 0) {
+			cpu_dcache_inv_range(va, len);
+			cpu_sdcache_inv_range(va, pa, len);
+		}
 		if (misalignment) {
 			va += len;
 			pa += len;
@@ -1173,9 +1175,10 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma
 	vaddr_t va;
 	paddr_t pa;
 	int curseg;
-	pt_entry_t *ptep/*, pte*/;
-	const uvm_flag_t kmflags =
-	    (flags & BUS_DMA_NOWAIT) != 0 ? UVM_KMF_NOWAIT : 0;
+	pt_entry_t *ptep;
+	const uvm_flag_t kmflags = UVM_KMF_VAONLY
+	    | ((flags & BUS_DMA_NOWAIT) != 0 ? UVM_KMF_NOWAIT : 0);
+	vsize_t align = 0;
 
 #ifdef DEBUG_DMA
 	printf("dmamem_map: t=%p segs=%p nsegs=%x size=%lx flags=%x\n", t,
@@ -1222,7 +1225,23 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma
 #endif
 
 	size = round_page(size);
-	va = uvm_km_alloc(kernel_map, size, 0, UVM_KMF_VAONLY | kmflags);
+	if (__predict_true(size > L2_L_SIZE)) {
+#if (ARM_MMU_V6 + ARM_MMU_V7) > 0
+		if (size >= L1_SS_SIZE)
+			align = L1_SS_SIZE;
+		else
+#endif
+		if (size >= L1_S_SIZE)
+			align = L1_S_SIZE;
+		else
+			align = L2_S_SIZE;
+	}
+
+	va = uvm_km_alloc(kernel_map, size, align, kmflags);
+	if (__predict_false(va == 0 && align > 0)) {
+		align = 0;
+		va = uvm_km_alloc(kernel_map, size, 0, kmflags);
+	}
 
 	if (va == 0)
 		return (ENOMEM);
@@ -1238,9 +1257,8 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma
 #endif	/* DEBUG_DMA */
 			if (size == 0)
 				panic("_bus_dmamem_map: size botch");
-			pmap_enter(pmap_kernel(), va, pa,
-			    VM_PROT_READ | VM_PROT_WRITE,
-			    VM_PROT_READ | VM_PROT_WRITE | PMAP_WIRED);
+			pmap_kenter_pa(va, pa,
+			    VM_PROT_READ | VM_PROT_WRITE, PMAP_WIRED);
 
 			/*
 			 * If the memory must remain coherent with the
@@ -1296,8 +1314,7 @@ _bus_dmamem_unmap(bus_dma_tag_t t, void 
 {
 
 #ifdef DEBUG_DMA
-	printf("dmamem_unmap: t=%p kva=%p size=%lx\n", t, kva,
-	    (unsigned long)size);
+	printf("dmamem_unmap: t=%p kva=%p size=%zx\n", t, kva, size);
 #endif	/* DEBUG_DMA */
 #ifdef DIAGNOSTIC
 	if ((u_long)kva & PGOFSET)
@@ -1305,7 +1322,7 @@ _bus_dmamem_unmap(bus_dma_tag_t t, void 
 #endif	/* DIAGNOSTIC */
 
 	size = round_page(size);
-	pmap_remove(pmap_kernel(), (vaddr_t)kva, (vaddr_t)kva + size);
+	pmap_kremove((vaddr_t)kva, size);
 	pmap_update(pmap_kernel());
 	uvm_km_free(kernel_map, (vaddr_t)kva, size, UVM_KMF_VAONLY);
 }
@@ -1394,7 +1411,9 @@ _bus_dmamap_load_buffer(bus_dma_tag_t t,
 				coherent = (*pde & L1_S_CACHE_MASK) != 0;
 			} else {
 				pt_entry_t pte = *ptep;
-				KDASSERT((pte & L2_TYPE_MASK) != L2_TYPE_INV);
+				KDASSERTMSG((pte & L2_TYPE_MASK) != L2_TYPE_INV,
+				    "va=%#"PRIxVADDR" pde=%#x ptep=%p pte=%#x",
+				    vaddr, *pde, ptep, pte);
 				if (__predict_false((pte & L2_TYPE_MASK)
 						    == L2_TYPE_L)) {
 					curaddr = (pte & L2_L_FRAME) |

Reply via email to