[BACK]Return to shpcic.c CVS log [TXT][DIR] Up to [local] / sys / arch / sh / dev

Annotation of sys/arch/sh/dev/shpcic.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: shpcic.c,v 1.7 2007/07/11 18:21:35 miod Exp $ */
        !             2: /*     $NetBSD: shpcic.c,v 1.10 2005/12/24 20:07:32 perry Exp $        */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 2005 NONAKA Kimihiro
        !             6:  * All rights reserved.
        !             7:  *
        !             8:  * Redistribution and use in source and binary forms, with or without
        !             9:  * modification, are permitted provided that the following conditions
        !            10:  * are met:
        !            11:  * 1. Redistributions of source code must retain the above copyright
        !            12:  *    notice, this list of conditions and the following disclaimer.
        !            13:  * 2. Redistributions in binary form must reproduce the above copyright
        !            14:  *    notice, this list of conditions and the following disclaimer in the
        !            15:  *    documentation and/or other materials provided with the distribution.
        !            16:  *
        !            17:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            18:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
        !            19:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        !            20:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
        !            21:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
        !            22:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        !            23:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        !            24:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            25:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
        !            26:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            27:  */
        !            28:
        !            29: #include <sys/param.h>
        !            30: #include <sys/systm.h>
        !            31: #include <sys/kernel.h>
        !            32: #include <sys/device.h>
        !            33: #include <sys/extent.h>
        !            34: #include <sys/malloc.h>
        !            35:
        !            36: #include <dev/pci/pcireg.h>
        !            37: #include <dev/pci/pcivar.h>
        !            38: #include <dev/pci/pcidevs.h>
        !            39:
        !            40: #include <sh/bscreg.h>
        !            41: #include <sh/cache.h>
        !            42: #include <sh/trap.h>
        !            43: #include <sh/dev/pcicreg.h>
        !            44:
        !            45: #include <machine/autoconf.h>
        !            46: #include <machine/bus.h>
        !            47: #include <machine/intr.h>
        !            48:
        !            49: #if defined(SHPCIC_DEBUG)
        !            50: int shpcic_debug = 0;
        !            51: #define        DPRINTF(arg)    if (shpcic_debug) printf arg
        !            52: #else
        !            53: #define        DPRINTF(arg)
        !            54: #endif
        !            55:
        !            56: #define        PCI_MODE1_ENABLE        0x80000000UL
        !            57:
        !            58: static const struct shpcic_product {
        !            59:        uint32_t        sp_product;
        !            60:        const char      *sp_name;
        !            61: } shpcic_products[] = {
        !            62:        { PCI_PRODUCT_HITACHI_SH7751,   "SH7751" },
        !            63:        { PCI_PRODUCT_HITACHI_SH7751R,  "SH7751R" },
        !            64:
        !            65:        { 0, NULL },
        !            66: };
        !            67:
        !            68: int    shpcic_match(struct device *, void *, void *);
        !            69: void   shpcic_attach(struct device *, struct device *, void *);
        !            70:
        !            71: struct cfattach shpcic_ca = {
        !            72:        sizeof(struct shpcic_softc), shpcic_match, shpcic_attach
        !            73: };
        !            74:
        !            75: struct cfdriver shpcic_cd = {
        !            76:        0, "shpcic", DV_DULL
        !            77: };
        !            78:
        !            79: /* There can be only one. */
        !            80: int shpcic_found = 0;
        !            81:
        !            82: static const struct shpcic_product *shpcic_lookup(void);
        !            83:
        !            84: static const struct shpcic_product *
        !            85: shpcic_lookup(void)
        !            86: {
        !            87:        const struct shpcic_product *spp;
        !            88:        pcireg_t id;
        !            89:
        !            90:        id = _reg_read_4(SH4_PCICONF0);
        !            91:        switch (PCI_VENDOR(id)) {
        !            92:        case PCI_VENDOR_HITACHI:
        !            93:                break;
        !            94:
        !            95:        default:
        !            96:                return (NULL);
        !            97:        }
        !            98:
        !            99:        for (spp = shpcic_products; spp->sp_name != NULL; spp++) {
        !           100:                if (PCI_PRODUCT(id) == spp->sp_product) {
        !           101:                        return (spp);
        !           102:                }
        !           103:        }
        !           104:        return (NULL);
        !           105: }
        !           106:
        !           107: int
        !           108: shpcic_match(struct device *parent, void *vcf, void *aux)
        !           109: {
        !           110:        struct mainbus_attach_args *ma = aux;
        !           111:
        !           112:        if (strcmp(ma->ma_name, shpcic_cd.cd_name) != 0)
        !           113:                return (0);
        !           114:
        !           115:        if (!CPU_IS_SH4)
        !           116:                return (0);
        !           117:
        !           118:        switch (cpu_product) {
        !           119:        default:
        !           120:                return (0);
        !           121:
        !           122:        case CPU_PRODUCT_7751:
        !           123:        case CPU_PRODUCT_7751R:
        !           124:                break;
        !           125:        }
        !           126:
        !           127:        if (shpcic_found)
        !           128:                return (0);
        !           129:
        !           130:        if (shpcic_lookup() == NULL)
        !           131:                return (0);
        !           132:
        !           133:        if (_reg_read_2(SH4_BCR2) & BCR2_PORTEN)
        !           134:                return (0);
        !           135:
        !           136:        return (1);
        !           137: }
        !           138:
        !           139: void
        !           140: shpcic_attach(struct device *parent, struct device *self, void *aux)
        !           141: {
        !           142:        const struct shpcic_product *spp;
        !           143:        struct shpcic_softc *sc = (struct shpcic_softc *)self;
        !           144:        struct pcibus_attach_args pba;
        !           145:
        !           146:        shpcic_found = 1;
        !           147:
        !           148:        spp = shpcic_lookup();
        !           149:        if (spp == NULL) {
        !           150:                printf("\n");
        !           151:                panic("shpcic_attach: impossible");
        !           152:        }
        !           153:
        !           154:        if (_reg_read_2(SH4_BCR2) & BCR2_PORTEN) {
        !           155:                printf("\n");
        !           156:                panic("shpcic_attach: port enabled");
        !           157:        }
        !           158:
        !           159:        printf(": HITACHI %s\n", spp->sp_name);
        !           160:
        !           161:        /* allow PCIC request */
        !           162:        _reg_write_4(SH4_BCR1, _reg_read_4(SH4_BCR1) | BCR1_BREQEN);
        !           163:
        !           164:        /* Initialize PCIC */
        !           165:        _reg_write_4(SH4_PCICR, PCICR_BASE | PCICR_RSTCTL);
        !           166:        delay(10 * 1000);
        !           167:        _reg_write_4(SH4_PCICR, PCICR_BASE);
        !           168:
        !           169:        /* Class: Host-Bridge */
        !           170:        _reg_write_4(SH4_PCICONF2,
        !           171:            (PCI_CLASS_BRIDGE << PCI_CLASS_SHIFT) |
        !           172:            (PCI_SUBCLASS_BRIDGE_HOST << PCI_SUBCLASS_SHIFT));
        !           173:
        !           174: #if !defined(DONT_INIT_PCIBSC)
        !           175: #if defined(PCIBCR_BCR1_VAL)
        !           176:        _reg_write_4(SH4_PCIBCR1, PCIBCR_BCR1_VAL);
        !           177: #else
        !           178:        _reg_write_4(SH4_PCIBCR1, _reg_read_4(SH4_BCR1) | BCR1_MASTER);
        !           179: #endif
        !           180: #if defined(PCIBCR_BCR2_VAL)
        !           181:        _reg_write_4(SH4_PCIBCR2, PCIBCR_BCR2_VAL);
        !           182: #else
        !           183:        _reg_write_4(SH4_PCIBCR2, _reg_read_2(SH4_BCR2));
        !           184: #endif
        !           185: #if defined(SH4) && defined(SH7751R)
        !           186:        if (cpu_product == CPU_PRODUCT_7751R) {
        !           187: #if defined(PCIBCR_BCR3_VAL)
        !           188:                _reg_write_4(SH4_PCIBCR3, PCIBCR_BCR3_VAL);
        !           189: #else
        !           190:                _reg_write_4(SH4_PCIBCR3, _reg_read_2(SH4_BCR3));
        !           191: #endif
        !           192:        }
        !           193: #endif /* SH4 && SH7751R && PCIBCR_BCR3_VAL */
        !           194: #if defined(PCIBCR_WCR1_VAL)
        !           195:        _reg_write_4(SH4_PCIWCR1, PCIBCR_WCR1_VAL);
        !           196: #else
        !           197:        _reg_write_4(SH4_PCIWCR1, _reg_read_4(SH4_WCR1));
        !           198: #endif
        !           199: #if defined(PCIBCR_WCR2_VAL)
        !           200:        _reg_write_4(SH4_PCIWCR2, PCIBCR_WCR2_VAL);
        !           201: #else
        !           202:        _reg_write_4(SH4_PCIWCR2, _reg_read_4(SH4_WCR2));
        !           203: #endif
        !           204: #if defined(PCIBCR_WCR3_VAL)
        !           205:        _reg_write_4(SH4_PCIWCR3, PCIBCR_WCR3_VAL);
        !           206: #else
        !           207:        _reg_write_4(SH4_PCIWCR3, _reg_read_4(SH4_WCR3));
        !           208: #endif
        !           209: #if defined(PCIBCR_MCR_VAL)
        !           210:        _reg_write_4(SH4_PCIMCR, PCIBCR_MCR_VAL);
        !           211: #else
        !           212:        _reg_write_4(SH4_PCIMCR, _reg_read_4(SH4_MCR));
        !           213: #endif
        !           214: #endif /* !DONT_INIT_PCIBSC */
        !           215:
        !           216:        /* set PCI I/O, memory base address */
        !           217:        _reg_write_4(SH4_PCIIOBR, SH4_PCIC_IO);
        !           218:        _reg_write_4(SH4_PCIMBR, SH4_PCIC_MEM);
        !           219:
        !           220:        /* set PCI local address 0 */
        !           221:        _reg_write_4(SH4_PCILSR0, (64 - 1) << 20);
        !           222:        _reg_write_4(SH4_PCILAR0, 0xac000000);
        !           223:        _reg_write_4(SH4_PCICONF5, 0xac000000);
        !           224:
        !           225:        /* set PCI local address 1 */
        !           226:        _reg_write_4(SH4_PCILSR1, (64 - 1) << 20);
        !           227:        _reg_write_4(SH4_PCILAR1, 0xac000000);
        !           228:        _reg_write_4(SH4_PCICONF6, 0x8c000000);
        !           229:
        !           230:        /* Enable I/O, memory, bus-master */
        !           231:        _reg_write_4(SH4_PCICONF1, PCI_COMMAND_IO_ENABLE
        !           232:                                   | PCI_COMMAND_MEM_ENABLE
        !           233:                                   | PCI_COMMAND_MASTER_ENABLE
        !           234:                                   | PCI_COMMAND_STEPPING_ENABLE
        !           235:                                   | PCI_STATUS_DEVSEL_MEDIUM);
        !           236:
        !           237:        /* Initialize done. */
        !           238:        _reg_write_4(SH4_PCICR, PCICR_BASE | PCICR_CFINIT);
        !           239:
        !           240:        /* set PCI controller interrupt priority */
        !           241:        intpri_intr_priority(SH4_INTEVT_PCIERR, IPL_BIO);       /* IPL_HIGH? */
        !           242:        intpri_intr_priority(SH4_INTEVT_PCISERR, IPL_BIO);      /* IPL_HIGH? */
        !           243:
        !           244:        sc->sc_membus_space.bus_base = SH4_PCIC_MEM;
        !           245:        sc->sc_membus_space.bus_size = SH4_PCIC_MEM_SIZE;
        !           246:        sc->sc_membus_space.bus_io = 0;
        !           247:        sc->sc_iobus_space.bus_base = SH4_PCIC_IO; /* XXX */
        !           248:        sc->sc_iobus_space.bus_size =  SH4_PCIC_IO_SIZE;
        !           249:        sc->sc_iobus_space.bus_io = 1;;
        !           250:
        !           251:        sc->sc_pci_chipset = shpcic_get_bus_mem_tag();
        !           252:        pci_addr_fixup(sc, 1);
        !           253:
        !           254:        /* PCI bus */
        !           255:        memset(&pba, 0, sizeof(pba));
        !           256:        pba.pba_busname = "pci";
        !           257:        pba.pba_iot = shpcic_get_bus_io_tag();
        !           258:        pba.pba_memt = shpcic_get_bus_mem_tag();
        !           259:        pba.pba_dmat = shpcic_get_bus_dma_tag();
        !           260:        pba.pba_pc = NULL;
        !           261:        pba.pba_domain = pci_ndomains++;
        !           262:        pba.pba_bus = 0;
        !           263:        pba.pba_bridgetag = NULL;
        !           264:        config_found(self, &pba, NULL);
        !           265: }
        !           266:
        !           267: int
        !           268: shpcic_bus_maxdevs(void *v, int busno)
        !           269: {
        !           270:        /*
        !           271:         * Bus number is irrelevant.  Configuration Mechanism 1 is in
        !           272:         * use, can have devices 0-32 (i.e. the `normal' range).
        !           273:         */
        !           274:        return (32);
        !           275: }
        !           276:
        !           277: pcitag_t
        !           278: shpcic_make_tag(void *v, int bus, int device, int function)
        !           279: {
        !           280:        pcitag_t tag;
        !           281:
        !           282:        if (bus >= 256 || device >= 32 || function >= 8)
        !           283:                panic("pci_make_tag: bad request");
        !           284:
        !           285:        tag = PCI_MODE1_ENABLE |
        !           286:                    (bus << 16) | (device << 11) | (function << 8);
        !           287:
        !           288:        return (tag);
        !           289: }
        !           290:
        !           291: void
        !           292: shpcic_decompose_tag(void *v, pcitag_t tag, int *bp, int *dp, int *fp)
        !           293: {
        !           294:        if (bp != NULL)
        !           295:                *bp = (tag >> 16) & 0xff;
        !           296:        if (dp != NULL)
        !           297:                *dp = (tag >> 11) & 0x1f;
        !           298:        if (fp != NULL)
        !           299:                *fp = (tag >> 8) & 0x7;
        !           300: }
        !           301:
        !           302: pcireg_t
        !           303: shpcic_conf_read(void *v, pcitag_t tag, int reg)
        !           304: {
        !           305:        pcireg_t data;
        !           306:        int s;
        !           307:
        !           308:        s = splhigh();
        !           309:        _reg_write_4(SH4_PCIPAR, tag | reg);
        !           310:        data = _reg_read_4(SH4_PCIPDR);
        !           311:        _reg_write_4(SH4_PCIPAR, 0);
        !           312:        splx(s);
        !           313:
        !           314:        return data;
        !           315: }
        !           316:
        !           317: void
        !           318: shpcic_conf_write(void *v, pcitag_t tag, int reg, pcireg_t data)
        !           319: {
        !           320:        int s;
        !           321:
        !           322:        s = splhigh();
        !           323:        _reg_write_4(SH4_PCIPAR, tag | reg);
        !           324:        _reg_write_4(SH4_PCIPDR, data);
        !           325:        _reg_write_4(SH4_PCIPAR, 0);
        !           326:        splx(s);
        !           327: }
        !           328:
        !           329: /*
        !           330:  * shpcic bus space
        !           331:  */
        !           332: int
        !           333: shpcic_iomem_map(void *v, bus_addr_t bpa, bus_size_t size,
        !           334:     int flags, bus_space_handle_t *bshp)
        !           335: {
        !           336:        *bshp = (bus_space_handle_t)bpa;
        !           337:
        !           338:        return (0);
        !           339: }
        !           340:
        !           341: void
        !           342: shpcic_iomem_unmap(void *v, bus_space_handle_t bsh, bus_size_t size)
        !           343: {
        !           344:        /* Nothing to do */
        !           345: }
        !           346:
        !           347: int
        !           348: shpcic_iomem_subregion(void *v, bus_space_handle_t bsh,
        !           349:     bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp)
        !           350: {
        !           351:        *nbshp = bsh + offset;
        !           352:
        !           353:        return (0);
        !           354: }
        !           355:
        !           356: int
        !           357: shpcic_iomem_alloc(void *v, bus_addr_t rstart, bus_addr_t rend,
        !           358:     bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags,
        !           359:     bus_addr_t *bpap, bus_space_handle_t *bshp)
        !           360: {
        !           361:        *bshp = *bpap = rstart;
        !           362:
        !           363:        return (0);
        !           364: }
        !           365:
        !           366: void
        !           367: shpcic_iomem_free(void *v, bus_space_handle_t bsh, bus_size_t size)
        !           368: {
        !           369:        /* Nothing to do */
        !           370: }
        !           371:
        !           372: /*
        !           373:  * shpcic bus space io/mem read/write
        !           374:  */
        !           375: /* read */
        !           376: static inline uint8_t __shpcic_io_read_1(bus_space_handle_t bsh,
        !           377:     bus_size_t offset);
        !           378: static inline uint16_t __shpcic_io_read_2(bus_space_handle_t bsh,
        !           379:     bus_size_t offset);
        !           380: static inline uint32_t __shpcic_io_read_4(bus_space_handle_t bsh,
        !           381:     bus_size_t offset);
        !           382: static inline uint8_t __shpcic_mem_read_1(bus_space_handle_t bsh,
        !           383:     bus_size_t offset);
        !           384: static inline uint16_t __shpcic_mem_read_2(bus_space_handle_t bsh,
        !           385:     bus_size_t offset);
        !           386: static inline uint32_t __shpcic_mem_read_4(bus_space_handle_t bsh,
        !           387:     bus_size_t offset);
        !           388:
        !           389: static inline uint8_t
        !           390: __shpcic_io_read_1(bus_space_handle_t bsh, bus_size_t offset)
        !           391: {
        !           392:        u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK;
        !           393:
        !           394:        return *(volatile uint8_t *)(SH4_PCIC_IO + adr);
        !           395: }
        !           396:
        !           397: static inline uint16_t
        !           398: __shpcic_io_read_2(bus_space_handle_t bsh, bus_size_t offset)
        !           399: {
        !           400:        u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK;
        !           401:
        !           402:        return *(volatile uint16_t *)(SH4_PCIC_IO + adr);
        !           403: }
        !           404:
        !           405: static inline uint32_t
        !           406: __shpcic_io_read_4(bus_space_handle_t bsh, bus_size_t offset)
        !           407: {
        !           408:        u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK;
        !           409:
        !           410:        return *(volatile uint32_t *)(SH4_PCIC_IO + adr);
        !           411: }
        !           412:
        !           413: static inline uint8_t
        !           414: __shpcic_mem_read_1(bus_space_handle_t bsh, bus_size_t offset)
        !           415: {
        !           416:        u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK;
        !           417:
        !           418:        return *(volatile uint8_t *)(SH4_PCIC_MEM + adr);
        !           419: }
        !           420:
        !           421: static inline uint16_t
        !           422: __shpcic_mem_read_2(bus_space_handle_t bsh, bus_size_t offset)
        !           423: {
        !           424:        u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK;
        !           425:
        !           426:        return *(volatile uint16_t *)(SH4_PCIC_MEM + adr);
        !           427: }
        !           428:
        !           429: static inline uint32_t
        !           430: __shpcic_mem_read_4(bus_space_handle_t bsh, bus_size_t offset)
        !           431: {
        !           432:        u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK;
        !           433:
        !           434:        return *(volatile uint32_t *)(SH4_PCIC_MEM + adr);
        !           435: }
        !           436:
        !           437: /*
        !           438:  * read single
        !           439:  */
        !           440: uint8_t
        !           441: shpcic_io_read_1(void *v, bus_space_handle_t bsh, bus_size_t offset)
        !           442: {
        !           443:        uint8_t value;
        !           444:
        !           445:        value = __shpcic_io_read_1(bsh, offset);
        !           446:
        !           447:        return value;
        !           448: }
        !           449:
        !           450: uint16_t
        !           451: shpcic_io_read_2(void *v, bus_space_handle_t bsh, bus_size_t offset)
        !           452: {
        !           453:        uint16_t value;
        !           454:
        !           455:        value = __shpcic_io_read_2(bsh, offset);
        !           456:
        !           457:        return value;
        !           458: }
        !           459:
        !           460: uint32_t
        !           461: shpcic_io_read_4(void *v, bus_space_handle_t bsh, bus_size_t offset)
        !           462: {
        !           463:        uint32_t value;
        !           464:
        !           465:        value = __shpcic_io_read_4(bsh, offset);
        !           466:
        !           467:        return value;
        !           468: }
        !           469:
        !           470: uint8_t
        !           471: shpcic_mem_read_1(void *v, bus_space_handle_t bsh, bus_size_t offset)
        !           472: {
        !           473:        uint8_t value;
        !           474:
        !           475:        value = __shpcic_mem_read_1(bsh, offset);
        !           476:
        !           477:        return value;
        !           478: }
        !           479:
        !           480: uint16_t
        !           481: shpcic_mem_read_2(void *v, bus_space_handle_t bsh, bus_size_t offset)
        !           482: {
        !           483:        uint16_t value;
        !           484:
        !           485:        value = __shpcic_mem_read_2(bsh, offset);
        !           486:
        !           487:        return value;
        !           488: }
        !           489:
        !           490: uint32_t
        !           491: shpcic_mem_read_4(void *v, bus_space_handle_t bsh, bus_size_t offset)
        !           492: {
        !           493:        uint32_t value;
        !           494:
        !           495:        value = __shpcic_mem_read_4(bsh, offset);
        !           496:
        !           497:        return value;
        !           498: }
        !           499:
        !           500: /*
        !           501:  * read multi
        !           502:  */
        !           503: void
        !           504: shpcic_io_read_multi_1(void *v, bus_space_handle_t bsh,
        !           505:     bus_size_t offset, uint8_t *addr, bus_size_t count)
        !           506: {
        !           507:        while (count--) {
        !           508:                *addr++ = __shpcic_io_read_1(bsh, offset);
        !           509:        }
        !           510: }
        !           511:
        !           512: void
        !           513: shpcic_io_read_multi_2(void *v, bus_space_handle_t bsh,
        !           514:     bus_size_t offset, uint16_t *addr, bus_size_t count)
        !           515: {
        !           516:        while (count--) {
        !           517:                *addr++ = __shpcic_io_read_2(bsh, offset);
        !           518:        }
        !           519: }
        !           520:
        !           521: void
        !           522: shpcic_io_read_multi_4(void *v, bus_space_handle_t bsh,
        !           523:     bus_size_t offset, uint32_t *addr, bus_size_t count)
        !           524: {
        !           525:        while (count--) {
        !           526:                *addr++ = __shpcic_io_read_4(bsh, offset);
        !           527:        }
        !           528: }
        !           529:
        !           530: void
        !           531: shpcic_mem_read_multi_1(void *v, bus_space_handle_t bsh,
        !           532:     bus_size_t offset, uint8_t *addr, bus_size_t count)
        !           533: {
        !           534:        while (count--) {
        !           535:                *addr++ = __shpcic_mem_read_1(bsh, offset);
        !           536:        }
        !           537: }
        !           538:
        !           539: void
        !           540: shpcic_mem_read_multi_2(void *v, bus_space_handle_t bsh,
        !           541:     bus_size_t offset, uint16_t *addr, bus_size_t count)
        !           542: {
        !           543:        while (count--) {
        !           544:                *addr++ = __shpcic_mem_read_2(bsh, offset);
        !           545:        }
        !           546: }
        !           547:
        !           548: void
        !           549: shpcic_mem_read_multi_4(void *v, bus_space_handle_t bsh,
        !           550:     bus_size_t offset, uint32_t *addr, bus_size_t count)
        !           551: {
        !           552:        while (count--) {
        !           553:                *addr++ = __shpcic_mem_read_4(bsh, offset);
        !           554:        }
        !           555: }
        !           556:
        !           557: /*
        !           558:  * read raw multi
        !           559:  */
        !           560:
        !           561: void
        !           562: shpcic_io_read_raw_multi_2(void *v, bus_space_handle_t bsh,
        !           563:     bus_size_t offset, uint8_t *addr, bus_size_t count)
        !           564: {
        !           565:        count >>= 1;
        !           566:        while (count--) {
        !           567:                *(uint16_t *)addr = __shpcic_io_read_2(bsh, offset);
        !           568:                addr += 2;
        !           569:        }
        !           570: }
        !           571:
        !           572: void
        !           573: shpcic_io_read_raw_multi_4(void *v, bus_space_handle_t bsh,
        !           574:     bus_size_t offset, uint8_t *addr, bus_size_t count)
        !           575: {
        !           576:        count >>= 2;
        !           577:        while (count--) {
        !           578:                *(uint32_t *)addr = __shpcic_io_read_4(bsh, offset);
        !           579:                addr += 4;
        !           580:        }
        !           581: }
        !           582:
        !           583: void
        !           584: shpcic_mem_read_raw_multi_2(void *v, bus_space_handle_t bsh,
        !           585:     bus_size_t offset, uint8_t *addr, bus_size_t count)
        !           586: {
        !           587:        count >>= 1;
        !           588:        while (count--) {
        !           589:                *(uint16_t *)addr = __shpcic_mem_read_2(bsh, offset);
        !           590:                addr += 2;
        !           591:        }
        !           592: }
        !           593:
        !           594: void
        !           595: shpcic_mem_read_raw_multi_4(void *v, bus_space_handle_t bsh,
        !           596:     bus_size_t offset, uint8_t *addr, bus_size_t count)
        !           597: {
        !           598:        count >>= 2;
        !           599:        while (count--) {
        !           600:                *(uint32_t *)addr = __shpcic_mem_read_4(bsh, offset);
        !           601:                addr += 4;
        !           602:        }
        !           603: }
        !           604:
        !           605: /*
        !           606:  * read region
        !           607:  */
        !           608: void
        !           609: shpcic_io_read_region_1(void *v, bus_space_handle_t bsh,
        !           610:     bus_size_t offset, uint8_t *addr, bus_size_t count)
        !           611: {
        !           612:        while (count--) {
        !           613:                *addr++ = __shpcic_io_read_1(bsh, offset);
        !           614:                offset += 1;
        !           615:        }
        !           616: }
        !           617:
        !           618: void
        !           619: shpcic_io_read_region_2(void *v, bus_space_handle_t bsh,
        !           620:     bus_size_t offset, uint16_t *addr, bus_size_t count)
        !           621: {
        !           622:        while (count--) {
        !           623:                *addr++ = __shpcic_io_read_2(bsh, offset);
        !           624:                offset += 2;
        !           625:        }
        !           626: }
        !           627:
        !           628: void
        !           629: shpcic_io_read_region_4(void *v, bus_space_handle_t bsh,
        !           630:     bus_size_t offset, uint32_t *addr, bus_size_t count)
        !           631: {
        !           632:        while (count--) {
        !           633:                *addr++ = __shpcic_io_read_4(bsh, offset);
        !           634:                offset += 4;
        !           635:        }
        !           636: }
        !           637:
        !           638: void
        !           639: shpcic_mem_read_region_1(void *v, bus_space_handle_t bsh,
        !           640:     bus_size_t offset, uint8_t *addr, bus_size_t count)
        !           641: {
        !           642:        while (count--) {
        !           643:                *addr++ = __shpcic_mem_read_1(bsh, offset);
        !           644:                offset += 1;
        !           645:        }
        !           646: }
        !           647:
        !           648: void
        !           649: shpcic_mem_read_region_2(void *v, bus_space_handle_t bsh,
        !           650:     bus_size_t offset, uint16_t *addr, bus_size_t count)
        !           651: {
        !           652:        while (count--) {
        !           653:                *addr++ = __shpcic_mem_read_2(bsh, offset);
        !           654:                offset += 2;
        !           655:        }
        !           656: }
        !           657:
        !           658: void
        !           659: shpcic_mem_read_region_4(void *v, bus_space_handle_t bsh,
        !           660:     bus_size_t offset, uint32_t *addr, bus_size_t count)
        !           661: {
        !           662:        while (count--) {
        !           663:                *addr++ = __shpcic_mem_read_4(bsh, offset);
        !           664:                offset += 4;
        !           665:        }
        !           666: }
        !           667:
        !           668: /*
        !           669:  * read raw region
        !           670:  */
        !           671:
        !           672: void
        !           673: shpcic_io_read_raw_region_2(void *v, bus_space_handle_t bsh,
        !           674:     bus_size_t offset, uint8_t *addr, bus_size_t count)
        !           675: {
        !           676:        count >>= 1;
        !           677:        while (count--) {
        !           678:                *(uint16_t *)addr = __shpcic_io_read_2(bsh, offset);
        !           679:                addr += 2;
        !           680:                offset += 2;
        !           681:        }
        !           682: }
        !           683:
        !           684: void
        !           685: shpcic_io_read_raw_region_4(void *v, bus_space_handle_t bsh,
        !           686:     bus_size_t offset, uint8_t *addr, bus_size_t count)
        !           687: {
        !           688:        count >>= 2;
        !           689:        while (count--) {
        !           690:                *(uint32_t *)addr = __shpcic_io_read_4(bsh, offset);
        !           691:                addr += 4;
        !           692:                offset += 4;
        !           693:        }
        !           694: }
        !           695:
        !           696: void
        !           697: shpcic_mem_read_raw_region_2(void *v, bus_space_handle_t bsh,
        !           698:     bus_size_t offset, uint8_t *addr, bus_size_t count)
        !           699: {
        !           700:        count >>= 1;
        !           701:        while (count--) {
        !           702:                *(uint16_t *)addr = __shpcic_mem_read_2(bsh, offset);
        !           703:                addr += 2;
        !           704:                offset += 2;
        !           705:        }
        !           706: }
        !           707:
        !           708: void
        !           709: shpcic_mem_read_raw_region_4(void *v, bus_space_handle_t bsh,
        !           710:     bus_size_t offset, uint8_t *addr, bus_size_t count)
        !           711: {
        !           712:        count >>= 2;
        !           713:        while (count--) {
        !           714:                *(uint32_t *)addr = __shpcic_mem_read_4(bsh, offset);
        !           715:                addr += 4;
        !           716:                offset += 4;
        !           717:        }
        !           718: }
        !           719:
        !           720: /* write */
        !           721: static inline void __shpcic_io_write_1(bus_space_handle_t bsh,
        !           722:     bus_size_t offset, uint8_t value);
        !           723: static inline void __shpcic_io_write_2(bus_space_handle_t bsh,
        !           724:     bus_size_t offset, uint16_t value);
        !           725: static inline void __shpcic_io_write_4(bus_space_handle_t bsh,
        !           726:     bus_size_t offset, uint32_t value);
        !           727: static inline void __shpcic_mem_write_1(bus_space_handle_t bsh,
        !           728:     bus_size_t offset, uint8_t value);
        !           729: static inline void __shpcic_mem_write_2(bus_space_handle_t bsh,
        !           730:     bus_size_t offset, uint16_t value);
        !           731: static inline void __shpcic_mem_write_4(bus_space_handle_t bsh,
        !           732:     bus_size_t offset, uint32_t value);
        !           733:
        !           734: static inline void
        !           735: __shpcic_io_write_1(bus_space_handle_t bsh, bus_size_t offset,
        !           736:     uint8_t value)
        !           737: {
        !           738:        u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK;
        !           739:
        !           740:        *(volatile uint8_t *)(SH4_PCIC_IO + adr) = value;
        !           741: }
        !           742:
        !           743: static inline void
        !           744: __shpcic_io_write_2(bus_space_handle_t bsh, bus_size_t offset,
        !           745:     uint16_t value)
        !           746: {
        !           747:        u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK;
        !           748:
        !           749:        *(volatile uint16_t *)(SH4_PCIC_IO + adr) = value;
        !           750: }
        !           751:
        !           752: static inline void
        !           753: __shpcic_io_write_4(bus_space_handle_t bsh, bus_size_t offset,
        !           754:     uint32_t value)
        !           755: {
        !           756:        u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK;
        !           757:
        !           758:        *(volatile uint32_t *)(SH4_PCIC_IO + adr) = value;
        !           759: }
        !           760:
        !           761: static inline void
        !           762: __shpcic_mem_write_1(bus_space_handle_t bsh, bus_size_t offset,
        !           763:     uint8_t value)
        !           764: {
        !           765:        u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK;
        !           766:
        !           767:        *(volatile uint8_t *)(SH4_PCIC_MEM + adr) = value;
        !           768: }
        !           769:
        !           770: static inline void
        !           771: __shpcic_mem_write_2(bus_space_handle_t bsh, bus_size_t offset,
        !           772:     uint16_t value)
        !           773: {
        !           774:        u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK;
        !           775:
        !           776:        *(volatile uint16_t *)(SH4_PCIC_MEM + adr) = value;
        !           777: }
        !           778:
        !           779: static inline void
        !           780: __shpcic_mem_write_4(bus_space_handle_t bsh, bus_size_t offset,
        !           781:     uint32_t value)
        !           782: {
        !           783:        u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK;
        !           784:
        !           785:        *(volatile uint32_t *)(SH4_PCIC_MEM + adr) = value;
        !           786: }
        !           787:
        !           788: /*
        !           789:  * write single
        !           790:  */
        !           791: void
        !           792: shpcic_io_write_1(void *v, bus_space_handle_t bsh,
        !           793:     bus_size_t offset, uint8_t value)
        !           794: {
        !           795:        __shpcic_io_write_1(bsh, offset, value);
        !           796: }
        !           797:
        !           798: void
        !           799: shpcic_io_write_2(void *v, bus_space_handle_t bsh,
        !           800:     bus_size_t offset, uint16_t value)
        !           801: {
        !           802:        __shpcic_io_write_2(bsh, offset, value);
        !           803: }
        !           804:
        !           805: void
        !           806: shpcic_io_write_4(void *v, bus_space_handle_t bsh,
        !           807:     bus_size_t offset, uint32_t value)
        !           808: {
        !           809:        __shpcic_io_write_4(bsh, offset, value);
        !           810: }
        !           811:
        !           812: void
        !           813: shpcic_mem_write_1(void *v, bus_space_handle_t bsh,
        !           814:     bus_size_t offset, uint8_t value)
        !           815: {
        !           816:        __shpcic_mem_write_1(bsh, offset, value);
        !           817: }
        !           818:
        !           819: void
        !           820: shpcic_mem_write_2(void *v, bus_space_handle_t bsh,
        !           821:     bus_size_t offset, uint16_t value)
        !           822: {
        !           823:        __shpcic_mem_write_2(bsh, offset, value);
        !           824: }
        !           825:
        !           826: void
        !           827: shpcic_mem_write_4(void *v, bus_space_handle_t bsh,
        !           828:     bus_size_t offset, uint32_t value)
        !           829: {
        !           830:        __shpcic_mem_write_4(bsh, offset, value);
        !           831: }
        !           832:
        !           833: /*
        !           834:  * write multi
        !           835:  */
        !           836: void
        !           837: shpcic_io_write_multi_1(void *v, bus_space_handle_t bsh,
        !           838:     bus_size_t offset, const uint8_t *addr, bus_size_t count)
        !           839: {
        !           840:        while (count--) {
        !           841:                __shpcic_io_write_1(bsh, offset, *addr++);
        !           842:        }
        !           843: }
        !           844:
        !           845: void
        !           846: shpcic_io_write_multi_2(void *v, bus_space_handle_t bsh,
        !           847:     bus_size_t offset, const uint16_t *addr, bus_size_t count)
        !           848: {
        !           849:        while (count--) {
        !           850:                __shpcic_io_write_2(bsh, offset, *addr++);
        !           851:        }
        !           852: }
        !           853:
        !           854: void
        !           855: shpcic_io_write_multi_4(void *v, bus_space_handle_t bsh,
        !           856:     bus_size_t offset, const uint32_t *addr, bus_size_t count)
        !           857: {
        !           858:        while (count--) {
        !           859:                __shpcic_io_write_4(bsh, offset, *addr++);
        !           860:        }
        !           861: }
        !           862:
        !           863: void
        !           864: shpcic_mem_write_multi_1(void *v, bus_space_handle_t bsh,
        !           865:     bus_size_t offset, const uint8_t *addr, bus_size_t count)
        !           866: {
        !           867:        while (count--) {
        !           868:                __shpcic_mem_write_1(bsh, offset, *addr++);
        !           869:        }
        !           870: }
        !           871:
        !           872: void
        !           873: shpcic_mem_write_multi_2(void *v, bus_space_handle_t bsh,
        !           874:     bus_size_t offset, const uint16_t *addr, bus_size_t count)
        !           875: {
        !           876:        while (count--) {
        !           877:                __shpcic_mem_write_2(bsh, offset, *addr++);
        !           878:        }
        !           879: }
        !           880:
        !           881: void
        !           882: shpcic_mem_write_multi_4(void *v, bus_space_handle_t bsh,
        !           883:     bus_size_t offset, const uint32_t *addr, bus_size_t count)
        !           884: {
        !           885:        while (count--) {
        !           886:                __shpcic_mem_write_4(bsh, offset, *addr++);
        !           887:        }
        !           888: }
        !           889:
        !           890: /*
        !           891:  * write raw multi
        !           892:  */
        !           893:
        !           894: void
        !           895: shpcic_io_write_raw_multi_2(void *v, bus_space_handle_t bsh,
        !           896:     bus_size_t offset, const uint8_t *addr, bus_size_t count)
        !           897: {
        !           898:        count >>= 1;
        !           899:        while (count--) {
        !           900:                __shpcic_io_write_2(bsh, offset, *(uint16_t *)addr);
        !           901:                addr += 2;
        !           902:        }
        !           903: }
        !           904:
        !           905: void
        !           906: shpcic_io_write_raw_multi_4(void *v, bus_space_handle_t bsh,
        !           907:     bus_size_t offset, const uint8_t *addr, bus_size_t count)
        !           908: {
        !           909:        count >>= 2;
        !           910:        while (count--) {
        !           911:                __shpcic_io_write_4(bsh, offset, *(uint32_t *)addr);
        !           912:                addr += 4;
        !           913:        }
        !           914: }
        !           915:
        !           916: void
        !           917: shpcic_mem_write_raw_multi_2(void *v, bus_space_handle_t bsh,
        !           918:     bus_size_t offset, const uint8_t *addr, bus_size_t count)
        !           919: {
        !           920:        count >>= 1;
        !           921:        while (count--) {
        !           922:                __shpcic_mem_write_2(bsh, offset, *(uint16_t *)addr);
        !           923:                addr += 2;
        !           924:        }
        !           925: }
        !           926:
        !           927: void
        !           928: shpcic_mem_write_raw_multi_4(void *v, bus_space_handle_t bsh,
        !           929:     bus_size_t offset, const uint8_t *addr, bus_size_t count)
        !           930: {
        !           931:        count >>= 2;
        !           932:        while (count--) {
        !           933:                __shpcic_mem_write_4(bsh, offset, *(uint32_t *)addr);
        !           934:                addr += 4;
        !           935:        }
        !           936: }
        !           937:
        !           938: /*
        !           939:  * write region
        !           940:  */
        !           941: void
        !           942: shpcic_io_write_region_1(void *v, bus_space_handle_t bsh,
        !           943:     bus_size_t offset, const uint8_t *addr, bus_size_t count)
        !           944: {
        !           945:        while (count--) {
        !           946:                __shpcic_io_write_1(bsh, offset, *addr++);
        !           947:                offset += 1;
        !           948:        }
        !           949: }
        !           950:
        !           951: void
        !           952: shpcic_io_write_region_2(void *v, bus_space_handle_t bsh,
        !           953:     bus_size_t offset, const uint16_t *addr, bus_size_t count)
        !           954: {
        !           955:        while (count--) {
        !           956:                __shpcic_io_write_2(bsh, offset, *addr++);
        !           957:                offset += 2;
        !           958:        }
        !           959: }
        !           960:
        !           961: void
        !           962: shpcic_io_write_region_4(void *v, bus_space_handle_t bsh,
        !           963:     bus_size_t offset, const uint32_t *addr, bus_size_t count)
        !           964: {
        !           965:        while (count--) {
        !           966:                __shpcic_io_write_4(bsh, offset, *addr++);
        !           967:                offset += 4;
        !           968:        }
        !           969: }
        !           970:
        !           971: void
        !           972: shpcic_mem_write_region_1(void *v, bus_space_handle_t bsh,
        !           973:     bus_size_t offset, const uint8_t *addr, bus_size_t count)
        !           974: {
        !           975:        while (count--) {
        !           976:                __shpcic_mem_write_1(bsh, offset, *addr++);
        !           977:                offset += 1;
        !           978:        }
        !           979: }
        !           980:
        !           981: void
        !           982: shpcic_mem_write_region_2(void *v, bus_space_handle_t bsh,
        !           983:     bus_size_t offset, const uint16_t *addr, bus_size_t count)
        !           984: {
        !           985:        while (count--) {
        !           986:                __shpcic_mem_write_2(bsh, offset, *addr++);
        !           987:                offset += 2;
        !           988:        }
        !           989: }
        !           990:
        !           991: void
        !           992: shpcic_mem_write_region_4(void *v, bus_space_handle_t bsh,
        !           993:     bus_size_t offset, const uint32_t *addr, bus_size_t count)
        !           994: {
        !           995:        while (count--) {
        !           996:                __shpcic_mem_write_4(bsh, offset, *addr++);
        !           997:                offset += 4;
        !           998:        }
        !           999: }
        !          1000:
        !          1001: /*
        !          1002:  * write raw region
        !          1003:  */
        !          1004:
        !          1005: void
        !          1006: shpcic_io_write_raw_region_2(void *v, bus_space_handle_t bsh,
        !          1007:     bus_size_t offset, const uint8_t *addr, bus_size_t count)
        !          1008: {
        !          1009:        count >>= 1;
        !          1010:        while (count--) {
        !          1011:                __shpcic_io_write_2(bsh, offset, *(uint16_t *)addr);
        !          1012:                addr += 2;
        !          1013:                offset += 2;
        !          1014:        }
        !          1015: }
        !          1016:
        !          1017: void
        !          1018: shpcic_io_write_raw_region_4(void *v, bus_space_handle_t bsh,
        !          1019:     bus_size_t offset, const uint8_t *addr, bus_size_t count)
        !          1020: {
        !          1021:        count >>= 1;
        !          1022:        while (count--) {
        !          1023:                __shpcic_io_write_4(bsh, offset, *(uint32_t *)addr);
        !          1024:                addr += 4;
        !          1025:                offset += 4;
        !          1026:        }
        !          1027: }
        !          1028:
        !          1029: void
        !          1030: shpcic_mem_write_raw_region_2(void *v, bus_space_handle_t bsh,
        !          1031:     bus_size_t offset, const uint8_t *addr, bus_size_t count)
        !          1032: {
        !          1033:        count >>= 1;
        !          1034:        while (count--) {
        !          1035:                __shpcic_mem_write_2(bsh, offset, *(uint16_t *)addr);
        !          1036:                addr += 2;
        !          1037:                offset += 2;
        !          1038:        }
        !          1039: }
        !          1040:
        !          1041: void
        !          1042: shpcic_mem_write_raw_region_4(void *v, bus_space_handle_t bsh,
        !          1043:     bus_size_t offset, const uint8_t *addr, bus_size_t count)
        !          1044: {
        !          1045:        count >>= 2;
        !          1046:        while (count--) {
        !          1047:                __shpcic_mem_write_4(bsh, offset, *(uint32_t *)addr);
        !          1048:                addr += 4;
        !          1049:                offset += 4;
        !          1050:        }
        !          1051: }
        !          1052:
        !          1053: /*
        !          1054:  * set multi
        !          1055:  */
        !          1056: void
        !          1057: shpcic_io_set_multi_1(void *v, bus_space_handle_t bsh,
        !          1058:     bus_size_t offset, uint8_t value, bus_size_t count)
        !          1059: {
        !          1060:        while (count--) {
        !          1061:                __shpcic_io_write_1(bsh, offset, value);
        !          1062:        }
        !          1063: }
        !          1064:
        !          1065: void
        !          1066: shpcic_io_set_multi_2(void *v, bus_space_handle_t bsh,
        !          1067:     bus_size_t offset, uint16_t value, bus_size_t count)
        !          1068: {
        !          1069:        while (count--) {
        !          1070:                __shpcic_io_write_2(bsh, offset, value);
        !          1071:        }
        !          1072: }
        !          1073:
        !          1074: void
        !          1075: shpcic_io_set_multi_4(void *v, bus_space_handle_t bsh,
        !          1076:     bus_size_t offset, uint32_t value, bus_size_t count)
        !          1077: {
        !          1078:        while (count--) {
        !          1079:                __shpcic_io_write_4(bsh, offset, value);
        !          1080:        }
        !          1081: }
        !          1082:
        !          1083: void
        !          1084: shpcic_mem_set_multi_1(void *v, bus_space_handle_t bsh,
        !          1085:     bus_size_t offset, uint8_t value, bus_size_t count)
        !          1086: {
        !          1087:        while (count--) {
        !          1088:                __shpcic_mem_write_1(bsh, offset, value);
        !          1089:        }
        !          1090: }
        !          1091:
        !          1092: void
        !          1093: shpcic_mem_set_multi_2(void *v, bus_space_handle_t bsh,
        !          1094:     bus_size_t offset, uint16_t value, bus_size_t count)
        !          1095: {
        !          1096:        while (count--) {
        !          1097:                __shpcic_mem_write_2(bsh, offset, value);
        !          1098:        }
        !          1099: }
        !          1100:
        !          1101: void
        !          1102: shpcic_mem_set_multi_4(void *v, bus_space_handle_t bsh,
        !          1103:     bus_size_t offset, uint32_t value, bus_size_t count)
        !          1104: {
        !          1105:        while (count--) {
        !          1106:                __shpcic_mem_write_4(bsh, offset, value);
        !          1107:        }
        !          1108: }
        !          1109:
        !          1110: /*
        !          1111:  * set region
        !          1112:  */
        !          1113: void
        !          1114: shpcic_io_set_region_1(void *v, bus_space_handle_t bsh,
        !          1115:     bus_size_t offset, uint8_t value, bus_size_t count)
        !          1116: {
        !          1117:        while (count--) {
        !          1118:                __shpcic_io_write_1(bsh, offset, value);
        !          1119:                offset += 1;
        !          1120:        }
        !          1121: }
        !          1122:
        !          1123: void
        !          1124: shpcic_io_set_region_2(void *v, bus_space_handle_t bsh,
        !          1125:     bus_size_t offset, uint16_t value, bus_size_t count)
        !          1126: {
        !          1127:        while (count--) {
        !          1128:                __shpcic_io_write_2(bsh, offset, value);
        !          1129:                offset += 2;
        !          1130:        }
        !          1131: }
        !          1132:
        !          1133: void
        !          1134: shpcic_io_set_region_4(void *v, bus_space_handle_t bsh,
        !          1135:     bus_size_t offset, uint32_t value, bus_size_t count)
        !          1136: {
        !          1137:        while (count--) {
        !          1138:                __shpcic_io_write_4(bsh, offset, value);
        !          1139:                offset += 4;
        !          1140:        }
        !          1141: }
        !          1142:
        !          1143: void
        !          1144: shpcic_mem_set_region_1(void *v, bus_space_handle_t bsh,
        !          1145:     bus_size_t offset, uint8_t value, bus_size_t count)
        !          1146: {
        !          1147:        while (count--) {
        !          1148:                __shpcic_mem_write_1(bsh, offset, value);
        !          1149:                offset += 1;
        !          1150:        }
        !          1151: }
        !          1152:
        !          1153: void
        !          1154: shpcic_mem_set_region_2(void *v, bus_space_handle_t bsh,
        !          1155:     bus_size_t offset, uint16_t value, bus_size_t count)
        !          1156: {
        !          1157:        while (count--) {
        !          1158:                __shpcic_mem_write_2(bsh, offset, value);
        !          1159:                offset += 2;
        !          1160:        }
        !          1161: }
        !          1162:
        !          1163: void
        !          1164: shpcic_mem_set_region_4(void *v, bus_space_handle_t bsh,
        !          1165:     bus_size_t offset, uint32_t value, bus_size_t count)
        !          1166: {
        !          1167:        while (count--) {
        !          1168:                __shpcic_mem_write_4(bsh, offset, value);
        !          1169:                offset += 4;
        !          1170:        }
        !          1171: }
        !          1172:
        !          1173: /*
        !          1174:  * copy region
        !          1175:  */
        !          1176: void
        !          1177: shpcic_io_copy_region_1(void *v, bus_space_handle_t bsh1,
        !          1178:     bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count)
        !          1179: {
        !          1180:        u_long addr1 = bsh1 + off1;
        !          1181:        u_long addr2 = bsh2 + off2;
        !          1182:        uint8_t value;
        !          1183:
        !          1184:        if (addr1 >= addr2) {   /* src after dest: copy forward */
        !          1185:                while (count--) {
        !          1186:                        value = __shpcic_io_read_1(bsh1, off1);
        !          1187:                        __shpcic_io_write_1(bsh2, off2, value);
        !          1188:                        off1 += 1;
        !          1189:                        off2 += 1;
        !          1190:                }
        !          1191:        } else {                /* dest after src: copy backwards */
        !          1192:                off1 += (count - 1) * 1;
        !          1193:                off2 += (count - 1) * 1;
        !          1194:                while (count--) {
        !          1195:                        value = __shpcic_io_read_1(bsh1, off1);
        !          1196:                        __shpcic_io_write_1(bsh2, off2, value);
        !          1197:                        off1 -= 1;
        !          1198:                        off2 -= 1;
        !          1199:                }
        !          1200:        }
        !          1201: }
        !          1202:
        !          1203: void
        !          1204: shpcic_io_copy_region_2(void *v, bus_space_handle_t bsh1,
        !          1205:     bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count)
        !          1206: {
        !          1207:        u_long addr1 = bsh1 + off1;
        !          1208:        u_long addr2 = bsh2 + off2;
        !          1209:        uint16_t value;
        !          1210:
        !          1211:        if (addr1 >= addr2) {   /* src after dest: copy forward */
        !          1212:                while (count--) {
        !          1213:                        value = __shpcic_io_read_2(bsh1, off1);
        !          1214:                        __shpcic_io_write_2(bsh2, off2, value);
        !          1215:                        off1 += 2;
        !          1216:                        off2 += 2;
        !          1217:                }
        !          1218:        } else {                /* dest after src: copy backwards */
        !          1219:                off1 += (count - 1) * 2;
        !          1220:                off2 += (count - 1) * 2;
        !          1221:                while (count--) {
        !          1222:                        value = __shpcic_io_read_2(bsh1, off1);
        !          1223:                        __shpcic_io_write_2(bsh2, off2, value);
        !          1224:                        off1 -= 2;
        !          1225:                        off2 -= 2;
        !          1226:                }
        !          1227:        }
        !          1228: }
        !          1229:
        !          1230: void
        !          1231: shpcic_io_copy_region_4(void *v, bus_space_handle_t bsh1,
        !          1232:     bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count)
        !          1233: {
        !          1234:        u_long addr1 = bsh1 + off1;
        !          1235:        u_long addr2 = bsh2 + off2;
        !          1236:        uint32_t value;
        !          1237:
        !          1238:        if (addr1 >= addr2) {   /* src after dest: copy forward */
        !          1239:                while (count--) {
        !          1240:                        value = __shpcic_io_read_4(bsh1, off1);
        !          1241:                        __shpcic_io_write_4(bsh2, off2, value);
        !          1242:                        off1 += 4;
        !          1243:                        off2 += 4;
        !          1244:                }
        !          1245:        } else {                /* dest after src: copy backwards */
        !          1246:                off1 += (count - 1) * 4;
        !          1247:                off2 += (count - 1) * 4;
        !          1248:                while (count--) {
        !          1249:                        value = __shpcic_io_read_4(bsh1, off1);
        !          1250:                        __shpcic_io_write_4(bsh2, off2, value);
        !          1251:                        off1 -= 4;
        !          1252:                        off2 -= 4;
        !          1253:                }
        !          1254:        }
        !          1255: }
        !          1256:
        !          1257: void
        !          1258: shpcic_mem_copy_region_1(void *v, bus_space_handle_t bsh1,
        !          1259:     bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count)
        !          1260: {
        !          1261:        u_long addr1 = bsh1 + off1;
        !          1262:        u_long addr2 = bsh2 + off2;
        !          1263:        uint8_t value;
        !          1264:
        !          1265:        if (addr1 >= addr2) {   /* src after dest: copy forward */
        !          1266:                while (count--) {
        !          1267:                        value = __shpcic_mem_read_1(bsh1, off1);
        !          1268:                        __shpcic_mem_write_1(bsh2, off2, value);
        !          1269:                        off1 += 1;
        !          1270:                        off2 += 1;
        !          1271:                }
        !          1272:        } else {                /* dest after src: copy backwards */
        !          1273:                off1 += (count - 1) * 1;
        !          1274:                off2 += (count - 1) * 1;
        !          1275:                while (count--) {
        !          1276:                        value = __shpcic_mem_read_1(bsh1, off1);
        !          1277:                        __shpcic_mem_write_1(bsh2, off2, value);
        !          1278:                        off1 -= 1;
        !          1279:                        off2 -= 1;
        !          1280:                }
        !          1281:        }
        !          1282: }
        !          1283:
        !          1284: void
        !          1285: shpcic_mem_copy_region_2(void *v, bus_space_handle_t bsh1,
        !          1286:     bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count)
        !          1287: {
        !          1288:        u_long addr1 = bsh1 + off1;
        !          1289:        u_long addr2 = bsh2 + off2;
        !          1290:        uint16_t value;
        !          1291:
        !          1292:        if (addr1 >= addr2) {   /* src after dest: copy forward */
        !          1293:                while (count--) {
        !          1294:                        value = __shpcic_mem_read_2(bsh1, off1);
        !          1295:                        __shpcic_mem_write_2(bsh2, off2, value);
        !          1296:                        off1 += 2;
        !          1297:                        off2 += 2;
        !          1298:                }
        !          1299:        } else {                /* dest after src: copy backwards */
        !          1300:                off1 += (count - 1) * 2;
        !          1301:                off2 += (count - 1) * 2;
        !          1302:                while (count--) {
        !          1303:                        value = __shpcic_mem_read_2(bsh1, off1);
        !          1304:                        __shpcic_mem_write_2(bsh2, off2, value);
        !          1305:                        off1 -= 2;
        !          1306:                        off2 -= 2;
        !          1307:                }
        !          1308:        }
        !          1309: }
        !          1310:
        !          1311: void
        !          1312: shpcic_mem_copy_region_4(void *v, bus_space_handle_t bsh1,
        !          1313:     bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count)
        !          1314: {
        !          1315:        u_long addr1 = bsh1 + off1;
        !          1316:        u_long addr2 = bsh2 + off2;
        !          1317:        uint32_t value;
        !          1318:
        !          1319:        if (addr1 >= addr2) {   /* src after dest: copy forward */
        !          1320:                while (count--) {
        !          1321:                        value = __shpcic_mem_read_4(bsh1, off1);
        !          1322:                        __shpcic_mem_write_4(bsh2, off2, value);
        !          1323:                        off1 += 4;
        !          1324:                        off2 += 4;
        !          1325:                }
        !          1326:        } else {                /* dest after src: copy backwards */
        !          1327:                off1 += (count - 1) * 4;
        !          1328:                off2 += (count - 1) * 4;
        !          1329:                while (count--) {
        !          1330:                        value = __shpcic_mem_read_4(bsh1, off1);
        !          1331:                        __shpcic_mem_write_4(bsh2, off2, value);
        !          1332:                        off1 -= 4;
        !          1333:                        off2 -= 4;
        !          1334:                }
        !          1335:        }
        !          1336: }

CVSweb