[BACK]Return to bus.h CVS log [TXT][DIR] Up to [local] / sys / arch / luna88k / include

Annotation of sys/arch/luna88k/include/bus.h, Revision 1.1

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

CVSweb