[BACK]Return to tc_bus_mem.c CVS log [TXT][DIR] Up to [local] / sys / arch / alpha / tc

Annotation of sys/arch/alpha/tc/tc_bus_mem.c, Revision 1.1.1.1

1.1       nbrk        1: /* $OpenBSD: tc_bus_mem.c,v 1.13 2002/05/02 22:56:06 miod Exp $ */
                      2: /* $NetBSD: tc_bus_mem.c,v 1.25 2001/09/04 05:31:28 thorpej Exp $ */
                      3:
                      4: /*
                      5:  * Copyright (c) 1996 Carnegie-Mellon University.
                      6:  * All rights reserved.
                      7:  *
                      8:  * Author: Chris G. Demetriou
                      9:  *
                     10:  * Permission to use, copy, modify and distribute this software and
                     11:  * its documentation is hereby granted, provided that both the copyright
                     12:  * notice and this permission notice appear in all copies of the
                     13:  * software, derivative works or modified versions, and any portions
                     14:  * thereof, and that both notices appear in supporting documentation.
                     15:  *
                     16:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     17:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
                     18:  * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     19:  *
                     20:  * Carnegie Mellon requests users of this software to return to
                     21:  *
                     22:  *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
                     23:  *  School of Computer Science
                     24:  *  Carnegie Mellon University
                     25:  *  Pittsburgh PA 15213-3890
                     26:  *
                     27:  * any improvements or extensions that they make and grant Carnegie the
                     28:  * rights to redistribute these changes.
                     29:  */
                     30:
                     31: /*
                     32:  * Common TurboChannel Chipset "bus memory" functions.
                     33:  */
                     34:
                     35: #include <sys/param.h>
                     36: #include <sys/systm.h>
                     37: #include <sys/malloc.h>
                     38: #include <sys/syslog.h>
                     39: #include <sys/device.h>
                     40:
                     41: #include <uvm/uvm_extern.h>
                     42:
                     43: #include <machine/bus.h>
                     44: #include <dev/tc/tcvar.h>
                     45:
                     46: #define        __C(A,B)        __CONCAT(A,B)
                     47:
                     48: /* mapping/unmapping */
                     49: int            tc_mem_map(void *, bus_addr_t, bus_size_t, int,
                     50:                    bus_space_handle_t *);
                     51: void           tc_mem_unmap(void *, bus_space_handle_t, bus_size_t);
                     52: int            tc_mem_subregion(void *, bus_space_handle_t, bus_size_t,
                     53:                    bus_size_t, bus_space_handle_t *);
                     54:
                     55: /* allocation/deallocation */
                     56: int            tc_mem_alloc(void *, bus_addr_t, bus_addr_t, bus_size_t,
                     57:                    bus_size_t, bus_addr_t, int, bus_addr_t *,
                     58:                    bus_space_handle_t *);
                     59: void           tc_mem_free(void *, bus_space_handle_t, bus_size_t);
                     60:
                     61: /* barrier */
                     62: inline void    tc_mem_barrier(void *, bus_space_handle_t,
                     63:                    bus_size_t, bus_size_t, int);
                     64:
                     65: /* read (single) */
                     66: inline u_int8_t        tc_mem_read_1(void *, bus_space_handle_t, bus_size_t);
                     67: inline u_int16_t tc_mem_read_2(void *, bus_space_handle_t, bus_size_t);
                     68: inline u_int32_t tc_mem_read_4(void *, bus_space_handle_t, bus_size_t);
                     69: inline u_int64_t tc_mem_read_8(void *, bus_space_handle_t, bus_size_t);
                     70:
                     71: /* read multiple */
                     72: void           tc_mem_read_multi_1(void *, bus_space_handle_t,
                     73:                    bus_size_t, u_int8_t *, bus_size_t);
                     74: void           tc_mem_read_multi_2(void *, bus_space_handle_t,
                     75:                    bus_size_t, u_int16_t *, bus_size_t);
                     76: void           tc_mem_read_multi_4(void *, bus_space_handle_t,
                     77:                    bus_size_t, u_int32_t *, bus_size_t);
                     78: void           tc_mem_read_multi_8(void *, bus_space_handle_t,
                     79:                    bus_size_t, u_int64_t *, bus_size_t);
                     80:
                     81: /* read region */
                     82: void           tc_mem_read_region_1(void *, bus_space_handle_t,
                     83:                    bus_size_t, u_int8_t *, bus_size_t);
                     84: void           tc_mem_read_region_2(void *, bus_space_handle_t,
                     85:                    bus_size_t, u_int16_t *, bus_size_t);
                     86: void           tc_mem_read_region_4(void *, bus_space_handle_t,
                     87:                    bus_size_t, u_int32_t *, bus_size_t);
                     88: void           tc_mem_read_region_8(void *, bus_space_handle_t,
                     89:                    bus_size_t, u_int64_t *, bus_size_t);
                     90:
                     91: /* write (single) */
                     92: inline void    tc_mem_write_1(void *, bus_space_handle_t, bus_size_t,
                     93:                    u_int8_t);
                     94: inline void    tc_mem_write_2(void *, bus_space_handle_t, bus_size_t,
                     95:                    u_int16_t);
                     96: inline void    tc_mem_write_4(void *, bus_space_handle_t, bus_size_t,
                     97:                    u_int32_t);
                     98: inline void    tc_mem_write_8(void *, bus_space_handle_t, bus_size_t,
                     99:                    u_int64_t);
                    100:
                    101: /* write multiple */
                    102: void           tc_mem_write_multi_1(void *, bus_space_handle_t,
                    103:                    bus_size_t, const u_int8_t *, bus_size_t);
                    104: void           tc_mem_write_multi_2(void *, bus_space_handle_t,
                    105:                    bus_size_t, const u_int16_t *, bus_size_t);
                    106: void           tc_mem_write_multi_4(void *, bus_space_handle_t,
                    107:                    bus_size_t, const u_int32_t *, bus_size_t);
                    108: void           tc_mem_write_multi_8(void *, bus_space_handle_t,
                    109:                    bus_size_t, const u_int64_t *, bus_size_t);
                    110:
                    111: /* write region */
                    112: void           tc_mem_write_region_1(void *, bus_space_handle_t,
                    113:                    bus_size_t, const u_int8_t *, bus_size_t);
                    114: void           tc_mem_write_region_2(void *, bus_space_handle_t,
                    115:                    bus_size_t, const u_int16_t *, bus_size_t);
                    116: void           tc_mem_write_region_4(void *, bus_space_handle_t,
                    117:                    bus_size_t, const u_int32_t *, bus_size_t);
                    118: void           tc_mem_write_region_8(void *, bus_space_handle_t,
                    119:                    bus_size_t, const u_int64_t *, bus_size_t);
                    120:
                    121: /* set multiple */
                    122: void           tc_mem_set_multi_1(void *, bus_space_handle_t,
                    123:                    bus_size_t, u_int8_t, bus_size_t);
                    124: void           tc_mem_set_multi_2(void *, bus_space_handle_t,
                    125:                    bus_size_t, u_int16_t, bus_size_t);
                    126: void           tc_mem_set_multi_4(void *, bus_space_handle_t,
                    127:                    bus_size_t, u_int32_t, bus_size_t);
                    128: void           tc_mem_set_multi_8(void *, bus_space_handle_t,
                    129:                    bus_size_t, u_int64_t, bus_size_t);
                    130:
                    131: /* set region */
                    132: void           tc_mem_set_region_1(void *, bus_space_handle_t,
                    133:                    bus_size_t, u_int8_t, bus_size_t);
                    134: void           tc_mem_set_region_2(void *, bus_space_handle_t,
                    135:                    bus_size_t, u_int16_t, bus_size_t);
                    136: void           tc_mem_set_region_4(void *, bus_space_handle_t,
                    137:                    bus_size_t, u_int32_t, bus_size_t);
                    138: void           tc_mem_set_region_8(void *, bus_space_handle_t,
                    139:                    bus_size_t, u_int64_t, bus_size_t);
                    140:
                    141: /* copy */
                    142: void           tc_mem_copy_region_1(void *, bus_space_handle_t,
                    143:                    bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
                    144: void           tc_mem_copy_region_2(void *, bus_space_handle_t,
                    145:                    bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
                    146: void           tc_mem_copy_region_4(void *, bus_space_handle_t,
                    147:                    bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
                    148: void           tc_mem_copy_region_8(void *, bus_space_handle_t,
                    149:                    bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
                    150:
                    151: struct alpha_bus_space tc_mem_space = {
                    152:        /* cookie */
                    153:        NULL,
                    154:
                    155:        /* mapping/unmapping */
                    156:        tc_mem_map,
                    157:        tc_mem_unmap,
                    158:        tc_mem_subregion,
                    159:
                    160:        /* allocation/deallocation */
                    161:        tc_mem_alloc,
                    162:        tc_mem_free,
                    163:
                    164:        /* barrier */
                    165:        tc_mem_barrier,
                    166:
                    167:        /* read (single) */
                    168:        tc_mem_read_1,
                    169:        tc_mem_read_2,
                    170:        tc_mem_read_4,
                    171:        tc_mem_read_8,
                    172:
                    173:        /* read multiple */
                    174:        tc_mem_read_multi_1,
                    175:        tc_mem_read_multi_2,
                    176:        tc_mem_read_multi_4,
                    177:        tc_mem_read_multi_8,
                    178:
                    179:        /* read region */
                    180:        tc_mem_read_region_1,
                    181:        tc_mem_read_region_2,
                    182:        tc_mem_read_region_4,
                    183:        tc_mem_read_region_8,
                    184:
                    185:        /* write (single) */
                    186:        tc_mem_write_1,
                    187:        tc_mem_write_2,
                    188:        tc_mem_write_4,
                    189:        tc_mem_write_8,
                    190:
                    191:        /* write multiple */
                    192:        tc_mem_write_multi_1,
                    193:        tc_mem_write_multi_2,
                    194:        tc_mem_write_multi_4,
                    195:        tc_mem_write_multi_8,
                    196:
                    197:        /* write region */
                    198:        tc_mem_write_region_1,
                    199:        tc_mem_write_region_2,
                    200:        tc_mem_write_region_4,
                    201:        tc_mem_write_region_8,
                    202:
                    203:        /* set multiple */
                    204:        tc_mem_set_multi_1,
                    205:        tc_mem_set_multi_2,
                    206:        tc_mem_set_multi_4,
                    207:        tc_mem_set_multi_8,
                    208:
                    209:        /* set region */
                    210:        tc_mem_set_region_1,
                    211:        tc_mem_set_region_2,
                    212:        tc_mem_set_region_4,
                    213:        tc_mem_set_region_8,
                    214:
                    215:        /* copy */
                    216:        tc_mem_copy_region_1,
                    217:        tc_mem_copy_region_2,
                    218:        tc_mem_copy_region_4,
                    219:        tc_mem_copy_region_8,
                    220: };
                    221:
                    222: bus_space_tag_t
                    223: tc_bus_mem_init(memv)
                    224:        void *memv;
                    225: {
                    226:        bus_space_tag_t h = &tc_mem_space;
                    227:
                    228:        h->abs_cookie = memv;
                    229:        return (h);
                    230: }
                    231:
                    232: /* ARGSUSED */
                    233: int
                    234: tc_mem_map(v, memaddr, memsize, cacheable, memhp)
                    235:        void *v;
                    236:        bus_addr_t memaddr;
                    237:        bus_size_t memsize;
                    238:        int cacheable;
                    239:        bus_space_handle_t *memhp;
                    240: {
                    241:
                    242:        if (memaddr & 0x7)
                    243:                panic("tc_mem_map needs 8 byte alignment");
                    244:        if (cacheable)
                    245:                *memhp = ALPHA_PHYS_TO_K0SEG(memaddr);
                    246:        else
                    247:                *memhp = ALPHA_PHYS_TO_K0SEG(TC_DENSE_TO_SPARSE(memaddr));
                    248:        return (0);
                    249: }
                    250:
                    251: /* ARGSUSED */
                    252: void
                    253: tc_mem_unmap(v, memh, memsize)
                    254:        void *v;
                    255:        bus_space_handle_t memh;
                    256:        bus_size_t memsize;
                    257: {
                    258:
                    259:        /* XXX XX XXX nothing to do. */
                    260: }
                    261:
                    262: int
                    263: tc_mem_subregion(v, memh, offset, size, nmemh)
                    264:        void *v;
                    265:        bus_space_handle_t memh, *nmemh;
                    266:        bus_size_t offset, size;
                    267: {
                    268:
                    269:        /* Disallow subregioning that would make the handle unaligned. */
                    270:        if ((offset & 0x7) != 0)
                    271:                return (1);
                    272:
                    273:        if ((memh & TC_SPACE_SPARSE) != 0)
                    274:                *nmemh = memh + (offset << 1);
                    275:        else
                    276:                *nmemh = memh + offset;
                    277:
                    278:        return (0);
                    279: }
                    280:
                    281: int
                    282: tc_mem_alloc(v, rstart, rend, size, align, boundary, flags, addrp, bshp)
                    283:        void *v;
                    284:        bus_addr_t rstart, rend, *addrp;
                    285:        bus_size_t size, align, boundary;
                    286:        int flags;
                    287:        bus_space_handle_t *bshp;
                    288: {
                    289:
                    290:        /* XXX XXX XXX XXX XXX XXX */
                    291:        panic("tc_mem_alloc unimplemented");
                    292: }
                    293:
                    294: void
                    295: tc_mem_free(v, bsh, size)
                    296:        void *v;
                    297:        bus_space_handle_t bsh;
                    298:        bus_size_t size;
                    299: {
                    300:
                    301:        /* XXX XXX XXX XXX XXX XXX */
                    302:        panic("tc_mem_free unimplemented");
                    303: }
                    304:
                    305: inline void
                    306: tc_mem_barrier(v, h, o, l, f)
                    307:        void *v;
                    308:        bus_space_handle_t h;
                    309:        bus_size_t o, l;
                    310:        int f;
                    311: {
                    312:
                    313:        if ((f & BUS_SPACE_BARRIER_READ) != 0)
                    314:                alpha_mb();
                    315:        else if ((f & BUS_SPACE_BARRIER_WRITE) != 0)
                    316:                alpha_wmb();
                    317: }
                    318:
                    319: inline u_int8_t
                    320: tc_mem_read_1(v, memh, off)
                    321:        void *v;
                    322:        bus_space_handle_t memh;
                    323:        bus_size_t off;
                    324: {
                    325:        volatile u_int8_t *p;
                    326:
                    327:        alpha_mb();             /* XXX XXX XXX */
                    328:
                    329:        if ((memh & TC_SPACE_SPARSE) != 0)
                    330:                panic("tc_mem_read_1 not implemented for sparse space");
                    331:
                    332:        p = (u_int8_t *)(memh + off);
                    333:        return (*p);
                    334: }
                    335:
                    336: inline u_int16_t
                    337: tc_mem_read_2(v, memh, off)
                    338:        void *v;
                    339:        bus_space_handle_t memh;
                    340:        bus_size_t off;
                    341: {
                    342:        volatile u_int16_t *p;
                    343:
                    344:        alpha_mb();             /* XXX XXX XXX */
                    345:
                    346:        if ((memh & TC_SPACE_SPARSE) != 0)
                    347:                panic("tc_mem_read_2 not implemented for sparse space");
                    348:
                    349:        p = (u_int16_t *)(memh + off);
                    350:        return (*p);
                    351: }
                    352:
                    353: inline u_int32_t
                    354: tc_mem_read_4(v, memh, off)
                    355:        void *v;
                    356:        bus_space_handle_t memh;
                    357:        bus_size_t off;
                    358: {
                    359:        volatile u_int32_t *p;
                    360:
                    361:        alpha_mb();             /* XXX XXX XXX */
                    362:
                    363:        if ((memh & TC_SPACE_SPARSE) != 0)
                    364:                /* Nothing special to do for 4-byte sparse space accesses */
                    365:                p = (u_int32_t *)(memh + (off << 1));
                    366:        else
                    367:                p = (u_int32_t *)(memh + off);
                    368:        return (*p);
                    369: }
                    370:
                    371: inline u_int64_t
                    372: tc_mem_read_8(v, memh, off)
                    373:        void *v;
                    374:        bus_space_handle_t memh;
                    375:        bus_size_t off;
                    376: {
                    377:        volatile u_int64_t *p;
                    378:
                    379:        alpha_mb();             /* XXX XXX XXX */
                    380:
                    381:        if ((memh & TC_SPACE_SPARSE) != 0)
                    382:                panic("tc_mem_read_8 not implemented for sparse space");
                    383:
                    384:        p = (u_int64_t *)(memh + off);
                    385:        return (*p);
                    386: }
                    387:
                    388: #define        tc_mem_read_multi_N(BYTES,TYPE)                                 \
                    389: void                                                                   \
                    390: __C(tc_mem_read_multi_,BYTES)(v, h, o, a, c)                           \
                    391:        void *v;                                                        \
                    392:        bus_space_handle_t h;                                           \
                    393:        bus_size_t o, c;                                                \
                    394:        TYPE *a;                                                        \
                    395: {                                                                      \
                    396:                                                                        \
                    397:        while (c-- > 0) {                                               \
                    398:                tc_mem_barrier(v, h, o, sizeof *a, BUS_SPACE_BARRIER_READ); \
                    399:                *a++ = __C(tc_mem_read_,BYTES)(v, h, o);                \
                    400:        }                                                               \
                    401: }
                    402: tc_mem_read_multi_N(1,u_int8_t)
                    403: tc_mem_read_multi_N(2,u_int16_t)
                    404: tc_mem_read_multi_N(4,u_int32_t)
                    405: tc_mem_read_multi_N(8,u_int64_t)
                    406:
                    407: #define        tc_mem_read_region_N(BYTES,TYPE)                                \
                    408: void                                                                   \
                    409: __C(tc_mem_read_region_,BYTES)(v, h, o, a, c)                          \
                    410:        void *v;                                                        \
                    411:        bus_space_handle_t h;                                           \
                    412:        bus_size_t o, c;                                                \
                    413:        TYPE *a;                                                        \
                    414: {                                                                      \
                    415:                                                                        \
                    416:        while (c-- > 0) {                                               \
                    417:                *a++ = __C(tc_mem_read_,BYTES)(v, h, o);                \
                    418:                o += sizeof *a;                                         \
                    419:        }                                                               \
                    420: }
                    421: tc_mem_read_region_N(1,u_int8_t)
                    422: tc_mem_read_region_N(2,u_int16_t)
                    423: tc_mem_read_region_N(4,u_int32_t)
                    424: tc_mem_read_region_N(8,u_int64_t)
                    425:
                    426: inline void
                    427: tc_mem_write_1(v, memh, off, val)
                    428:        void *v;
                    429:        bus_space_handle_t memh;
                    430:        bus_size_t off;
                    431:        u_int8_t val;
                    432: {
                    433:
                    434:        if ((memh & TC_SPACE_SPARSE) != 0) {
                    435:                volatile u_int64_t *p, v;
                    436:                u_int64_t shift, msk;
                    437:
                    438:                shift = off & 0x3;
                    439:                off &= 0x3;
                    440:
                    441:                p = (u_int64_t *)(memh + (off << 1));
                    442:
                    443:                msk = ~(0x1 << shift) & 0xf;
                    444:                v = (msk << 32) | (((u_int64_t)val) << (shift * 8));
                    445:
                    446:                *p = val;
                    447:        } else {
                    448:                volatile u_int8_t *p;
                    449:
                    450:                p = (u_int8_t *)(memh + off);
                    451:                *p = val;
                    452:        }
                    453:         alpha_mb();            /* XXX XXX XXX */
                    454: }
                    455:
                    456: inline void
                    457: tc_mem_write_2(v, memh, off, val)
                    458:        void *v;
                    459:        bus_space_handle_t memh;
                    460:        bus_size_t off;
                    461:        u_int16_t val;
                    462: {
                    463:
                    464:        if ((memh & TC_SPACE_SPARSE) != 0) {
                    465:                volatile u_int64_t *p, v;
                    466:                u_int64_t shift, msk;
                    467:
                    468:                shift = off & 0x2;
                    469:                off &= 0x3;
                    470:
                    471:                p = (u_int64_t *)(memh + (off << 1));
                    472:
                    473:                msk = ~(0x3 << shift) & 0xf;
                    474:                v = (msk << 32) | (((u_int64_t)val) << (shift * 8));
                    475:
                    476:                *p = val;
                    477:        } else {
                    478:                volatile u_int16_t *p;
                    479:
                    480:                p = (u_int16_t *)(memh + off);
                    481:                *p = val;
                    482:        }
                    483:         alpha_mb();            /* XXX XXX XXX */
                    484: }
                    485:
                    486: inline void
                    487: tc_mem_write_4(v, memh, off, val)
                    488:        void *v;
                    489:        bus_space_handle_t memh;
                    490:        bus_size_t off;
                    491:        u_int32_t val;
                    492: {
                    493:        volatile u_int32_t *p;
                    494:
                    495:        if ((memh & TC_SPACE_SPARSE) != 0)
                    496:                /* Nothing special to do for 4-byte sparse space accesses */
                    497:                p = (u_int32_t *)(memh + (off << 1));
                    498:        else
                    499:                p = (u_int32_t *)(memh + off);
                    500:        *p = val;
                    501:         alpha_mb();            /* XXX XXX XXX */
                    502: }
                    503:
                    504: inline void
                    505: tc_mem_write_8(v, memh, off, val)
                    506:        void *v;
                    507:        bus_space_handle_t memh;
                    508:        bus_size_t off;
                    509:        u_int64_t val;
                    510: {
                    511:        volatile u_int64_t *p;
                    512:
                    513:        if ((memh & TC_SPACE_SPARSE) != 0)
                    514:                panic("tc_mem_read_8 not implemented for sparse space");
                    515:
                    516:        p = (u_int64_t *)(memh + off);
                    517:        *p = val;
                    518:         alpha_mb();            /* XXX XXX XXX */
                    519: }
                    520:
                    521: #define        tc_mem_write_multi_N(BYTES,TYPE)                                \
                    522: void                                                                   \
                    523: __C(tc_mem_write_multi_,BYTES)(v, h, o, a, c)                          \
                    524:        void *v;                                                        \
                    525:        bus_space_handle_t h;                                           \
                    526:        bus_size_t o, c;                                                \
                    527:        const TYPE *a;                                                  \
                    528: {                                                                      \
                    529:                                                                        \
                    530:        while (c-- > 0) {                                               \
                    531:                __C(tc_mem_write_,BYTES)(v, h, o, *a++);                \
                    532:                tc_mem_barrier(v, h, o, sizeof *a, BUS_SPACE_BARRIER_WRITE); \
                    533:        }                                                               \
                    534: }
                    535: tc_mem_write_multi_N(1,u_int8_t)
                    536: tc_mem_write_multi_N(2,u_int16_t)
                    537: tc_mem_write_multi_N(4,u_int32_t)
                    538: tc_mem_write_multi_N(8,u_int64_t)
                    539:
                    540: #define        tc_mem_write_region_N(BYTES,TYPE)                               \
                    541: void                                                                   \
                    542: __C(tc_mem_write_region_,BYTES)(v, h, o, a, c)                         \
                    543:        void *v;                                                        \
                    544:        bus_space_handle_t h;                                           \
                    545:        bus_size_t o, c;                                                \
                    546:        const TYPE *a;                                                  \
                    547: {                                                                      \
                    548:                                                                        \
                    549:        while (c-- > 0) {                                               \
                    550:                __C(tc_mem_write_,BYTES)(v, h, o, *a++);                \
                    551:                o += sizeof *a;                                         \
                    552:        }                                                               \
                    553: }
                    554: tc_mem_write_region_N(1,u_int8_t)
                    555: tc_mem_write_region_N(2,u_int16_t)
                    556: tc_mem_write_region_N(4,u_int32_t)
                    557: tc_mem_write_region_N(8,u_int64_t)
                    558:
                    559: #define        tc_mem_set_multi_N(BYTES,TYPE)                                  \
                    560: void                                                                   \
                    561: __C(tc_mem_set_multi_,BYTES)(v, h, o, val, c)                          \
                    562:        void *v;                                                        \
                    563:        bus_space_handle_t h;                                           \
                    564:        bus_size_t o, c;                                                \
                    565:        TYPE val;                                                       \
                    566: {                                                                      \
                    567:                                                                        \
                    568:        while (c-- > 0) {                                               \
                    569:                __C(tc_mem_write_,BYTES)(v, h, o, val);                 \
                    570:                tc_mem_barrier(v, h, o, sizeof val, BUS_SPACE_BARRIER_WRITE); \
                    571:        }                                                               \
                    572: }
                    573: tc_mem_set_multi_N(1,u_int8_t)
                    574: tc_mem_set_multi_N(2,u_int16_t)
                    575: tc_mem_set_multi_N(4,u_int32_t)
                    576: tc_mem_set_multi_N(8,u_int64_t)
                    577:
                    578: #define        tc_mem_set_region_N(BYTES,TYPE)                                 \
                    579: void                                                                   \
                    580: __C(tc_mem_set_region_,BYTES)(v, h, o, val, c)                         \
                    581:        void *v;                                                        \
                    582:        bus_space_handle_t h;                                           \
                    583:        bus_size_t o, c;                                                \
                    584:        TYPE val;                                                       \
                    585: {                                                                      \
                    586:                                                                        \
                    587:        while (c-- > 0) {                                               \
                    588:                __C(tc_mem_write_,BYTES)(v, h, o, val);                 \
                    589:                o += sizeof val;                                        \
                    590:        }                                                               \
                    591: }
                    592: tc_mem_set_region_N(1,u_int8_t)
                    593: tc_mem_set_region_N(2,u_int16_t)
                    594: tc_mem_set_region_N(4,u_int32_t)
                    595: tc_mem_set_region_N(8,u_int64_t)
                    596:
                    597: #define        tc_mem_copy_region_N(BYTES)                                     \
                    598: void                                                                   \
                    599: __C(tc_mem_copy_region_,BYTES)(v, h1, o1, h2, o2, c)                   \
                    600:        void *v;                                                        \
                    601:        bus_space_handle_t h1, h2;                                      \
                    602:        bus_size_t o1, o2, c;                                           \
                    603: {                                                                      \
                    604:        bus_size_t o;                                                   \
                    605:                                                                        \
                    606:        if ((h1 & TC_SPACE_SPARSE) != 0 &&                              \
                    607:            (h2 & TC_SPACE_SPARSE) != 0) {                              \
                    608:                bcopy((void *)(h1 + o1), (void *)(h2 + o2), c * BYTES); \
                    609:                return;                                                 \
                    610:        }                                                               \
                    611:                                                                        \
                    612:        if (h1 + o1 >= h2 + o2)                                         \
                    613:                /* src after dest: copy forward */                      \
                    614:                for (o = 0; c > 0; c--, o += BYTES)                     \
                    615:                        __C(tc_mem_write_,BYTES)(v, h2, o2 + o,         \
                    616:                            __C(tc_mem_read_,BYTES)(v, h1, o1 + o));    \
                    617:        else                                                            \
                    618:                /* dest after src: copy backwards */                    \
                    619:                for (o = (c - 1) * BYTES; c > 0; c--, o -= BYTES)       \
                    620:                        __C(tc_mem_write_,BYTES)(v, h2, o2 + o,         \
                    621:                            __C(tc_mem_read_,BYTES)(v, h1, o1 + o));    \
                    622: }
                    623: tc_mem_copy_region_N(1)
                    624: tc_mem_copy_region_N(2)
                    625: tc_mem_copy_region_N(4)
                    626: tc_mem_copy_region_N(8)

CVSweb