[BACK]Return to bus.h CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / arch / mac68k / include

Annotation of src/sys/arch/mac68k/include/bus.h, Revision 1.10

1.10    ! scottr      1: /*     $NetBSD: bus.h,v 1.9 1998/01/13 18:32:15 scottr Exp $   */
1.7       thorpej     2:
                      3: /*-
1.9       scottr      4:  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
1.7       thorpej     5:  * All rights reserved.
                      6:  *
                      7:  * This code is derived from software contributed to The NetBSD Foundation
                      8:  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
                      9:  * NASA Ames Research Center.
                     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:  */
1.1       scottr     39:
                     40: /*
1.5       scottr     41:  * Copyright (C) 1997 Scott Reynolds.  All rights reserved.
1.1       scottr     42:  *
                     43:  * Redistribution and use in source and binary forms, with or without
                     44:  * modification, are permitted provided that the following conditions
                     45:  * are met:
                     46:  * 1. Redistributions of source code must retain the above copyright
                     47:  *    notice, this list of conditions and the following disclaimer.
                     48:  * 2. Redistributions in binary form must reproduce the above copyright
                     49:  *    notice, this list of conditions and the following disclaimer in the
                     50:  *    documentation and/or other materials provided with the distribution.
1.8       scottr     51:  * 3. The name of the author may not be used to endorse or promote products
1.1       scottr     52:  *    derived from this software without specific prior written permission
                     53:  *
                     54:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     55:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     56:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     57:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     58:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     59:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     60:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     61:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     62:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
                     63:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     64:  */
                     65:
                     66: #ifndef _MAC68K_BUS_H_
                     67: #define _MAC68K_BUS_H_
                     68:
                     69: /*
                     70:  * Value for the mac68k bus space tag, not to be used directly by MI code.
                     71:  */
                     72: #define MAC68K_BUS_SPACE_MEM   0       /* space is mem space */
                     73:
                     74: /*
                     75:  * Bus address and size types
                     76:  */
                     77: typedef u_long bus_addr_t;
                     78: typedef u_long bus_size_t;
                     79:
                     80: /*
                     81:  * Access methods for bus resources and address space.
                     82:  */
1.2       scottr     83: typedef int    bus_space_tag_t;
                     84: typedef u_long bus_space_handle_t;
1.1       scottr     85:
1.9       scottr     86: /*
                     87:  *     int bus_space_map __P((bus_space_tag_t t, bus_addr_t addr,
                     88:  *         bus_size_t size, int flags, bus_space_handle_t *bshp));
                     89:  *
                     90:  * Map a region of bus space.
                     91:  */
                     92:
                     93: #define        BUS_SPACE_MAP_CACHEABLE         0x01
                     94: #define        BUS_SPACE_MAP_LINEAR            0x02
                     95:
1.1       scottr     96: int    bus_space_map __P((bus_space_tag_t, bus_addr_t, bus_size_t,
1.9       scottr     97:            int, bus_space_handle_t *));
                     98:
                     99: /*
                    100:  *     void bus_space_unmap __P((bus_space_tag_t t,
                    101:  *         bus_space_handle_t bsh, bus_size_t size));
                    102:  *
                    103:  * Unmap a region of bus space.
                    104:  */
                    105:
                    106: void   bus_space_unmap __P((bus_space_tag_t, bus_space_handle_t, bus_size_t));
                    107:
                    108: /*
                    109:  *     int bus_space_subregion __P((bus_space_tag_t t,
                    110:  *         bus_space_handle_t bsh, bus_size_t offset, bus_size_t size,
                    111:  *         bus_space_handle_t *nbshp));
                    112:  *
                    113:  * Get a new handle for a subregion of an already-mapped area of bus space.
                    114:  */
                    115:
1.1       scottr    116: int    bus_space_subregion __P((bus_space_tag_t t, bus_space_handle_t bsh,
                    117:            bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp));
1.3       scottr    118:
1.9       scottr    119: /*
                    120:  *     int bus_space_alloc __P((bus_space_tag_t t, bus_addr_t, rstart,
                    121:  *         bus_addr_t rend, bus_size_t size, bus_size_t align,
                    122:  *         bus_size_t boundary, int flags, bus_addr_t *addrp,
                    123:  *         bus_space_handle_t *bshp));
                    124:  *
                    125:  * Allocate a region of bus space.
                    126:  */
                    127:
1.3       scottr    128: int    bus_space_alloc __P((bus_space_tag_t t, bus_addr_t rstart,
                    129:            bus_addr_t rend, bus_size_t size, bus_size_t align,
                    130:            bus_size_t boundary, int cacheable, bus_addr_t *addrp,
                    131:            bus_space_handle_t *bshp));
1.9       scottr    132:
                    133: /*
                    134:  *     int bus_space_free __P((bus_space_tag_t t,
                    135:  *         bus_space_handle_t bsh, bus_size_t size));
                    136:  *
                    137:  * Free a region of bus space.
                    138:  */
                    139:
1.3       scottr    140: void   bus_space_free __P((bus_space_tag_t t, bus_space_handle_t bsh,
                    141:            bus_size_t size));
1.1       scottr    142:
                    143: /*
1.9       scottr    144:  *     int mac68k_bus_space_probe __P((bus_space_tag_t t,
                    145:  *         bus_space_handle_t bsh, bus_size_t offset, int sz));
                    146:  *
                    147:  * Probe the bus at t/bsh/offset, using sz as the size of the load.
                    148:  *
                    149:  * This is a machine-dependent extension, and is not to be used by
                    150:  * machine-independent code.
                    151:  */
                    152:
                    153: int    mac68k_bus_space_probe __P((bus_space_tag_t t,
                    154:            bus_space_handle_t bsh, bus_size_t offset, int sz));
                    155:
                    156: /*
1.1       scottr    157:  *     u_intN_t bus_space_read_N __P((bus_space_tag_t tag,
                    158:  *         bus_space_handle_t bsh, bus_size_t offset));
                    159:  *
                    160:  * Read a 1, 2, 4, or 8 byte quantity from bus space
                    161:  * described by tag/handle/offset.
                    162:  */
                    163:
                    164: #define        bus_space_read_1(t, h, o)                                       \
                    165:     ((void) t, (*(volatile u_int8_t *)((h) + (o))))
                    166:
                    167: #define        bus_space_read_2(t, h, o)                                       \
                    168:     ((void) t, (*(volatile u_int16_t *)((h) + (o))))
                    169:
                    170: #define        bus_space_read_4(t, h, o)                                       \
                    171:     ((void) t, (*(volatile u_int32_t *)((h) + (o))))
                    172:
                    173: #if 0  /* Cause a link error for bus_space_read_8 */
                    174: #define        bus_space_read_8(t, h, o)       !!! bus_space_read_8 unimplemented !!!
                    175: #endif
                    176:
                    177: /*
                    178:  *     void bus_space_read_multi_N __P((bus_space_tag_t tag,
                    179:  *         bus_space_handle_t bsh, bus_size_t offset,
                    180:  *         u_intN_t *addr, size_t count));
                    181:  *
                    182:  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
                    183:  * described by tag/handle/offset and copy into buffer provided.
                    184:  */
                    185:
                    186: #define        bus_space_read_multi_1(t, h, o, a, c) do {                      \
1.6       scottr    187:        (void) t;                                                       \
1.1       scottr    188:        __asm __volatile ("                                             \
                    189:                movl    %0,a0                                   ;       \
                    190:                movl    %1,a1                                   ;       \
                    191:                movl    %2,d0                                   ;       \
                    192:        1:      movb    a0@,a1@+                                ;       \
                    193:                subql   #1,d0                                   ;       \
                    194:                jne     1b"                                     :       \
                    195:                                                                :       \
                    196:                    "r" ((h) + (o)), "g" (a), "g" (c)           :       \
                    197:                    "a0","a1","d0");                                    \
1.10    ! scottr    198: } while (0)
1.1       scottr    199:
                    200: #define        bus_space_read_multi_2(t, h, o, a, c) do {                      \
1.6       scottr    201:        (void) t;                                                       \
1.1       scottr    202:        __asm __volatile ("                                             \
                    203:                movl    %0,a0                                   ;       \
                    204:                movl    %1,a1                                   ;       \
                    205:                movl    %2,d0                                   ;       \
                    206:        1:      movw    a0@,a1@+                                ;       \
                    207:                subql   #1,d0                                   ;       \
                    208:                jne     1b"                                     :       \
                    209:                                                                :       \
                    210:                    "r" ((h) + (o)), "g" (a), "g" (c)           :       \
                    211:                    "a0","a1","d0");                                    \
1.10    ! scottr    212: } while (0)
1.1       scottr    213:
                    214: #define        bus_space_read_multi_4(t, h, o, a, c) do {                      \
1.6       scottr    215:        (void) t;                                                       \
1.1       scottr    216:        __asm __volatile ("                                             \
                    217:                movl    %0,a0                                   ;       \
                    218:                movl    %1,a1                                   ;       \
                    219:                movl    %2,d0                                   ;       \
                    220:        1:      movl    a0@,a1@+                                ;       \
                    221:                subql   #1,d0                                   ;       \
                    222:                jne     1b"                                     :       \
                    223:                                                                :       \
                    224:                    "r" ((h) + (o)), "g" (a), "g" (c)           :       \
                    225:                    "a0","a1","d0");                                    \
1.10    ! scottr    226: } while (0)
1.1       scottr    227:
                    228: #if 0  /* Cause a link error for bus_space_read_multi_8 */
                    229: #define        bus_space_read_multi_8  !!! bus_space_read_multi_8 unimplemented !!!
                    230: #endif
                    231:
                    232: /*
                    233:  *     void bus_space_read_region_N __P((bus_space_tag_t tag,
                    234:  *         bus_space_handle_t bsh, bus_size_t offset,
                    235:  *         u_intN_t *addr, size_t count));
                    236:  *
                    237:  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
                    238:  * described by tag/handle and starting at `offset' and copy into
                    239:  * buffer provided.
                    240:  */
                    241:
                    242: #define        bus_space_read_region_1(t, h, o, a, c) do {                     \
1.6       scottr    243:        (void) t;                                                       \
1.1       scottr    244:        __asm __volatile ("                                             \
                    245:                movl    %0,a0                                   ;       \
                    246:                movl    %1,a1                                   ;       \
                    247:                movl    %2,d0                                   ;       \
                    248:        1:      movb    a0@+,a1@+                               ;       \
                    249:                subql   #1,d0                                   ;       \
                    250:                jne     1b"                                     :       \
                    251:                                                                :       \
                    252:                    "r" ((h) + (o)), "g" (a), "g" (c)           :       \
                    253:                    "a0","a1","d0");                                    \
1.10    ! scottr    254: } while (0)
1.1       scottr    255:
                    256: #define        bus_space_read_region_2(t, h, o, a, c) do {                     \
1.6       scottr    257:        (void) t;                                                       \
1.1       scottr    258:        __asm __volatile ("                                             \
                    259:                movl    %0,a0                                   ;       \
                    260:                movl    %1,a1                                   ;       \
                    261:                movl    %2,d0                                   ;       \
                    262:        1:      movw    a0@+,a1@+                               ;       \
                    263:                subql   #1,d0                                   ;       \
                    264:                jne     1b"                                     :       \
                    265:                                                                :       \
                    266:                    "r" ((h) + (o)), "g" (a), "g" (c)           :       \
                    267:                    "a0","a1","d0");                                    \
1.10    ! scottr    268: } while (0)
1.1       scottr    269:
                    270: #define        bus_space_read_region_4(t, h, o, a, c) do {                     \
1.6       scottr    271:        (void) t;                                                       \
1.1       scottr    272:        __asm __volatile ("                                             \
                    273:                movl    %0,a0                                   ;       \
                    274:                movl    %1,a1                                   ;       \
                    275:                movl    %2,d0                                   ;       \
                    276:        1:      movl    a0@+,a1@+                               ;       \
                    277:                subql   #1,d0                                   ;       \
                    278:                jne     1b"                                     :       \
                    279:                                                                :       \
                    280:                    "r" ((h) + (o)), "g" (a), "g" (c)           :       \
                    281:                    "a0","a1","d0");                                    \
1.10    ! scottr    282: } while (0)
1.1       scottr    283:
                    284: #if 0  /* Cause a link error for bus_space_read_region_8 */
                    285: #define        bus_space_read_region_8 !!! bus_space_read_region_8 unimplemented !!!
                    286: #endif
                    287:
                    288: /*
                    289:  *     void bus_space_write_N __P((bus_space_tag_t tag,
                    290:  *         bus_space_handle_t bsh, bus_size_t offset,
                    291:  *         u_intN_t value));
                    292:  *
                    293:  * Write the 1, 2, 4, or 8 byte value `value' to bus space
                    294:  * described by tag/handle/offset.
                    295:  */
                    296:
                    297: #define        bus_space_write_1(t, h, o, v)                                   \
                    298:     ((void) t, ((void)(*(volatile u_int8_t *)((h) + (o)) = (v))))
                    299:
                    300: #define        bus_space_write_2(t, h, o, v)                                   \
                    301:     ((void) t, ((void)(*(volatile u_int16_t *)((h) + (o)) = (v))))
                    302:
                    303: #define        bus_space_write_4(t, h, o, v)                                   \
                    304:     ((void) t, ((void)(*(volatile u_int32_t *)((h) + (o)) = (v))))
                    305:
                    306: #if 0  /* Cause a link error for bus_space_write_8 */
                    307: #define        bus_space_write_8       !!! bus_space_write_8 not implemented !!!
                    308: #endif
                    309:
                    310: /*
                    311:  *     void bus_space_write_multi_N __P((bus_space_tag_t tag,
                    312:  *         bus_space_handle_t bsh, bus_size_t offset,
                    313:  *         const u_intN_t *addr, size_t count));
                    314:  *
                    315:  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
                    316:  * provided to bus space described by tag/handle/offset.
                    317:  */
                    318:
                    319: #define        bus_space_write_multi_1(t, h, o, a, c) do {                     \
1.6       scottr    320:        (void) t;                                                       \
1.1       scottr    321:        __asm __volatile ("                                             \
                    322:                movl    %0,a0                                   ;       \
                    323:                movl    %1,a1                                   ;       \
                    324:                movl    %2,d0                                   ;       \
                    325:        1:      movb    a1@+,a0@                                ;       \
                    326:                subql   #1,d0                                   ;       \
                    327:                jne     1b"                                     :       \
                    328:                                                                :       \
                    329:                    "r" ((h) + (o)), "g" (a), "g" (c)           :       \
                    330:                    "a0","a1","d0");                                    \
1.10    ! scottr    331: } while (0)
1.1       scottr    332:
                    333: #define        bus_space_write_multi_2(t, h, o, a, c) do {                     \
1.6       scottr    334:        (void) t;                                                       \
1.1       scottr    335:        __asm __volatile ("                                             \
                    336:                movl    %0,a0                                   ;       \
                    337:                movl    %1,a1                                   ;       \
                    338:                movl    %2,d0                                   ;       \
                    339:        1:      movw    a1@+,a0@                                ;       \
                    340:                subql   #1,d0                                   ;       \
                    341:                jne     1b"                                     :       \
                    342:                                                                :       \
                    343:                    "r" ((h) + (o)), "g" (a), "g" (c)           :       \
                    344:                    "a0","a1","d0");                                    \
1.10    ! scottr    345: } while (0)
1.1       scottr    346:
                    347: #define        bus_space_write_multi_4(t, h, o, a, c) do {                     \
1.6       scottr    348:        (void) t;                                                       \
1.1       scottr    349:        __asm __volatile ("                                             \
                    350:                movl    %0,a0                                   ;       \
                    351:                movl    %1,a1                                   ;       \
                    352:                movl    %2,d0                                   ;       \
                    353:        1:      movl    a1@+,a0@                                ;       \
                    354:                subql   #1,d0                                   ;       \
                    355:                jne     1b"                                     :       \
                    356:                                                                :       \
                    357:                    "r" ((h) + (o)), "g" (a), "g" (c)           :       \
                    358:                    "a0","a1","d0");                                    \
1.10    ! scottr    359: } while (0)
1.1       scottr    360:
                    361: #if 0  /* Cause a link error for bus_space_write_8 */
                    362: #define        bus_space_write_multi_8(t, h, o, a, c)                          \
                    363:                        !!! bus_space_write_multi_8 unimplimented !!!
                    364: #endif
                    365:
                    366: /*
                    367:  *     void bus_space_write_region_N __P((bus_space_tag_t tag,
                    368:  *         bus_space_handle_t bsh, bus_size_t offset,
                    369:  *         const u_intN_t *addr, size_t count));
                    370:  *
                    371:  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided
                    372:  * to bus space described by tag/handle starting at `offset'.
                    373:  */
                    374:
                    375: #define        bus_space_write_region_1(t, h, o, a, c) do {                    \
1.6       scottr    376:        (void) t;                                                       \
1.1       scottr    377:        __asm __volatile ("                                             \
                    378:                movl    %0,a0                                   ;       \
                    379:                movl    %1,a1                                   ;       \
                    380:                movl    %2,d0                                   ;       \
                    381:        1:      movb    a1@+,a0@+                               ;       \
                    382:                subql   #1,d0                                   ;       \
                    383:                jne     1b"                                     :       \
                    384:                                                                :       \
                    385:                    "r" ((h) + (o)), "g" (a), "g" (c)           :       \
                    386:                    "a0","a1","d0");                                    \
1.10    ! scottr    387: } while (0)
1.1       scottr    388:
                    389: #define        bus_space_write_region_2(t, h, o, a, c) do {                    \
1.6       scottr    390:        (void) t;                                                       \
1.1       scottr    391:        __asm __volatile ("                                             \
                    392:                movl    %0,a0                                   ;       \
                    393:                movl    %1,a1                                   ;       \
                    394:                movl    %2,d0                                   ;       \
                    395:        1:      movw    a1@+,a0@+                               ;       \
                    396:                subql   #1,d0                                   ;       \
                    397:                jne     1b"                                     :       \
                    398:                                                                :       \
                    399:                    "r" ((h) + (o)), "g" (a), "g" (c)           :       \
                    400:                    "a0","a1","d0");                                    \
1.10    ! scottr    401: } while (0)
1.1       scottr    402:
                    403: #define        bus_space_write_region_4(t, h, o, a, c) do {                    \
1.6       scottr    404:        (void) t;                                                       \
1.1       scottr    405:        __asm __volatile ("                                             \
                    406:                movl    %0,a0                                   ;       \
                    407:                movl    %1,a1                                   ;       \
                    408:                movl    %2,d0                                   ;       \
                    409:        1:      movl    a1@+,a0@+                               ;       \
                    410:                subql   #1,d0                                   ;       \
                    411:                jne     1b"                                     :       \
                    412:                                                                :       \
                    413:                    "r" ((h) + (o)), "g" (a), "g" (c)           :       \
                    414:                    "a0","a1","d0");                                    \
1.10    ! scottr    415: } while (0)
1.1       scottr    416:
                    417: #if 0  /* Cause a link error for bus_space_write_region_8 */
                    418: #define        bus_space_write_region_8                                        \
                    419:                        !!! bus_space_write_region_8 unimplemented !!!
                    420: #endif
                    421:
                    422: /*
                    423:  *     void bus_space_set_multi_N __P((bus_space_tag_t tag,
                    424:  *         bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
                    425:  *         size_t count));
                    426:  *
                    427:  * Write the 1, 2, 4, or 8 byte value `val' to bus space described
                    428:  * by tag/handle/offset `count' times.
                    429:  */
                    430:
1.4       scottr    431: #define        bus_space_set_multi_1(t, h, o, val, c) do {                     \
1.6       scottr    432:        (void) t;                                                       \
1.4       scottr    433:        __asm __volatile ("                                             \
                    434:                movl    %0,a0                                   ;       \
                    435:                movl    %1,d1                                   ;       \
                    436:                movl    %2,d0                                   ;       \
                    437:        1:      movb    d1,a0@                                  ;       \
                    438:                subql   #1,d0                                   ;       \
                    439:                jne     1b"                                     :       \
                    440:                                                                :       \
                    441:                    "r" ((h) + (o)), "g" (val), "g" (c)         :       \
                    442:                    "a0","d0","d1");                                    \
1.10    ! scottr    443: } while (0)
1.4       scottr    444:
                    445: #define        bus_space_set_multi_2(t, h, o, val, c) do {                     \
1.6       scottr    446:        (void) t;                                                       \
1.4       scottr    447:        __asm __volatile ("                                             \
                    448:                movl    %0,a0                                   ;       \
                    449:                movl    %1,d1                                   ;       \
                    450:                movl    %2,d0                                   ;       \
                    451:        1:      movw    d1,a0@                                  ;       \
                    452:                subql   #1,d0                                   ;       \
                    453:                jne     1b"                                     :       \
                    454:                                                                :       \
                    455:                    "r" ((h) + (o)), "g" (val), "g" (c)         :       \
                    456:                    "a0","d0","d1");                                    \
1.10    ! scottr    457: } while (0)
1.4       scottr    458:
                    459: #define        bus_space_set_multi_4(t, h, o, val, c) do {                     \
1.6       scottr    460:        (void) t;                                                       \
1.4       scottr    461:        __asm __volatile ("                                             \
                    462:                movl    %0,a0                                   ;       \
                    463:                movl    %1,d1                                   ;       \
                    464:                movl    %2,d0                                   ;       \
                    465:        1:      movl    d1,a0@                                  ;       \
                    466:                subql   #1,d0                                   ;       \
                    467:                jne     1b"                                     :       \
                    468:                                                                :       \
                    469:                    "r" ((h) + (o)), "g" (val), "g" (c)         :       \
                    470:                    "a0","d0","d1");                                    \
1.10    ! scottr    471: } while (0)
1.4       scottr    472:
                    473: #if 0  /* Cause a link error for bus_space_set_multi_8 */
                    474: #define        bus_space_set_multi_8                                           \
                    475:                        !!! bus_space_set_multi_8 unimplemented !!!
                    476: #endif
1.1       scottr    477:
                    478: /*
                    479:  *     void bus_space_set_region_N __P((bus_space_tag_t tag,
                    480:  *         bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
                    481:  *         size_t count));
                    482:  *
                    483:  * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
                    484:  * by tag/handle starting at `offset'.
                    485:  */
                    486:
1.4       scottr    487: #define        bus_space_set_region_1(t, h, o, val, c) do {                    \
1.6       scottr    488:        (void) t;                                                       \
1.4       scottr    489:        __asm __volatile ("                                             \
                    490:                movl    %0,a0                                   ;       \
                    491:                movl    %1,d1                                   ;       \
                    492:                movl    %2,d0                                   ;       \
                    493:        1:      movb    d1,a0@+                                 ;       \
                    494:                subql   #1,d0                                   ;       \
                    495:                jne     1b"                                     :       \
                    496:                                                                :       \
                    497:                    "r" ((h) + (o)), "g" (val), "g" (c)         :       \
                    498:                    "a0","d0","d1");                                    \
1.10    ! scottr    499: } while (0)
1.4       scottr    500:
                    501: #define        bus_space_set_region_2(t, h, o, val, c) do {                    \
1.6       scottr    502:        (void) t;                                                       \
1.4       scottr    503:        __asm __volatile ("                                             \
                    504:                movl    %0,a0                                   ;       \
                    505:                movl    %1,d1                                   ;       \
                    506:                movl    %2,d0                                   ;       \
                    507:        1:      movw    d1,a0@+                                 ;       \
                    508:                subql   #1,d0                                   ;       \
                    509:                jne     1b"                                     :       \
                    510:                                                                :       \
                    511:                    "r" ((h) + (o)), "g" (val), "g" (c)         :       \
                    512:                    "a0","d0","d1");                                    \
1.10    ! scottr    513: } while (0)
1.4       scottr    514:
                    515: #define        bus_space_set_region_4(t, h, o, val, c) do {                    \
1.6       scottr    516:        (void) t;                                                       \
1.4       scottr    517:        __asm __volatile ("                                             \
                    518:                movl    %0,a0                                   ;       \
                    519:                movl    %1,d1                                   ;       \
                    520:                movl    %2,d0                                   ;       \
                    521:        1:      movl    d1,a0@+                                 ;       \
                    522:                subql   #1,d0                                   ;       \
                    523:                jne     1b"                                     :       \
                    524:                                                                :       \
                    525:                    "r" ((h) + (o)), "g" (val), "g" (c)         :       \
                    526:                    "a0","d0","d1");                                    \
1.10    ! scottr    527: } while (0)
1.4       scottr    528:
                    529: #if 0  /* Cause a link error for bus_space_set_region_8 */
                    530: #define        bus_space_set_region_8                                          \
                    531:                        !!! bus_space_set_region_8 unimplemented !!!
                    532: #endif
1.1       scottr    533:
                    534: /*
                    535:  *     void bus_space_copy_N __P((bus_space_tag_t tag,
                    536:  *         bus_space_handle_t bsh1, bus_size_t off1,
                    537:  *         bus_space_handle_t bsh2, bus_size_t off2,
                    538:  *         size_t count));
                    539:  *
                    540:  * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
                    541:  * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
                    542:  */
                    543:
1.9       scottr    544: #define        __MAC68K_copy_region_N(BYTES)                                   \
                    545: static __inline void __CONCAT(bus_space_copy_region_,BYTES)            \
                    546:        __P((bus_space_tag_t,                                           \
                    547:            bus_space_handle_t bsh1, bus_size_t off1,                   \
                    548:            bus_space_handle_t bsh2, bus_size_t off2,                   \
                    549:            bus_size_t count));                                         \
                    550:                                                                        \
                    551: static __inline void                                                   \
                    552: __CONCAT(bus_space_copy_region_,BYTES)(t, h1, o1, h2, o2, c)           \
                    553:        bus_space_tag_t t;                                              \
                    554:        bus_space_handle_t h1, h2;                                      \
                    555:        bus_size_t o1, o2, c;                                           \
                    556: {                                                                      \
                    557:        bus_size_t o;                                                   \
                    558:                                                                        \
                    559:        if ((h1 + o1) >= (h2 + o2)) {                                   \
                    560:                /* src after dest: copy forward */                      \
                    561:                for (o = 0; c != 0; c--, o += BYTES)                    \
                    562:                        __CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o, \
                    563:                            __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \
                    564:        } else {                                                        \
                    565:                /* dest after src: copy backwards */                    \
                    566:                for (o = (c - 1) * BYTES; c != 0; c--, o -= BYTES)      \
                    567:                        __CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o, \
                    568:                            __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \
                    569:        }                                                               \
                    570: }
                    571: __MAC68K_copy_region_N(1)
                    572: __MAC68K_copy_region_N(2)
                    573: __MAC68K_copy_region_N(4)
1.4       scottr    574: #if 0  /* Cause a link error for bus_space_copy_8 */
                    575: #define        bus_space_copy_8                                                \
                    576:                        !!! bus_space_copy_8 unimplemented !!!
                    577: #endif
1.1       scottr    578:
1.9       scottr    579: #undef __MAC68K_copy_region_N
                    580:
1.1       scottr    581: /*
                    582:  * Bus read/write barrier methods.
                    583:  *
                    584:  *     void bus_space_barrier __P((bus_space_tag_t tag,
                    585:  *         bus_space_handle_t bsh, bus_size_t offset,
                    586:  *         bus_size_t len, int flags));
                    587:  *
                    588:  * Note: the 680x0 does not currently require barriers, but we must
                    589:  * provide the flags to MI code.
                    590:  */
                    591: #define        bus_space_barrier(t, h, o, l, f)        \
                    592:        ((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f)))
1.9       scottr    593: #define        BUS_SPACE_BARRIER_READ  0x01            /* force read barrier */
                    594: #define        BUS_SPACE_BARRIER_WRITE 0x02            /* force write barrier */
1.1       scottr    595:
                    596: #endif /* _MAC68K_BUS_H_ */

CVSweb <webmaster@jp.NetBSD.org>