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

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

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

CVSweb