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>