[BACK]Return to obio.c CVS log [TXT][DIR] Up to [local] / sys / arch / landisk / dev

Annotation of sys/arch/landisk/dev/obio.c, Revision 1.1.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