[BACK]Return to bus_space.c CVS log [TXT][DIR] Up to [local] / sys / arch / hp300 / hp300

Annotation of sys/arch/hp300/hp300/bus_space.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: bus_space.c,v 1.5 2007/01/06 20:11:01 miod Exp $      */
                      2: /*     $NetBSD: bus_space.c,v 1.6 2002/09/27 15:36:02 provos 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 Jason R. Thorpe.
                     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: /*
                     41:  * Implementation of bus_space mapping for the hp300.
                     42:  */
                     43:
                     44: #include <sys/param.h>
                     45: #include <sys/systm.h>
                     46: #include <sys/extent.h>
                     47:
                     48: #include <machine/autoconf.h>
                     49: #include <machine/bus.h>
                     50:
                     51: #include <uvm/uvm_extern.h>
                     52:
                     53: #ifdef DIAGNOSTIC
                     54: extern char *extiobase;
                     55: #endif
                     56: extern struct extent *extio;
                     57:
                     58: /*
                     59:  * Memory mapped devices (intio, dio and sgc)
                     60:  */
                     61:
                     62: int    hp300_mem_map(bus_addr_t, bus_size_t, int, bus_space_handle_t *);
                     63: void   hp300_mem_unmap(bus_space_handle_t, bus_size_t);
                     64: int    hp300_mem_subregion(bus_space_handle_t, bus_size_t, bus_size_t,
                     65:            bus_space_handle_t *);
                     66: void * hp300_mem_vaddr(bus_space_handle_t);
                     67:
                     68: u_int8_t hp300_mem_bsr1(bus_space_handle_t, bus_size_t);
                     69: u_int16_t hp300_mem_bsr2(bus_space_handle_t, bus_size_t);
                     70: u_int32_t hp300_mem_bsr4(bus_space_handle_t, bus_size_t);
                     71: void   hp300_mem_bsrm1(bus_space_handle_t, bus_size_t, u_int8_t *, size_t);
                     72: void   hp300_mem_bsrm2(bus_space_handle_t, bus_size_t, u_int16_t *, size_t);
                     73: void   hp300_mem_bsrm4(bus_space_handle_t, bus_size_t, u_int32_t *, size_t);
                     74: void   hp300_mem_bsrrm2(bus_space_handle_t, bus_size_t, u_int8_t *, size_t);
                     75: void   hp300_mem_bsrrm4(bus_space_handle_t, bus_size_t, u_int8_t *, size_t);
                     76: void   hp300_mem_bsrr1(bus_space_handle_t, bus_size_t, u_int8_t *, size_t);
                     77: void   hp300_mem_bsrr2(bus_space_handle_t, bus_size_t, u_int16_t *, size_t);
                     78: void   hp300_mem_bsrr4(bus_space_handle_t, bus_size_t, u_int32_t *, size_t);
                     79: void   hp300_mem_bsrrr2(bus_space_handle_t, bus_size_t, u_int8_t *, size_t);
                     80: void   hp300_mem_bsrrr4(bus_space_handle_t, bus_size_t, u_int8_t *, size_t);
                     81: void   hp300_mem_bsw1(bus_space_handle_t, bus_size_t, u_int8_t);
                     82: void   hp300_mem_bsw2(bus_space_handle_t, bus_size_t, u_int16_t);
                     83: void   hp300_mem_bsw4(bus_space_handle_t, bus_size_t, u_int32_t);
                     84: void   hp300_mem_bswm1(bus_space_handle_t, bus_size_t, const u_int8_t *, size_t);
                     85: void   hp300_mem_bswm2(bus_space_handle_t, bus_size_t, const u_int16_t *, size_t);
                     86: void   hp300_mem_bswm4(bus_space_handle_t, bus_size_t, const u_int32_t *, size_t);
                     87: void   hp300_mem_bswrm2(bus_space_handle_t, bus_size_t, const u_int8_t *, size_t);
                     88: void   hp300_mem_bswrm4(bus_space_handle_t, bus_size_t, const u_int8_t *, size_t);
                     89: void   hp300_mem_bswr1(bus_space_handle_t, bus_size_t, const u_int8_t *, size_t);
                     90: void   hp300_mem_bswr2(bus_space_handle_t, bus_size_t, const u_int16_t *, size_t);
                     91: void   hp300_mem_bswr4(bus_space_handle_t, bus_size_t, const u_int32_t *, size_t);
                     92: void   hp300_mem_bswrr2(bus_space_handle_t, bus_size_t, const u_int8_t *, size_t);
                     93: void   hp300_mem_bswrr4(bus_space_handle_t, bus_size_t, const u_int8_t *, size_t);
                     94: void   hp300_mem_bssm1(bus_space_handle_t, bus_size_t, u_int8_t, size_t);
                     95: void   hp300_mem_bssm2(bus_space_handle_t, bus_size_t, u_int16_t, size_t);
                     96: void   hp300_mem_bssm4(bus_space_handle_t, bus_size_t, u_int32_t, size_t);
                     97: void   hp300_mem_bssr1(bus_space_handle_t, bus_size_t, u_int8_t, size_t);
                     98: void   hp300_mem_bssr2(bus_space_handle_t, bus_size_t, u_int16_t, size_t);
                     99: void   hp300_mem_bssr4(bus_space_handle_t, bus_size_t, u_int32_t, size_t);
                    100:
                    101: struct hp300_bus_space_tag hp300_mem_tag = {
                    102:        hp300_mem_map,
                    103:        hp300_mem_unmap,
                    104:        hp300_mem_subregion,
                    105:        hp300_mem_vaddr,
                    106:
                    107:        hp300_mem_bsr1,
                    108:        hp300_mem_bsr2,
                    109:        hp300_mem_bsr4,
                    110:        hp300_mem_bsrm1,
                    111:        hp300_mem_bsrm2,
                    112:        hp300_mem_bsrm4,
                    113:        hp300_mem_bsrrm2,
                    114:        hp300_mem_bsrrm4,
                    115:        hp300_mem_bsrr1,
                    116:        hp300_mem_bsrr2,
                    117:        hp300_mem_bsrr4,
                    118:        hp300_mem_bsrrr2,
                    119:        hp300_mem_bsrrr4,
                    120:        hp300_mem_bsw1,
                    121:        hp300_mem_bsw2,
                    122:        hp300_mem_bsw4,
                    123:        hp300_mem_bswm1,
                    124:        hp300_mem_bswm2,
                    125:        hp300_mem_bswm4,
                    126:        hp300_mem_bswrm2,
                    127:        hp300_mem_bswrm4,
                    128:        hp300_mem_bswr1,
                    129:        hp300_mem_bswr2,
                    130:        hp300_mem_bswr4,
                    131:        hp300_mem_bswrr2,
                    132:        hp300_mem_bswrr4,
                    133:        hp300_mem_bssm1,
                    134:        hp300_mem_bssm2,
                    135:        hp300_mem_bssm4,
                    136:        hp300_mem_bssr1,
                    137:        hp300_mem_bssr2,
                    138:        hp300_mem_bssr4
                    139: };
                    140:
                    141: int
                    142: hp300_mem_map(bus_addr_t bpa, bus_size_t size, int flags,
                    143:     bus_space_handle_t *bshp)
                    144: {
                    145:        u_long kva;
                    146:        pt_entry_t template;
                    147:        int error;
                    148:
                    149:        /*
                    150:         * intio space is direct-mapped in pmap_bootstrap(); just do the
                    151:         * translation in this case.
                    152:         */
                    153:        if (bpa >= INTIOBASE && bpa < INTIOTOP) {
                    154:                *bshp = IIOV(bpa);
                    155:                return (0);
                    156:        }
                    157:
                    158:        /*
                    159:         * Allocate virtual address space from the extio extent map.
                    160:         */
                    161:        size = round_page(bpa + size) - trunc_page(bpa);
                    162:        error = extent_alloc(extio, size, PAGE_SIZE, 0, EX_NOBOUNDARY,
                    163:            EX_NOWAIT | EX_MALLOCOK, &kva);
                    164:        if (error)
                    165:                return (error);
                    166:
                    167:        *bshp = (bus_space_handle_t)kva + (bpa & PAGE_MASK);
                    168:        bpa = trunc_page(bpa);
                    169:
                    170:        /*
                    171:         * Map the range.
                    172:         */
                    173:        if (flags & BUS_SPACE_MAP_CACHEABLE)
                    174:                template = PG_RW;
                    175:        else
                    176:                template = PG_RW | PG_CI;
                    177:        while (size != 0) {
                    178:                pmap_kenter_cache(kva, bpa, template);
                    179:                size -= PAGE_SIZE;
                    180:                kva += PAGE_SIZE;
                    181:                bpa += PAGE_SIZE;
                    182:        }
                    183:        pmap_update(pmap_kernel());
                    184:
                    185:        /*
                    186:         * All done.
                    187:         */
                    188:        return (0);
                    189: }
                    190:
                    191: void
                    192: hp300_mem_unmap(bus_space_handle_t bsh, bus_size_t size)
                    193: {
                    194: #ifdef DIAGNOSTIC
                    195:        extern int eiomapsize;
                    196: #endif
                    197:        int error;
                    198:
                    199:        /*
                    200:         * intio space is direct-mapped in pmap_bootstrap(); nothing
                    201:         * to do.
                    202:         */
                    203:        if (IIOP(bsh) >= INTIOBASE && IIOP(bsh) < INTIOTOP)
                    204:                return;
                    205:
                    206: #ifdef DIAGNOSTIC
                    207:        if ((caddr_t)bsh < extiobase ||
                    208:            (caddr_t)bsh >= extiobase + ptoa(eiomapsize)) {
                    209:                printf("bus_space_unmap: bad bus space handle %x\n", bsh);
                    210:                return;
                    211:        }
                    212: #endif
                    213:
                    214:        size = round_page(bsh + size) - trunc_page(bsh);
                    215:        bsh = trunc_page(bsh);
                    216:
                    217:        /*
                    218:         * Unmap the range.
                    219:         */
                    220:        pmap_kremove(bsh, size);
                    221:        pmap_update(pmap_kernel());
                    222:
                    223:        /*
                    224:         * Free it from the extio extent map.
                    225:         */
                    226:        error = extent_free(extio, (u_long)bsh, size, EX_NOWAIT | EX_MALLOCOK);
                    227: #ifdef DIAGNOSTIC
                    228:        if (error != 0) {
                    229:                printf("bus_space_unmap: kva 0x%lx size 0x%lx: "
                    230:                    "can't free region (%d)\n", (vaddr_t)bsh, size, error);
                    231:        }
                    232: #endif
                    233: }
                    234:
                    235: /* ARGSUSED */
                    236: int
                    237: hp300_mem_subregion(bus_space_handle_t bsh, bus_size_t offset, bus_size_t size,
                    238:     bus_space_handle_t *nbshp)
                    239: {
                    240:        *nbshp = bsh + offset;
                    241:        return (0);
                    242: }
                    243:
                    244: #if 0
                    245: /* ARGSUSED */
                    246: paddr_t
                    247: hp300_mem_mmap(bus_addr_t addr, off_t offset, int prot, int flags)
                    248: {
                    249:        return (((paddr_t)addr + offset) >> PAGE_SHIFT);
                    250: }
                    251: #endif
                    252:
                    253: void *
                    254: hp300_mem_vaddr(bus_space_handle_t h)
                    255: {
                    256:        return ((void *)h);
                    257: }
                    258:
                    259: u_int8_t
                    260: hp300_mem_bsr1(bus_space_handle_t bsh, bus_size_t offset)
                    261: {
                    262:        return (*(volatile u_int8_t *) (bsh + offset));
                    263: }
                    264:
                    265: u_int16_t
                    266: hp300_mem_bsr2(bus_space_handle_t bsh, bus_size_t offset)
                    267: {
                    268:        return (*(volatile u_int16_t *) (bsh + offset));
                    269: }
                    270:
                    271: u_int32_t
                    272: hp300_mem_bsr4(bus_space_handle_t bsh, bus_size_t offset)
                    273: {
                    274:        return (*(volatile u_int32_t *) (bsh + offset));
                    275: }
                    276:
                    277: void
                    278: hp300_mem_bsrm1(bus_space_handle_t h, bus_size_t offset,
                    279:             u_int8_t *a, size_t c)
                    280: {
                    281:        __asm __volatile (
                    282:        "       movl    %0,a0           ;"
                    283:        "       movl    %1,a1           ;"
                    284:        "       movl    %2,d0           ;"
                    285:        "1:     movb    a0@,a1@+        ;"
                    286:        "       subql   #1,d0           ;"
                    287:        "       jne     1b"                                     :
                    288:                                                                :
                    289:                    "r" (h + offset), "g" (a), "g" (c)  :
                    290:                    "a0","a1","d0");
                    291: }
                    292:
                    293: void
                    294: hp300_mem_bsrm2(bus_space_handle_t h, bus_size_t offset,
                    295:             u_int16_t *a, size_t c)
                    296: {
                    297:        __asm __volatile (
                    298:        "       movl    %0,a0           ;"
                    299:        "       movl    %1,a1           ;"
                    300:        "       movl    %2,d0           ;"
                    301:        "1:     movw    a0@,a1@+        ;"
                    302:        "       subql   #1,d0           ;"
                    303:        "       jne     1b"                                     :
                    304:                                                                :
                    305:                    "r" (h + offset), "g" (a), "g" (c)  :
                    306:                    "a0","a1","d0");
                    307: }
                    308:
                    309: void
                    310: hp300_mem_bsrm4(bus_space_handle_t h, bus_size_t offset,
                    311:             u_int32_t *a, size_t c)
                    312: {
                    313:        __asm __volatile (
                    314:        "       movl    %0,a0           ;"
                    315:        "       movl    %1,a1           ;"
                    316:        "       movl    %2,%d0          ;"
                    317:        "1:     movl    a0@,a1@+        ;"
                    318:        "       subql   #1,d0           ;"
                    319:        "       jne     1b"                                     :
                    320:                                                                :
                    321:                    "r" (h + offset), "g" (a), "g" (c)  :
                    322:                    "a0","a1","d0");
                    323: }
                    324:
                    325: void
                    326: hp300_mem_bsrrm2(bus_space_handle_t h, bus_size_t offset,
                    327:             u_int8_t *a, size_t c)
                    328: {
                    329:        __asm __volatile (
                    330:        "       movl    %0,a0           ;"
                    331:        "       movl    %1,a1           ;"
                    332:        "       movl    %2,d0           ;"
                    333:        "1:     movw    a0@,a1@+        ;"
                    334:        "       subql   #1,d0           ;"
                    335:        "       jne     1b"                                     :
                    336:                                                                :
                    337:                    "r" (h + offset), "g" (a), "g" (c)  :
                    338:                    "a0","a1","d0");
                    339: }
                    340:
                    341: void
                    342: hp300_mem_bsrrm4(bus_space_handle_t h, bus_size_t offset,
                    343:             u_int8_t *a, size_t c)
                    344: {
                    345:        __asm __volatile (
                    346:        "       movl    %0,a0           ;"
                    347:        "       movl    %1,a1           ;"
                    348:        "       movl    %2,%d0          ;"
                    349:        "1:     movl    a0@,a1@+        ;"
                    350:        "       subql   #1,d0           ;"
                    351:        "       jne     1b"                                     :
                    352:                                                                :
                    353:                    "r" (h + offset), "g" (a), "g" (c)  :
                    354:                    "a0","a1","d0");
                    355: }
                    356:
                    357: void
                    358: hp300_mem_bsrr1(bus_space_handle_t h, bus_size_t offset,
                    359:             u_int8_t *a, size_t c)
                    360: {
                    361:        __asm __volatile (
                    362:        "       movl    %0,a0           ;"
                    363:        "       movl    %1,a1           ;"
                    364:        "       movl    %2,d0           ;"
                    365:        "1:     movb    a0@+,a1@+       ;"
                    366:        "       subql   #1,d0           ;"
                    367:        "       jne     1b"                                     :
                    368:                                                                :
                    369:                    "r" (h + offset), "g" (a), "g" (c)  :
                    370:                    "a0","a1","d0");
                    371: }
                    372:
                    373: void
                    374: hp300_mem_bsrr2(bus_space_handle_t h, bus_size_t offset,
                    375:             u_int16_t *a, size_t c)
                    376: {
                    377:        __asm __volatile (
                    378:        "       movl    %0,a0           ;"
                    379:        "       movl    %1,a1           ;"
                    380:        "       movl    %2,d0           ;"
                    381:        "1:     movw    a0@+,a1@+       ;"
                    382:        "       subql   #1,d0           ;"
                    383:        "       jne     1b"                                     :
                    384:                                                                :
                    385:                    "r" (h + offset), "g" (a), "g" (c)  :
                    386:                    "a0","a1","d0");
                    387: }
                    388:
                    389: void
                    390: hp300_mem_bsrr4(bus_space_handle_t h, bus_size_t offset,
                    391:             u_int32_t *a, size_t c)
                    392: {
                    393:        __asm __volatile (
                    394:        "       movl    %0,a0           ;"
                    395:        "       movl    %1,a1           ;"
                    396:        "       movl    %2,d0           ;"
                    397:        "1:     movl    a0@+,a1@+       ;"
                    398:        "       subql   #1,d0           ;"
                    399:        "       jne     1b"                                     :
                    400:                                                                :
                    401:                    "r" (h + offset), "g" (a), "g" (c)  :
                    402:                    "a0","a1","d0");
                    403: }
                    404:
                    405: void
                    406: hp300_mem_bsrrr2(bus_space_handle_t h, bus_size_t offset,
                    407:             u_int8_t *a, size_t c)
                    408: {
                    409:        __asm __volatile (
                    410:        "       movl    %0,a0           ;"
                    411:        "       movl    %1,a1           ;"
                    412:        "       movl    %2,d0           ;"
                    413:        "1:     movw    a0@+,a1@+       ;"
                    414:        "       subql   #1,d0           ;"
                    415:        "       jne     1b"                                     :
                    416:                                                                :
                    417:                    "r" (h + offset), "g" (a), "g" (c / 2)      :
                    418:                    "a0","a1","d0");
                    419: }
                    420:
                    421: void
                    422: hp300_mem_bsrrr4(bus_space_handle_t h, bus_size_t offset,
                    423:             u_int8_t *a, size_t c)
                    424: {
                    425:        __asm __volatile (
                    426:        "       movl    %0,a0           ;"
                    427:        "       movl    %1,a1           ;"
                    428:        "       movl    %2,d0           ;"
                    429:        "1:     movl    a0@+,a1@+       ;"
                    430:        "       subql   #1,d0           ;"
                    431:        "       jne     1b"                                     :
                    432:                                                                :
                    433:                    "r" (h + offset), "g" (a), "g" (c / 4)      :
                    434:                    "a0","a1","d0");
                    435: }
                    436:
                    437: void
                    438: hp300_mem_bsw1(bus_space_handle_t h, bus_size_t offset,
                    439:            u_int8_t v)
                    440: {
                    441:        (*(volatile u_int8_t *)(h + offset)) = v;
                    442: }
                    443:
                    444: void
                    445: hp300_mem_bsw2(bus_space_handle_t h, bus_size_t offset,
                    446:            u_int16_t v)
                    447: {
                    448:        (*(volatile u_int16_t *)(h + offset)) = v;
                    449: }
                    450:
                    451: void
                    452: hp300_mem_bsw4(bus_space_handle_t h, bus_size_t offset,
                    453:            u_int32_t v)
                    454: {
                    455:        (*(volatile u_int32_t *)(h + offset)) = v;
                    456: }
                    457:
                    458: void
                    459: hp300_mem_bswm1(bus_space_handle_t h, bus_size_t offset,
                    460:             const u_int8_t *a, size_t c)
                    461: {
                    462:        __asm __volatile (
                    463:        "       movl    %0,a0           ;"
                    464:        "       movl    %1,a1           ;"
                    465:        "       movl    %2,d0           ;"
                    466:        "1:     movb    a1@+,a0@        ;"
                    467:        "       subql   #1,d0           ;"
                    468:        "       jne     1b"                                     :
                    469:                                                                :
                    470:                    "r" (h + offset), "g" (a), "g" (c)  :
                    471:                    "a0","a1","d0");
                    472: }
                    473:
                    474: void
                    475: hp300_mem_bswm2(bus_space_handle_t h, bus_size_t offset,
                    476:             const u_int16_t *a, size_t c)
                    477: {
                    478:        __asm __volatile (
                    479:        "       movl    %0,a0           ;"
                    480:        "       movl    %1,a1           ;"
                    481:        "       movl    %2,d0           ;"
                    482:        "1:     movw    a1@+,a0@        ;"
                    483:        "       subql   #1,d0           ;"
                    484:        "       jne     1b"                                     :
                    485:                                                                :
                    486:                    "r" (h + offset), "g" (a), "g" (c)  :
                    487:                    "a0","a1","d0");
                    488: }
                    489:
                    490: void
                    491: hp300_mem_bswm4(bus_space_handle_t h, bus_size_t offset,
                    492:             const u_int32_t *a, size_t c)
                    493: {
                    494:        __asm __volatile (
                    495:        "       movl    %0,a0           ;"
                    496:        "       movl    %1,a1           ;"
                    497:        "       movl    %2,d0           ;"
                    498:        "1:     movl    a1@+,a0@        ;"
                    499:        "       subql   #1,d0           ;"
                    500:        "       jne     1b"                                     :
                    501:                                                                :
                    502:                    "r" (h + offset), "g" (a), "g" (c)  :
                    503:                    "a0","a1","d0");
                    504: }
                    505:
                    506: void
                    507: hp300_mem_bswrm2(bus_space_handle_t h, bus_size_t offset,
                    508:             const u_int8_t *a, size_t c)
                    509: {
                    510:        __asm __volatile (
                    511:        "       movl    %0,a0           ;"
                    512:        "       movl    %1,a1           ;"
                    513:        "       movl    %2,d0           ;"
                    514:        "1:     movw    a1@+,a0@        ;"
                    515:        "       subql   #1,d0           ;"
                    516:        "       jne     1b"                                     :
                    517:                                                                :
                    518:                    "r" (h + offset), "g" (a), "g" (c)  :
                    519:                    "a0","a1","d0");
                    520: }
                    521:
                    522: void
                    523: hp300_mem_bswrm4(bus_space_handle_t h, bus_size_t offset,
                    524:             const u_int8_t *a, size_t c)
                    525: {
                    526:        __asm __volatile (
                    527:        "       movl    %0,a0           ;"
                    528:        "       movl    %1,a1           ;"
                    529:        "       movl    %2,d0           ;"
                    530:        "1:     movl    a1@+,a0@        ;"
                    531:        "       subql   #1,d0           ;"
                    532:        "       jne     1b"                                     :
                    533:                                                                :
                    534:                    "r" (h + offset), "g" (a), "g" (c)  :
                    535:                    "a0","a1","d0");
                    536: }
                    537:
                    538: void
                    539: hp300_mem_bswr1(bus_space_handle_t h, bus_size_t offset,
                    540:             const u_int8_t *a, size_t c)
                    541: {
                    542:        __asm __volatile (
                    543:        "       movl    %0,a0           ;"
                    544:        "       movl    %1,a1           ;"
                    545:        "       movl    %2,d0           ;"
                    546:        "1:     movb    a1@+,a0@+       ;"
                    547:        "       subql   #1,d0           ;"
                    548:        "       jne     1b"                                     :
                    549:                                                                :
                    550:                    "r" (h + offset), "g" (a), "g" (c)  :
                    551:                    "a0","a1","d0");
                    552: }
                    553:
                    554: void
                    555: hp300_mem_bswr2(bus_space_handle_t h, bus_size_t offset,
                    556:             const u_int16_t *a, size_t c)
                    557: {
                    558:        __asm __volatile (
                    559:        "       movl    %0,a0           ;"
                    560:        "       movl    %1,a1           ;"
                    561:        "       movl    %2,d0           ;"
                    562:        "1:     movw    a1@+,a0@+       ;"
                    563:        "       subql   #1,d0           ;"
                    564:        "       jne     1b"                                     :
                    565:                                                                :
                    566:                    "r" (h + offset), "g" (a), "g" (c)  :
                    567:                    "a0","a1","d0");
                    568: }
                    569:
                    570: void
                    571: hp300_mem_bswr4(bus_space_handle_t h, bus_size_t offset,
                    572:             const u_int32_t *a, size_t c)
                    573: {
                    574:        __asm __volatile (
                    575:        "       movl    %0,a0           ;"
                    576:        "       movl    %1,a1           ;"
                    577:        "       movl    %2,d0           ;"
                    578:        "1:     movl    a1@+,a0@+       ;"
                    579:        "       subql   #1,d0           ;"
                    580:        "       jne     1b"                                     :
                    581:                                                                :
                    582:                    "r" (h + offset), "g" (a), "g" (c)  :
                    583:                    "a0","a1","d0");
                    584: }
                    585:
                    586: void
                    587: hp300_mem_bswrr2(bus_space_handle_t h, bus_size_t offset,
                    588:             const u_int8_t *a, size_t c)
                    589: {
                    590:        __asm __volatile (
                    591:        "       movl    %0,a0           ;"
                    592:        "       movl    %1,a1           ;"
                    593:        "       movl    %2,d0           ;"
                    594:        "1:     movw    a1@+,a0@+       ;"
                    595:        "       subql   #1,d0           ;"
                    596:        "       jne     1b"                                     :
                    597:                                                                :
                    598:                    "r" (h + offset), "g" (a), "g" (c / 2)      :
                    599:                    "a0","a1","d0");
                    600: }
                    601:
                    602: void
                    603: hp300_mem_bswrr4(bus_space_handle_t h, bus_size_t offset,
                    604:             const u_int8_t *a, size_t c)
                    605: {
                    606:        __asm __volatile (
                    607:        "       movl    %0,a0           ;"
                    608:        "       movl    %1,a1           ;"
                    609:        "       movl    %2,d0           ;"
                    610:        "1:     movl    a1@+,a0@+       ;"
                    611:        "       subql   #1,d0           ;"
                    612:        "       jne     1b"                                     :
                    613:                                                                :
                    614:                    "r" (h + offset), "g" (a), "g" (c / 4)      :
                    615:                    "a0","a1","d0");
                    616: }
                    617:
                    618: void
                    619: hp300_mem_bssm1(bus_space_handle_t h, bus_size_t offset,
                    620:             u_int8_t v, size_t c)
                    621: {
                    622:        __asm __volatile (
                    623:        "       movl    %0,a0           ;"
                    624:        "       movl    %1,d1           ;"
                    625:        "       movl    %2,d0           ;"
                    626:        "1:     movb    d1,a0@  ;"
                    627:        "       subql   #1,d0           ;"
                    628:        "       jne     1b"                                             :
                    629:                                                                        :
                    630:                    "r" (h + offset), "g" ((u_long)v), "g" (c)  :
                    631:                    "a0","d0","d1");
                    632: }
                    633:
                    634: void
                    635: hp300_mem_bssm2(bus_space_handle_t h, bus_size_t offset,
                    636:             u_int16_t v, size_t c)
                    637: {
                    638:        __asm __volatile (
                    639:        "       movl    %0,a0           ;"
                    640:        "       movl    %1,d1           ;"
                    641:        "       movl    %2,d0           ;"
                    642:        "1:     movw    d1,a0@  ;"
                    643:        "       subql   #1,d0           ;"
                    644:        "       jne     1b"                                             :
                    645:                                                                        :
                    646:                    "r" (h + offset), "g" ((u_long)v), "g" (c)  :
                    647:                    "a0","d0","d1");
                    648: }
                    649:
                    650: void
                    651: hp300_mem_bssm4(bus_space_handle_t h, bus_size_t offset,
                    652:             u_int32_t v, size_t c)
                    653: {
                    654:        __asm __volatile (
                    655:        "       movl    %0,a0           ;"
                    656:        "       movl    %1,d1           ;"
                    657:        "       movl    %2,d0           ;"
                    658:        "1:     movl    d1,a0@  ;"
                    659:        "       subql   #1,d0           ;"
                    660:        "       jne     1b"                                             :
                    661:                                                                        :
                    662:                    "r" (h + offset), "g" ((u_long)v), "g" (c)  :
                    663:                    "a0","d0","d1");
                    664: }
                    665:
                    666: void
                    667: hp300_mem_bssr1(bus_space_handle_t h, bus_size_t offset,
                    668:             u_int8_t v, size_t c)
                    669: {
                    670:        __asm __volatile (
                    671:        "       movl    %0,a0           ;"
                    672:        "       movl    %1,d1           ;"
                    673:        "       movl    %2,d0           ;"
                    674:        "1:     movb    d1,a0@+ ;"
                    675:        "       subql   #1,d0           ;"
                    676:        "       jne     1b"                                             :
                    677:                                                                        :
                    678:                    "r" (h + offset), "g" ((u_long)v), "g" (c)  :
                    679:                    "a0","d0","d1");
                    680: }
                    681:
                    682: void
                    683: hp300_mem_bssr2(bus_space_handle_t h, bus_size_t offset,
                    684:             u_int16_t v, size_t c)
                    685: {
                    686:        __asm __volatile (
                    687:        "       movl    %0,a0           ;"
                    688:        "       movl    %1,d1           ;"
                    689:        "       movl    %2,d0           ;"
                    690:        "1:     movw    d1,a0@+ ;"
                    691:        "       subql   #1,d0           ;"
                    692:        "       jne     1b"                                             :
                    693:                                                                        :
                    694:                    "r" (h + offset), "g" ((u_long)v), "g" (c)  :
                    695:                    "a0","d0","d1");
                    696: }
                    697:
                    698: void
                    699: hp300_mem_bssr4(bus_space_handle_t h, bus_size_t offset,
                    700:             u_int32_t v, size_t c)
                    701: {
                    702:        __asm __volatile (
                    703:        "       movl    %0,a0           ;"
                    704:        "       movl    %1,d1           ;"
                    705:        "       movl    %2,d0           ;"
                    706:        "1:     movl    d1,a0@+ ;"
                    707:        "       subql   #1,d0           ;"
                    708:        "       jne     1b"                                             :
                    709:                                                                        :
                    710:                    "r" (h + offset), "g" ((u_long)v), "g" (c)  :
                    711:                    "a0","d0","d1");
                    712: }
                    713:
                    714: #if 0
                    715: paddr_t
                    716: bus_space_mmap(bus_space_tag_t t, bus_addr_t addr, off_t offset, int prot,
                    717:     int flags)
                    718: {
                    719:        return (((paddr_t)addr + offset) >> PAGE_SHIFT);
                    720: }
                    721: #endif

CVSweb