i81342_space.c revision 277478
1171626Scognet/* $NetBSD: i80321_space.c,v 1.6 2003/10/06 15:43:35 thorpej Exp $ */ 2171626Scognet 3171626Scognet/*- 4171626Scognet * Copyright (c) 2001, 2002 Wasabi Systems, Inc. 5171626Scognet * All rights reserved. 6171626Scognet * 7171626Scognet * Written by Jason R. Thorpe for Wasabi Systems, Inc. 8171626Scognet * 9171626Scognet * Redistribution and use in source and binary forms, with or without 10171626Scognet * modification, are permitted provided that the following conditions 11171626Scognet * are met: 12171626Scognet * 1. Redistributions of source code must retain the above copyright 13171626Scognet * notice, this list of conditions and the following disclaimer. 14171626Scognet * 2. Redistributions in binary form must reproduce the above copyright 15171626Scognet * notice, this list of conditions and the following disclaimer in the 16171626Scognet * documentation and/or other materials provided with the distribution. 17171626Scognet * 3. All advertising materials mentioning features or use of this software 18171626Scognet * must display the following acknowledgement: 19171626Scognet * This product includes software developed for the NetBSD Project by 20171626Scognet * Wasabi Systems, Inc. 21171626Scognet * 4. The name of Wasabi Systems, Inc. may not be used to endorse 22171626Scognet * or promote products derived from this software without specific prior 23171626Scognet * written permission. 24171626Scognet * 25171626Scognet * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND 26171626Scognet * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 27171626Scognet * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 28171626Scognet * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC 29171626Scognet * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30171626Scognet * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31171626Scognet * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 32171626Scognet * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 33171626Scognet * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 34171626Scognet * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 35171626Scognet * POSSIBILITY OF SUCH DAMAGE. 36171626Scognet */ 37171626Scognet 38171626Scognet/* 39171626Scognet * bus_space functions for i81342 I/O Processor. 40171626Scognet */ 41171626Scognet 42171626Scognet#include <sys/cdefs.h> 43171626Scognet__FBSDID("$FreeBSD: head/sys/arm/xscale/i8134x/i81342_space.c 277478 2015-01-21 05:10:23Z ian $"); 44171626Scognet 45171626Scognet#include <sys/param.h> 46171626Scognet#include <sys/systm.h> 47171626Scognet#include <sys/bus.h> 48171626Scognet#include <sys/malloc.h> 49171626Scognet 50171626Scognet#include <machine/pcb.h> 51171626Scognet 52171626Scognet#include <vm/vm.h> 53171626Scognet#include <vm/vm_kern.h> 54171626Scognet#include <vm/pmap.h> 55171626Scognet#include <vm/vm_page.h> 56171626Scognet#include <vm/vm_extern.h> 57171626Scognet 58171626Scognet#include <machine/bus.h> 59171626Scognet 60171626Scognet#include <arm/xscale/i8134x/i81342reg.h> 61171626Scognet#include <arm/xscale/i8134x/i81342var.h> 62171626Scognet 63171626Scognet/* Prototypes for all the bus_space structure functions */ 64171626Scognetbs_protos(i81342); 65171626Scognetbs_protos(i81342_io); 66171626Scognetbs_protos(i81342_mem); 67171626Scognet 68171626Scognetvoid 69171626Scogneti81342_bs_init(bus_space_tag_t bs, void *cookie) 70171626Scognet{ 71171626Scognet 72277478Sian *bs = *arm_base_bs_tag; 73277460Sian bs->bs_privdata = cookie; 74171626Scognet} 75171626Scognet 76171626Scognetvoid 77171626Scogneti81342_io_bs_init(bus_space_tag_t bs, void *cookie) 78171626Scognet{ 79171626Scognet 80277478Sian *bs = *arm_base_bs_tag; 81277460Sian bs->bs_privdata = cookie; 82171626Scognet 83171626Scognet bs->bs_map = i81342_io_bs_map; 84171626Scognet bs->bs_unmap = i81342_io_bs_unmap; 85171626Scognet bs->bs_alloc = i81342_io_bs_alloc; 86171626Scognet bs->bs_free = i81342_io_bs_free; 87171626Scognet 88171626Scognet} 89171626Scognet 90171626Scognetvoid 91171626Scogneti81342_mem_bs_init(bus_space_tag_t bs, void *cookie) 92171626Scognet{ 93171626Scognet 94277478Sian *bs = *arm_base_bs_tag; 95277460Sian bs->bs_privdata = cookie; 96171626Scognet 97171626Scognet bs->bs_map = i81342_mem_bs_map; 98171626Scognet bs->bs_unmap = i81342_mem_bs_unmap; 99171626Scognet bs->bs_alloc = i81342_mem_bs_alloc; 100171626Scognet bs->bs_free = i81342_mem_bs_free; 101171626Scognet 102171626Scognet} 103171626Scognet 104171626Scognet/* *** Routines shared by i81342, PCI IO, and PCI MEM. *** */ 105171626Scognet 106171626Scognetint 107277460Siani81342_bs_subregion(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, 108171626Scognet bus_size_t size, bus_space_handle_t *nbshp) 109171626Scognet{ 110171626Scognet 111171626Scognet *nbshp = bsh + offset; 112171626Scognet return (0); 113171626Scognet} 114171626Scognet 115171626Scognetvoid 116277460Siani81342_bs_barrier(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, 117171626Scognet bus_size_t len, int flags) 118171626Scognet{ 119171626Scognet 120171626Scognet /* Nothing to do. */ 121171626Scognet} 122171626Scognet 123171626Scognet/* *** Routines for PCI IO. *** */ 124171626Scognet 125171626Scognetint 126277460Siani81342_io_bs_map(bus_space_tag_t tag, bus_addr_t bpa, bus_size_t size, int flags, 127171626Scognet bus_space_handle_t *bshp) 128171626Scognet{ 129171626Scognet 130171626Scognet *bshp = bpa; 131171626Scognet return (0); 132171626Scognet} 133171626Scognet 134171626Scognetvoid 135277460Siani81342_io_bs_unmap(bus_space_tag_t tag, bus_space_handle_t h, bus_size_t size) 136171626Scognet{ 137171626Scognet 138171626Scognet /* Nothing to do. */ 139171626Scognet} 140171626Scognet 141171626Scognetint 142277460Siani81342_io_bs_alloc(bus_space_tag_t tag, bus_addr_t rstart, bus_addr_t rend, 143171626Scognet bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags, 144171626Scognet bus_addr_t *bpap, bus_space_handle_t *bshp) 145171626Scognet{ 146171626Scognet 147171626Scognet panic("i81342_io_bs_alloc(): not implemented"); 148171626Scognet} 149171626Scognet 150236987Simpvoid 151277460Siani81342_io_bs_free(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t size) 152171626Scognet{ 153171626Scognet 154171626Scognet panic("i81342_io_bs_free(): not implemented"); 155171626Scognet} 156171626Scognet 157171626Scognet 158171626Scognet/* *** Routines for PCI MEM. *** */ 159171626Scognetextern int badaddr_read(void *, int, void *); 160171626Scognetstatic vm_offset_t allocable = 0xe1000000; 161171626Scognetint 162277460Siani81342_mem_bs_map(bus_space_tag_t tag, bus_addr_t bpa, bus_size_t size, int flags, 163171626Scognet bus_space_handle_t *bshp) 164171626Scognet{ 165277460Sian struct i81342_pci_softc *sc = (struct i81342_pci_softc *)tag->bs_privdata; 166171626Scognet struct i81342_pci_map *tmp; 167171626Scognet vm_offset_t addr, endaddr; 168171626Scognet vm_paddr_t paddr; 169171626Scognet 170171626Scognet /* Lookup to see if we already have a mapping at this address. */ 171171626Scognet tmp = sc->sc_pci_mappings; 172171626Scognet while (tmp) { 173171626Scognet if (tmp->paddr <= bpa && tmp->paddr + tmp->size > 174171626Scognet bpa + size) { 175171626Scognet *bshp = bpa - tmp->paddr + tmp->vaddr; 176171626Scognet return (0); 177171626Scognet } 178171626Scognet tmp = tmp->next; 179171626Scognet } 180171626Scognet addr = allocable; 181171626Scognet endaddr = ((addr + size) &~ (0x1000000 - 1)) + 0x1000000; 182171626Scognet if (endaddr >= IOP34X_VADDR) 183171626Scognet panic("PCI virtual memory exhausted"); 184171626Scognet allocable = endaddr; 185171626Scognet tmp = malloc(sizeof(*tmp), M_DEVBUF, M_WAITOK); 186171626Scognet tmp->next = NULL; 187171626Scognet paddr = bpa &~ (0x100000 - 1); 188171626Scognet tmp->paddr = paddr; 189171626Scognet tmp->vaddr = addr; 190171626Scognet tmp->size = 0; 191171626Scognet while (addr < endaddr) { 192171626Scognet pmap_kenter_supersection(addr, paddr + (sc->sc_is_atux ? 193171626Scognet IOP34X_PCIX_OMBAR : IOP34X_PCIE_OMBAR), 0); 194171626Scognet addr += 0x1000000; 195171626Scognet paddr += 0x1000000; 196171626Scognet tmp->size += 0x1000000; 197171626Scognet } 198171626Scognet tmp->next = sc->sc_pci_mappings; 199171626Scognet sc->sc_pci_mappings = tmp; 200171626Scognet *bshp = bpa - tmp->paddr + tmp->vaddr; 201171626Scognet return (0); 202171626Scognet} 203171626Scognet 204171626Scognetvoid 205277460Siani81342_mem_bs_unmap(bus_space_tag_t tag, bus_space_handle_t h, bus_size_t size) 206171626Scognet{ 207171626Scognet#if 0 208171626Scognet vm_offset_t va, endva; 209171626Scognet 210277460Sian va = trunc_page((vm_offset_t)h); 211171626Scognet endva = va + round_page(size); 212171626Scognet 213171626Scognet /* Free the kernel virtual mapping. */ 214254025Sjeff kva_free(va, endva - va); 215171626Scognet#endif 216171626Scognet} 217171626Scognet 218171626Scognetint 219277460Siani81342_mem_bs_alloc(bus_space_tag_t tag, bus_addr_t rstart, bus_addr_t rend, 220171626Scognet bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags, 221171626Scognet bus_addr_t *bpap, bus_space_handle_t *bshp) 222171626Scognet{ 223171626Scognet 224171626Scognet panic("i81342_mem_bs_alloc(): not implemented"); 225171626Scognet} 226171626Scognet 227236987Simpvoid 228277460Siani81342_mem_bs_free(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t size) 229171626Scognet{ 230171626Scognet 231171626Scognet panic("i81342_mem_bs_free(): not implemented"); 232171626Scognet} 233