svn commit: r269568 - in projects/arm64/sys: arm/arm arm64/include
Andrew Turner
andrew at FreeBSD.org
Tue Aug 5 08:00:02 UTC 2014
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 at 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
More information about the svn-src-projects
mailing list