Annotation of sys/arch/arm/mainbus/mainbus_io.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: mainbus_io.c,v 1.3 2007/05/25 16:45:59 krw Exp $ */
! 2: /* $NetBSD: mainbus_io.c,v 1.14 2003/12/06 22:05:33 bjh21 Exp $ */
! 3:
! 4: /*
! 5: * Copyright (c) 1997 Mark Brinicombe.
! 6: * All rights reserved.
! 7: *
! 8: * Redistribution and use in source and binary forms, with or without
! 9: * modification, are permitted provided that the following conditions
! 10: * are met:
! 11: * 1. Redistributions of source code must retain the above copyright
! 12: * notice, this list of conditions and the following disclaimer.
! 13: * 2. Redistributions in binary form must reproduce the above copyright
! 14: * notice, this list of conditions and the following disclaimer in the
! 15: * documentation and/or other materials provided with the distribution.
! 16: * 3. All advertising materials mentioning features or use of this software
! 17: * must display the following acknowledgement:
! 18: * This product includes software developed by Mark Brinicombe.
! 19: * 4. The name of the company nor the name of the author may be used to
! 20: * endorse or promote products derived from this software without specific
! 21: * prior written permission.
! 22: *
! 23: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
! 24: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
! 25: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 26: * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
! 27: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
! 28: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
! 29: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 30: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 31: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 32: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 33: * SUCH DAMAGE.
! 34: */
! 35:
! 36: /*
! 37: * bus_space I/O functions for mainbus
! 38: */
! 39:
! 40: #include <sys/param.h>
! 41: #include <sys/systm.h>
! 42: #include <sys/queue.h>
! 43:
! 44: #include <uvm/uvm.h>
! 45:
! 46: #include <machine/bus.h>
! 47: #include <machine/pmap.h>
! 48:
! 49: /* Prototypes for all the bus_space structure functions */
! 50:
! 51: bs_protos(mainbus);
! 52: bs_protos(bs_notimpl);
! 53:
! 54: /* Declare the mainbus bus space tag */
! 55:
! 56: struct bus_space mainbus_bs_tag = {
! 57: /* cookie */
! 58: NULL,
! 59:
! 60: /* mapping/unmapping */
! 61: mainbus_bs_map,
! 62: mainbus_bs_unmap,
! 63: mainbus_bs_subregion,
! 64:
! 65: /* allocation/deallocation */
! 66: mainbus_bs_alloc,
! 67: mainbus_bs_free,
! 68:
! 69: /* get kernel virtual address */
! 70: 0, /* there is no linear mapping */
! 71:
! 72: /* Mmap bus space for user */
! 73: mainbus_bs_mmap,
! 74:
! 75: /* barrier */
! 76: mainbus_bs_barrier,
! 77:
! 78: /* read (single) */
! 79: mainbus_bs_r_1,
! 80: mainbus_bs_r_2,
! 81: mainbus_bs_r_4,
! 82: bs_notimpl_bs_r_8,
! 83:
! 84: /* read multiple */
! 85: bs_notimpl_bs_rm_1,
! 86: mainbus_bs_rm_2,
! 87: bs_notimpl_bs_rm_4,
! 88: bs_notimpl_bs_rm_8,
! 89:
! 90: /* read region */
! 91: bs_notimpl_bs_rr_1,
! 92: bs_notimpl_bs_rr_2,
! 93: bs_notimpl_bs_rr_4,
! 94: bs_notimpl_bs_rr_8,
! 95:
! 96: /* write (single) */
! 97: mainbus_bs_w_1,
! 98: mainbus_bs_w_2,
! 99: mainbus_bs_w_4,
! 100: bs_notimpl_bs_w_8,
! 101:
! 102: /* write multiple */
! 103: mainbus_bs_wm_1,
! 104: mainbus_bs_wm_2,
! 105: bs_notimpl_bs_wm_4,
! 106: bs_notimpl_bs_wm_8,
! 107:
! 108: /* write region */
! 109: bs_notimpl_bs_wr_1,
! 110: bs_notimpl_bs_wr_2,
! 111: bs_notimpl_bs_wr_4,
! 112: bs_notimpl_bs_wr_8,
! 113:
! 114: bs_notimpl_bs_sm_1,
! 115: bs_notimpl_bs_sm_2,
! 116: bs_notimpl_bs_sm_4,
! 117: bs_notimpl_bs_sm_8,
! 118:
! 119: /* set region */
! 120: bs_notimpl_bs_sr_1,
! 121: bs_notimpl_bs_sr_2,
! 122: bs_notimpl_bs_sr_4,
! 123: bs_notimpl_bs_sr_8,
! 124:
! 125: /* copy */
! 126: bs_notimpl_bs_c_1,
! 127: bs_notimpl_bs_c_2,
! 128: bs_notimpl_bs_c_4,
! 129: bs_notimpl_bs_c_8,
! 130: };
! 131:
! 132: /* bus space functions */
! 133:
! 134: int
! 135: mainbus_bs_map(t, bpa, size, flags, bshp)
! 136: void *t;
! 137: bus_addr_t bpa;
! 138: bus_size_t size;
! 139: int flags;
! 140: bus_space_handle_t *bshp;
! 141: {
! 142: u_long startpa, endpa, pa;
! 143: vaddr_t va;
! 144: pt_entry_t *pte;
! 145:
! 146: if ((u_long)bpa > (u_long)KERNEL_BASE) {
! 147: /* XXX This is a temporary hack to aid transition. */
! 148: *bshp = bpa;
! 149: return(0);
! 150: }
! 151:
! 152: startpa = trunc_page(bpa);
! 153: endpa = round_page(bpa + size);
! 154:
! 155: /* XXX use extent manager to check duplicate mapping */
! 156:
! 157: va = uvm_km_valloc(kernel_map, endpa - startpa);
! 158: if (! va)
! 159: return(ENOMEM);
! 160:
! 161: *bshp = (bus_space_handle_t)(va + (bpa - startpa));
! 162:
! 163: for(pa = startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE) {
! 164: pmap_kenter_pa(va, pa, VM_PROT_READ | VM_PROT_WRITE);
! 165: if ((flags & BUS_SPACE_MAP_CACHEABLE) == 0) {
! 166: pte = vtopte(va);
! 167: *pte &= ~L2_S_CACHE_MASK;
! 168: PTE_SYNC(pte);
! 169: }
! 170: }
! 171: pmap_update(pmap_kernel());
! 172:
! 173: return(0);
! 174: }
! 175:
! 176: int
! 177: mainbus_bs_alloc(t, rstart, rend, size, alignment, boundary, cacheable,
! 178: bpap, bshp)
! 179: void *t;
! 180: bus_addr_t rstart, rend;
! 181: bus_size_t size, alignment, boundary;
! 182: int cacheable;
! 183: bus_addr_t *bpap;
! 184: bus_space_handle_t *bshp;
! 185: {
! 186: panic("mainbus_bs_alloc(): Help!");
! 187: }
! 188:
! 189:
! 190: void
! 191: mainbus_bs_unmap(t, bsh, size)
! 192: void *t;
! 193: bus_space_handle_t bsh;
! 194: bus_size_t size;
! 195: {
! 196: /*
! 197: * Temporary implementation
! 198: */
! 199: }
! 200:
! 201: void
! 202: mainbus_bs_free(t, bsh, size)
! 203: void *t;
! 204: bus_space_handle_t bsh;
! 205: bus_size_t size;
! 206: {
! 207:
! 208: panic("mainbus_bs_free(): Help!");
! 209: /* mainbus_bs_unmap() does all that we need to do. */
! 210: /* mainbus_bs_unmap(t, bsh, size);*/
! 211: }
! 212:
! 213: int
! 214: mainbus_bs_subregion(t, bsh, offset, size, nbshp)
! 215: void *t;
! 216: bus_space_handle_t bsh;
! 217: bus_size_t offset, size;
! 218: bus_space_handle_t *nbshp;
! 219: {
! 220:
! 221: *nbshp = bsh + (offset << 2);
! 222: return (0);
! 223: }
! 224:
! 225: paddr_t
! 226: mainbus_bs_mmap(t, paddr, offset, prot, flags)
! 227: void *t;
! 228: bus_addr_t paddr;
! 229: off_t offset;
! 230: int prot;
! 231: int flags;
! 232: {
! 233: /*
! 234: * mmap from address `paddr+offset' for one page
! 235: */
! 236: return (atop(paddr + offset));
! 237: }
! 238:
! 239: void
! 240: mainbus_bs_barrier(t, bsh, offset, len, flags)
! 241: void *t;
! 242: bus_space_handle_t bsh;
! 243: bus_size_t offset, len;
! 244: int flags;
! 245: {
! 246: }
! 247:
! 248: /* End of mainbus_io.c */
CVSweb