Annotation of sys/arch/landisk/dev/obio.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: obio.c,v 1.5 2006/11/10 19:23:15 miod Exp $ */
! 2: /* $NetBSD: obio.c,v 1.1 2006/09/01 21:26:18 uwe Exp $ */
! 3:
! 4: /*-
! 5: * Copyright (c) 1998 The NetBSD Foundation, Inc.
! 6: * All rights reserved.
! 7: *
! 8: * This code is derived from software contributed to The NetBSD Foundation
! 9: * by Charles M. Hannum.
! 10: *
! 11: * Redistribution and use in source and binary forms, with or without
! 12: * modification, are permitted provided that the following conditions
! 13: * are met:
! 14: * 1. Redistributions of source code must retain the above copyright
! 15: * notice, this list of conditions and the following disclaimer.
! 16: * 2. Redistributions in binary form must reproduce the above copyright
! 17: * notice, this list of conditions and the following disclaimer in the
! 18: * documentation and/or other materials provided with the distribution.
! 19: * 3. All advertising materials mentioning features or use of this software
! 20: * must display the following acknowledgement:
! 21: * This product includes software developed by the NetBSD
! 22: * Foundation, Inc. and its contributors.
! 23: * 4. Neither the name of The NetBSD Foundation nor the names of its
! 24: * contributors may be used to endorse or promote products derived
! 25: * from this software without specific prior written permission.
! 26: *
! 27: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
! 28: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
! 29: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
! 30: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
! 31: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
! 32: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
! 33: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
! 34: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
! 35: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
! 36: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
! 37: * POSSIBILITY OF SUCH DAMAGE.
! 38: */
! 39:
! 40: #include <sys/param.h>
! 41: #include <sys/systm.h>
! 42: #include <sys/device.h>
! 43:
! 44: #include <uvm/uvm_extern.h>
! 45:
! 46: #include <sh/devreg.h>
! 47: #include <sh/mmu.h>
! 48: #include <sh/pmap.h>
! 49: #include <sh/pte.h>
! 50:
! 51: #include <machine/bus.h>
! 52: #include <machine/cpu.h>
! 53: #include <machine/intr.h>
! 54:
! 55: #include <landisk/dev/obiovar.h>
! 56:
! 57: int obio_match(struct device *, void *, void *);
! 58: void obio_attach(struct device *, struct device *, void *);
! 59: int obio_print(void *, const char *);
! 60: int obio_search(struct device *, void *, void *);
! 61:
! 62: struct cfattach obio_ca = {
! 63: sizeof(struct obio_softc), obio_match, obio_attach
! 64: };
! 65:
! 66: struct cfdriver obio_cd = {
! 67: 0, "obio", DV_DULL
! 68: };
! 69:
! 70: int
! 71: obio_match(struct device *parent, void *vcf, void *aux)
! 72: {
! 73: struct obiobus_attach_args *oba = aux;
! 74:
! 75: if (strcmp(oba->oba_busname, obio_cd.cd_name) != 0)
! 76: return (0);
! 77:
! 78: return (1);
! 79: }
! 80:
! 81: void
! 82: obio_attach(struct device *parent, struct device *self, void *aux)
! 83: {
! 84: struct obio_softc *sc = (struct obio_softc *)self;
! 85: struct obiobus_attach_args *oba = aux;
! 86:
! 87: printf("\n");
! 88:
! 89: sc->sc_iot = oba->oba_iot;
! 90: sc->sc_memt = oba->oba_memt;
! 91:
! 92: config_search(obio_search, self, NULL);
! 93: }
! 94:
! 95: int
! 96: obio_search(struct device *parent, void *vcf, void *aux)
! 97: {
! 98: struct obio_softc *sc = (struct obio_softc *)parent;
! 99: struct cfdata *cf = vcf;
! 100: struct obio_attach_args oa;
! 101: struct obio_io res_io[1];
! 102: struct obio_iomem res_mem[1];
! 103: struct obio_irq res_irq[1];
! 104:
! 105: oa.oa_iot = sc->sc_iot;
! 106: oa.oa_memt = sc->sc_memt;
! 107: oa.oa_nio = oa.oa_niomem = oa.oa_nirq = 0;
! 108:
! 109: if (cf->cf_iobase != IOBASEUNK) {
! 110: res_io[0].or_addr = cf->cf_iobase;
! 111: res_io[0].or_size = cf->cf_iosize;
! 112: oa.oa_io = res_io;
! 113: oa.oa_nio = 1;
! 114: }
! 115:
! 116: if (cf->cf_maddr != MADDRUNK) {
! 117: res_mem[0].or_addr = cf->cf_maddr;
! 118: res_mem[0].or_size = cf->cf_msize;
! 119: oa.oa_iomem = res_mem;
! 120: oa.oa_niomem = 1;
! 121: }
! 122:
! 123: if (cf->cf_irq != IRQUNK) {
! 124: res_irq[0].or_irq = cf->cf_irq;
! 125: oa.oa_irq = res_irq;
! 126: oa.oa_nirq = 1;
! 127: }
! 128:
! 129: if ((*cf->cf_attach->ca_match)(parent, cf, &oa) == 0)
! 130: return (0);
! 131:
! 132: config_attach(parent, cf, &oa, obio_print);
! 133: return (1);
! 134: }
! 135:
! 136: int
! 137: obio_print(void *args, const char *name)
! 138: {
! 139: struct obio_attach_args *oa = args;
! 140: const char *sep;
! 141: int i;
! 142:
! 143: if (oa->oa_nio) {
! 144: sep = "";
! 145: printf(" port ");
! 146: for (i = 0; i < oa->oa_nio; i++) {
! 147: if (oa->oa_io[i].or_size == 0)
! 148: continue;
! 149: printf("%s0x%x", sep, oa->oa_io[i].or_addr);
! 150: if (oa->oa_io[i].or_size > 1)
! 151: printf("-0x%x", oa->oa_io[i].or_addr +
! 152: oa->oa_io[i].or_size - 1);
! 153: sep = ",";
! 154: }
! 155: }
! 156:
! 157: if (oa->oa_niomem) {
! 158: sep = "";
! 159: printf(" iomem ");
! 160: for (i = 0; i < oa->oa_niomem; i++) {
! 161: if (oa->oa_iomem[i].or_size == 0)
! 162: continue;
! 163: printf("%s0x%x", sep, oa->oa_iomem[i].or_addr);
! 164: if (oa->oa_iomem[i].or_size > 1)
! 165: printf("-0x%x", oa->oa_iomem[i].or_addr +
! 166: oa->oa_iomem[i].or_size - 1);
! 167: sep = ",";
! 168: }
! 169: }
! 170:
! 171: if (oa->oa_nirq) {
! 172: sep = "";
! 173: printf(" irq ");
! 174: for (i = 0; i < oa->oa_nirq; i++) {
! 175: if (oa->oa_irq[i].or_irq == IRQUNK)
! 176: continue;
! 177: printf("%s%d", sep, oa->oa_irq[i].or_irq);
! 178: sep = ",";
! 179: }
! 180: }
! 181:
! 182: return (UNCONF);
! 183: }
! 184:
! 185: /*
! 186: * Set up an interrupt handler to start being called.
! 187: */
! 188: void *
! 189: obio_intr_establish(int irq, int level, int (*ih_fun)(void *), void *ih_arg,
! 190: const char *ih_name)
! 191: {
! 192: return extintr_establish(irq, level, ih_fun, ih_arg, ih_name);
! 193: }
! 194:
! 195: /*
! 196: * Deregister an interrupt handler.
! 197: */
! 198: void
! 199: obio_intr_disestablish(void *arg)
! 200: {
! 201: extintr_disestablish(arg);
! 202: }
! 203:
! 204: /*
! 205: * on-board I/O bus space
! 206: */
! 207: #define OBIO_IOMEM_IO 0 /* space is i/o space */
! 208: #define OBIO_IOMEM_MEM 1 /* space is mem space */
! 209: #define OBIO_IOMEM_PCMCIA_IO 2 /* PCMCIA IO space */
! 210: #define OBIO_IOMEM_PCMCIA_MEM 3 /* PCMCIA Mem space */
! 211: #define OBIO_IOMEM_PCMCIA_ATT 4 /* PCMCIA Attr space */
! 212: #define OBIO_IOMEM_PCMCIA_8BIT 0x8000 /* PCMCIA BUS 8 BIT WIDTH */
! 213: #define OBIO_IOMEM_PCMCIA_IO8 \
! 214: (OBIO_IOMEM_PCMCIA_IO|OBIO_IOMEM_PCMCIA_8BIT)
! 215: #define OBIO_IOMEM_PCMCIA_MEM8 \
! 216: (OBIO_IOMEM_PCMCIA_MEM|OBIO_IOMEM_PCMCIA_8BIT)
! 217: #define OBIO_IOMEM_PCMCIA_ATT8 \
! 218: (OBIO_IOMEM_PCMCIA_ATT|OBIO_IOMEM_PCMCIA_8BIT)
! 219:
! 220: int obio_iomem_map(void *v, bus_addr_t bpa, bus_size_t size, int flags,
! 221: bus_space_handle_t *bshp);
! 222: void obio_iomem_unmap(void *v, bus_space_handle_t bsh, bus_size_t size);
! 223: int obio_iomem_subregion(void *v, bus_space_handle_t bsh,
! 224: bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp);
! 225: int obio_iomem_alloc(void *v, bus_addr_t rstart, bus_addr_t rend,
! 226: bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags,
! 227: bus_addr_t *bpap, bus_space_handle_t *bshp);
! 228: void obio_iomem_free(void *v, bus_space_handle_t bsh, bus_size_t size);
! 229:
! 230: int obio_iomem_add_mapping(bus_addr_t, bus_size_t, int,
! 231: bus_space_handle_t *);
! 232:
! 233: int
! 234: obio_iomem_add_mapping(bus_addr_t bpa, bus_size_t size, int type,
! 235: bus_space_handle_t *bshp)
! 236: {
! 237: u_long pa, endpa;
! 238: vaddr_t va;
! 239: pt_entry_t *pte;
! 240: unsigned int m = 0;
! 241: int io_type = type & ~OBIO_IOMEM_PCMCIA_8BIT;
! 242:
! 243: pa = trunc_page(bpa);
! 244: endpa = round_page(bpa + size);
! 245:
! 246: #ifdef DIAGNOSTIC
! 247: if (endpa <= pa)
! 248: panic("obio_iomem_add_mapping: overflow");
! 249: #endif
! 250:
! 251: va = uvm_km_valloc(kernel_map, endpa - pa);
! 252: if (va == 0)
! 253: return (ENOMEM);
! 254:
! 255: *bshp = (bus_space_handle_t)(va + (bpa & PGOFSET));
! 256:
! 257: #define MODE(t, s) \
! 258: ((t) & OBIO_IOMEM_PCMCIA_8BIT) ? \
! 259: _PG_PCMCIA_ ## s ## 8 : \
! 260: _PG_PCMCIA_ ## s ## 16
! 261: switch (io_type) {
! 262: default:
! 263: panic("unknown pcmcia space.");
! 264: /* NOTREACHED */
! 265: case OBIO_IOMEM_PCMCIA_IO:
! 266: m = MODE(type, IO);
! 267: break;
! 268: case OBIO_IOMEM_PCMCIA_MEM:
! 269: m = MODE(type, MEM);
! 270: break;
! 271: case OBIO_IOMEM_PCMCIA_ATT:
! 272: m = MODE(type, ATTR);
! 273: break;
! 274: }
! 275: #undef MODE
! 276:
! 277: for (; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE) {
! 278: pmap_kenter_pa(va, pa, VM_PROT_READ | VM_PROT_WRITE);
! 279: pte = __pmap_kpte_lookup(va);
! 280: KDASSERT(pte);
! 281: *pte |= m; /* PTEA PCMCIA assistant bit */
! 282: sh_tlb_update(0, va, *pte);
! 283: }
! 284:
! 285: return (0);
! 286: }
! 287:
! 288: int
! 289: obio_iomem_map(void *v, bus_addr_t bpa, bus_size_t size,
! 290: int flags, bus_space_handle_t *bshp)
! 291: {
! 292: bus_addr_t addr = SH3_PHYS_TO_P2SEG(bpa);
! 293: int error;
! 294:
! 295: KASSERT((bpa & SH3_PHYS_MASK) == bpa);
! 296:
! 297: if (bpa < 0x14000000 || bpa >= 0x1c000000) {
! 298: /* CS0,1,2,3,4,7 */
! 299: *bshp = (bus_space_handle_t)addr;
! 300: return (0);
! 301: }
! 302:
! 303: /* CS5,6 */
! 304: error = obio_iomem_add_mapping(addr, size, (int)(u_long)v, bshp);
! 305:
! 306: return (error);
! 307: }
! 308:
! 309: void
! 310: obio_iomem_unmap(void *v, bus_space_handle_t bsh, bus_size_t size)
! 311: {
! 312: u_long va, endva;
! 313: bus_addr_t bpa;
! 314:
! 315: if (bsh >= SH3_P2SEG_BASE && bsh <= SH3_P2SEG_END) {
! 316: /* maybe CS0,1,2,3,4,7 */
! 317: return;
! 318: }
! 319:
! 320: /* CS5,6 */
! 321: va = trunc_page(bsh);
! 322: endva = round_page(bsh + size);
! 323:
! 324: #ifdef DIAGNOSTIC
! 325: if (endva <= va)
! 326: panic("obio_io_unmap: overflow");
! 327: #endif
! 328:
! 329: pmap_extract(pmap_kernel(), va, &bpa);
! 330: bpa += bsh & PGOFSET;
! 331:
! 332: pmap_kremove(va, endva - va);
! 333:
! 334: /*
! 335: * Free the kernel virtual mapping.
! 336: */
! 337: uvm_km_free(kernel_map, va, endva - va);
! 338: }
! 339:
! 340: int
! 341: obio_iomem_subregion(void *v, bus_space_handle_t bsh,
! 342: bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp)
! 343: {
! 344: *nbshp = bsh + offset;
! 345:
! 346: return (0);
! 347: }
! 348:
! 349: int
! 350: obio_iomem_alloc(void *v, bus_addr_t rstart, bus_addr_t rend,
! 351: bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags,
! 352: bus_addr_t *bpap, bus_space_handle_t *bshp)
! 353: {
! 354: *bshp = *bpap = rstart;
! 355:
! 356: return (0);
! 357: }
! 358:
! 359: void
! 360: obio_iomem_free(void *v, bus_space_handle_t bsh, bus_size_t size)
! 361: {
! 362: obio_iomem_unmap(v, bsh, size);
! 363: }
! 364:
! 365: /*
! 366: * on-board I/O bus space read/write
! 367: */
! 368: uint8_t obio_iomem_read_1(void *v, bus_space_handle_t bsh, bus_size_t offset);
! 369: uint16_t obio_iomem_read_2(void *v, bus_space_handle_t bsh, bus_size_t offset);
! 370: uint32_t obio_iomem_read_4(void *v, bus_space_handle_t bsh, bus_size_t offset);
! 371: void obio_iomem_read_multi_1(void *v, bus_space_handle_t bsh,
! 372: bus_size_t offset, uint8_t *addr, bus_size_t count);
! 373: void obio_iomem_read_multi_2(void *v, bus_space_handle_t bsh,
! 374: bus_size_t offset, uint16_t *addr, bus_size_t count);
! 375: void obio_iomem_read_multi_4(void *v, bus_space_handle_t bsh,
! 376: bus_size_t offset, uint32_t *addr, bus_size_t count);
! 377: void obio_iomem_read_raw_multi_2(void *v, bus_space_handle_t bsh,
! 378: bus_size_t offset, uint8_t *addr, bus_size_t count);
! 379: void obio_iomem_read_raw_multi_4(void *v, bus_space_handle_t bsh,
! 380: bus_size_t offset, uint8_t *addr, bus_size_t count);
! 381: void obio_iomem_read_region_1(void *v, bus_space_handle_t bsh,
! 382: bus_size_t offset, uint8_t *addr, bus_size_t count);
! 383: void obio_iomem_read_region_2(void *v, bus_space_handle_t bsh,
! 384: bus_size_t offset, uint16_t *addr, bus_size_t count);
! 385: void obio_iomem_read_region_4(void *v, bus_space_handle_t bsh,
! 386: bus_size_t offset, uint32_t *addr, bus_size_t count);
! 387: void obio_iomem_read_raw_region_2(void *v, bus_space_handle_t bsh,
! 388: bus_size_t offset, uint8_t *addr, bus_size_t count);
! 389: void obio_iomem_read_raw_region_4(void *v, bus_space_handle_t bsh,
! 390: bus_size_t offset, uint8_t *addr, bus_size_t count);
! 391: void obio_iomem_write_1(void *v, bus_space_handle_t bsh, bus_size_t offset,
! 392: uint8_t value);
! 393: void obio_iomem_write_2(void *v, bus_space_handle_t bsh, bus_size_t offset,
! 394: uint16_t value);
! 395: void obio_iomem_write_4(void *v, bus_space_handle_t bsh, bus_size_t offset,
! 396: uint32_t value);
! 397: void obio_iomem_write_multi_1(void *v, bus_space_handle_t bsh,
! 398: bus_size_t offset, const uint8_t *addr, bus_size_t count);
! 399: void obio_iomem_write_multi_2(void *v, bus_space_handle_t bsh,
! 400: bus_size_t offset, const uint16_t *addr, bus_size_t count);
! 401: void obio_iomem_write_multi_4(void *v, bus_space_handle_t bsh,
! 402: bus_size_t offset, const uint32_t *addr, bus_size_t count);
! 403: void obio_iomem_write_raw_multi_2(void *v, bus_space_handle_t bsh,
! 404: bus_size_t offset, const uint8_t *addr, bus_size_t count);
! 405: void obio_iomem_write_raw_multi_4(void *v, bus_space_handle_t bsh,
! 406: bus_size_t offset, const uint8_t *addr, bus_size_t count);
! 407: void obio_iomem_write_region_1(void *v, bus_space_handle_t bsh,
! 408: bus_size_t offset, const uint8_t *addr, bus_size_t count);
! 409: void obio_iomem_write_region_2(void *v, bus_space_handle_t bsh,
! 410: bus_size_t offset, const uint16_t *addr, bus_size_t count);
! 411: void obio_iomem_write_region_4(void *v, bus_space_handle_t bsh,
! 412: bus_size_t offset, const uint32_t *addr, bus_size_t count);
! 413: void obio_iomem_write_raw_region_2(void *v, bus_space_handle_t bsh,
! 414: bus_size_t offset, const uint8_t *addr, bus_size_t count);
! 415: void obio_iomem_write_raw_region_4(void *v, bus_space_handle_t bsh,
! 416: bus_size_t offset, const uint8_t *addr, bus_size_t count);
! 417: void obio_iomem_set_multi_1(void *v, bus_space_handle_t bsh, bus_size_t offset,
! 418: uint8_t val, bus_size_t count);
! 419: void obio_iomem_set_multi_2(void *v, bus_space_handle_t bsh, bus_size_t offset,
! 420: uint16_t val, bus_size_t count);
! 421: void obio_iomem_set_multi_4(void *v, bus_space_handle_t bsh, bus_size_t offset,
! 422: uint32_t val, bus_size_t count);
! 423: void obio_iomem_set_region_1(void *v, bus_space_handle_t bsh,
! 424: bus_size_t offset, uint8_t val, bus_size_t count);
! 425: void obio_iomem_set_region_2(void *v, bus_space_handle_t bsh,
! 426: bus_size_t offset, uint16_t val, bus_size_t count);
! 427: void obio_iomem_set_region_4(void *v, bus_space_handle_t bsh,
! 428: bus_size_t offset, uint32_t val, bus_size_t count);
! 429: void obio_iomem_copy_region_1(void *v, bus_space_handle_t h1, bus_size_t o1,
! 430: bus_space_handle_t h2, bus_size_t o2, bus_size_t count);
! 431: void obio_iomem_copy_region_2(void *v, bus_space_handle_t h1, bus_size_t o1,
! 432: bus_space_handle_t h2, bus_size_t o2, bus_size_t count);
! 433: void obio_iomem_copy_region_4(void *v, bus_space_handle_t h1, bus_size_t o1,
! 434: bus_space_handle_t h2, bus_size_t o2, bus_size_t count);
! 435:
! 436: struct _bus_space obio_bus_io =
! 437: {
! 438: .bs_cookie = (void *)OBIO_IOMEM_PCMCIA_IO,
! 439:
! 440: .bs_map = obio_iomem_map,
! 441: .bs_unmap = obio_iomem_unmap,
! 442: .bs_subregion = obio_iomem_subregion,
! 443:
! 444: .bs_alloc = obio_iomem_alloc,
! 445: .bs_free = obio_iomem_free,
! 446:
! 447: .bs_r_1 = obio_iomem_read_1,
! 448: .bs_r_2 = obio_iomem_read_2,
! 449: .bs_r_4 = obio_iomem_read_4,
! 450:
! 451: .bs_rm_1 = obio_iomem_read_multi_1,
! 452: .bs_rm_2 = obio_iomem_read_multi_2,
! 453: .bs_rm_4 = obio_iomem_read_multi_4,
! 454:
! 455: .bs_rrm_2 = obio_iomem_read_raw_multi_2,
! 456: .bs_rrm_4 = obio_iomem_read_raw_multi_4,
! 457:
! 458: .bs_rr_1 = obio_iomem_read_region_1,
! 459: .bs_rr_2 = obio_iomem_read_region_2,
! 460: .bs_rr_4 = obio_iomem_read_region_4,
! 461:
! 462: .bs_rrr_2 = obio_iomem_read_raw_region_2,
! 463: .bs_rrr_4 = obio_iomem_read_raw_region_4,
! 464:
! 465: .bs_w_1 = obio_iomem_write_1,
! 466: .bs_w_2 = obio_iomem_write_2,
! 467: .bs_w_4 = obio_iomem_write_4,
! 468:
! 469: .bs_wm_1 = obio_iomem_write_multi_1,
! 470: .bs_wm_2 = obio_iomem_write_multi_2,
! 471: .bs_wm_4 = obio_iomem_write_multi_4,
! 472:
! 473: .bs_wrm_2 = obio_iomem_write_raw_multi_2,
! 474: .bs_wrm_4 = obio_iomem_write_raw_multi_4,
! 475:
! 476: .bs_wr_1 = obio_iomem_write_region_1,
! 477: .bs_wr_2 = obio_iomem_write_region_2,
! 478: .bs_wr_4 = obio_iomem_write_region_4,
! 479:
! 480: .bs_wrr_2 = obio_iomem_write_raw_region_2,
! 481: .bs_wrr_4 = obio_iomem_write_raw_region_4,
! 482:
! 483: .bs_sm_1 = obio_iomem_set_multi_1,
! 484: .bs_sm_2 = obio_iomem_set_multi_2,
! 485: .bs_sm_4 = obio_iomem_set_multi_4,
! 486:
! 487: .bs_sr_1 = obio_iomem_set_region_1,
! 488: .bs_sr_2 = obio_iomem_set_region_2,
! 489: .bs_sr_4 = obio_iomem_set_region_4,
! 490:
! 491: .bs_c_1 = obio_iomem_copy_region_1,
! 492: .bs_c_2 = obio_iomem_copy_region_2,
! 493: .bs_c_4 = obio_iomem_copy_region_4,
! 494: };
! 495:
! 496: struct _bus_space obio_bus_mem =
! 497: {
! 498: .bs_cookie = (void *)OBIO_IOMEM_PCMCIA_MEM,
! 499:
! 500: .bs_map = obio_iomem_map,
! 501: .bs_unmap = obio_iomem_unmap,
! 502: .bs_subregion = obio_iomem_subregion,
! 503:
! 504: .bs_alloc = obio_iomem_alloc,
! 505: .bs_free = obio_iomem_free,
! 506:
! 507: .bs_r_1 = obio_iomem_read_1,
! 508: .bs_r_2 = obio_iomem_read_2,
! 509: .bs_r_4 = obio_iomem_read_4,
! 510:
! 511: .bs_rm_1 = obio_iomem_read_multi_1,
! 512: .bs_rm_2 = obio_iomem_read_multi_2,
! 513: .bs_rm_4 = obio_iomem_read_multi_4,
! 514:
! 515: .bs_rrm_2 = obio_iomem_read_raw_multi_2,
! 516: .bs_rrm_4 = obio_iomem_read_raw_multi_4,
! 517:
! 518: .bs_rr_1 = obio_iomem_read_region_1,
! 519: .bs_rr_2 = obio_iomem_read_region_2,
! 520: .bs_rr_4 = obio_iomem_read_region_4,
! 521:
! 522: .bs_rrr_2 = obio_iomem_read_raw_region_2,
! 523: .bs_rrr_4 = obio_iomem_read_raw_region_4,
! 524:
! 525: .bs_w_1 = obio_iomem_write_1,
! 526: .bs_w_2 = obio_iomem_write_2,
! 527: .bs_w_4 = obio_iomem_write_4,
! 528:
! 529: .bs_wm_1 = obio_iomem_write_multi_1,
! 530: .bs_wm_2 = obio_iomem_write_multi_2,
! 531: .bs_wm_4 = obio_iomem_write_multi_4,
! 532:
! 533: .bs_wrm_2 = obio_iomem_write_raw_multi_2,
! 534: .bs_wrm_4 = obio_iomem_write_raw_multi_4,
! 535:
! 536: .bs_wr_1 = obio_iomem_write_region_1,
! 537: .bs_wr_2 = obio_iomem_write_region_2,
! 538: .bs_wr_4 = obio_iomem_write_region_4,
! 539:
! 540: .bs_wrr_2 = obio_iomem_write_raw_region_2,
! 541: .bs_wrr_4 = obio_iomem_write_raw_region_4,
! 542:
! 543: .bs_sm_1 = obio_iomem_set_multi_1,
! 544: .bs_sm_2 = obio_iomem_set_multi_2,
! 545: .bs_sm_4 = obio_iomem_set_multi_4,
! 546:
! 547: .bs_sr_1 = obio_iomem_set_region_1,
! 548: .bs_sr_2 = obio_iomem_set_region_2,
! 549: .bs_sr_4 = obio_iomem_set_region_4,
! 550:
! 551: .bs_c_1 = obio_iomem_copy_region_1,
! 552: .bs_c_2 = obio_iomem_copy_region_2,
! 553: .bs_c_4 = obio_iomem_copy_region_4,
! 554: };
! 555:
! 556: /* read */
! 557: uint8_t
! 558: obio_iomem_read_1(void *v, bus_space_handle_t bsh, bus_size_t offset)
! 559: {
! 560: return *(volatile uint8_t *)(bsh + offset);
! 561: }
! 562:
! 563: uint16_t
! 564: obio_iomem_read_2(void *v, bus_space_handle_t bsh, bus_size_t offset)
! 565: {
! 566: return *(volatile uint16_t *)(bsh + offset);
! 567: }
! 568:
! 569: uint32_t
! 570: obio_iomem_read_4(void *v, bus_space_handle_t bsh, bus_size_t offset)
! 571: {
! 572: return *(volatile uint32_t *)(bsh + offset);
! 573: }
! 574:
! 575: void
! 576: obio_iomem_read_multi_1(void *v, bus_space_handle_t bsh,
! 577: bus_size_t offset, uint8_t *addr, bus_size_t count)
! 578: {
! 579: volatile uint8_t *p = (void *)(bsh + offset);
! 580:
! 581: while (count--) {
! 582: *addr++ = *p;
! 583: }
! 584: }
! 585:
! 586: void
! 587: obio_iomem_read_multi_2(void *v, bus_space_handle_t bsh,
! 588: bus_size_t offset, uint16_t *addr, bus_size_t count)
! 589: {
! 590: volatile uint16_t *p = (void *)(bsh + offset);
! 591:
! 592: while (count--) {
! 593: *addr++ = *p;
! 594: }
! 595: }
! 596:
! 597: void
! 598: obio_iomem_read_multi_4(void *v, bus_space_handle_t bsh,
! 599: bus_size_t offset, uint32_t *addr, bus_size_t count)
! 600: {
! 601: volatile uint32_t *p = (void *)(bsh + offset);
! 602:
! 603: while (count--) {
! 604: *addr++ = *p;
! 605: }
! 606: }
! 607:
! 608: void
! 609: obio_iomem_read_raw_multi_2(void *v, bus_space_handle_t bsh,
! 610: bus_size_t offset, uint8_t *addr, bus_size_t count)
! 611: {
! 612: volatile uint16_t *p = (void *)(bsh + offset);
! 613:
! 614: count >>= 1;
! 615: while (count--) {
! 616: *(uint16_t *)addr = *p;
! 617: addr += 2;
! 618: }
! 619: }
! 620:
! 621: void
! 622: obio_iomem_read_raw_multi_4(void *v, bus_space_handle_t bsh,
! 623: bus_size_t offset, uint8_t *addr, bus_size_t count)
! 624: {
! 625: volatile uint32_t *p = (void *)(bsh + offset);
! 626:
! 627: count >>= 2;
! 628: while (count--) {
! 629: *(uint32_t *)addr = *p;
! 630: addr += 4;
! 631: }
! 632: }
! 633:
! 634: void
! 635: obio_iomem_read_region_1(void *v, bus_space_handle_t bsh,
! 636: bus_size_t offset, uint8_t *addr, bus_size_t count)
! 637: {
! 638: volatile uint8_t *p = (void *)(bsh + offset);
! 639:
! 640: while (count--) {
! 641: *addr++ = *p++;
! 642: }
! 643: }
! 644:
! 645: void
! 646: obio_iomem_read_region_2(void *v, bus_space_handle_t bsh,
! 647: bus_size_t offset, uint16_t *addr, bus_size_t count)
! 648: {
! 649: volatile uint16_t *p = (void *)(bsh + offset);
! 650:
! 651: while (count--) {
! 652: *addr++ = *p++;
! 653: }
! 654: }
! 655:
! 656: void
! 657: obio_iomem_read_region_4(void *v, bus_space_handle_t bsh,
! 658: bus_size_t offset, uint32_t *addr, bus_size_t count)
! 659: {
! 660: volatile uint32_t *p = (void *)(bsh + offset);
! 661:
! 662: while (count--) {
! 663: *addr++ = *p++;
! 664: }
! 665: }
! 666:
! 667: void
! 668: obio_iomem_read_raw_region_2(void *v, bus_space_handle_t bsh,
! 669: bus_size_t offset, uint8_t *addr, bus_size_t count)
! 670: {
! 671: volatile uint16_t *p = (void *)(bsh + offset);
! 672:
! 673: count >>= 1;
! 674: while (count--) {
! 675: *(uint16_t *)addr = *p++;
! 676: addr += 2;
! 677: }
! 678: }
! 679:
! 680: void
! 681: obio_iomem_read_raw_region_4(void *v, bus_space_handle_t bsh,
! 682: bus_size_t offset, uint8_t *addr, bus_size_t count)
! 683: {
! 684: volatile uint32_t *p = (void *)(bsh + offset);
! 685:
! 686: count >>= 2;
! 687: while (count--) {
! 688: *(uint32_t *)addr = *p++;
! 689: addr += 4;
! 690: }
! 691: }
! 692:
! 693: /* write */
! 694: void
! 695: obio_iomem_write_1(void *v, bus_space_handle_t bsh, bus_size_t offset,
! 696: uint8_t value)
! 697: {
! 698: *(volatile uint8_t *)(bsh + offset) = value;
! 699: }
! 700:
! 701: void
! 702: obio_iomem_write_2(void *v, bus_space_handle_t bsh, bus_size_t offset,
! 703: uint16_t value)
! 704: {
! 705: *(volatile uint16_t *)(bsh + offset) = value;
! 706: }
! 707:
! 708: void
! 709: obio_iomem_write_4(void *v, bus_space_handle_t bsh, bus_size_t offset,
! 710: uint32_t value)
! 711: {
! 712: *(volatile uint32_t *)(bsh + offset) = value;
! 713: }
! 714:
! 715: void
! 716: obio_iomem_write_multi_1(void *v, bus_space_handle_t bsh,
! 717: bus_size_t offset, const uint8_t *addr, bus_size_t count)
! 718: {
! 719: volatile uint8_t *p = (void *)(bsh + offset);
! 720:
! 721: while (count--) {
! 722: *p = *addr++;
! 723: }
! 724: }
! 725:
! 726: void
! 727: obio_iomem_write_multi_2(void *v, bus_space_handle_t bsh,
! 728: bus_size_t offset, const uint16_t *addr, bus_size_t count)
! 729: {
! 730: volatile uint16_t *p = (void *)(bsh + offset);
! 731:
! 732: while (count--) {
! 733: *p = *addr++;
! 734: }
! 735: }
! 736:
! 737: void
! 738: obio_iomem_write_multi_4(void *v, bus_space_handle_t bsh,
! 739: bus_size_t offset, const uint32_t *addr, bus_size_t count)
! 740: {
! 741: volatile uint32_t *p = (void *)(bsh + offset);
! 742:
! 743: while (count--) {
! 744: *p = *addr++;
! 745: }
! 746: }
! 747:
! 748: void
! 749: obio_iomem_write_raw_multi_2(void *v, bus_space_handle_t bsh,
! 750: bus_size_t offset, const uint8_t *addr, bus_size_t count)
! 751: {
! 752: volatile uint16_t *p = (void *)(bsh + offset);
! 753:
! 754: count >>= 1;
! 755: while (count--) {
! 756: *p = *(uint16_t *)addr;
! 757: addr += 2;
! 758: }
! 759: }
! 760:
! 761: void
! 762: obio_iomem_write_raw_multi_4(void *v, bus_space_handle_t bsh,
! 763: bus_size_t offset, const uint8_t *addr, bus_size_t count)
! 764: {
! 765: volatile uint32_t *p = (void *)(bsh + offset);
! 766:
! 767: count >>= 2;
! 768: while (count--) {
! 769: *p = *(uint32_t *)addr;
! 770: addr += 4;
! 771: }
! 772: }
! 773:
! 774: void
! 775: obio_iomem_write_region_1(void *v, bus_space_handle_t bsh,
! 776: bus_size_t offset, const uint8_t *addr, bus_size_t count)
! 777: {
! 778: volatile uint8_t *p = (void *)(bsh + offset);
! 779:
! 780: while (count--) {
! 781: *p++ = *addr++;
! 782: }
! 783: }
! 784:
! 785: void
! 786: obio_iomem_write_region_2(void *v, bus_space_handle_t bsh,
! 787: bus_size_t offset, const uint16_t *addr, bus_size_t count)
! 788: {
! 789: volatile uint16_t *p = (void *)(bsh + offset);
! 790:
! 791: while (count--) {
! 792: *p++ = *addr++;
! 793: }
! 794: }
! 795:
! 796: void
! 797: obio_iomem_write_region_4(void *v, bus_space_handle_t bsh,
! 798: bus_size_t offset, const uint32_t *addr, bus_size_t count)
! 799: {
! 800: volatile uint32_t *p = (void *)(bsh + offset);
! 801:
! 802: while (count--) {
! 803: *p++ = *addr++;
! 804: }
! 805: }
! 806:
! 807: void
! 808: obio_iomem_write_raw_region_2(void *v, bus_space_handle_t bsh,
! 809: bus_size_t offset, const uint8_t *addr, bus_size_t count)
! 810: {
! 811: volatile uint16_t *p = (void *)(bsh + offset);
! 812:
! 813: count >>= 1;
! 814: while (count--) {
! 815: *p++ = *(uint16_t *)addr;
! 816: addr += 2;
! 817: }
! 818: }
! 819:
! 820: void
! 821: obio_iomem_write_raw_region_4(void *v, bus_space_handle_t bsh,
! 822: bus_size_t offset, const uint8_t *addr, bus_size_t count)
! 823: {
! 824: volatile uint32_t *p = (void *)(bsh + offset);
! 825:
! 826: count >>= 2;
! 827: while (count--) {
! 828: *p++ = *(uint32_t *)addr;
! 829: addr += 4;
! 830: }
! 831: }
! 832:
! 833: void
! 834: obio_iomem_set_multi_1(void *v, bus_space_handle_t bsh,
! 835: bus_size_t offset, uint8_t val, bus_size_t count)
! 836: {
! 837: volatile uint8_t *p = (void *)(bsh + offset);
! 838:
! 839: while (count--) {
! 840: *p = val;
! 841: }
! 842: }
! 843:
! 844: void
! 845: obio_iomem_set_multi_2(void *v, bus_space_handle_t bsh,
! 846: bus_size_t offset, uint16_t val, bus_size_t count)
! 847: {
! 848: volatile uint16_t *p = (void *)(bsh + offset);
! 849:
! 850: while (count--) {
! 851: *p = val;
! 852: }
! 853: }
! 854:
! 855: void
! 856: obio_iomem_set_multi_4(void *v, bus_space_handle_t bsh,
! 857: bus_size_t offset, uint32_t val, bus_size_t count)
! 858: {
! 859: volatile uint32_t *p = (void *)(bsh + offset);
! 860:
! 861: while (count--) {
! 862: *p = val;
! 863: }
! 864: }
! 865:
! 866: void
! 867: obio_iomem_set_region_1(void *v, bus_space_handle_t bsh,
! 868: bus_size_t offset, uint8_t val, bus_size_t count)
! 869: {
! 870: volatile uint8_t *addr = (void *)(bsh + offset);
! 871:
! 872: while (count--) {
! 873: *addr++ = val;
! 874: }
! 875: }
! 876:
! 877: void
! 878: obio_iomem_set_region_2(void *v, bus_space_handle_t bsh,
! 879: bus_size_t offset, uint16_t val, bus_size_t count)
! 880: {
! 881: volatile uint16_t *addr = (void *)(bsh + offset);
! 882:
! 883: while (count--) {
! 884: *addr++ = val;
! 885: }
! 886: }
! 887:
! 888: void
! 889: obio_iomem_set_region_4(void *v, bus_space_handle_t bsh,
! 890: bus_size_t offset, uint32_t val, bus_size_t count)
! 891: {
! 892: volatile uint32_t *addr = (void *)(bsh + offset);
! 893:
! 894: while (count--) {
! 895: *addr++ = val;
! 896: }
! 897: }
! 898:
! 899: void
! 900: obio_iomem_copy_region_1(void *v, bus_space_handle_t h1, bus_size_t o1,
! 901: bus_space_handle_t h2, bus_size_t o2, bus_size_t count)
! 902: {
! 903: volatile uint8_t *addr1 = (void *)(h1 + o1);
! 904: volatile uint8_t *addr2 = (void *)(h2 + o2);
! 905:
! 906: if (addr1 >= addr2) { /* src after dest: copy forward */
! 907: while (count--) {
! 908: *addr2++ = *addr1++;
! 909: }
! 910: } else { /* dest after src: copy backwards */
! 911: addr1 += count - 1;
! 912: addr2 += count - 1;
! 913: while (count--) {
! 914: *addr2-- = *addr1--;
! 915: }
! 916: }
! 917: }
! 918:
! 919: void
! 920: obio_iomem_copy_region_2(void *v, bus_space_handle_t h1, bus_size_t o1,
! 921: bus_space_handle_t h2, bus_size_t o2, bus_size_t count)
! 922: {
! 923: volatile uint16_t *addr1 = (void *)(h1 + o1);
! 924: volatile uint16_t *addr2 = (void *)(h2 + o2);
! 925:
! 926: if (addr1 >= addr2) { /* src after dest: copy forward */
! 927: while (count--) {
! 928: *addr2++ = *addr1++;
! 929: }
! 930: } else { /* dest after src: copy backwards */
! 931: addr1 += count - 1;
! 932: addr2 += count - 1;
! 933: while (count--) {
! 934: *addr2-- = *addr1--;
! 935: }
! 936: }
! 937: }
! 938:
! 939: void
! 940: obio_iomem_copy_region_4(void *v, bus_space_handle_t h1, bus_size_t o1,
! 941: bus_space_handle_t h2, bus_size_t o2, bus_size_t count)
! 942: {
! 943: volatile uint32_t *addr1 = (void *)(h1 + o1);
! 944: volatile uint32_t *addr2 = (void *)(h2 + o2);
! 945:
! 946: if (addr1 >= addr2) { /* src after dest: copy forward */
! 947: while (count--) {
! 948: *addr2++ = *addr1++;
! 949: }
! 950: } else { /* dest after src: copy backwards */
! 951: addr1 += count - 1;
! 952: addr2 += count - 1;
! 953: while (count--) {
! 954: *addr2-- = *addr1--;
! 955: }
! 956: }
! 957: }
CVSweb