[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

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