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

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

1.1     ! nbrk        1: /*     $OpenBSD: bus.h,v 1.5 2006/04/26 21:09:50 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 mvme88k bus_space and bus_dma 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        _MVME88K_BUS_H_
        !            37: #define        _MVME88K_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 mvme88k_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 mvme88k_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: #endif /* __BUS_SPACE_RESTRICT_D16__ */
        !           716:
        !           717: /*
        !           718:  * Extra D16 access functions (see vme.c)
        !           719:  */
        !           720:
        !           721: void d16_bcopy(const void *, void *, size_t);
        !           722: void d16_bzero(void *, size_t);
        !           723:
        !           724: /*
        !           725:  * Bus DMA implementation
        !           726:  */
        !           727:
        !           728: #define        BUS_DMA_WAITOK          0x000   /* safe to sleep (pseudo-flag) */
        !           729: #define        BUS_DMA_NOWAIT          0x001   /* not safe to sleep */
        !           730: #define        BUS_DMA_ALLOCNOW        0x002   /* perform resource allocation now */
        !           731: #define        BUS_DMA_COHERENT        0x004   /* hint: map memory DMA coherent */
        !           732: #define        BUS_DMAMEM_NOSYNC       0x008
        !           733: #define        BUS_DMA_BUS1            0x010   /* placeholders for bus functions... */
        !           734: #define        BUS_DMA_BUS2            0x020
        !           735: #define        BUS_DMA_BUS3            0x040
        !           736: #define        BUS_DMA_BUS4            0x080
        !           737: #define        BUS_DMA_READ            0x100   /* mapping is device -> memory only */
        !           738: #define        BUS_DMA_WRITE           0x200   /* mapping is memory -> device only */
        !           739: #define        BUS_DMA_STREAMING       0x400   /* hint: sequential, unidirectional */
        !           740:
        !           741: #define BUS_DMASYNC_PREREAD    0x01
        !           742: #define BUS_DMASYNC_POSTREAD   0x02
        !           743: #define BUS_DMASYNC_PREWRITE   0x04
        !           744: #define BUS_DMASYNC_POSTWRITE  0x08
        !           745:
        !           746: typedef        u_int32_t       bus_dma_tag_t;  /* ignored, really */
        !           747:
        !           748: /*
        !           749:  *     bus_dma_segment_t
        !           750:  *
        !           751:  *     Describes a single contiguous DMA transaction.  Values
        !           752:  *     are suitable for programming into DMA registers.
        !           753:  */
        !           754: struct m88k_bus_dma_segment {
        !           755:        bus_addr_t      ds_addr;        /* DMA address */
        !           756:        bus_size_t      ds_len;         /* length of transfer */
        !           757: };
        !           758: typedef struct m88k_bus_dma_segment  bus_dma_segment_t;
        !           759:
        !           760: /*
        !           761:  *     bus_dmamap_t
        !           762:  *
        !           763:  *     Describes a DMA mapping.
        !           764:  */
        !           765: struct m88k_bus_dmamap {
        !           766:        bus_size_t      _dm_size;       /* largest DMA transfer mappable */
        !           767:        int             _dm_segcnt;     /* number of segs this map can map */
        !           768:        bus_size_t      _dm_maxsegsz;   /* largest possible segment */
        !           769:        bus_size_t      _dm_boundary;   /* don't cross this */
        !           770:
        !           771:        bus_size_t      dm_mapsize;     /* size of the mapping */
        !           772:        int             dm_nsegs;       /* # valid segments in mapping */
        !           773:        bus_dma_segment_t dm_segs[1];   /* segments; variable length */
        !           774: };
        !           775: typedef struct m88k_bus_dmamap         *bus_dmamap_t;
        !           776:
        !           777: struct mbuf;
        !           778: struct proc;
        !           779: struct uio;
        !           780:
        !           781: int    bus_dmamap_create(bus_dma_tag_t, bus_size_t, int, bus_size_t,
        !           782:            bus_size_t, int, bus_dmamap_t *);
        !           783: void   bus_dmamap_destroy(bus_dma_tag_t, bus_dmamap_t);
        !           784: int    bus_dmamap_load(bus_dma_tag_t, bus_dmamap_t, void *,
        !           785:            bus_size_t, struct proc *, int);
        !           786: int    bus_dmamap_load_mbuf(bus_dma_tag_t, bus_dmamap_t,
        !           787:            struct mbuf *, int);
        !           788: int    bus_dmamap_load_uio(bus_dma_tag_t, bus_dmamap_t,
        !           789:            struct uio *, int);
        !           790: int    bus_dmamap_load_raw(bus_dma_tag_t, bus_dmamap_t, bus_dma_segment_t *,
        !           791:            int, bus_size_t, int);
        !           792: void   bus_dmamap_unload(bus_dma_tag_t, bus_dmamap_t);
        !           793: void   bus_dmamap_sync(bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
        !           794:            bus_size_t, int);
        !           795:
        !           796: int    bus_dmamem_alloc(bus_dma_tag_t tag, bus_size_t size,
        !           797:            bus_size_t alignment, bus_size_t boundary,
        !           798:            bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags);
        !           799: void   bus_dmamem_free(bus_dma_tag_t tag, bus_dma_segment_t *segs,
        !           800:            int nsegs);
        !           801: int    bus_dmamem_map(bus_dma_tag_t tag, bus_dma_segment_t *segs,
        !           802:            int nsegs, size_t size, caddr_t *kvap, int flags);
        !           803: void   bus_dmamem_unmap(bus_dma_tag_t tag, caddr_t kva,
        !           804:            size_t size);
        !           805: paddr_t bus_dmamem_mmap(bus_dma_tag_t tag, bus_dma_segment_t *segs,
        !           806:            int nsegs, off_t off, int prot, int flags);
        !           807:
        !           808: #endif /* _MVME88K_BUS_H_ */

CVSweb