1177888Sraj/* $NetBSD: obio_space.c,v 1.6 2003/07/15 00:25:05 lukem Exp $ */ 2177888Sraj 3177888Sraj/*- 4177888Sraj * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc. 5177888Sraj * All rights reserved. 6177888Sraj * 7177888Sraj * Written by Jason R. Thorpe for Wasabi Systems, Inc. 8177888Sraj * 9177888Sraj * Redistribution and use in source and binary forms, with or without 10177888Sraj * modification, are permitted provided that the following conditions 11177888Sraj * are met: 12177888Sraj * 1. Redistributions of source code must retain the above copyright 13177888Sraj * notice, this list of conditions and the following disclaimer. 14177888Sraj * 2. Redistributions in binary form must reproduce the above copyright 15177888Sraj * notice, this list of conditions and the following disclaimer in the 16177888Sraj * documentation and/or other materials provided with the distribution. 17177888Sraj * 3. All advertising materials mentioning features or use of this software 18177888Sraj * must display the following acknowledgement: 19177888Sraj * This product includes software developed for the NetBSD Project by 20177888Sraj * Wasabi Systems, Inc. 21177888Sraj * 4. The name of Wasabi Systems, Inc. may not be used to endorse 22177888Sraj * or promote products derived from this software without specific prior 23177888Sraj * written permission. 24177888Sraj * 25177888Sraj * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 26177888Sraj * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 27177888Sraj * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28177888Sraj * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 29177888Sraj * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30177888Sraj * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31177888Sraj * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32177888Sraj * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33177888Sraj * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34177888Sraj * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35177888Sraj * POSSIBILITY OF SUCH DAMAGE. 36177888Sraj */ 37177888Sraj 38177888Sraj#include <sys/cdefs.h> 39177888Sraj__FBSDID("$FreeBSD$"); 40177888Sraj 41177888Sraj#include <sys/param.h> 42177888Sraj#include <sys/systm.h> 43177888Sraj#include <sys/bus.h> 44177888Sraj#include <sys/kernel.h> 45177888Sraj#include <sys/malloc.h> 46177888Sraj 47177888Sraj#include <vm/vm.h> 48177888Sraj#include <vm/pmap.h> 49177888Sraj#include <vm/vm_kern.h> 50177888Sraj#include <vm/vm_extern.h> 51177888Sraj 52177888Sraj#include <machine/bus.h> 53177888Sraj 54177888Sraj/* Prototypes for all the bus_space structure functions */ 55177888Srajbs_protos(generic); 56177888Sraj 57177888Srajint 58177888Srajgeneric_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags, 59177888Sraj bus_space_handle_t *bshp) 60177888Sraj{ 61177888Sraj const struct pmap_devmap *pd; 62177888Sraj vm_paddr_t startpa, endpa, pa, offset; 63177888Sraj vm_offset_t va; 64177888Sraj pt_entry_t *pte; 65177888Sraj 66177888Sraj if ((pd = pmap_devmap_find_pa(bpa, size)) != NULL) { 67177888Sraj /* Device was statically mapped. */ 68177888Sraj *bshp = pd->pd_va + (bpa - pd->pd_pa); 69177888Sraj return (0); 70177888Sraj } 71177888Sraj 72177888Sraj endpa = round_page(bpa + size); 73177888Sraj offset = bpa & PAGE_MASK; 74177888Sraj startpa = trunc_page(bpa); 75177888Sraj 76177888Sraj va = kmem_alloc(kernel_map, endpa - startpa); 77177888Sraj if (va == 0) 78177888Sraj return (ENOMEM); 79177888Sraj 80177888Sraj *bshp = va + offset; 81177888Sraj 82177888Sraj for (pa = startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE) { 83177888Sraj pmap_kenter(va, pa); 84177888Sraj pte = vtopte(va); 85177888Sraj if (!(flags & BUS_SPACE_MAP_CACHEABLE)) { 86177888Sraj *pte &= ~L2_S_CACHE_MASK; 87177888Sraj PTE_SYNC(pte); 88177888Sraj } 89177888Sraj } 90177888Sraj 91177888Sraj return (0); 92177888Sraj} 93177888Sraj 94177888Srajint 95177888Srajgeneric_bs_alloc(void *t, bus_addr_t rstart, bus_addr_t rend, bus_size_t size, 96177888Sraj bus_size_t alignment, bus_size_t boundary, int flags, bus_addr_t *bpap, 97177888Sraj bus_space_handle_t *bshp) 98177888Sraj{ 99177888Sraj 100177888Sraj panic("generic_bs_alloc(): not implemented"); 101177888Sraj} 102177888Sraj 103177888Sraj 104177888Srajvoid 105177888Srajgeneric_bs_unmap(void *t, bus_space_handle_t h, bus_size_t size) 106177888Sraj{ 107177888Sraj vm_offset_t va, endva; 108177888Sraj 109177888Sraj if (pmap_devmap_find_va((vm_offset_t)t, size) != NULL) { 110177888Sraj /* Device was statically mapped; nothing to do. */ 111177888Sraj return; 112177888Sraj } 113177888Sraj 114177888Sraj endva = round_page((vm_offset_t)t + size); 115177888Sraj va = trunc_page((vm_offset_t)t); 116177888Sraj 117177888Sraj while (va < endva) { 118177888Sraj pmap_kremove(va); 119177888Sraj va += PAGE_SIZE; 120177888Sraj } 121177888Sraj kmem_free(kernel_map, va, endva - va); 122177888Sraj} 123177888Sraj 124177888Srajvoid 125177888Srajgeneric_bs_free(void *t, bus_space_handle_t bsh, bus_size_t size) 126177888Sraj{ 127177888Sraj 128177888Sraj panic("generic_bs_free(): not implemented"); 129177888Sraj} 130177888Sraj 131177888Srajint 132177888Srajgeneric_bs_subregion(void *t, bus_space_handle_t bsh, bus_size_t offset, 133177888Sraj bus_size_t size, bus_space_handle_t *nbshp) 134177888Sraj{ 135177888Sraj 136177888Sraj *nbshp = bsh + offset; 137177888Sraj return (0); 138177888Sraj} 139177888Sraj 140177888Srajvoid 141177888Srajgeneric_bs_barrier(void *t, bus_space_handle_t bsh, bus_size_t offset, 142177888Sraj bus_size_t len, int flags) 143177888Sraj{ 144177888Sraj 145177888Sraj /* Nothing to do. */ 146177888Sraj} 147