[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     ! 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