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

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

1.1     ! nbrk        1: /*     $OpenBSD: bus.h,v 1.1.1.1 2006/05/09 18:18:49 miod Exp $        */
        !             2: /*
        !             3:  * Copyright (c) 2004, Miodrag Vallat.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms, with or without
        !             6:  * modification, are permitted provided that the following conditions
        !             7:  * are met:
        !             8:  * 1. Redistributions of source code must retain the above copyright
        !             9:  *    notice, this list of conditions and the following disclaimer.
        !            10:  * 2. Redistributions in binary form must reproduce the above copyright
        !            11:  *    notice, this list of conditions and the following disclaimer in the
        !            12:  *    documentation and/or other materials provided with the distribution.
        !            13:  *
        !            14:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            15:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
        !            16:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
        !            17:  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
        !            18:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
        !            19:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
        !            20:  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            21:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
        !            22:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
        !            23:  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            24:  * POSSIBILITY OF SUCH DAMAGE.
        !            25:  */
        !            26:
        !            27: /*
        !            28:  * Simple aviion bus_space implementation.
        !            29:  *
        !            30:  * Currently, we only need specific handling for 32 bit read/writes in D16
        !            31:  * space, and this choice is made at compile time.  As a result, all the
        !            32:  * implementation can go through macros or inline functions, except for
        !            33:  * the management functions.
        !            34:  */
        !            35:
        !            36: #ifndef        _AVIION_BUS_H_
        !            37: #define        _AVIION_BUS_H_
        !            38:
        !            39: #include <machine/asm_macro.h>
        !            40:
        !            41: typedef        u_int32_t       bus_addr_t;
        !            42: typedef        u_int32_t       bus_size_t;
        !            43:
        !            44: typedef        u_int32_t       bus_space_handle_t;
        !            45:
        !            46: struct aviion_bus_space_tag {
        !            47:        int     (*bs_map)(bus_addr_t, bus_size_t, int, bus_space_handle_t *);
        !            48:        void    (*bs_unmap)(bus_space_handle_t, bus_size_t);
        !            49:        int     (*bs_subregion)(bus_space_handle_t, bus_size_t, bus_size_t,
        !            50:                    bus_space_handle_t *);
        !            51:        void *  (*bs_vaddr)(bus_space_handle_t);
        !            52:        /* alloc, free not implemented yet */
        !            53: };
        !            54:
        !            55: typedef const struct aviion_bus_space_tag *bus_space_tag_t;
        !            56:
        !            57: #define        BUS_SPACE_BARRIER_READ  0
        !            58: #define        BUS_SPACE_BARRIER_WRITE 1
        !            59:
        !            60: #define        BUS_SPACE_MAP_CACHEABLE 0x01
        !            61: #define        BUS_SPACE_MAP_LINEAR    0x02
        !            62:
        !            63: /*
        !            64:  * General bus_space function set
        !            65:  */
        !            66:
        !            67: #define        bus_space_map(t,a,s,f,r)        ((t)->bs_map(a,s,f,r))
        !            68: #define        bus_space_unmap(t,h,s)          ((t)->bs_unmap(h,s))
        !            69: #define        bus_space_subregion(t,h,o,s,r)  ((t)->bs_subregion(h,o,s,r))
        !            70: #define        bus_space_vaddr(t,h)            ((t)->bs_vaddr(h))
        !            71:
        !            72: static void bus_space_barrier(bus_space_tag_t, bus_space_handle_t,
        !            73:     bus_addr_t, bus_size_t, int);
        !            74:
        !            75: static __inline__ void
        !            76: bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t handle,
        !            77:     bus_addr_t offset, bus_size_t size, int flags)
        !            78: {
        !            79:        flush_pipeline();       /* overkill? */
        !            80: }
        !            81:
        !            82: /*
        !            83:  * Read/Write/Region functions for D8 and D16 access.
        !            84:  * Most of these are straightforward and assume that everything is properly
        !            85:  * aligned.
        !            86:  */
        !            87:
        !            88: #define        bus_space_read_1(tag, handle, offset) \
        !            89:        ((void)(tag), *(volatile u_int8_t *)((handle) + (offset)))
        !            90: #define        bus_space_read_2(tag, handle, offset) \
        !            91:        ((void)(tag), *(volatile u_int16_t *)((handle) + (offset)))
        !            92:
        !            93: static void bus_space_read_multi_1(bus_space_tag_t, bus_space_handle_t,
        !            94:     bus_addr_t, u_int8_t *, size_t);
        !            95:
        !            96: static __inline__ void
        !            97: bus_space_read_multi_1(bus_space_tag_t tag, bus_space_handle_t handle,
        !            98:     bus_addr_t offset, u_int8_t *dest, size_t count)
        !            99: {
        !           100:        offset += handle;
        !           101:        while ((int)--count >= 0)
        !           102:                *dest++ = bus_space_read_1(tag, 0, offset);
        !           103: }
        !           104:
        !           105: static void bus_space_read_multi_2(bus_space_tag_t, bus_space_handle_t,
        !           106:     bus_addr_t, u_int16_t *, size_t);
        !           107:
        !           108: static __inline__ void
        !           109: bus_space_read_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
        !           110:     bus_addr_t offset, u_int16_t *dest, size_t count)
        !           111: {
        !           112:        offset += handle;
        !           113:        while ((int)--count >= 0)
        !           114:                *dest++ = bus_space_read_2(tag, 0, offset);
        !           115: }
        !           116:
        !           117: static void bus_space_read_raw_multi_2(bus_space_tag_t, bus_space_handle_t,
        !           118:     bus_addr_t, u_int8_t *, size_t);
        !           119:
        !           120: static __inline__ void
        !           121: bus_space_read_raw_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
        !           122:     bus_addr_t offset, u_int8_t *dest, size_t size)
        !           123: {
        !           124:        offset += handle;
        !           125:        size >>= 1;
        !           126:        while ((int)--size >= 0) {
        !           127:                *(u_int16_t *)dest =
        !           128:                    bus_space_read_2(tag, 0, offset);
        !           129:                dest += 2;
        !           130:        }
        !           131: }
        !           132:
        !           133: static void bus_space_read_region_1(bus_space_tag_t, bus_space_handle_t,
        !           134:     bus_addr_t, u_int8_t *, size_t);
        !           135:
        !           136: static __inline__ void
        !           137: bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t handle,
        !           138:     bus_addr_t offset, u_int8_t *dest, size_t count)
        !           139: {
        !           140:        offset += handle;
        !           141:        while ((int)--count >= 0)
        !           142:                *dest++ = bus_space_read_1(tag, 0, offset++);
        !           143: }
        !           144:
        !           145: static void bus_space_read_region_2(bus_space_tag_t, bus_space_handle_t,
        !           146:     bus_addr_t, u_int16_t *, size_t);
        !           147:
        !           148: static __inline__ void
        !           149: bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
        !           150:     bus_addr_t offset, u_int16_t *dest, size_t count)
        !           151: {
        !           152:        offset += handle;
        !           153:        while ((int)--count >= 0) {
        !           154:                *dest++ = bus_space_read_2(tag, 0, offset);
        !           155:                offset += 2;
        !           156:        }
        !           157: }
        !           158:
        !           159: static void bus_space_read_raw_region_2(bus_space_tag_t, bus_space_handle_t,
        !           160:     bus_addr_t, u_int8_t *, size_t);
        !           161:
        !           162: static __inline__ void
        !           163: bus_space_read_raw_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
        !           164:     bus_addr_t offset, u_int8_t *dest, size_t size)
        !           165: {
        !           166:        size >>= 1;
        !           167:        offset += handle;
        !           168:        while ((int)--size >= 0) {
        !           169:                *(u_int16_t *)dest = bus_space_read_2(tag, 0, offset);
        !           170:                offset += 2;
        !           171:                dest += 2;
        !           172:        }
        !           173: }
        !           174:
        !           175: #define        bus_space_write_1(tag, handle, offset, value) \
        !           176:        ((void)(tag), *(volatile u_int8_t *)((handle) + (offset)) = (value))
        !           177: #define        bus_space_write_2(tag, handle, offset, value) \
        !           178:        ((void)(tag), *(volatile u_int16_t *)((handle) + (offset)) = (value))
        !           179:
        !           180: static void bus_space_write_multi_1(bus_space_tag_t, bus_space_handle_t,
        !           181:     bus_addr_t, u_int8_t *, size_t);
        !           182:
        !           183: static __inline__ void
        !           184: bus_space_write_multi_1(bus_space_tag_t tag, bus_space_handle_t handle,
        !           185:     bus_addr_t offset, u_int8_t *dest, size_t count)
        !           186: {
        !           187:        offset += handle;
        !           188:        while ((int)--count >= 0)
        !           189:                bus_space_write_1(tag, 0, offset, *dest++);
        !           190: }
        !           191:
        !           192: static void bus_space_write_multi_2(bus_space_tag_t, bus_space_handle_t,
        !           193:     bus_addr_t, u_int16_t *, size_t);
        !           194:
        !           195: static __inline__ void
        !           196: bus_space_write_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
        !           197:     bus_addr_t offset, u_int16_t *dest, size_t count)
        !           198: {
        !           199:        offset += handle;
        !           200:        while ((int)--count >= 0)
        !           201:                bus_space_write_2(tag, 0, offset, *dest++);
        !           202: }
        !           203:
        !           204: static void bus_space_write_raw_multi_2(bus_space_tag_t, bus_space_handle_t,
        !           205:     bus_addr_t, u_int8_t *, size_t);
        !           206:
        !           207: static __inline__ void
        !           208: bus_space_write_raw_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
        !           209:     bus_addr_t offset, u_int8_t *dest, size_t size)
        !           210: {
        !           211:        offset += handle;
        !           212:        size >>= 1;
        !           213:        while ((int)--size >= 0) {
        !           214:                bus_space_write_2(tag, 0, offset, *(u_int16_t *)dest);
        !           215:                dest += 2;
        !           216:        }
        !           217: }
        !           218:
        !           219: static void bus_space_set_multi_1(bus_space_tag_t, bus_space_handle_t,
        !           220:     bus_addr_t, u_int8_t, size_t);
        !           221:
        !           222: static __inline__ void
        !           223: bus_space_set_multi_1(bus_space_tag_t tag, bus_space_handle_t handle,
        !           224:     bus_addr_t offset, u_int8_t value, size_t count)
        !           225: {
        !           226:        offset += handle;
        !           227:        while ((int)--count >= 0)
        !           228:                bus_space_write_1(tag, 0, offset, value);
        !           229: }
        !           230:
        !           231: static void bus_space_set_multi_2(bus_space_tag_t, bus_space_handle_t,
        !           232:     bus_addr_t, u_int16_t, size_t);
        !           233:
        !           234: static __inline__ void
        !           235: bus_space_set_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
        !           236:     bus_addr_t offset, u_int16_t value, size_t count)
        !           237: {
        !           238:        offset += handle;
        !           239:        while ((int)--count >= 0)
        !           240:                bus_space_write_2(tag, 0, offset, value);
        !           241: }
        !           242:
        !           243: static void bus_space_write_region_1(bus_space_tag_t, bus_space_handle_t,
        !           244:     bus_addr_t, u_int8_t *, size_t);
        !           245:
        !           246: static __inline__ void
        !           247: bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t handle,
        !           248:     bus_addr_t offset, u_int8_t *dest, size_t count)
        !           249: {
        !           250:        offset += handle;
        !           251:        while ((int)--count >= 0)
        !           252:                bus_space_write_1(tag, 0, offset++, *dest++);
        !           253: }
        !           254:
        !           255: static void bus_space_write_region_2(bus_space_tag_t, bus_space_handle_t,
        !           256:     bus_addr_t, u_int16_t *, size_t);
        !           257:
        !           258: static __inline__ void
        !           259: bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
        !           260:     bus_addr_t offset, u_int16_t *dest, size_t count)
        !           261: {
        !           262:        offset += handle;
        !           263:        while ((int)--count >= 0) {
        !           264:                bus_space_write_2(tag, 0, offset, *dest++);
        !           265:                offset += 2;
        !           266:        }
        !           267: }
        !           268:
        !           269: static void bus_space_write_raw_region_2(bus_space_tag_t, bus_space_handle_t,
        !           270:     bus_addr_t, u_int8_t *, size_t);
        !           271:
        !           272: static __inline__ void
        !           273: bus_space_write_raw_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
        !           274:     bus_addr_t offset, u_int8_t *dest, size_t size)
        !           275: {
        !           276:        offset += handle;
        !           277:        size >>= 1;
        !           278:        while ((int)--size >= 0) {
        !           279:                bus_space_write_2(tag, 0, offset, *(u_int16_t *)dest);
        !           280:                offset += 2;
        !           281:                dest += 2;
        !           282:        }
        !           283: }
        !           284:
        !           285: static void bus_space_set_region_1(bus_space_tag_t, bus_space_handle_t,
        !           286:     bus_addr_t, u_int8_t, size_t);
        !           287:
        !           288: static __inline__ void
        !           289: bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t handle,
        !           290:     bus_addr_t offset, u_int8_t value, size_t count)
        !           291: {
        !           292:        offset += handle;
        !           293:        while ((int)--count >= 0)
        !           294:                bus_space_write_1(tag, 0, offset++, value);
        !           295: }
        !           296:
        !           297: static void bus_space_set_region_2(bus_space_tag_t, bus_space_handle_t,
        !           298:     bus_addr_t, u_int16_t, size_t);
        !           299:
        !           300: static __inline__ void
        !           301: bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
        !           302:     bus_addr_t offset, u_int16_t value, size_t count)
        !           303: {
        !           304:        offset += handle;
        !           305:        while ((int)--count >= 0) {
        !           306:                bus_space_write_2(tag, 0, offset, value);
        !           307:                offset += 2;
        !           308:        }
        !           309: }
        !           310:
        !           311: static void bus_space_copy_1(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
        !           312:     bus_space_handle_t, bus_addr_t, bus_size_t);
        !           313:
        !           314: static __inline__ void
        !           315: bus_space_copy_1(bus_space_tag_t tag, bus_space_handle_t h1, bus_addr_t o1,
        !           316:     bus_space_handle_t h2, bus_addr_t o2, bus_size_t count)
        !           317: {
        !           318:        o1 += h1;
        !           319:        o2 += h2;
        !           320:        while ((int)--count >= 0) {
        !           321:                *((volatile u_int8_t *)o1)++ = *((volatile u_int8_t *)o2)++;
        !           322:        }
        !           323: }
        !           324:
        !           325: static void bus_space_copy_2(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
        !           326:     bus_space_handle_t, bus_addr_t, bus_size_t);
        !           327:
        !           328: static __inline__ void
        !           329: bus_space_copy_2(bus_space_tag_t tag, bus_space_handle_t h1, bus_addr_t o1,
        !           330:     bus_space_handle_t h2, bus_addr_t o2, bus_size_t count)
        !           331: {
        !           332:        o1 += h1;
        !           333:        o2 += h2;
        !           334:        while ((int)--count >= 0) {
        !           335:                *(volatile u_int16_t *)o1 = *(volatile u_int16_t *)o2;
        !           336:                o1 += 2;
        !           337:                o2 += 2;
        !           338:        }
        !           339: }
        !           340:
        !           341: /*
        !           342:  * Unrestricted D32 access
        !           343:  */
        !           344:
        !           345: #ifndef        __BUS_SPACE_RESTRICT_D16__
        !           346:
        !           347: #define        bus_space_read_4(tag, handle, offset) \
        !           348:        ((void)(tag), *(volatile u_int32_t *)((handle) + (offset)))
        !           349:
        !           350: static void bus_space_read_multi_4(bus_space_tag_t, bus_space_handle_t,
        !           351:     bus_addr_t, u_int32_t *, size_t);
        !           352:
        !           353: static __inline__ void
        !           354: bus_space_read_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           355:     bus_addr_t offset, u_int32_t *dest, size_t count)
        !           356: {
        !           357:        offset += handle;
        !           358:        while ((int)--count >= 0)
        !           359:                *dest++ = bus_space_read_4(tag, 0, offset);
        !           360: }
        !           361:
        !           362: static void bus_space_read_raw_multi_4(bus_space_tag_t, bus_space_handle_t,
        !           363:     bus_addr_t, u_int8_t *, size_t);
        !           364:
        !           365: static __inline__ void
        !           366: bus_space_read_raw_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           367:     bus_addr_t offset, u_int8_t *dest, size_t size)
        !           368: {
        !           369:        offset += handle;
        !           370:        size >>= 2;
        !           371:        while ((int)--size >= 0) {
        !           372:                *(u_int32_t *)dest =
        !           373:                    bus_space_read_4(tag, 0, offset);
        !           374:                dest += 4;
        !           375:        }
        !           376: }
        !           377:
        !           378: static void bus_space_read_region_4(bus_space_tag_t, bus_space_handle_t,
        !           379:     bus_addr_t, u_int32_t *, size_t);
        !           380:
        !           381: static __inline__ void
        !           382: bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           383:     bus_addr_t offset, u_int32_t *dest, size_t count)
        !           384: {
        !           385:        offset += handle;
        !           386:        while ((int)--count >= 0) {
        !           387:                *dest++ = bus_space_read_4(tag, 0, offset);
        !           388:                offset += 4;
        !           389:        }
        !           390: }
        !           391:
        !           392: static void bus_space_read_raw_region_4(bus_space_tag_t, bus_space_handle_t,
        !           393:     bus_addr_t, u_int8_t *, size_t);
        !           394:
        !           395: static __inline__ void
        !           396: bus_space_read_raw_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           397:     bus_addr_t offset, u_int8_t *dest, size_t size)
        !           398: {
        !           399:        size >>= 2;
        !           400:        offset += handle;
        !           401:        while ((int)--size >= 0) {
        !           402:                *(u_int32_t *)dest = bus_space_read_4(tag, 0, offset);
        !           403:                offset += 4;
        !           404:                dest += 4;
        !           405:        }
        !           406: }
        !           407:
        !           408: #define        bus_space_write_4(tag, handle, offset, value) \
        !           409:        ((void)(tag), *(volatile u_int32_t *)((handle) + (offset)) = (value))
        !           410:
        !           411: static void bus_space_write_multi_4(bus_space_tag_t, bus_space_handle_t,
        !           412:     bus_addr_t, u_int32_t *, size_t);
        !           413:
        !           414: static __inline__ void
        !           415: bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           416:     bus_addr_t offset, u_int32_t *dest, size_t count)
        !           417: {
        !           418:        offset += handle;
        !           419:        while ((int)--count >= 0)
        !           420:                bus_space_write_4(tag, 0, offset, *dest++);
        !           421: }
        !           422:
        !           423: static void bus_space_write_raw_multi_4(bus_space_tag_t, bus_space_handle_t,
        !           424:     bus_addr_t, u_int8_t *, size_t);
        !           425:
        !           426: static __inline__ void
        !           427: bus_space_write_raw_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           428:     bus_addr_t offset, u_int8_t *dest, size_t size)
        !           429: {
        !           430:        offset += handle;
        !           431:        size >>= 2;
        !           432:        while ((int)--size >= 0) {
        !           433:                bus_space_write_4(tag, 0, offset, *(u_int32_t *)dest);
        !           434:                dest += 4;
        !           435:        }
        !           436: }
        !           437:
        !           438: static void bus_space_set_multi_4(bus_space_tag_t, bus_space_handle_t,
        !           439:     bus_addr_t, u_int32_t, size_t);
        !           440:
        !           441: static __inline__ void
        !           442: bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           443:     bus_addr_t offset, u_int32_t value, size_t count)
        !           444: {
        !           445:        offset += handle;
        !           446:        while ((int)--count >= 0)
        !           447:                bus_space_write_4(tag, 0, offset, value);
        !           448: }
        !           449:
        !           450: static void bus_space_write_region_4(bus_space_tag_t, bus_space_handle_t,
        !           451:     bus_addr_t, u_int32_t *, size_t);
        !           452:
        !           453: static __inline__ void
        !           454: bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           455:     bus_addr_t offset, u_int32_t *dest, size_t count)
        !           456: {
        !           457:        offset += handle;
        !           458:        while ((int)--count >= 0) {
        !           459:                bus_space_write_4(tag, 0, offset, *dest++);
        !           460:                offset += 4;
        !           461:        }
        !           462: }
        !           463:
        !           464: static void bus_space_write_raw_region_4(bus_space_tag_t, bus_space_handle_t,
        !           465:     bus_addr_t, u_int8_t *, size_t);
        !           466:
        !           467: static __inline__ void
        !           468: bus_space_write_raw_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           469:     bus_addr_t offset, u_int8_t *dest, size_t size)
        !           470: {
        !           471:        offset += handle;
        !           472:        size >>= 2;
        !           473:        while ((int)--size >= 0) {
        !           474:                bus_space_write_4(tag, 0, offset, *(u_int32_t *)dest);
        !           475:                offset += 4;
        !           476:                dest += 4;
        !           477:        }
        !           478: }
        !           479:
        !           480: static void bus_space_set_region_4(bus_space_tag_t, bus_space_handle_t,
        !           481:     bus_addr_t, u_int32_t, size_t);
        !           482:
        !           483: static __inline__ void
        !           484: bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           485:     bus_addr_t offset, u_int32_t value, size_t count)
        !           486: {
        !           487:        offset += handle;
        !           488:        while ((int)--count >= 0) {
        !           489:                bus_space_write_4(tag, 0, offset, value);
        !           490:                offset += 4;
        !           491:        }
        !           492: }
        !           493:
        !           494: static void bus_space_copy_4(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
        !           495:     bus_space_handle_t, bus_addr_t, bus_size_t);
        !           496:
        !           497: static __inline__ void
        !           498: bus_space_copy_4(bus_space_tag_t tag, bus_space_handle_t h1, bus_addr_t o1,
        !           499:     bus_space_handle_t h2, bus_addr_t o2, bus_size_t count)
        !           500: {
        !           501:        o1 += h1;
        !           502:        o2 += h2;
        !           503:        while ((int)--count >= 0) {
        !           504:                *(volatile u_int32_t *)o1 = *(volatile u_int32_t *)o2;
        !           505:                o1 += 4;
        !           506:                o2 += 4;
        !           507:        }
        !           508: }
        !           509:
        !           510: #else  /* __BUS_SPACE_RESTRICT_D16__ */
        !           511:
        !           512: /*
        !           513:  * Restricted D32 access - done through two adjacent D16 access.
        !           514:  *
        !           515:  * The speed of the basic read and write routines is critical.
        !           516:  * This implementation uses a temporary variable on stack, and does
        !           517:  * two 16 bit load&store sequences. Since the stack is in Dcache, this
        !           518:  * is faster and spills fewer register than a register-only sequence
        !           519:  * (which would need to ld.h into two distinct registers, then extu
        !           520:  * the second one into itself, and or both in the result register).
        !           521:  */
        !           522:
        !           523: static u_int32_t d16_read_4(vaddr_t);
        !           524: static void d16_write_4(vaddr_t, u_int32_t);
        !           525:
        !           526: static __inline__ u_int32_t
        !           527: d16_read_4(vaddr_t va)
        !           528: {
        !           529:        u_int32_t tmp;
        !           530:
        !           531:        *(u_int16_t *)&tmp = *(volatile u_int16_t *)va;
        !           532:        *(u_int16_t *)((vaddr_t)&tmp + 2) = *(volatile u_int16_t *)(va + 2);
        !           533:
        !           534:        return tmp;
        !           535: }
        !           536:
        !           537: static __inline__ void
        !           538: d16_write_4(vaddr_t va, u_int32_t value)
        !           539: {
        !           540:        u_int32_t tmp = value;
        !           541:
        !           542:        *(volatile u_int16_t *)va = *(u_int16_t *)&tmp;
        !           543:        *(volatile u_int16_t *)(va + 2) = *(u_int16_t *)((vaddr_t)&tmp + 2);
        !           544: }
        !           545:
        !           546: #define        bus_space_read_4(tag, handle, offset) \
        !           547:        ((void)(tag), d16_read_4((handle) + (offset)))
        !           548:
        !           549: static void bus_space_read_multi_4(bus_space_tag_t, bus_space_handle_t,
        !           550:     bus_addr_t, u_int32_t *, size_t);
        !           551:
        !           552: static __inline__ void
        !           553: bus_space_read_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           554:     bus_addr_t offset, u_int32_t *dest, size_t count)
        !           555: {
        !           556:        offset += handle;
        !           557:        while ((int)--count >= 0)
        !           558:                *dest++ = bus_space_read_4(tag, 0, offset);
        !           559: }
        !           560:
        !           561: static void bus_space_read_raw_multi_4(bus_space_tag_t, bus_space_handle_t,
        !           562:     bus_addr_t, u_int8_t *, size_t);
        !           563:
        !           564: static __inline__ void
        !           565: bus_space_read_raw_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           566:     bus_addr_t offset, u_int8_t *dest, size_t size)
        !           567: {
        !           568:        offset += handle;
        !           569:        size >>= 1;
        !           570:        while ((int)--size >= 0) {
        !           571:                *(u_int16_t *)dest = bus_space_read_2(tag, 0, offset);
        !           572:                dest += 2;
        !           573:        }
        !           574: }
        !           575:
        !           576: static void bus_space_read_region_4(bus_space_tag_t, bus_space_handle_t,
        !           577:     bus_addr_t, u_int32_t *, size_t);
        !           578:
        !           579: static __inline__ void
        !           580: bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           581:     bus_addr_t offset, u_int32_t *__dest, size_t count)
        !           582: {
        !           583:        u_int16_t *dest = (u_int16_t *)__dest;
        !           584:
        !           585:        offset += handle;
        !           586:        count <<= 1;
        !           587:        while ((int)--count >= 0) {
        !           588:                *dest++ = bus_space_read_2(tag, 0, offset);
        !           589:                offset += 2;
        !           590:        }
        !           591: }
        !           592:
        !           593: static void bus_space_read_raw_region_4(bus_space_tag_t, bus_space_handle_t,
        !           594:     bus_addr_t, u_int8_t *, size_t);
        !           595:
        !           596: static __inline__ void
        !           597: bus_space_read_raw_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           598:     bus_addr_t offset, u_int8_t *dest, size_t size)
        !           599: {
        !           600:        size >>= 1;
        !           601:        offset += handle;
        !           602:        while ((int)--size >= 0) {
        !           603:                *(u_int16_t *)dest = bus_space_read_2(tag, 0, offset);
        !           604:                offset += 2;
        !           605:                dest += 2;
        !           606:        }
        !           607: }
        !           608:
        !           609: #define        bus_space_write_4(tag, handle, offset, value) \
        !           610:        ((void)(tag), d16_write_4((handle) + (offset), (value)))
        !           611:
        !           612: static void bus_space_write_multi_4(bus_space_tag_t, bus_space_handle_t,
        !           613:     bus_addr_t, u_int32_t *, size_t);
        !           614:
        !           615: static __inline__ void
        !           616: bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           617:     bus_addr_t offset, u_int32_t *dest, size_t count)
        !           618: {
        !           619:        offset += handle;
        !           620:        while ((int)--count >= 0)
        !           621:                bus_space_write_4(tag, 0, offset, *dest++);
        !           622: }
        !           623:
        !           624: static void bus_space_write_raw_multi_4(bus_space_tag_t, bus_space_handle_t,
        !           625:     bus_addr_t, u_int8_t *, size_t);
        !           626:
        !           627: static __inline__ void
        !           628: bus_space_write_raw_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           629:     bus_addr_t offset, u_int8_t *dest, size_t size)
        !           630: {
        !           631:        offset += handle;
        !           632:        size >>= 1;
        !           633:        while ((int)--size >= 0) {
        !           634:                bus_space_write_2(tag, 0, offset, *(u_int16_t *)dest);
        !           635:                dest += 2;
        !           636:        }
        !           637: }
        !           638:
        !           639: static void bus_space_set_multi_4(bus_space_tag_t, bus_space_handle_t,
        !           640:     bus_addr_t, u_int32_t, size_t);
        !           641:
        !           642: static __inline__ void
        !           643: bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           644:     bus_addr_t offset, u_int32_t value, size_t count)
        !           645: {
        !           646:        offset += handle;
        !           647:        while ((int)--count >= 0)
        !           648:                bus_space_write_4(tag, 0, offset, value);
        !           649: }
        !           650:
        !           651: static void bus_space_write_region_4(bus_space_tag_t, bus_space_handle_t,
        !           652:     bus_addr_t, u_int32_t *, size_t);
        !           653:
        !           654: static __inline__ void
        !           655: bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           656:     bus_addr_t offset, u_int32_t *__dest, size_t count)
        !           657: {
        !           658:        u_int16_t *dest = (u_int16_t *)__dest;
        !           659:
        !           660:        offset += handle;
        !           661:        count <<= 1;
        !           662:        while ((int)--count >= 0) {
        !           663:                bus_space_write_2(tag, 0, offset, *dest++);
        !           664:                offset += 2;
        !           665:        }
        !           666: }
        !           667:
        !           668: static void bus_space_write_raw_region_4(bus_space_tag_t, bus_space_handle_t,
        !           669:     bus_addr_t, u_int8_t *, size_t);
        !           670:
        !           671: static __inline__ void
        !           672: bus_space_write_raw_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           673:     bus_addr_t offset, u_int8_t *dest, size_t size)
        !           674: {
        !           675:        offset += handle;
        !           676:        size >>= 1;
        !           677:        while ((int)--size >= 0) {
        !           678:                bus_space_write_2(tag, 0, offset, *(u_int16_t *)dest);
        !           679:                offset += 2;
        !           680:                dest += 2;
        !           681:        }
        !           682: }
        !           683:
        !           684: static void bus_space_set_region_4(bus_space_tag_t, bus_space_handle_t,
        !           685:     bus_addr_t, u_int32_t, size_t);
        !           686:
        !           687: static __inline__ void
        !           688: bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
        !           689:     bus_addr_t offset, u_int32_t value, size_t count)
        !           690: {
        !           691:        offset += handle;
        !           692:        while ((int)--count >= 0) {
        !           693:                bus_space_write_4(tag, 0, offset, value);
        !           694:                offset += 4;
        !           695:        }
        !           696: }
        !           697:
        !           698: static void bus_space_copy_4(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
        !           699:     bus_space_handle_t, bus_addr_t, bus_size_t);
        !           700:
        !           701: static __inline__ void
        !           702: bus_space_copy_4(bus_space_tag_t tag, bus_space_handle_t h1, bus_addr_t o1,
        !           703:     bus_space_handle_t h2, bus_addr_t o2, bus_size_t count)
        !           704: {
        !           705:        o1 += h1;
        !           706:        o2 += h2;
        !           707:        count <<= 1;
        !           708:        while ((int)--count >= 0) {
        !           709:                *(volatile u_int16_t *)o1 = *(volatile u_int16_t *)o2;
        !           710:                o1 += 2;
        !           711:                o2 += 2;
        !           712:        }
        !           713: }
        !           714:
        !           715: /*
        !           716:  * Extra D16 access functions (see vme.c)
        !           717:  */
        !           718:
        !           719: void d16_bcopy(const void *, void *, size_t);
        !           720: void d16_bzero(void *, size_t);
        !           721:
        !           722: #endif /* __BUS_SPACE_RESTRICT_D16__ */
        !           723:
        !           724: #endif /* _AVIION_BUS_H_ */

CVSweb