Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 4 Jan 2014 21:38:41 +0000 (UTC)
From:      Ian Lepore <ian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r260288 - head/sys/arm/arm
Message-ID:  <201401042138.s04Lcfh2013504@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ian
Date: Sat Jan  4 21:38:41 2014
New Revision: 260288
URL: http://svnweb.freebsd.org/changeset/base/260288

Log:
  In pmap_mapdev(), first check whether a static mapping exists, and if so
  use it rather than allocating kva space and making another mapping.  In
  pmap_unmapdev(), don't unmap/free if the mapping is static.

Modified:
  head/sys/arm/arm/devmap.c

Modified: head/sys/arm/arm/devmap.c
==============================================================================
--- head/sys/arm/arm/devmap.c	Sat Jan  4 21:32:53 2014	(r260287)
+++ head/sys/arm/arm/devmap.c	Sat Jan  4 21:38:41 2014	(r260288)
@@ -207,13 +207,23 @@ arm_devmap_vtop(void * vpva, vm_size_t s
 
 /*
  * Map a set of physical memory pages into the kernel virtual address space.
- * Return a pointer to where it is mapped. This routine is intended to be used
- * for mapping device memory, NOT real memory.
+ * Return a pointer to where it is mapped.
+ *
+ * This uses a pre-established static mapping if one exists for the requested
+ * range, otherwise it allocates kva space and maps the physical pages into it.
+ *
+ * This routine is intended to be used for mapping device memory, NOT real
+ * memory; the mapping type is inherently PTE_DEVICE in pmap_kenter_device().
  */
 void *
 pmap_mapdev(vm_offset_t pa, vm_size_t size)
 {
 	vm_offset_t va, tmpva, offset;
+	void * rva;
+
+	/* First look in the static mapping table. */
+	if ((rva = arm_devmap_ptov(pa, size)) != NULL)
+		return (rva);
 	
 	offset = pa & PAGE_MASK;
 	pa = trunc_page(pa);
@@ -240,8 +250,13 @@ void
 pmap_unmapdev(vm_offset_t va, vm_size_t size)
 {
 	vm_offset_t tmpva, offset;
-	vm_size_t origsize = size;
-	
+	vm_size_t origsize;
+
+	/* Nothing to do if we find the mapping in the static table. */
+	if (arm_devmap_vtop((void*)va, size) != DEVMAP_PADDR_NOTFOUND)
+		return;
+
+	origsize = size;
 	offset = va & PAGE_MASK;
 	va = trunc_page(va);
 	size = round_page(size + offset);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201401042138.s04Lcfh2013504>