Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 5 Aug 2014 08:00:02 +0000 (UTC)
From:      Andrew Turner <andrew@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r269568 - in projects/arm64/sys: arm/arm arm64/include
Message-ID:  <53e08f02.5fc9.25a3ddea@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: andrew
Date: Tue Aug  5 08:00:01 2014
New Revision: 269568
URL: http://svnweb.freebsd.org/changeset/base/269568

Log:
  Allow early static devmaps on arm64

Added:
  projects/arm64/sys/arm64/include/devmap.h   (contents, props changed)
Modified:
  projects/arm64/sys/arm/arm/devmap.c

Modified: projects/arm64/sys/arm/arm/devmap.c
==============================================================================
--- projects/arm64/sys/arm/arm/devmap.c	Tue Aug  5 07:03:16 2014	(r269567)
+++ projects/arm64/sys/arm/arm/devmap.c	Tue Aug  5 08:00:01 2014	(r269568)
@@ -40,8 +40,8 @@ __FBSDID("$FreeBSD$");
 #include <vm/pmap.h>
 #include <machine/armreg.h>
 
-#if 0
 #include <machine/devmap.h>
+#include <machine/vmparam.h>
 
 static const struct arm_devmap_entry *devmap_table;
 static boolean_t devmap_bootstrap_done = false;
@@ -55,8 +55,9 @@ static boolean_t devmap_bootstrap_done =
 #define	AKVA_DEVMAP_MAX_ENTRIES	32
 static struct arm_devmap_entry	akva_devmap_entries[AKVA_DEVMAP_MAX_ENTRIES];
 static u_int			akva_devmap_idx;
-static vm_offset_t		akva_devmap_vaddr = ARM_VECTORS_HIGH;
+static vm_offset_t		akva_devmap_vaddr = VM_MAX_KERNEL_ADDRESS;
 
+#if 0
 /*
  * Print the contents of the static mapping table using the provided printf-like
  * output function (which will be either printf or db_printf).
@@ -86,6 +87,7 @@ arm_devmap_print_table()
 {
 	devmap_dump_table(printf);
 }
+#endif
 
 /*
  * Return the "last" kva address used by the registered devmap table.  It's
@@ -101,7 +103,7 @@ arm_devmap_lastaddr()
 	if (akva_devmap_idx > 0)
 		return (akva_devmap_vaddr);
 
-	lowaddr = ARM_VECTORS_HIGH;
+	lowaddr = VM_MAX_KERNEL_ADDRESS;
 	for (pd = devmap_table; pd != NULL && pd->pd_size != 0; ++pd) {
 		if (lowaddr > pd->pd_va)
 			lowaddr = pd->pd_va;
@@ -138,17 +140,22 @@ arm_devmap_add_entry(vm_paddr_t pa, vm_s
 	 * align the virtual address to the next-lower 1MB boundary so that we
 	 * end up with a nice efficient section mapping.
 	 */
+#if 0
 	if ((pa & 0x000fffff) == 0 && (sz & 0x000fffff) == 0) {
 		akva_devmap_vaddr = trunc_1mpage(akva_devmap_vaddr - sz);
 	} else {
 		akva_devmap_vaddr = trunc_page(akva_devmap_vaddr - sz);
 	}
+#else
+	akva_devmap_vaddr = trunc_page(akva_devmap_vaddr - sz);
+#endif
+
 	m = &akva_devmap_entries[akva_devmap_idx++];
 	m->pd_va    = akva_devmap_vaddr;
 	m->pd_pa    = pa;
 	m->pd_size  = sz;
 	m->pd_prot  = VM_PROT_READ | VM_PROT_WRITE;
-	m->pd_cache = PTE_DEVICE;
+	m->pd_cache = 0;
 }
 
 /*
@@ -175,6 +182,8 @@ void
 arm_devmap_bootstrap(vm_offset_t l1pt, const struct arm_devmap_entry *table)
 {
 	const struct arm_devmap_entry *pd;
+	vm_offset_t pa, va;
+	vm_size_t size;
 
 	devmap_bootstrap_done = true;
 
@@ -188,8 +197,16 @@ arm_devmap_bootstrap(vm_offset_t l1pt, c
 		return;
 
 	for (pd = devmap_table; pd->pd_size != 0; ++pd) {
-		pmap_map_chunk(l1pt, pd->pd_va, pd->pd_pa, pd->pd_size,
-		    pd->pd_prot,pd->pd_cache);
+		va = pd->pd_va;
+		pa = pd->pd_pa;
+		size = pd->pd_size;
+
+		while (size > 0) {
+			pmap_kenter_device(va, pa);
+			size -= PAGE_SIZE;
+			va += PAGE_SIZE;
+			pa += PAGE_SIZE;
+		}
 	}
 }
 
@@ -234,7 +251,6 @@ arm_devmap_vtop(void * vpva, vm_size_t s
 
 	return (DEVMAP_PADDR_NOTFOUND);
 }
-#endif
 
 /*
  * Map a set of physical memory pages into the kernel virtual address space.
@@ -250,14 +266,12 @@ void *
 pmap_mapdev(vm_offset_t pa, vm_size_t size)
 {
 	vm_offset_t va, tmpva, offset;
-#if 0
 	void * rva;
 
 	/* First look in the static mapping table. */
 	if ((rva = arm_devmap_ptov(pa, size)) != NULL)
 		return (rva);
-#endif
-	
+
 	offset = pa & PAGE_MASK;
 	pa = trunc_page(pa);
 	size = round_page(size + offset);
@@ -285,11 +299,9 @@ pmap_unmapdev(vm_offset_t va, vm_size_t 
 	vm_offset_t tmpva, offset;
 	vm_size_t origsize;
 
-#if 0
 	/* Nothing to do if we find the mapping in the static table. */
 	if (arm_devmap_vtop((void*)va, size) != DEVMAP_PADDR_NOTFOUND)
 		return;
-#endif
 
 	origsize = size;
 	offset = va & PAGE_MASK;

Added: projects/arm64/sys/arm64/include/devmap.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ projects/arm64/sys/arm64/include/devmap.h	Tue Aug  5 08:00:01 2014	(r269568)
@@ -0,0 +1,93 @@
+/*-
+ * Copyright (c) 2013 Ian Lepore <ian@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef	_MACHINE_DEVMAP_H_
+#define	_MACHINE_DEVMAP_H_
+
+/*
+ * This structure is used by MD code to describe static mappings of devices
+ * which are established as part of bringing up the MMU early in the boot.
+ */
+struct arm_devmap_entry {
+	vm_offset_t	pd_va;		/* virtual address */
+	vm_paddr_t	pd_pa;		/* physical address */
+	vm_size_t	pd_size;	/* size of region */
+	vm_prot_t	pd_prot;	/* protection code */
+	int		pd_cache;	/* cache attributes */
+};
+
+/*
+ * Return the lowest KVA address used in any entry in the registered devmap
+ * table.  This works with whatever table is registered, including the internal
+ * table used by arm_devmap_add_entry() if that routine was used. Platforms can
+ * implement initarm_lastaddr() by calling this if static device mappings are
+ * their only use of high KVA space.
+ */
+vm_offset_t arm_devmap_lastaddr(void);
+
+/*
+ * Automatically allocate KVA (from the top of the address space downwards) and
+ * make static device mapping entries in an internal table.  The internal table
+ * is automatically registered on the first call to this.
+ */
+void arm_devmap_add_entry(vm_paddr_t pa, vm_size_t sz);
+
+/*
+ * Register a platform-local table to be bootstrapped by the generic
+ * initarm() in arm/machdep.c.  This is used by newer code that allocates and
+ * fills in its own local table but does not have its own initarm() routine.
+ */
+void arm_devmap_register_table(const struct arm_devmap_entry * _table);
+
+/*
+ * Establish mappings for all the entries in the table.  This is called
+ * automatically from the common initarm() in arm/machdep.c, and also from the
+ * custom initarm() routines in older code.  If the table pointer is NULL, this
+ * will use the table installed previously by arm_devmap_register_table().
+ */
+void arm_devmap_bootstrap(vm_offset_t _l1pt, 
+    const struct arm_devmap_entry *_table);
+
+/*
+ * Translate between virtual and physical addresses within a region that is
+ * static-mapped by the devmap code.  If the given address range isn't
+ * static-mapped, then ptov returns NULL and vtop returns DEVMAP_PADDR_NOTFOUND.
+ * The latter implies that you can't vtop just the last byte of physical address
+ * space.  This is not as limiting as it might sound, because even if a device
+ * occupies the end of the physical address space, you're only prevented from
+ * doing vtop for that single byte.  If you vtop a size bigger than 1 it works.
+ */
+#define	DEVMAP_PADDR_NOTFOUND	((vm_paddr_t)(-1))
+
+void *     arm_devmap_ptov(vm_paddr_t _pa, vm_size_t _sz);
+vm_paddr_t arm_devmap_vtop(void * _va, vm_size_t _sz);
+
+/* Print the static mapping table; used for bootverbose output. */
+void arm_devmap_print_table(void);
+
+#endif



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?53e08f02.5fc9.25a3ddea>