From owner-svn-src-projects@FreeBSD.ORG Tue Aug 5 08:00:02 2014 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 6CD785B2 for ; Tue, 5 Aug 2014 08:00:02 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 5B90D20CE for ; Tue, 5 Aug 2014 08:00:02 +0000 (UTC) Received: from andrew (uid 1231) (envelope-from andrew@FreeBSD.org) id 5fc9 by svn.freebsd.org (DragonFly Mail Agent v0.9+); Tue, 05 Aug 2014 08:00:02 +0000 From: Andrew Turner Date: Tue, 5 Aug 2014 08:00:02 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r269568 - in projects/arm64/sys: arm/arm arm64/include X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Message-Id: <53e08f02.5fc9.25a3ddea@svn.freebsd.org> X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 05 Aug 2014 08:00:02 -0000 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 #include -#if 0 #include +#include 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 + * 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