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

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

1.1       nbrk        1: /*     $OpenBSD: bus_space.c,v 1.22 2006/06/24 13:24:21 miod Exp $     */
                      2: /*     $NetBSD: bus_space.c,v 1.5 1999/03/26 23:41:30 mycroft Exp $    */
                      3:
                      4: /*-
                      5:  * Copyright (c) 1996, 1997 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 of the Numerical Aerospace Simulation Facility,
                     10:  * NASA Ames Research Center.
                     11:  *
                     12:  * Redistribution and use in source and binary forms, with or without
                     13:  * modification, are permitted provided that the following conditions
                     14:  * are met:
                     15:  * 1. Redistributions of source code must retain the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer.
                     17:  * 2. Redistributions in binary form must reproduce the above copyright
                     18:  *    notice, this list of conditions and the following disclaimer in the
                     19:  *    documentation and/or other materials provided with the distribution.
                     20:  * 3. All advertising materials mentioning features or use of this software
                     21:  *    must display the following acknowledgement:
                     22:  *     This product includes software developed by the NetBSD
                     23:  *     Foundation, Inc. and its contributors.
                     24:  * 4. Neither the name of The NetBSD Foundation nor the names of its
                     25:  *    contributors may be used to endorse or promote products derived
                     26:  *    from this software without specific prior written permission.
                     27:  *
                     28:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
                     29:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
                     30:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
                     31:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
                     32:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
                     33:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
                     34:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
                     35:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
                     36:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
                     37:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
                     38:  * POSSIBILITY OF SUCH DAMAGE.
                     39:  */
                     40:
                     41: /*
                     42:  * Implementation of bus_space mapping for mac68k.
                     43:  */
                     44:
                     45: #include <sys/param.h>
                     46: #include <sys/systm.h>
                     47: #include <sys/extent.h>
                     48:
                     49: #include <machine/bus.h>
                     50:
                     51: #include <uvm/uvm_extern.h>
                     52:
                     53: int    bus_mem_add_mapping(bus_addr_t, bus_size_t,
                     54:            int, bus_space_handle_t *);
                     55:
                     56: extern struct extent *iomem_ex;
                     57: extern int iomem_malloc_safe;
                     58: label_t *nofault;
                     59:
                     60: int
                     61: bus_space_map(t, bpa, size, flags, bshp)
                     62:        bus_space_tag_t t;
                     63:        bus_addr_t bpa;
                     64:        bus_size_t size;
                     65:        int flags;
                     66:        bus_space_handle_t *bshp;
                     67: {
                     68:        paddr_t pa, endpa;
                     69:        int error;
                     70:
                     71:        /*
                     72:         * Before we go any further, let's make sure that this
                     73:         * region is available.
                     74:         */
                     75:        error = extent_alloc_region(iomem_ex, bpa, size,
                     76:            EX_NOWAIT | (iomem_malloc_safe ? EX_MALLOCOK : 0));
                     77:        if (error)
                     78:                return (error);
                     79:
                     80:        pa = trunc_page(bpa + t);
                     81:        endpa = round_page((bpa + t + size) - 1);
                     82:
                     83: #ifdef DIAGNOSTIC
                     84:        if (endpa <= pa)
                     85:                panic("bus_space_map: overflow");
                     86: #endif
                     87:
                     88:        error = bus_mem_add_mapping(bpa, size, flags, bshp);
                     89:        if (error) {
                     90:                if (extent_free(iomem_ex, bpa, size, EX_NOWAIT |
                     91:                    (iomem_malloc_safe ? EX_MALLOCOK : 0))) {
                     92:                        printf("bus_space_map: pa 0x%lx, size 0x%lx\n",
                     93:                            bpa, size);
                     94:                        printf("bus_space_map: can't free region\n");
                     95:                }
                     96:        }
                     97:
                     98:        return (error);
                     99: }
                    100:
                    101: int
                    102: bus_space_alloc(t, rstart, rend, size, alignment, boundary, flags, bpap, bshp)
                    103:        bus_space_tag_t t;
                    104:        bus_addr_t rstart, rend;
                    105:        bus_size_t size, alignment, boundary;
                    106:        int flags;
                    107:        bus_addr_t *bpap;
                    108:        bus_space_handle_t *bshp;
                    109: {
                    110:        u_long bpa;
                    111:        int error;
                    112:
                    113:        /*
                    114:         * Sanity check the allocation against the extent's boundaries.
                    115:         */
                    116:        if (rstart < iomem_ex->ex_start || rend > iomem_ex->ex_end)
                    117:                panic("bus_space_alloc: bad region start/end");
                    118:
                    119:        /*
                    120:         * Do the requested allocation.
                    121:         */
                    122:        error = extent_alloc_subregion(iomem_ex, rstart, rend, size, alignment,
                    123:            0, boundary,
                    124:            EX_FAST | EX_NOWAIT | (iomem_malloc_safe ?  EX_MALLOCOK : 0),
                    125:            &bpa);
                    126:
                    127:        if (error)
                    128:                return (error);
                    129:
                    130:        /*
                    131:         * For memory space, map the bus physical address to
                    132:         * a kernel virtual address.
                    133:         */
                    134:        error = bus_mem_add_mapping(bpa, size, flags, bshp);
                    135:        if (error) {
                    136:                if (extent_free(iomem_ex, bpa, size, EX_NOWAIT |
                    137:                    (iomem_malloc_safe ? EX_MALLOCOK : 0))) {
                    138:                        printf("bus_space_alloc: pa 0x%lx, size 0x%lx\n",
                    139:                            bpa, size);
                    140:                        printf("bus_space_alloc: can't free region\n");
                    141:                }
                    142:        }
                    143:
                    144:        *bpap = bpa;
                    145:
                    146:        return (error);
                    147: }
                    148:
                    149: int
                    150: bus_mem_add_mapping(bpa, size, flags, bshp)
                    151:        bus_addr_t bpa;
                    152:        bus_size_t size;
                    153:        int flags;
                    154:        bus_space_handle_t *bshp;
                    155: {
                    156:        u_long pa, endpa;
                    157:        vaddr_t va;
                    158:        pt_entry_t pte;
                    159:
                    160:        pa = trunc_page(bpa);
                    161:        endpa = round_page((bpa + size) - 1);
                    162:
                    163: #ifdef DIAGNOSTIC
                    164:        if (endpa <= pa)
                    165:                panic("bus_mem_add_mapping: overflow");
                    166: #endif
                    167:
                    168:        va = uvm_km_valloc(kernel_map, endpa - pa);
                    169:        if (va == 0)
                    170:                return (ENOMEM);
                    171:
                    172:        bshp->base = (u_long)(va + m68k_page_offset(bpa));
                    173:        bshp->swapped = 0;
                    174:        bshp->bsr1 = mac68k_bsr1;
                    175:        bshp->bsr2 = mac68k_bsr2;
                    176:        bshp->bsr4 = mac68k_bsr4;
                    177:        bshp->bsrm1 = mac68k_bsrm1;
                    178:        bshp->bsrm2 = mac68k_bsrm2;
                    179:        bshp->bsrm4 = mac68k_bsrm4;
                    180:        bshp->bsrr1 = mac68k_bsrr1;
                    181:        bshp->bsrr2 = mac68k_bsrr2;
                    182:        bshp->bsrr4 = mac68k_bsrr4;
                    183:        bshp->bsw1 = mac68k_bsw1;
                    184:        bshp->bsw2 = mac68k_bsw2;
                    185:        bshp->bsw4 = mac68k_bsw4;
                    186:        bshp->bswm1 = mac68k_bswm1;
                    187:        bshp->bswm2 = mac68k_bswm2;
                    188:        bshp->bswm4 = mac68k_bswm4;
                    189:        bshp->bswr1 = mac68k_bswr1;
                    190:        bshp->bswr2 = mac68k_bswr2;
                    191:        bshp->bswr4 = mac68k_bswr4;
                    192:        bshp->bssm1 = mac68k_bssm1;
                    193:        bshp->bssm2 = mac68k_bssm2;
                    194:        bshp->bssm4 = mac68k_bssm4;
                    195:        bshp->bssr1 = mac68k_bssr1;
                    196:        bshp->bssr2 = mac68k_bssr2;
                    197:        bshp->bssr4 = mac68k_bssr4;
                    198:
                    199:        if (flags & BUS_SPACE_MAP_CACHEABLE)
                    200:                pte = PG_CWT;
                    201:        else
                    202:                pte = PG_CI;
                    203:
                    204:        for (; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE)
                    205:                pmap_enter_cache(pmap_kernel(), va, pa,
                    206:                    UVM_PROT_RW, UVM_PROT_RW | PMAP_WIRED, pte);
                    207:        pmap_update(pmap_kernel());
                    208:
                    209:        return 0;
                    210: }
                    211:
                    212: void
                    213: bus_space_unmap(t, bsh, size)
                    214:        bus_space_tag_t t;
                    215:        bus_space_handle_t bsh;
                    216:        bus_size_t size;
                    217: {
                    218:        vaddr_t va, endva;
                    219:        bus_addr_t bpa;
                    220:
                    221:        va = trunc_page(bsh.base);
                    222:        endva = round_page((bsh.base + size) - 1);
                    223:
                    224: #ifdef DIAGNOSTIC
                    225:        if (endva <= va)
                    226:                panic("bus_space_unmap: overflow");
                    227: #endif
                    228:
                    229:        pmap_extract(pmap_kernel(), va, &bpa);
                    230:        bpa += m68k_page_offset(bsh.base);
                    231:
                    232:        /*
                    233:         * Free the kernel virtual mapping.
                    234:         */
                    235:        pmap_remove(pmap_kernel(), va, endva);
                    236:        pmap_update(pmap_kernel());
                    237:        uvm_km_free(kernel_map, va, endva - va);
                    238:
                    239:        if (extent_free(iomem_ex, bpa, size,
                    240:            EX_NOWAIT | (iomem_malloc_safe ? EX_MALLOCOK : 0))) {
                    241:                printf("bus_space_unmap: pa 0x%lx, size 0x%lx\n",
                    242:                    bpa, size);
                    243:                printf("bus_space_unmap: can't free region\n");
                    244:        }
                    245: }
                    246:
                    247: void
                    248: bus_space_free(t, bsh, size)
                    249:        bus_space_tag_t t;
                    250:        bus_space_handle_t bsh;
                    251:        bus_size_t size;
                    252: {
                    253:        /* bus_space_unmap() does all that we need to do. */
                    254:        bus_space_unmap(t, bsh, size);
                    255: }
                    256:
                    257: int
                    258: bus_space_subregion(t, bsh, offset, size, nbshp)
                    259:        bus_space_tag_t t;
                    260:        bus_space_handle_t bsh;
                    261:        bus_size_t offset, size;
                    262:        bus_space_handle_t *nbshp;
                    263: {
                    264:        *nbshp = bsh;
                    265:        nbshp->base += offset;
                    266:        return (0);
                    267: }
                    268:
                    269: int
                    270: mac68k_bus_space_probe(t, bsh, offset, sz)
                    271:        bus_space_tag_t t;
                    272:        bus_space_handle_t bsh;
                    273:        bus_size_t offset;
                    274:        int sz;
                    275: {
                    276:        int i;
                    277:        label_t faultbuf;
                    278:
                    279:        nofault = &faultbuf;
                    280:        if (setjmp(nofault)) {
                    281:                nofault = (label_t *)0;
                    282:                return (0);
                    283:        }
                    284:
                    285:        switch (sz) {
                    286:        case 1:
                    287:                i = bus_space_read_1(t, bsh, offset);
                    288:                break;
                    289:        case 2:
                    290:                i = bus_space_read_2(t, bsh, offset);
                    291:                break;
                    292:        case 4:
                    293:                i = bus_space_read_4(t, bsh, offset);
                    294:                break;
                    295:        case 8:
                    296:        default:
                    297:                panic("bus_space_probe: unsupported data size %d", sz);
                    298:                /* NOTREACHED */
                    299:        }
                    300:
                    301:        nofault = (label_t *)0;
                    302:        return (1);
                    303: }
                    304:
                    305: void
                    306: mac68k_bus_space_handle_swapped(t, h)
                    307:        bus_space_tag_t t;
                    308:        bus_space_handle_t *h;
                    309: {
                    310:        h->swapped = 1;
                    311:        h->bsr2 = mac68k_bsr2_swap;
                    312:        h->bsr4 = mac68k_bsr4_swap;
                    313:        h->bsrm2 = mac68k_bsrm2_swap;
                    314:        h->bsrm4 = mac68k_bsrm4_swap;
                    315:        h->bsrr2 = mac68k_bsrr2_swap;
                    316:        h->bsrr4 = mac68k_bsrr4_swap;
                    317:        h->bsw2 = mac68k_bsw2_swap;
                    318:        h->bsw4 = mac68k_bsw4_swap;
                    319:        h->bswm2 = mac68k_bswm2_swap;
                    320:        h->bswm4 = mac68k_bswm4_swap;
                    321:        h->bswr2 = mac68k_bswr2_swap;
                    322:        h->bswr4 = mac68k_bswr4_swap;
                    323:        h->bssm2 = mac68k_bssm2_swap;
                    324:        h->bssm4 = mac68k_bssm4_swap;
                    325:        h->bssr2 = mac68k_bssr2_swap;
                    326:        h->bssr4 = mac68k_bssr4_swap;
                    327: }
                    328:
                    329: u_int8_t
                    330: mac68k_bsr1(bus_space_tag_t t, bus_space_handle_t *bsh, bus_size_t offset)
                    331: {
                    332:        return (*(volatile u_int8_t *) (bsh->base + offset));
                    333: }
                    334:
                    335: u_int16_t
                    336: mac68k_bsr2(bus_space_tag_t t, bus_space_handle_t *bsh, bus_size_t offset)
                    337: {
                    338:        return (*(volatile u_int16_t *) (bsh->base + offset));
                    339: }
                    340:
                    341: u_int16_t
                    342: mac68k_bsr2_swap(bus_space_tag_t t, bus_space_handle_t *bsh, bus_size_t offset)
                    343: {
                    344:        u_int16_t       v;
                    345:
                    346:        v = (*(volatile u_int16_t *) (bsh->base + offset));
                    347:        return swap16(v);
                    348: }
                    349:
                    350: u_int32_t
                    351: mac68k_bsr4(bus_space_tag_t tag, bus_space_handle_t *bsh, bus_size_t offset)
                    352: {
                    353:        return (*(volatile u_int32_t *) (bsh->base + offset));
                    354: }
                    355:
                    356: u_int32_t
                    357: mac68k_bsr4_swap(bus_space_tag_t t, bus_space_handle_t *bsh, bus_size_t offset)
                    358: {
                    359:        u_int32_t       v;
                    360:
                    361:        v = (*(volatile u_int32_t *) (bsh->base + offset));
                    362:        return swap32(v);
                    363: }
                    364:
                    365: void
                    366: mac68k_bsrm1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    367:             u_int8_t *a, size_t c)
                    368: {
                    369:        __asm __volatile (
                    370:        "       movl    %0,a0           ;"
                    371:        "       movl    %1,a1           ;"
                    372:        "       movl    %2,d0           ;"
                    373:        "1:     movb    a0@,a1@+        ;"
                    374:        "       subql   #1,d0           ;"
                    375:        "       jne     1b"                                     :
                    376:                                                                :
                    377:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    378:                    "a0","a1","d0");
                    379: }
                    380:
                    381: void
                    382: mac68k_bsrm2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    383:             u_int16_t *a, size_t c)
                    384: {
                    385:        __asm __volatile (
                    386:        "       movl    %0,a0           ;"
                    387:        "       movl    %1,a1           ;"
                    388:        "       movl    %2,d0           ;"
                    389:        "1:     movw    a0@,a1@+        ;"
                    390:        "       subql   #1,d0           ;"
                    391:        "       jne     1b"                                     :
                    392:                                                                :
                    393:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    394:                    "a0","a1","d0");
                    395: }
                    396:
                    397: void
                    398: mac68k_bsrm2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    399:                  u_int16_t *a, size_t c)
                    400: {
                    401:        __asm __volatile (
                    402:        "       movl    %0,a0           ;"
                    403:        "       movl    %1,a1           ;"
                    404:        "       movl    %2,d0           ;"
                    405:        "1:     movw    a0@,d1  ;"
                    406:        "       rolw    #8,d1           ;"
                    407:        "       movw    d1,a1@+ ;"
                    408:        "       subql   #1,d0           ;"
                    409:        "       jne     1b"                                     :
                    410:                                                                :
                    411:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    412:                    "a0","a1","d0","d1");
                    413: }
                    414:
                    415: void
                    416: mac68k_bsrm4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    417:             u_int32_t *a, size_t c)
                    418: {
                    419:        __asm __volatile (
                    420:        "       movl    %0,a0           ;"
                    421:        "       movl    %1,a1           ;"
                    422:        "       movl    %2,%d0          ;"
                    423:        "1:     movl    a0@,a1@+        ;"
                    424:        "       subql   #1,d0           ;"
                    425:        "       jne     1b"                                     :
                    426:                                                                :
                    427:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    428:                    "a0","a1","d0");
                    429: }
                    430:
                    431: void
                    432: mac68k_bsrm4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    433:                  u_int32_t *a, size_t c)
                    434: {
                    435:        __asm __volatile (
                    436:        "       movl    %0,a0           ;"
                    437:        "       movl    %1,a1           ;"
                    438:        "       movl    %2,d0           ;"
                    439:        "1:     movl    a0@,d1  ;"
                    440:        "       rolw    #8,d1           ;"
                    441:        "       swap    d1              ;"
                    442:        "       rolw    #8,d1           ;"
                    443:        "       movl    d1,a1@+ ;"
                    444:        "       subql   #1,d0           ;"
                    445:        "       jne     1b"                                     :
                    446:                                                                :
                    447:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    448:                    "a0","a1","d0","d1");
                    449: }
                    450:
                    451: void
                    452: mac68k_bsrr1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    453:             u_int8_t *a, size_t c)
                    454: {
                    455:        __asm __volatile (
                    456:        "       movl    %0,a0           ;"
                    457:        "       movl    %1,a1           ;"
                    458:        "       movl    %2,d0           ;"
                    459:        "1:     movb    a0@+,a1@+       ;"
                    460:        "       subql   #1,d0           ;"
                    461:        "       jne     1b"                                     :
                    462:                                                                :
                    463:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    464:                    "a0","a1","d0");
                    465: }
                    466:
                    467: void
                    468: mac68k_bsrr2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    469:             u_int16_t *a, size_t c)
                    470: {
                    471:        __asm __volatile (
                    472:        "       movl    %0,a0           ;"
                    473:        "       movl    %1,a1           ;"
                    474:        "       movl    %2,d0           ;"
                    475:        "1:     movw    a0@+,a1@+       ;"
                    476:        "       subql   #1,d0           ;"
                    477:        "       jne     1b"                                     :
                    478:                                                                :
                    479:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    480:                    "a0","a1","d0");
                    481: }
                    482:
                    483: void
                    484: mac68k_bsrr2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    485:                  u_int16_t *a, size_t c)
                    486: {
                    487:        __asm __volatile (
                    488:        "       movl    %0,a0           ;"
                    489:        "       movl    %1,a1           ;"
                    490:        "       movl    %2,d0           ;"
                    491:        "1:     movw    a0@+,d1 ;"
                    492:        "       rolw    #8,d1           ;"
                    493:        "       movw    d1,a1@+ ;"
                    494:        "       subql   #1,d0           ;"
                    495:        "       jne     1b"                                     :
                    496:                                                                :
                    497:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    498:                    "a0","a1","d0","d1");
                    499: }
                    500:
                    501: void
                    502: mac68k_bsrr4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    503:             u_int32_t *a, size_t c)
                    504: {
                    505:        __asm __volatile (
                    506:        "       movl    %0,a0           ;"
                    507:        "       movl    %1,a1           ;"
                    508:        "       movl    %2,d0           ;"
                    509:        "1:     movl    a0@+,a1@+       ;"
                    510:        "       subql   #1,d0           ;"
                    511:        "       jne     1b"                                     :
                    512:                                                                :
                    513:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    514:                    "a0","a1","d0");
                    515: }
                    516:
                    517: void
                    518: mac68k_bsrr4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    519:                  u_int32_t *a, size_t c)
                    520: {
                    521:        __asm __volatile (
                    522:        "       movl    %0,a0           ;"
                    523:        "       movl    %1,a1           ;"
                    524:        "       movl    %2,d0           ;"
                    525:        "1:     movl    a0@+,d1 ;"
                    526:        "       rolw    #8,d1           ;"
                    527:        "       swap    d1              ;"
                    528:        "       rolw    #8,d1           ;"
                    529:        "       movl    d1,a1@+ ;"
                    530:        "       subql   #1,d0           ;"
                    531:        "       jne     1b"                                     :
                    532:                                                                :
                    533:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    534:                    "a0","a1","d0");
                    535: }
                    536:
                    537: void
                    538: mac68k_bsw1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    539:            u_int8_t v)
                    540: {
                    541:        (*(volatile u_int8_t *)(h->base + offset)) = v;
                    542: }
                    543:
                    544: void
                    545: mac68k_bsw2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    546:            u_int16_t v)
                    547: {
                    548:        (*(volatile u_int16_t *)(h->base + offset)) = v;
                    549: }
                    550:
                    551: void
                    552: mac68k_bsw2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    553:                 u_int16_t v)
                    554: {
                    555:        v = swap16(v);
                    556:        (*(volatile u_int16_t *)(h->base + offset)) = v;
                    557: }
                    558:
                    559: void
                    560: mac68k_bsw4(bus_space_tag_t tag, bus_space_handle_t *h, bus_size_t offset,
                    561:            u_int32_t v)
                    562: {
                    563:        (*(volatile u_int32_t *)(h->base + offset)) = v;
                    564: }
                    565:
                    566: void
                    567: mac68k_bsw4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    568:                 u_int32_t v)
                    569: {
                    570:        v = swap32(v);
                    571:        (*(volatile u_int32_t *)(h->base + offset)) = v;
                    572: }
                    573:
                    574: void
                    575: mac68k_bswm1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    576:             const u_int8_t *a, size_t c)
                    577: {
                    578:        __asm __volatile (
                    579:        "       movl    %0,a0           ;"
                    580:        "       movl    %1,a1           ;"
                    581:        "       movl    %2,d0           ;"
                    582:        "1:     movb    a1@+,a0@        ;"
                    583:        "       subql   #1,d0           ;"
                    584:        "       jne     1b"                                     :
                    585:                                                                :
                    586:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    587:                    "a0","a1","d0");
                    588: }
                    589:
                    590: void
                    591: mac68k_bswm2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    592:             const u_int16_t *a, size_t c)
                    593: {
                    594:        __asm __volatile (
                    595:        "       movl    %0,a0           ;"
                    596:        "       movl    %1,a1           ;"
                    597:        "       movl    %2,d0           ;"
                    598:        "1:     movw    a1@+,a0@        ;"
                    599:        "       subql   #1,d0           ;"
                    600:        "       jne     1b"                                     :
                    601:                                                                :
                    602:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    603:                    "a0","a1","d0");
                    604: }
                    605:
                    606: void
                    607: mac68k_bswm2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    608:                  const u_int16_t *a, size_t c)
                    609: {
                    610:        __asm __volatile (
                    611:        "       movl    %0,a0           ;"
                    612:        "       movl    %1,a1           ;"
                    613:        "       movl    %2,d0           ;"
                    614:        "1:     movw    a1@+,d1 ;"
                    615:        "       rolw    #8,d1           ;"
                    616:        "       movw    d1,a0@  ;"
                    617:        "       subql   #1,d0           ;"
                    618:        "       jne     1b"                                     :
                    619:                                                                :
                    620:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    621:                    "a0","a1","d0","d1");
                    622: }
                    623:
                    624: void
                    625: mac68k_bswm4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    626:             const u_int32_t *a, size_t c)
                    627: {
                    628:        __asm __volatile (
                    629:        "       movl    %0,a0           ;"
                    630:        "       movl    %1,a1           ;"
                    631:        "       movl    %2,d0           ;"
                    632:        "1:     movl    a1@+,a0@        ;"
                    633:        "       subql   #1,d0           ;"
                    634:        "       jne     1b"                                     :
                    635:                                                                :
                    636:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    637:                    "a0","a1","d0");
                    638: }
                    639:
                    640: void
                    641: mac68k_bswm4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    642:                  const u_int32_t *a, size_t c)
                    643: {
                    644:        __asm __volatile (
                    645:        "       movl    %0,a0           ;"
                    646:        "       movl    %1,a1           ;"
                    647:        "       movl    %2,d0           ;"
                    648:        "1:     movl    a1@+,d1 ;"
                    649:        "       rolw    #8,d1           ;"
                    650:        "       swap    d1              ;"
                    651:        "       rolw    #8,d1           ;"
                    652:        "       movl    d1,a0@  ;"
                    653:        "       subql   #1,d0           ;"
                    654:        "       jne     1b"                                     :
                    655:                                                                :
                    656:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    657:                    "a0","a1","d0","d1");
                    658: }
                    659:
                    660: void
                    661: mac68k_bswr1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    662:             const u_int8_t *a, size_t c)
                    663: {
                    664:        __asm __volatile (
                    665:        "       movl    %0,a0           ;"
                    666:        "       movl    %1,a1           ;"
                    667:        "       movl    %2,d0           ;"
                    668:        "1:     movb    a1@+,a0@+       ;"
                    669:        "       subql   #1,d0           ;"
                    670:        "       jne     1b"                                     :
                    671:                                                                :
                    672:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    673:                    "a0","a1","d0");
                    674: }
                    675:
                    676: void
                    677: mac68k_bswr2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    678:             const u_int16_t *a, size_t c)
                    679: {
                    680:        __asm __volatile (
                    681:        "       movl    %0,a0           ;"
                    682:        "       movl    %1,a1           ;"
                    683:        "       movl    %2,d0           ;"
                    684:        "1:     movw    a1@+,a0@+       ;"
                    685:        "       subql   #1,d0           ;"
                    686:        "       jne     1b"                                     :
                    687:                                                                :
                    688:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    689:                    "a0","a1","d0");
                    690: }
                    691:
                    692: void
                    693: mac68k_bswr2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    694:                  const u_int16_t *a, size_t c)
                    695: {
                    696:        __asm __volatile (
                    697:        "       movl    %0,a0           ;"
                    698:        "       movl    %1,a1           ;"
                    699:        "       movl    %2,d0           ;"
                    700:        "1:     movw    a1@+,d1 ;"
                    701:        "       rolw    #8,d1           ;"
                    702:        "       movw    d1,a0@+ ;"
                    703:        "       subql   #1,d0           ;"
                    704:        "       jne     1b"                                     :
                    705:                                                                :
                    706:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    707:                    "a0","a1","d0","d1");
                    708: }
                    709:
                    710: void
                    711: mac68k_bswr4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    712:             const u_int32_t *a, size_t c)
                    713: {
                    714:        __asm __volatile (
                    715:        "       movl    %0,a0           ;"
                    716:        "       movl    %1,a1           ;"
                    717:        "       movl    %2,d0           ;"
                    718:        "1:     movl    a1@+,a0@+       ;"
                    719:        "       subql   #1,d0           ;"
                    720:        "       jne     1b"                                     :
                    721:                                                                :
                    722:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    723:                    "a0","a1","d0");
                    724: }
                    725:
                    726: void
                    727: mac68k_bswr4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    728:                  const u_int32_t *a, size_t c)
                    729: {
                    730:        __asm __volatile (
                    731:        "       movl    %0,a0           ;"
                    732:        "       movl    %1,a1           ;"
                    733:        "       movl    %2,d0           ;"
                    734:        "1:     movl    a1@+,d1 ;"
                    735:        "       rolw    #8,d1           ;"
                    736:        "       swap    d1              ;"
                    737:        "       rolw    #8,d1           ;"
                    738:        "       movl    d1,a0@+ ;"
                    739:        "       subql   #1,d0           ;"
                    740:        "       jne     1b"                                     :
                    741:                                                                :
                    742:                    "r" (h->base + offset), "g" (a), "g" (c)    :
                    743:                    "a0","a1","d0","d1");
                    744: }
                    745:
                    746: void
                    747: mac68k_bssm1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    748:             u_int8_t v, size_t c)
                    749: {
                    750:        __asm __volatile (
                    751:        "       movl    %0,a0           ;"
                    752:        "       movl    %1,d1           ;"
                    753:        "       movl    %2,d0           ;"
                    754:        "1:     movb    d1,a0@  ;"
                    755:        "       subql   #1,d0           ;"
                    756:        "       jne     1b"                                             :
                    757:                                                                        :
                    758:                    "r" (h->base + offset), "g" ((u_long)v), "g" (c)    :
                    759:                    "a0","d0","d1");
                    760: }
                    761:
                    762: void
                    763: mac68k_bssm2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    764:             u_int16_t v, size_t c)
                    765: {
                    766:        __asm __volatile (
                    767:        "       movl    %0,a0           ;"
                    768:        "       movl    %1,d1           ;"
                    769:        "       movl    %2,d0           ;"
                    770:        "1:     movw    d1,a0@  ;"
                    771:        "       subql   #1,d0           ;"
                    772:        "       jne     1b"                                             :
                    773:                                                                        :
                    774:                    "r" (h->base + offset), "g" ((u_long)v), "g" (c)    :
                    775:                    "a0","d0","d1");
                    776: }
                    777:
                    778: void
                    779: mac68k_bssm2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    780:                  u_int16_t v, size_t c)
                    781: {
                    782:        __asm __volatile (
                    783:        "       movl    %0,a0           ;"
                    784:        "       movl    %1,d1           ;"
                    785:        "       rolw    #8,d1           ;"
                    786:        "       movl    %2,d0           ;"
                    787:        "1:     movw    d1,a0@  ;"
                    788:        "       subql   #1,d0           ;"
                    789:        "       jne     1b"                                             :
                    790:                                                                        :
                    791:                    "r" (h->base + offset), "g" ((u_long)v), "g" (c)    :
                    792:                    "a0","d0","d1");
                    793: }
                    794:
                    795: void
                    796: mac68k_bssm4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    797:             u_int32_t v, size_t c)
                    798: {
                    799:        __asm __volatile (
                    800:        "       movl    %0,a0           ;"
                    801:        "       movl    %1,d1           ;"
                    802:        "       movl    %2,d0           ;"
                    803:        "1:     movl    d1,a0@  ;"
                    804:        "       subql   #1,d0           ;"
                    805:        "       jne     1b"                                             :
                    806:                                                                        :
                    807:                    "r" (h->base + offset), "g" ((u_long)v), "g" (c)    :
                    808:                    "a0","d0","d1");
                    809: }
                    810:
                    811: void
                    812: mac68k_bssm4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    813:                  u_int32_t v, size_t c)
                    814: {
                    815:        __asm __volatile (
                    816:        "       movl    %0,a0           ;"
                    817:        "       movl    %1,d1           ;"
                    818:        "       rolw    #8,d1           ;"
                    819:        "       swap    d1              ;"
                    820:        "       rolw    #8,d1           ;"
                    821:        "       movl    %2,d0           ;"
                    822:        "1:     movl    d1,a0@  ;"
                    823:        "       subql   #1,d0           ;"
                    824:        "       jne     1b"                                             :
                    825:                                                                        :
                    826:                    "r" (h->base + offset), "g" ((u_long)v), "g" (c)    :
                    827:                    "a0","d0","d1");
                    828: }
                    829:
                    830: void
                    831: mac68k_bssr1(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    832:             u_int8_t v, size_t c)
                    833: {
                    834:        __asm __volatile (
                    835:        "       movl    %0,a0           ;"
                    836:        "       movl    %1,d1           ;"
                    837:        "       movl    %2,d0           ;"
                    838:        "1:     movb    d1,a0@+ ;"
                    839:        "       subql   #1,d0           ;"
                    840:        "       jne     1b"                                             :
                    841:                                                                        :
                    842:                    "r" (h->base + offset), "g" ((u_long)v), "g" (c)    :
                    843:                    "a0","d0","d1");
                    844: }
                    845:
                    846: void
                    847: mac68k_bssr2(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    848:             u_int16_t v, size_t c)
                    849: {
                    850:        __asm __volatile (
                    851:        "       movl    %0,a0           ;"
                    852:        "       movl    %1,d1           ;"
                    853:        "       movl    %2,d0           ;"
                    854:        "1:     movw    d1,a0@+ ;"
                    855:        "       subql   #1,d0           ;"
                    856:        "       jne     1b"                                             :
                    857:                                                                        :
                    858:                    "r" (h->base + offset), "g" ((u_long)v), "g" (c)    :
                    859:                    "a0","d0","d1");
                    860: }
                    861:
                    862: void
                    863: mac68k_bssr2_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    864:                  u_int16_t v, size_t c)
                    865: {
                    866:        __asm __volatile (
                    867:        "       movl    %0,a0           ;"
                    868:        "       movl    %1,d1           ;"
                    869:        "       rolw    #8,d1           ;"
                    870:        "       movl    %2,d0           ;"
                    871:        "1:     movw    d1,a0@+ ;"
                    872:        "       subql   #1,d0           ;"
                    873:        "       jne     1b"                                             :
                    874:                                                                        :
                    875:                    "r" (h->base + offset), "g" ((u_long)v), "g" (c)    :
                    876:                    "a0","d0","d1");
                    877: }
                    878:
                    879: void
                    880: mac68k_bssr4(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    881:             u_int32_t v, size_t c)
                    882: {
                    883:        __asm __volatile (
                    884:        "       movl    %0,a0           ;"
                    885:        "       movl    %1,d1           ;"
                    886:        "       movl    %2,d0           ;"
                    887:        "1:     movl    d1,a0@+ ;"
                    888:        "       subql   #1,d0           ;"
                    889:        "       jne     1b"                                             :
                    890:                                                                        :
                    891:                    "r" (h->base + offset), "g" ((u_long)v), "g" (c)    :
                    892:                    "a0","d0","d1");
                    893: }
                    894:
                    895: void
                    896: mac68k_bssr4_swap(bus_space_tag_t t, bus_space_handle_t *h, bus_size_t offset,
                    897:                  u_int32_t v, size_t c)
                    898: {
                    899:        __asm __volatile (
                    900:        "       movl    %0,a0           ;"
                    901:        "       movl    %1,d1           ;"
                    902:        "       rolw    #8,d1           ;"
                    903:        "       swap    d1              ;"
                    904:        "       rolw    #8,d1           ;"
                    905:        "       movl    %2,d0           ;"
                    906:        "1:     movl    d1,a0@+ ;"
                    907:        "       subql   #1,d0           ;"
                    908:        "       jne     1b"                                             :
                    909:                                                                        :
                    910:                    "r" (h->base + offset), "g" ((u_long)v), "g" (c)    :
                    911:                    "a0","d0","d1");
                    912: }

CVSweb