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

Annotation of sys/arch/alpha/pci/pci_bwx_bus_io_chipdep.c, Revision 1.1.1.1

1.1       nbrk        1: /* $OpenBSD: pci_bwx_bus_io_chipdep.c,v 1.5 2003/09/02 17:25:21 miod Exp $ */
                      2: /* $NetBSD: pcs_bus_io_common.c,v 1.14 1996/12/02 22:19:35 cgd Exp $ */
                      3:
                      4: /*
                      5:  * Copyright (c) 1995, 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 PCI Chipset "bus I/O" functions, for chipsets which have to
                     33:  * deal with only a single PCI interface chip in a machine.
                     34:  *
                     35:  * uses:
                     36:  *     CHIP            name of the 'chip' it's being compiled for.
                     37:  *     CHIP_IO_BASE    Sparse I/O space base to use.
                     38:  */
                     39:
                     40: #include <sys/extent.h>
                     41:
                     42: #include <machine/bwx.h>
                     43:
                     44: #define        __C(A,B)        __CONCAT(A,B)
                     45: #define        __S(S)          __STRING(S)
                     46:
                     47: #ifndef        CHIP_EXTENT_NAME
                     48: #define        CHIP_EXTENT_NAME(v)     __S(__C(CHIP,_bus_io))
                     49: #endif
                     50:
                     51: #ifndef        CHIP_EXTENT_STORAGE
                     52: #define CHIP_EXTENT_STORAGE(v) __C(CHIP,_io_ex_storage)
                     53: static long
                     54:     __C(CHIP,_io_ex_storage)[EXTENT_FIXED_STORAGE_SIZE(8) / sizeof(long)];
                     55: #endif
                     56:
                     57: /* mapping/unmapping */
                     58: int            __C(CHIP,_io_map)(void *, bus_addr_t, bus_size_t, int,
                     59:                    bus_space_handle_t *);
                     60: void           __C(CHIP,_io_unmap)(void *, bus_space_handle_t,
                     61:                    bus_size_t);
                     62: int            __C(CHIP,_io_subregion)(void *, bus_space_handle_t,
                     63:                    bus_size_t, bus_size_t, bus_space_handle_t *);
                     64:
                     65: /* allocation/deallocation */
                     66: int            __C(CHIP,_io_alloc)(void *, bus_addr_t, bus_addr_t,
                     67:                    bus_size_t, bus_size_t, bus_addr_t, int, bus_addr_t *,
                     68:                     bus_space_handle_t *);
                     69: void           __C(CHIP,_io_free)(void *, bus_space_handle_t,
                     70:                    bus_size_t);
                     71:
                     72: /* barrier */
                     73: inline void    __C(CHIP,_io_barrier)(void *, bus_space_handle_t,
                     74:                    bus_size_t, bus_size_t, int);
                     75:
                     76: /* read (single) */
                     77: inline u_int8_t        __C(CHIP,_io_read_1)(void *, bus_space_handle_t,
                     78:                    bus_size_t);
                     79: inline u_int16_t __C(CHIP,_io_read_2)(void *, bus_space_handle_t,
                     80:                    bus_size_t);
                     81: inline u_int32_t __C(CHIP,_io_read_4)(void *, bus_space_handle_t,
                     82:                    bus_size_t);
                     83: inline u_int64_t __C(CHIP,_io_read_8)(void *, bus_space_handle_t,
                     84:                    bus_size_t);
                     85:
                     86: /* read multiple */
                     87: void           __C(CHIP,_io_read_multi_1)(void *, bus_space_handle_t,
                     88:                    bus_size_t, u_int8_t *, bus_size_t);
                     89: void           __C(CHIP,_io_read_multi_2)(void *, bus_space_handle_t,
                     90:                    bus_size_t, u_int16_t *, bus_size_t);
                     91: void           __C(CHIP,_io_read_multi_4)(void *, bus_space_handle_t,
                     92:                    bus_size_t, u_int32_t *, bus_size_t);
                     93: void           __C(CHIP,_io_read_multi_8)(void *, bus_space_handle_t,
                     94:                    bus_size_t, u_int64_t *, bus_size_t);
                     95:
                     96: /* read region */
                     97: void           __C(CHIP,_io_read_region_1)(void *, bus_space_handle_t,
                     98:                    bus_size_t, u_int8_t *, bus_size_t);
                     99: void           __C(CHIP,_io_read_region_2)(void *, bus_space_handle_t,
                    100:                    bus_size_t, u_int16_t *, bus_size_t);
                    101: void           __C(CHIP,_io_read_region_4)(void *, bus_space_handle_t,
                    102:                    bus_size_t, u_int32_t *, bus_size_t);
                    103: void           __C(CHIP,_io_read_region_8)(void *, bus_space_handle_t,
                    104:                    bus_size_t, u_int64_t *, bus_size_t);
                    105:
                    106: /* write (single) */
                    107: inline void    __C(CHIP,_io_write_1)(void *, bus_space_handle_t,
                    108:                    bus_size_t, u_int8_t);
                    109: inline void    __C(CHIP,_io_write_2)(void *, bus_space_handle_t,
                    110:                    bus_size_t, u_int16_t);
                    111: inline void    __C(CHIP,_io_write_4)(void *, bus_space_handle_t,
                    112:                    bus_size_t, u_int32_t);
                    113: inline void    __C(CHIP,_io_write_8)(void *, bus_space_handle_t,
                    114:                    bus_size_t, u_int64_t);
                    115:
                    116: /* write multiple */
                    117: void           __C(CHIP,_io_write_multi_1)(void *, bus_space_handle_t,
                    118:                    bus_size_t, const u_int8_t *, bus_size_t);
                    119: void           __C(CHIP,_io_write_multi_2)(void *, bus_space_handle_t,
                    120:                    bus_size_t, const u_int16_t *, bus_size_t);
                    121: void           __C(CHIP,_io_write_multi_4)(void *, bus_space_handle_t,
                    122:                    bus_size_t, const u_int32_t *, bus_size_t);
                    123: void           __C(CHIP,_io_write_multi_8)(void *, bus_space_handle_t,
                    124:                    bus_size_t, const u_int64_t *, bus_size_t);
                    125:
                    126: /* write region */
                    127: void           __C(CHIP,_io_write_region_1)(void *, bus_space_handle_t,
                    128:                    bus_size_t, const u_int8_t *, bus_size_t);
                    129: void           __C(CHIP,_io_write_region_2)(void *, bus_space_handle_t,
                    130:                    bus_size_t, const u_int16_t *, bus_size_t);
                    131: void           __C(CHIP,_io_write_region_4)(void *, bus_space_handle_t,
                    132:                    bus_size_t, const u_int32_t *, bus_size_t);
                    133: void           __C(CHIP,_io_write_region_8)(void *, bus_space_handle_t,
                    134:                    bus_size_t, const u_int64_t *, bus_size_t);
                    135:
                    136: /* set multiple */
                    137: void           __C(CHIP,_io_set_multi_1)(void *, bus_space_handle_t,
                    138:                    bus_size_t, u_int8_t, bus_size_t);
                    139: void           __C(CHIP,_io_set_multi_2)(void *, bus_space_handle_t,
                    140:                    bus_size_t, u_int16_t, bus_size_t);
                    141: void           __C(CHIP,_io_set_multi_4)(void *, bus_space_handle_t,
                    142:                    bus_size_t, u_int32_t, bus_size_t);
                    143: void           __C(CHIP,_io_set_multi_8)(void *, bus_space_handle_t,
                    144:                    bus_size_t, u_int64_t, bus_size_t);
                    145:
                    146: /* set region */
                    147: void           __C(CHIP,_io_set_region_1)(void *, bus_space_handle_t,
                    148:                    bus_size_t, u_int8_t, bus_size_t);
                    149: void           __C(CHIP,_io_set_region_2)(void *, bus_space_handle_t,
                    150:                    bus_size_t, u_int16_t, bus_size_t);
                    151: void           __C(CHIP,_io_set_region_4)(void *, bus_space_handle_t,
                    152:                    bus_size_t, u_int32_t, bus_size_t);
                    153: void           __C(CHIP,_io_set_region_8)(void *, bus_space_handle_t,
                    154:                    bus_size_t, u_int64_t, bus_size_t);
                    155:
                    156: /* copy */
                    157: void           __C(CHIP,_io_copy_1)(void *, bus_space_handle_t,
                    158:                    bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
                    159: void           __C(CHIP,_io_copy_2)(void *, bus_space_handle_t,
                    160:                    bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
                    161: void           __C(CHIP,_io_copy_4)(void *, bus_space_handle_t,
                    162:                    bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
                    163: void           __C(CHIP,_io_copy_8)(void *, bus_space_handle_t,
                    164:                    bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
                    165:
                    166: /* read multiple raw */
                    167: void           __C(CHIP,_io_read_raw_multi_2)(void *, bus_space_handle_t,
                    168:                    bus_size_t, u_int8_t *, bus_size_t);
                    169: void           __C(CHIP,_io_read_raw_multi_4)(void *, bus_space_handle_t,
                    170:                    bus_size_t, u_int8_t *, bus_size_t);
                    171: void           __C(CHIP,_io_read_raw_multi_8)(void *, bus_space_handle_t,
                    172:                    bus_size_t, u_int8_t *, bus_size_t);
                    173:
                    174: /* write multiple raw */
                    175: void           __C(CHIP,_io_write_raw_multi_2)(void *,
                    176:                    bus_space_handle_t, bus_size_t, const u_int8_t *,
                    177:                    bus_size_t);
                    178: void           __C(CHIP,_io_write_raw_multi_4)(void *,
                    179:                    bus_space_handle_t, bus_size_t, const u_int8_t *,
                    180:                    bus_size_t);
                    181: void           __C(CHIP,_io_write_raw_multi_8)(void *,
                    182:                    bus_space_handle_t, bus_size_t, const u_int8_t *,
                    183:                    bus_size_t);
                    184:
                    185: void
                    186: __C(CHIP,_bus_io_init)(t, v)
                    187:        bus_space_tag_t t;
                    188:        void *v;
                    189: {
                    190:        struct extent *ex;
                    191:
                    192:        /*
                    193:         * Initialize the bus space tag.
                    194:         */
                    195:
                    196:        /* cookie */
                    197:        t->abs_cookie =         v;
                    198:
                    199:        /* mapping/unmapping */
                    200:        t->abs_map =            __C(CHIP,_io_map);
                    201:        t->abs_unmap =          __C(CHIP,_io_unmap);
                    202:        t->abs_subregion =      __C(CHIP,_io_subregion);
                    203:
                    204:        /* allocation/deallocation */
                    205:        t->abs_alloc =          __C(CHIP,_io_alloc);
                    206:        t->abs_free =           __C(CHIP,_io_free);
                    207:
                    208:        /* barrier */
                    209:        t->abs_barrier =        __C(CHIP,_io_barrier);
                    210:
                    211:        /* read (single) */
                    212:        t->abs_r_1 =            __C(CHIP,_io_read_1);
                    213:        t->abs_r_2 =            __C(CHIP,_io_read_2);
                    214:        t->abs_r_4 =            __C(CHIP,_io_read_4);
                    215:        t->abs_r_8 =            __C(CHIP,_io_read_8);
                    216:
                    217:        /* read multiple */
                    218:        t->abs_rm_1 =           __C(CHIP,_io_read_multi_1);
                    219:        t->abs_rm_2 =           __C(CHIP,_io_read_multi_2);
                    220:        t->abs_rm_4 =           __C(CHIP,_io_read_multi_4);
                    221:        t->abs_rm_8 =           __C(CHIP,_io_read_multi_8);
                    222:
                    223:        /* read region */
                    224:        t->abs_rr_1 =           __C(CHIP,_io_read_region_1);
                    225:        t->abs_rr_2 =           __C(CHIP,_io_read_region_2);
                    226:        t->abs_rr_4 =           __C(CHIP,_io_read_region_4);
                    227:        t->abs_rr_8 =           __C(CHIP,_io_read_region_8);
                    228:
                    229:        /* write (single) */
                    230:        t->abs_w_1 =            __C(CHIP,_io_write_1);
                    231:        t->abs_w_2 =            __C(CHIP,_io_write_2);
                    232:        t->abs_w_4 =            __C(CHIP,_io_write_4);
                    233:        t->abs_w_8 =            __C(CHIP,_io_write_8);
                    234:
                    235:        /* write multiple */
                    236:        t->abs_wm_1 =           __C(CHIP,_io_write_multi_1);
                    237:        t->abs_wm_2 =           __C(CHIP,_io_write_multi_2);
                    238:        t->abs_wm_4 =           __C(CHIP,_io_write_multi_4);
                    239:        t->abs_wm_8 =           __C(CHIP,_io_write_multi_8);
                    240:
                    241:        /* write region */
                    242:        t->abs_wr_1 =           __C(CHIP,_io_write_region_1);
                    243:        t->abs_wr_2 =           __C(CHIP,_io_write_region_2);
                    244:        t->abs_wr_4 =           __C(CHIP,_io_write_region_4);
                    245:        t->abs_wr_8 =           __C(CHIP,_io_write_region_8);
                    246:
                    247:        /* set multiple */
                    248:        t->abs_sm_1 =           __C(CHIP,_io_set_multi_1);
                    249:        t->abs_sm_2 =           __C(CHIP,_io_set_multi_2);
                    250:        t->abs_sm_4 =           __C(CHIP,_io_set_multi_4);
                    251:        t->abs_sm_8 =           __C(CHIP,_io_set_multi_8);
                    252:
                    253:        /* set region */
                    254:        t->abs_sr_1 =           __C(CHIP,_io_set_region_1);
                    255:        t->abs_sr_2 =           __C(CHIP,_io_set_region_2);
                    256:        t->abs_sr_4 =           __C(CHIP,_io_set_region_4);
                    257:        t->abs_sr_8 =           __C(CHIP,_io_set_region_8);
                    258:
                    259:        /* copy */
                    260:        t->abs_c_1 =            __C(CHIP,_io_copy_1);
                    261:        t->abs_c_2 =            __C(CHIP,_io_copy_2);
                    262:        t->abs_c_4 =            __C(CHIP,_io_copy_4);
                    263:        t->abs_c_8 =            __C(CHIP,_io_copy_8);
                    264:
                    265:        /* read multiple raw */
                    266:        t->abs_rrm_2 =          __C(CHIP,_io_read_raw_multi_2);
                    267:        t->abs_rrm_4 =          __C(CHIP,_io_read_raw_multi_4);
                    268:        t->abs_rrm_8 =          __C(CHIP,_io_read_raw_multi_8);
                    269:
                    270:        /* write multiple raw*/
                    271:        t->abs_wrm_2 =          __C(CHIP,_io_write_raw_multi_2);
                    272:        t->abs_wrm_4 =          __C(CHIP,_io_write_raw_multi_4);
                    273:        t->abs_wrm_8 =          __C(CHIP,_io_write_raw_multi_8);
                    274:
                    275:        ex = extent_create(CHIP_EXTENT_NAME(v), 0x0UL, 0xffffffffUL,
                    276:            M_DEVBUF, (caddr_t)CHIP_EXTENT_STORAGE(v),
                    277:            sizeof(CHIP_EXTENT_STORAGE(v)), EX_NOWAIT|EX_NOCOALESCE);
                    278:
                    279:        CHIP_IO_EXTENT(v) = ex;
                    280: }
                    281:
                    282: int
                    283: __C(CHIP,_io_map)(v, ioaddr, iosize, cacheable, iohp)
                    284:        void *v;
                    285:        bus_addr_t ioaddr;
                    286:        bus_size_t iosize;
                    287:        int cacheable;
                    288:        bus_space_handle_t *iohp;
                    289: {
                    290:        int error;
                    291:
                    292: #ifdef EXTENT_DEBUG
                    293:        printf("io: allocating 0x%lx to 0x%lx\n", ioaddr, ioaddr + iosize - 1);
                    294: #endif
                    295:         error = extent_alloc_region(CHIP_IO_EXTENT(v), ioaddr, iosize,
                    296:             EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0));
                    297:        if (error) {
                    298: #ifdef EXTENT_DEBUG
                    299:                printf("io: allocation failed (%d)\n", error);
                    300:                extent_print(CHIP_IO_EXTENT(v));
                    301: #endif
                    302:                return (error);
                    303:        }
                    304:
                    305:        *iohp = ALPHA_PHYS_TO_K0SEG(CHIP_IO_SYS_START(v)) + ioaddr;
                    306:
                    307:        return (0);
                    308: }
                    309:
                    310: void
                    311: __C(CHIP,_io_unmap)(v, ioh, iosize)
                    312:        void *v;
                    313:        bus_space_handle_t ioh;
                    314:        bus_size_t iosize;
                    315: {
                    316:        bus_addr_t ioaddr;
                    317:        int error;
                    318:
                    319: #ifdef EXTENT_DEBUG
                    320:        printf("io: freeing handle 0x%lx for 0x%lx\n", ioh, iosize);
                    321: #endif
                    322:
                    323:        ioaddr = ioh - ALPHA_PHYS_TO_K0SEG(CHIP_IO_SYS_START(v));
                    324:
                    325: #ifdef EXTENT_DEBUG
                    326:        printf("io: freeing 0x%lx to 0x%lx\n", ioaddr, ioaddr + iosize - 1);
                    327: #endif
                    328:         error = extent_free(CHIP_IO_EXTENT(v), ioaddr, iosize,
                    329:             EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0));
                    330:        if (error) {
                    331:                printf("%s: WARNING: could not unmap 0x%lx-0x%lx (error %d)\n",
                    332:                   __S(__C(CHIP,_io_unmap)), ioaddr, ioaddr + iosize - 1,
                    333:                   error);
                    334: #ifdef EXTENT_DEBUG
                    335:                extent_print(CHIP_IO_EXTENT(v));
                    336: #endif
                    337:        }
                    338: }
                    339:
                    340: int
                    341: __C(CHIP,_io_subregion)(v, ioh, offset, size, nioh)
                    342:        void *v;
                    343:        bus_space_handle_t ioh, *nioh;
                    344:        bus_size_t offset, size;
                    345: {
                    346:
                    347:        *nioh = ioh + offset;
                    348:        return (0);
                    349: }
                    350:
                    351: int
                    352: __C(CHIP,_io_alloc)(v, rstart, rend, size, align, boundary, cacheable,
                    353:     addrp, bshp)
                    354:        void *v;
                    355:        bus_addr_t rstart, rend, *addrp;
                    356:        bus_size_t size, align, boundary;
                    357:        int cacheable;
                    358:        bus_space_handle_t *bshp;
                    359: {
                    360:
                    361:        /* XXX XXX XXX XXX XXX XXX */
                    362:        panic("%s not implemented", __S(__C(CHIP,_io_alloc)));
                    363: }
                    364:
                    365: void
                    366: __C(CHIP,_io_free)(v, bsh, size)
                    367:        void *v;
                    368:        bus_space_handle_t bsh;
                    369:        bus_size_t size;
                    370: {
                    371:
                    372:        /* XXX XXX XXX XXX XXX XXX */
                    373:        panic("%s not implemented", __S(__C(CHIP,_io_free)));
                    374: }
                    375:
                    376: inline void
                    377: __C(CHIP,_io_barrier)(v, h, o, l, f)
                    378:        void *v;
                    379:        bus_space_handle_t h;
                    380:        bus_size_t o, l;
                    381:        int f;
                    382: {
                    383:
                    384:        if ((f & BUS_BARRIER_READ) != 0)
                    385:                alpha_mb();
                    386:        else if ((f & BUS_BARRIER_WRITE) != 0)
                    387:                alpha_wmb();
                    388: }
                    389:
                    390: inline u_int8_t
                    391: __C(CHIP,_io_read_1)(v, ioh, off)
                    392:        void *v;
                    393:        bus_space_handle_t ioh;
                    394:        bus_size_t off;
                    395: {
                    396:        bus_addr_t addr;
                    397:
                    398:        addr = ioh + off;
                    399:        alpha_mb();
                    400:        return (alpha_ldbu((u_int8_t *)addr));
                    401: }
                    402:
                    403: inline u_int16_t
                    404: __C(CHIP,_io_read_2)(v, ioh, off)
                    405:        void *v;
                    406:        bus_space_handle_t ioh;
                    407:        bus_size_t off;
                    408: {
                    409:        bus_addr_t addr;
                    410:
                    411:        addr = ioh + off;
                    412: #ifdef DIAGNOSTIC
                    413:        if (addr & 1)
                    414:                panic(__S(__C(CHIP,_io_read_2)) ": addr 0x%lx not aligned",
                    415:                    addr);
                    416: #endif
                    417:        alpha_mb();
                    418:        return (alpha_ldwu((u_int16_t *)addr));
                    419: }
                    420:
                    421: inline u_int32_t
                    422: __C(CHIP,_io_read_4)(v, ioh, off)
                    423:        void *v;
                    424:        bus_space_handle_t ioh;
                    425:        bus_size_t off;
                    426: {
                    427:        bus_addr_t addr;
                    428:
                    429:        addr = ioh + off;
                    430: #ifdef DIAGNOSTIC
                    431:        if (addr & 3)
                    432:                panic(__S(__C(CHIP,_io_read_4)) ": addr 0x%lx not aligned",
                    433:                    addr);
                    434: #endif
                    435:        alpha_mb();
                    436:        return (*(u_int32_t *)addr);
                    437: }
                    438:
                    439: inline u_int64_t
                    440: __C(CHIP,_io_read_8)(v, ioh, off)
                    441:        void *v;
                    442:        bus_space_handle_t ioh;
                    443:        bus_size_t off;
                    444: {
                    445:
                    446:        /* XXX XXX XXX */
                    447:        panic("%s not implemented", __S(__C(CHIP,_io_read_8)));
                    448: }
                    449:
                    450: #define CHIP_io_read_multi_N(BYTES,TYPE)                               \
                    451: void                                                                   \
                    452: __C(__C(CHIP,_io_read_multi_),BYTES)(v, h, o, a, c)                    \
                    453:        void *v;                                                        \
                    454:        bus_space_handle_t h;                                           \
                    455:        bus_size_t o, c;                                                \
                    456:        TYPE *a;                                                        \
                    457: {                                                                      \
                    458:                                                                        \
                    459:        while (c-- > 0) {                                               \
                    460:                __C(CHIP,_io_barrier)(v, h, o, sizeof *a,               \
                    461:                    BUS_BARRIER_READ);                                  \
                    462:                *a++ = __C(__C(CHIP,_io_read_),BYTES)(v, h, o);         \
                    463:        }                                                               \
                    464: }
                    465: CHIP_io_read_multi_N(1,u_int8_t)
                    466: CHIP_io_read_multi_N(2,u_int16_t)
                    467: CHIP_io_read_multi_N(4,u_int32_t)
                    468: CHIP_io_read_multi_N(8,u_int64_t)
                    469:
                    470: #define CHIP_io_read_region_N(BYTES,TYPE)                              \
                    471: void                                                                   \
                    472: __C(__C(CHIP,_io_read_region_),BYTES)(v, h, o, a, c)                   \
                    473:        void *v;                                                        \
                    474:        bus_space_handle_t h;                                           \
                    475:        bus_size_t o, c;                                                \
                    476:        TYPE *a;                                                        \
                    477: {                                                                      \
                    478:                                                                        \
                    479:        while (c-- > 0) {                                               \
                    480:                *a++ = __C(__C(CHIP,_io_read_),BYTES)(v, h, o);         \
                    481:                o += sizeof *a;                                         \
                    482:        }                                                               \
                    483: }
                    484: CHIP_io_read_region_N(1,u_int8_t)
                    485: CHIP_io_read_region_N(2,u_int16_t)
                    486: CHIP_io_read_region_N(4,u_int32_t)
                    487: CHIP_io_read_region_N(8,u_int64_t)
                    488:
                    489: inline void
                    490: __C(CHIP,_io_write_1)(v, ioh, off, val)
                    491:        void *v;
                    492:        bus_space_handle_t ioh;
                    493:        bus_size_t off;
                    494:        u_int8_t val;
                    495: {
                    496:        bus_addr_t addr;
                    497:
                    498:        addr = ioh + off;
                    499:        alpha_stb((u_int8_t *)addr, val);
                    500:         alpha_mb();
                    501: }
                    502:
                    503: inline void
                    504: __C(CHIP,_io_write_2)(v, ioh, off, val)
                    505:        void *v;
                    506:        bus_space_handle_t ioh;
                    507:        bus_size_t off;
                    508:        u_int16_t val;
                    509: {
                    510:        bus_addr_t addr;
                    511:
                    512:        addr = ioh + off;
                    513: #ifdef DIAGNOSTIC
                    514:        if (addr & 1)
                    515:                panic(__S(__C(CHIP,_io_write_2)) ": addr 0x%lx not aligned",
                    516:                    addr);
                    517: #endif
                    518:        alpha_stw((u_int16_t *)addr, val);
                    519:        alpha_mb();
                    520: }
                    521:
                    522: inline void
                    523: __C(CHIP,_io_write_4)(v, ioh, off, val)
                    524:        void *v;
                    525:        bus_space_handle_t ioh;
                    526:        bus_size_t off;
                    527:        u_int32_t val;
                    528: {
                    529:        bus_addr_t addr;
                    530:
                    531:        addr = ioh + off;
                    532: #ifdef DIAGNOSTIC
                    533:        if (addr & 3)
                    534:                panic(__S(__C(CHIP,_io_write_4)) ": addr 0x%lx not aligned",
                    535:                    addr);
                    536: #endif
                    537:        *(u_int32_t *)addr = val;
                    538:        alpha_mb();
                    539: }
                    540:
                    541: inline void
                    542: __C(CHIP,_io_write_8)(v, ioh, off, val)
                    543:        void *v;
                    544:        bus_space_handle_t ioh;
                    545:        bus_size_t off;
                    546:        u_int64_t val;
                    547: {
                    548:
                    549:        /* XXX XXX XXX */
                    550:        panic("%s not implemented", __S(__C(CHIP,_io_write_8)));
                    551:        alpha_mb();
                    552: }
                    553:
                    554: #define CHIP_io_write_multi_N(BYTES,TYPE)                              \
                    555: void                                                                   \
                    556: __C(__C(CHIP,_io_write_multi_),BYTES)(v, h, o, a, c)                   \
                    557:        void *v;                                                        \
                    558:        bus_space_handle_t h;                                           \
                    559:        bus_size_t o, c;                                                \
                    560:        const TYPE *a;                                                  \
                    561: {                                                                      \
                    562:                                                                        \
                    563:        while (c-- > 0) {                                               \
                    564:                __C(__C(CHIP,_io_write_),BYTES)(v, h, o, *a++);         \
                    565:                __C(CHIP,_io_barrier)(v, h, o, sizeof *a,               \
                    566:                    BUS_BARRIER_WRITE);                                 \
                    567:        }                                                               \
                    568: }
                    569: CHIP_io_write_multi_N(1,u_int8_t)
                    570: CHIP_io_write_multi_N(2,u_int16_t)
                    571: CHIP_io_write_multi_N(4,u_int32_t)
                    572: CHIP_io_write_multi_N(8,u_int64_t)
                    573:
                    574: #define CHIP_io_write_region_N(BYTES,TYPE)                             \
                    575: void                                                                   \
                    576: __C(__C(CHIP,_io_write_region_),BYTES)(v, h, o, a, c)                  \
                    577:        void *v;                                                        \
                    578:        bus_space_handle_t h;                                           \
                    579:        bus_size_t o, c;                                                \
                    580:        const TYPE *a;                                                  \
                    581: {                                                                      \
                    582:                                                                        \
                    583:        while (c-- > 0) {                                               \
                    584:                __C(__C(CHIP,_io_write_),BYTES)(v, h, o, *a++);         \
                    585:                o += sizeof *a;                                         \
                    586:        }                                                               \
                    587: }
                    588: CHIP_io_write_region_N(1,u_int8_t)
                    589: CHIP_io_write_region_N(2,u_int16_t)
                    590: CHIP_io_write_region_N(4,u_int32_t)
                    591: CHIP_io_write_region_N(8,u_int64_t)
                    592:
                    593: #define CHIP_io_set_multi_N(BYTES,TYPE)                                        \
                    594: void                                                                   \
                    595: __C(__C(CHIP,_io_set_multi_),BYTES)(v, h, o, val, c)                   \
                    596:        void *v;                                                        \
                    597:        bus_space_handle_t h;                                           \
                    598:        bus_size_t o, c;                                                \
                    599:        TYPE val;                                                       \
                    600: {                                                                      \
                    601:                                                                        \
                    602:        while (c-- > 0) {                                               \
                    603:                __C(__C(CHIP,_io_write_),BYTES)(v, h, o, val);          \
                    604:                __C(CHIP,_io_barrier)(v, h, o, sizeof val,              \
                    605:                    BUS_BARRIER_WRITE);                                 \
                    606:        }                                                               \
                    607: }
                    608: CHIP_io_set_multi_N(1,u_int8_t)
                    609: CHIP_io_set_multi_N(2,u_int16_t)
                    610: CHIP_io_set_multi_N(4,u_int32_t)
                    611: CHIP_io_set_multi_N(8,u_int64_t)
                    612:
                    613: #define CHIP_io_set_region_N(BYTES,TYPE)                               \
                    614: void                                                                   \
                    615: __C(__C(CHIP,_io_set_region_),BYTES)(v, h, o, val, c)                  \
                    616:        void *v;                                                        \
                    617:        bus_space_handle_t h;                                           \
                    618:        bus_size_t o, c;                                                \
                    619:        TYPE val;                                                       \
                    620: {                                                                      \
                    621:                                                                        \
                    622:        while (c-- > 0) {                                               \
                    623:                __C(__C(CHIP,_io_write_),BYTES)(v, h, o, val);          \
                    624:                o += sizeof val;                                        \
                    625:        }                                                               \
                    626: }
                    627: CHIP_io_set_region_N(1,u_int8_t)
                    628: CHIP_io_set_region_N(2,u_int16_t)
                    629: CHIP_io_set_region_N(4,u_int32_t)
                    630: CHIP_io_set_region_N(8,u_int64_t)
                    631:
                    632: #define        CHIP_io_copy_N(BYTES)                                           \
                    633: void                                                                   \
                    634: __C(__C(CHIP,_io_copy_),BYTES)(v, h1, o1, h2, o2, c)                   \
                    635:        void *v;                                                        \
                    636:        bus_space_handle_t h1, h2;                                      \
                    637:        bus_size_t o1, o2, c;                                           \
                    638: {                                                                      \
                    639:        bus_size_t i, o;                                                \
                    640:                                                                        \
                    641:        for (i = 0, o = 0; i < c; i++, o += BYTES)                      \
                    642:                __C(__C(CHIP,_io_write_),BYTES)(v, h2, o2 + o,          \
                    643:                    __C(__C(CHIP,_io_read_),BYTES)(v, h1, o1 + o));     \
                    644: }
                    645: CHIP_io_copy_N(1)
                    646: CHIP_io_copy_N(2)
                    647: CHIP_io_copy_N(4)
                    648: CHIP_io_copy_N(8)
                    649:
                    650: #define CHIP_io_read_raw_multi_N(BYTES,TYPE)                           \
                    651: void                                                                   \
                    652: __C(__C(CHIP,_io_read_raw_multi_),BYTES)(v, h, o, a, c)                        \
                    653:        void *v;                                                        \
                    654:        bus_space_handle_t h;                                           \
                    655:        bus_size_t o, c;                                                \
                    656:        u_int8_t *a;                                                    \
                    657: {                                                                      \
                    658:        TYPE temp;                                                      \
                    659:        int i;                                                          \
                    660:                                                                        \
                    661:        while (c > 0) {                                                 \
                    662:                __C(CHIP,_io_barrier)(v, h, o, BYTES, BUS_BARRIER_READ); \
                    663:                temp = __C(__C(CHIP,_io_read_),BYTES)(v, h, o);         \
                    664:                i = MIN(c, BYTES);                                      \
                    665:                c -= i;                                                 \
                    666:                while (i--) {                                           \
                    667:                        *a++ = temp & 0xff;                             \
                    668:                        temp >>= 8;                                     \
                    669:                }                                                       \
                    670:        }                                                               \
                    671: }
                    672: CHIP_io_read_raw_multi_N(2,u_int16_t)
                    673: CHIP_io_read_raw_multi_N(4,u_int32_t)
                    674: CHIP_io_read_raw_multi_N(8,u_int64_t)
                    675:
                    676: #define CHIP_io_write_raw_multi_N(BYTES,TYPE)                          \
                    677: void                                                                   \
                    678: __C(__C(CHIP,_io_write_raw_multi_),BYTES)(v, h, o, a, c)               \
                    679:        void *v;                                                        \
                    680:        bus_space_handle_t h;                                           \
                    681:        bus_size_t o, c;                                                \
                    682:        const u_int8_t *a;                                              \
                    683: {                                                                      \
                    684:        TYPE temp;                                                      \
                    685:        int i;                                                          \
                    686:                                                                        \
                    687:        while (c > 0) {                                                 \
                    688:                temp = 0;                                               \
                    689:                for (i = BYTES - 1; i >= 0; i--) {                      \
                    690:                        temp <<= 8;                                     \
                    691:                        if (i < c)                                      \
                    692:                                temp |= *(a + i);                       \
                    693:                }                                                       \
                    694:                __C(__C(CHIP,_io_write_),BYTES)(v, h, o, temp);         \
                    695:                __C(CHIP,_io_barrier)(v, h, o, BYTES, BUS_BARRIER_WRITE); \
                    696:                i = MIN(c, BYTES);                                      \
                    697:                c -= i;                                                 \
                    698:                a += i;                                                 \
                    699:        }                                                               \
                    700: }
                    701: CHIP_io_write_raw_multi_N(2,u_int16_t)
                    702: CHIP_io_write_raw_multi_N(4,u_int32_t)
                    703: CHIP_io_write_raw_multi_N(8,u_int64_t)

CVSweb