Module Name:    src
Committed By:   matt
Date:           Wed Apr  2 12:28:54 UTC 2014

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

Log Message:
Deal with bus_dmamem_unmap of direct mapped KVA.


To generate a diff of this commit:
cvs rdiff -u -r1.83 -r1.84 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.83 src/sys/arch/arm/arm32/bus_dma.c:1.84
--- src/sys/arch/arm/arm32/bus_dma.c:1.83	Mon Mar 24 20:06:31 2014
+++ src/sys/arch/arm/arm32/bus_dma.c	Wed Apr  2 12:28:54 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: bus_dma.c,v 1.83 2014/03/24 20:06:31 christos Exp $	*/
+/*	$NetBSD: bus_dma.c,v 1.84 2014/04/02 12:28:54 matt Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
@@ -35,13 +35,15 @@
 #include "opt_arm_bus_space.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.83 2014/03/24 20:06:31 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.84 2014/04/02 12:28:54 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/kernel.h>
 #include <sys/proc.h>
 #include <sys/buf.h>
+#include <sys/bus.h>
+#include <sys/cpu.h>
 #include <sys/reboot.h>
 #include <sys/conf.h>
 #include <sys/file.h>
@@ -52,11 +54,12 @@ __KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 
 
 #include <uvm/uvm.h>
 
-#include <sys/bus.h>
-#include <machine/cpu.h>
-
 #include <arm/cpufunc.h>
 
+#ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS
+#include <dev/mm.h>
+#endif
+
 #ifdef BUSDMA_COUNTERS
 static struct evcnt bus_dma_creates =
 	EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, "busdma", "creates");
@@ -1391,6 +1394,19 @@ _bus_dmamem_unmap(bus_dma_tag_t t, void 
 	KASSERTMSG(((uintptr_t)kva & PAGE_MASK) == 0,
 	    "kva %p (%#"PRIxPTR")", kva, ((uintptr_t)kva & PAGE_MASK));
 
+#ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS
+	/*
+	 * Check to see if this used direct mapped memory.  Get it's physical
+	 * address and try to map it.  If the resultant matches the kva, then
+	 * it was and so we can just return since we have notice to free up.
+	 */
+	paddr_t pa;
+	vaddr_t va;
+	(void)pmap_extract(pmap_kernel(), (vaddr_t)kva, &pa);
+	if (mm_md_direct_mapped_phys(pa, &va) && va == (vaddr_t)kva)
+		return;
+#endif
+
 	size = round_page(size);
 	pmap_kremove((vaddr_t)kva, size);
 	pmap_update(pmap_kernel());

Reply via email to