i81342_space.c revision 277460
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 277460 2015-01-21 01:06:08Z 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); 67171626Scognetbs_protos(generic); 68171626Scognetbs_protos(generic_armv4); 69171626Scognet 70171626Scognet/* 71171626Scognet * Template bus_space -- copied, and the bits that are NULL are 72171626Scognet * filled in. 73171626Scognet */ 74171626Scognetconst struct bus_space i81342_bs_tag_template = { 75171626Scognet /* cookie */ 76171626Scognet (void *) 0, 77171626Scognet 78171626Scognet /* mapping/unmapping */ 79171626Scognet NULL, 80171626Scognet NULL, 81171626Scognet i81342_bs_subregion, 82171626Scognet 83171626Scognet /* allocation/deallocation */ 84171626Scognet NULL, 85171626Scognet NULL, 86171626Scognet 87171626Scognet /* barrier */ 88171626Scognet i81342_bs_barrier, 89171626Scognet 90171626Scognet /* read (single) */ 91171626Scognet generic_bs_r_1, 92171626Scognet generic_armv4_bs_r_2, 93171626Scognet generic_bs_r_4, 94171626Scognet NULL, 95171626Scognet 96171626Scognet /* read multiple */ 97171626Scognet generic_bs_rm_1, 98171626Scognet generic_armv4_bs_rm_2, 99171626Scognet generic_bs_rm_4, 100171626Scognet NULL, 101171626Scognet 102171626Scognet /* read region */ 103171626Scognet generic_bs_rr_1, 104171626Scognet generic_armv4_bs_rr_2, 105171626Scognet generic_bs_rr_4, 106171626Scognet NULL, 107171626Scognet 108171626Scognet /* write (single) */ 109171626Scognet generic_bs_w_1, 110171626Scognet generic_armv4_bs_w_2, 111171626Scognet generic_bs_w_4, 112171626Scognet NULL, 113171626Scognet 114171626Scognet /* write multiple */ 115171626Scognet generic_bs_wm_1, 116171626Scognet generic_armv4_bs_wm_2, 117171626Scognet generic_bs_wm_4, 118171626Scognet NULL, 119171626Scognet 120171626Scognet /* write region */ 121171626Scognet NULL, 122171626Scognet generic_armv4_bs_wr_2, 123171626Scognet generic_bs_wr_4, 124171626Scognet NULL, 125171626Scognet 126171626Scognet /* set multiple */ 127171626Scognet NULL, 128171626Scognet NULL, 129171626Scognet NULL, 130171626Scognet NULL, 131171626Scognet 132171626Scognet /* set region */ 133171626Scognet NULL, 134171626Scognet generic_armv4_bs_sr_2, 135171626Scognet generic_bs_sr_4, 136171626Scognet NULL, 137171626Scognet 138171626Scognet /* copy */ 139171626Scognet NULL, 140171626Scognet generic_armv4_bs_c_2, 141171626Scognet NULL, 142171626Scognet NULL, 143171626Scognet 144171626Scognet /* read (single) stream */ 145171626Scognet generic_bs_r_1, 146171626Scognet generic_armv4_bs_r_2, 147171626Scognet generic_bs_r_4, 148171626Scognet NULL, 149171626Scognet 150171626Scognet /* read multiple stream */ 151171626Scognet generic_bs_rm_1, 152171626Scognet generic_armv4_bs_rm_2, 153171626Scognet generic_bs_rm_4, 154171626Scognet NULL, 155171626Scognet 156171626Scognet /* read region stream */ 157171626Scognet generic_bs_rr_1, 158171626Scognet generic_armv4_bs_rr_2, 159171626Scognet generic_bs_rr_4, 160171626Scognet NULL, 161171626Scognet 162171626Scognet /* write (single) stream */ 163171626Scognet generic_bs_w_1, 164171626Scognet generic_armv4_bs_w_2, 165171626Scognet generic_bs_w_4, 166171626Scognet NULL, 167171626Scognet 168171626Scognet /* write multiple stream */ 169171626Scognet generic_bs_wm_1, 170171626Scognet generic_armv4_bs_wm_2, 171171626Scognet generic_bs_wm_4, 172171626Scognet NULL, 173171626Scognet 174171626Scognet /* write region stream */ 175171626Scognet NULL, 176171626Scognet generic_armv4_bs_wr_2, 177171626Scognet generic_bs_wr_4, 178171626Scognet NULL, 179171626Scognet}; 180171626Scognet 181171626Scognetvoid 182171626Scogneti81342_bs_init(bus_space_tag_t bs, void *cookie) 183171626Scognet{ 184171626Scognet 185171626Scognet *bs = i81342_bs_tag_template; 186277460Sian bs->bs_privdata = cookie; 187171626Scognet} 188171626Scognet 189171626Scognetvoid 190171626Scogneti81342_io_bs_init(bus_space_tag_t bs, void *cookie) 191171626Scognet{ 192171626Scognet 193171626Scognet *bs = i81342_bs_tag_template; 194277460Sian bs->bs_privdata = cookie; 195171626Scognet 196171626Scognet bs->bs_map = i81342_io_bs_map; 197171626Scognet bs->bs_unmap = i81342_io_bs_unmap; 198171626Scognet bs->bs_alloc = i81342_io_bs_alloc; 199171626Scognet bs->bs_free = i81342_io_bs_free; 200171626Scognet 201171626Scognet} 202171626Scognet 203171626Scognetvoid 204171626Scogneti81342_mem_bs_init(bus_space_tag_t bs, void *cookie) 205171626Scognet{ 206171626Scognet 207171626Scognet *bs = i81342_bs_tag_template; 208277460Sian bs->bs_privdata = cookie; 209171626Scognet 210171626Scognet bs->bs_map = i81342_mem_bs_map; 211171626Scognet bs->bs_unmap = i81342_mem_bs_unmap; 212171626Scognet bs->bs_alloc = i81342_mem_bs_alloc; 213171626Scognet bs->bs_free = i81342_mem_bs_free; 214171626Scognet 215171626Scognet} 216171626Scognet 217171626Scognet/* *** Routines shared by i81342, PCI IO, and PCI MEM. *** */ 218171626Scognet 219171626Scognetint 220277460Siani81342_bs_subregion(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, 221171626Scognet bus_size_t size, bus_space_handle_t *nbshp) 222171626Scognet{ 223171626Scognet 224171626Scognet *nbshp = bsh + offset; 225171626Scognet return (0); 226171626Scognet} 227171626Scognet 228171626Scognetvoid 229277460Siani81342_bs_barrier(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset, 230171626Scognet bus_size_t len, int flags) 231171626Scognet{ 232171626Scognet 233171626Scognet /* Nothing to do. */ 234171626Scognet} 235171626Scognet 236171626Scognet/* *** Routines for PCI IO. *** */ 237171626Scognet 238171626Scognetint 239277460Siani81342_io_bs_map(bus_space_tag_t tag, bus_addr_t bpa, bus_size_t size, int flags, 240171626Scognet bus_space_handle_t *bshp) 241171626Scognet{ 242171626Scognet 243171626Scognet *bshp = bpa; 244171626Scognet return (0); 245171626Scognet} 246171626Scognet 247171626Scognetvoid 248277460Siani81342_io_bs_unmap(bus_space_tag_t tag, bus_space_handle_t h, bus_size_t size) 249171626Scognet{ 250171626Scognet 251171626Scognet /* Nothing to do. */ 252171626Scognet} 253171626Scognet 254171626Scognetint 255277460Siani81342_io_bs_alloc(bus_space_tag_t tag, bus_addr_t rstart, bus_addr_t rend, 256171626Scognet bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags, 257171626Scognet bus_addr_t *bpap, bus_space_handle_t *bshp) 258171626Scognet{ 259171626Scognet 260171626Scognet panic("i81342_io_bs_alloc(): not implemented"); 261171626Scognet} 262171626Scognet 263236987Simpvoid 264277460Siani81342_io_bs_free(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t size) 265171626Scognet{ 266171626Scognet 267171626Scognet panic("i81342_io_bs_free(): not implemented"); 268171626Scognet} 269171626Scognet 270171626Scognet 271171626Scognet/* *** Routines for PCI MEM. *** */ 272171626Scognetextern int badaddr_read(void *, int, void *); 273171626Scognetstatic vm_offset_t allocable = 0xe1000000; 274171626Scognetint 275277460Siani81342_mem_bs_map(bus_space_tag_t tag, bus_addr_t bpa, bus_size_t size, int flags, 276171626Scognet bus_space_handle_t *bshp) 277171626Scognet{ 278277460Sian struct i81342_pci_softc *sc = (struct i81342_pci_softc *)tag->bs_privdata; 279171626Scognet struct i81342_pci_map *tmp; 280171626Scognet vm_offset_t addr, endaddr; 281171626Scognet vm_paddr_t paddr; 282171626Scognet 283171626Scognet /* Lookup to see if we already have a mapping at this address. */ 284171626Scognet tmp = sc->sc_pci_mappings; 285171626Scognet while (tmp) { 286171626Scognet if (tmp->paddr <= bpa && tmp->paddr + tmp->size > 287171626Scognet bpa + size) { 288171626Scognet *bshp = bpa - tmp->paddr + tmp->vaddr; 289171626Scognet return (0); 290171626Scognet } 291171626Scognet tmp = tmp->next; 292171626Scognet } 293171626Scognet addr = allocable; 294171626Scognet endaddr = ((addr + size) &~ (0x1000000 - 1)) + 0x1000000; 295171626Scognet if (endaddr >= IOP34X_VADDR) 296171626Scognet panic("PCI virtual memory exhausted"); 297171626Scognet allocable = endaddr; 298171626Scognet tmp = malloc(sizeof(*tmp), M_DEVBUF, M_WAITOK); 299171626Scognet tmp->next = NULL; 300171626Scognet paddr = bpa &~ (0x100000 - 1); 301171626Scognet tmp->paddr = paddr; 302171626Scognet tmp->vaddr = addr; 303171626Scognet tmp->size = 0; 304171626Scognet while (addr < endaddr) { 305171626Scognet pmap_kenter_supersection(addr, paddr + (sc->sc_is_atux ? 306171626Scognet IOP34X_PCIX_OMBAR : IOP34X_PCIE_OMBAR), 0); 307171626Scognet addr += 0x1000000; 308171626Scognet paddr += 0x1000000; 309171626Scognet tmp->size += 0x1000000; 310171626Scognet } 311171626Scognet tmp->next = sc->sc_pci_mappings; 312171626Scognet sc->sc_pci_mappings = tmp; 313171626Scognet *bshp = bpa - tmp->paddr + tmp->vaddr; 314171626Scognet return (0); 315171626Scognet} 316171626Scognet 317171626Scognetvoid 318277460Siani81342_mem_bs_unmap(bus_space_tag_t tag, bus_space_handle_t h, bus_size_t size) 319171626Scognet{ 320171626Scognet#if 0 321171626Scognet vm_offset_t va, endva; 322171626Scognet 323277460Sian va = trunc_page((vm_offset_t)h); 324171626Scognet endva = va + round_page(size); 325171626Scognet 326171626Scognet /* Free the kernel virtual mapping. */ 327254025Sjeff kva_free(va, endva - va); 328171626Scognet#endif 329171626Scognet} 330171626Scognet 331171626Scognetint 332277460Siani81342_mem_bs_alloc(bus_space_tag_t tag, bus_addr_t rstart, bus_addr_t rend, 333171626Scognet bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags, 334171626Scognet bus_addr_t *bpap, bus_space_handle_t *bshp) 335171626Scognet{ 336171626Scognet 337171626Scognet panic("i81342_mem_bs_alloc(): not implemented"); 338171626Scognet} 339171626Scognet 340236987Simpvoid 341277460Siani81342_mem_bs_free(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t size) 342171626Scognet{ 343171626Scognet 344171626Scognet panic("i81342_mem_bs_free(): not implemented"); 345171626Scognet} 346