[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     ! 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