1*3836e7c7Smiod /* $OpenBSD: shpcic.c,v 1.15 2024/11/05 18:58:59 miod Exp $ */ 295c7671fSmiod /* $NetBSD: shpcic.c,v 1.10 2005/12/24 20:07:32 perry Exp $ */ 395c7671fSmiod 495c7671fSmiod /* 595c7671fSmiod * Copyright (c) 2005 NONAKA Kimihiro 695c7671fSmiod * All rights reserved. 795c7671fSmiod * 895c7671fSmiod * Redistribution and use in source and binary forms, with or without 995c7671fSmiod * modification, are permitted provided that the following conditions 1095c7671fSmiod * are met: 1195c7671fSmiod * 1. Redistributions of source code must retain the above copyright 1295c7671fSmiod * notice, this list of conditions and the following disclaimer. 1395c7671fSmiod * 2. Redistributions in binary form must reproduce the above copyright 1495c7671fSmiod * notice, this list of conditions and the following disclaimer in the 1595c7671fSmiod * documentation and/or other materials provided with the distribution. 1695c7671fSmiod * 1795c7671fSmiod * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1895c7671fSmiod * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1995c7671fSmiod * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 2095c7671fSmiod * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2195c7671fSmiod * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2295c7671fSmiod * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2395c7671fSmiod * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2495c7671fSmiod * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2595c7671fSmiod * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2695c7671fSmiod * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2795c7671fSmiod */ 2895c7671fSmiod 2995c7671fSmiod #include <sys/param.h> 3095c7671fSmiod #include <sys/systm.h> 3195c7671fSmiod #include <sys/kernel.h> 3295c7671fSmiod #include <sys/device.h> 3395c7671fSmiod #include <sys/extent.h> 3495c7671fSmiod #include <sys/malloc.h> 3595c7671fSmiod 3695c7671fSmiod #include <dev/pci/pcireg.h> 3795c7671fSmiod #include <dev/pci/pcivar.h> 3895c7671fSmiod #include <dev/pci/pcidevs.h> 3995c7671fSmiod 4095c7671fSmiod #include <sh/bscreg.h> 4195c7671fSmiod #include <sh/cache.h> 4295c7671fSmiod #include <sh/trap.h> 4395c7671fSmiod #include <sh/dev/pcicreg.h> 4495c7671fSmiod 45af87755aSmiod #include <machine/autoconf.h> 4695c7671fSmiod #include <machine/bus.h> 4795c7671fSmiod #include <machine/intr.h> 4895c7671fSmiod 4995c7671fSmiod #if defined(SHPCIC_DEBUG) 5095c7671fSmiod int shpcic_debug = 0; 5195c7671fSmiod #define DPRINTF(arg) if (shpcic_debug) printf arg 5295c7671fSmiod #else 5395c7671fSmiod #define DPRINTF(arg) 5495c7671fSmiod #endif 5595c7671fSmiod 5695c7671fSmiod #define PCI_MODE1_ENABLE 0x80000000UL 5795c7671fSmiod 5895c7671fSmiod static const struct shpcic_product { 5995c7671fSmiod uint32_t sp_product; 6095c7671fSmiod const char *sp_name; 6195c7671fSmiod } shpcic_products[] = { 6295c7671fSmiod { PCI_PRODUCT_HITACHI_SH7751, "SH7751" }, 6395c7671fSmiod { PCI_PRODUCT_HITACHI_SH7751R, "SH7751R" }, 6495c7671fSmiod 6595c7671fSmiod { 0, NULL }, 6695c7671fSmiod }; 6795c7671fSmiod 6895c7671fSmiod int shpcic_match(struct device *, void *, void *); 6995c7671fSmiod void shpcic_attach(struct device *, struct device *, void *); 7095c7671fSmiod 71471aeecfSnaddy const struct cfattach shpcic_ca = { 725e123da1Sdrahn sizeof(struct shpcic_softc), shpcic_match, shpcic_attach 7395c7671fSmiod }; 7495c7671fSmiod 7595c7671fSmiod struct cfdriver shpcic_cd = { 76*3836e7c7Smiod NULL, "shpcic", DV_DULL 7795c7671fSmiod }; 7895c7671fSmiod 7995c7671fSmiod /* There can be only one. */ 8095c7671fSmiod int shpcic_found = 0; 8195c7671fSmiod 8295c7671fSmiod static const struct shpcic_product *shpcic_lookup(void); 8395c7671fSmiod 8495c7671fSmiod static const struct shpcic_product * 8595c7671fSmiod shpcic_lookup(void) 8695c7671fSmiod { 8795c7671fSmiod const struct shpcic_product *spp; 8895c7671fSmiod pcireg_t id; 8995c7671fSmiod 9095c7671fSmiod id = _reg_read_4(SH4_PCICONF0); 9195c7671fSmiod switch (PCI_VENDOR(id)) { 9295c7671fSmiod case PCI_VENDOR_HITACHI: 9395c7671fSmiod break; 9495c7671fSmiod 9595c7671fSmiod default: 9695c7671fSmiod return (NULL); 9795c7671fSmiod } 9895c7671fSmiod 9995c7671fSmiod for (spp = shpcic_products; spp->sp_name != NULL; spp++) { 10095c7671fSmiod if (PCI_PRODUCT(id) == spp->sp_product) { 10195c7671fSmiod return (spp); 10295c7671fSmiod } 10395c7671fSmiod } 10495c7671fSmiod return (NULL); 10595c7671fSmiod } 10695c7671fSmiod 10795c7671fSmiod int 10895c7671fSmiod shpcic_match(struct device *parent, void *vcf, void *aux) 10995c7671fSmiod { 110af87755aSmiod struct mainbus_attach_args *ma = aux; 111af87755aSmiod 112af87755aSmiod if (strcmp(ma->ma_name, shpcic_cd.cd_name) != 0) 113af87755aSmiod return (0); 114af87755aSmiod 11595c7671fSmiod if (!CPU_IS_SH4) 11695c7671fSmiod return (0); 11795c7671fSmiod 11895c7671fSmiod switch (cpu_product) { 11995c7671fSmiod default: 12095c7671fSmiod return (0); 12195c7671fSmiod 12295c7671fSmiod case CPU_PRODUCT_7751: 12395c7671fSmiod case CPU_PRODUCT_7751R: 12495c7671fSmiod break; 12595c7671fSmiod } 12695c7671fSmiod 12795c7671fSmiod if (shpcic_found) 12895c7671fSmiod return (0); 12995c7671fSmiod 13095c7671fSmiod if (shpcic_lookup() == NULL) 13195c7671fSmiod return (0); 13295c7671fSmiod 13395c7671fSmiod if (_reg_read_2(SH4_BCR2) & BCR2_PORTEN) 13495c7671fSmiod return (0); 13595c7671fSmiod 13695c7671fSmiod return (1); 13795c7671fSmiod } 13895c7671fSmiod 13995c7671fSmiod void 14095c7671fSmiod shpcic_attach(struct device *parent, struct device *self, void *aux) 14195c7671fSmiod { 14295c7671fSmiod const struct shpcic_product *spp; 1435e123da1Sdrahn struct shpcic_softc *sc = (struct shpcic_softc *)self; 14495c7671fSmiod struct pcibus_attach_args pba; 1451cba604cSkettenis struct extent *io_ex; 1461cba604cSkettenis struct extent *mem_ex; 14795c7671fSmiod 14895c7671fSmiod shpcic_found = 1; 14995c7671fSmiod 15095c7671fSmiod spp = shpcic_lookup(); 15195c7671fSmiod if (spp == NULL) { 15295c7671fSmiod printf("\n"); 15395c7671fSmiod panic("shpcic_attach: impossible"); 15495c7671fSmiod } 15595c7671fSmiod 15695c7671fSmiod if (_reg_read_2(SH4_BCR2) & BCR2_PORTEN) { 15795c7671fSmiod printf("\n"); 15895c7671fSmiod panic("shpcic_attach: port enabled"); 15995c7671fSmiod } 16095c7671fSmiod 16195c7671fSmiod printf(": HITACHI %s\n", spp->sp_name); 16295c7671fSmiod 16395c7671fSmiod /* allow PCIC request */ 16495c7671fSmiod _reg_write_4(SH4_BCR1, _reg_read_4(SH4_BCR1) | BCR1_BREQEN); 16595c7671fSmiod 16695c7671fSmiod /* Initialize PCIC */ 16795c7671fSmiod _reg_write_4(SH4_PCICR, PCICR_BASE | PCICR_RSTCTL); 16895c7671fSmiod delay(10 * 1000); 16995c7671fSmiod _reg_write_4(SH4_PCICR, PCICR_BASE); 17095c7671fSmiod 17195c7671fSmiod /* Class: Host-Bridge */ 17295c7671fSmiod _reg_write_4(SH4_PCICONF2, 17395c7671fSmiod (PCI_CLASS_BRIDGE << PCI_CLASS_SHIFT) | 17495c7671fSmiod (PCI_SUBCLASS_BRIDGE_HOST << PCI_SUBCLASS_SHIFT)); 17595c7671fSmiod 17695c7671fSmiod #if !defined(DONT_INIT_PCIBSC) 17795c7671fSmiod #if defined(PCIBCR_BCR1_VAL) 17895c7671fSmiod _reg_write_4(SH4_PCIBCR1, PCIBCR_BCR1_VAL); 17995c7671fSmiod #else 18095c7671fSmiod _reg_write_4(SH4_PCIBCR1, _reg_read_4(SH4_BCR1) | BCR1_MASTER); 18195c7671fSmiod #endif 18295c7671fSmiod #if defined(PCIBCR_BCR2_VAL) 18395c7671fSmiod _reg_write_4(SH4_PCIBCR2, PCIBCR_BCR2_VAL); 18495c7671fSmiod #else 18595c7671fSmiod _reg_write_4(SH4_PCIBCR2, _reg_read_2(SH4_BCR2)); 18695c7671fSmiod #endif 18795c7671fSmiod #if defined(SH4) && defined(SH7751R) 18895c7671fSmiod if (cpu_product == CPU_PRODUCT_7751R) { 18995c7671fSmiod #if defined(PCIBCR_BCR3_VAL) 19095c7671fSmiod _reg_write_4(SH4_PCIBCR3, PCIBCR_BCR3_VAL); 19195c7671fSmiod #else 19295c7671fSmiod _reg_write_4(SH4_PCIBCR3, _reg_read_2(SH4_BCR3)); 19395c7671fSmiod #endif 19495c7671fSmiod } 19595c7671fSmiod #endif /* SH4 && SH7751R && PCIBCR_BCR3_VAL */ 19695c7671fSmiod #if defined(PCIBCR_WCR1_VAL) 19795c7671fSmiod _reg_write_4(SH4_PCIWCR1, PCIBCR_WCR1_VAL); 19895c7671fSmiod #else 19995c7671fSmiod _reg_write_4(SH4_PCIWCR1, _reg_read_4(SH4_WCR1)); 20095c7671fSmiod #endif 20195c7671fSmiod #if defined(PCIBCR_WCR2_VAL) 20295c7671fSmiod _reg_write_4(SH4_PCIWCR2, PCIBCR_WCR2_VAL); 20395c7671fSmiod #else 20495c7671fSmiod _reg_write_4(SH4_PCIWCR2, _reg_read_4(SH4_WCR2)); 20595c7671fSmiod #endif 20695c7671fSmiod #if defined(PCIBCR_WCR3_VAL) 20795c7671fSmiod _reg_write_4(SH4_PCIWCR3, PCIBCR_WCR3_VAL); 20895c7671fSmiod #else 20995c7671fSmiod _reg_write_4(SH4_PCIWCR3, _reg_read_4(SH4_WCR3)); 21095c7671fSmiod #endif 21195c7671fSmiod #if defined(PCIBCR_MCR_VAL) 21295c7671fSmiod _reg_write_4(SH4_PCIMCR, PCIBCR_MCR_VAL); 21395c7671fSmiod #else 21495c7671fSmiod _reg_write_4(SH4_PCIMCR, _reg_read_4(SH4_MCR)); 21595c7671fSmiod #endif 21695c7671fSmiod #endif /* !DONT_INIT_PCIBSC */ 21795c7671fSmiod 21895c7671fSmiod /* set PCI I/O, memory base address */ 21995c7671fSmiod _reg_write_4(SH4_PCIIOBR, SH4_PCIC_IO); 22095c7671fSmiod _reg_write_4(SH4_PCIMBR, SH4_PCIC_MEM); 22195c7671fSmiod 22295c7671fSmiod /* set PCI local address 0 */ 22395c7671fSmiod _reg_write_4(SH4_PCILSR0, (64 - 1) << 20); 22495c7671fSmiod _reg_write_4(SH4_PCILAR0, 0xac000000); 22595c7671fSmiod _reg_write_4(SH4_PCICONF5, 0xac000000); 22695c7671fSmiod 22795c7671fSmiod /* set PCI local address 1 */ 22895c7671fSmiod _reg_write_4(SH4_PCILSR1, (64 - 1) << 20); 22995c7671fSmiod _reg_write_4(SH4_PCILAR1, 0xac000000); 23095c7671fSmiod _reg_write_4(SH4_PCICONF6, 0x8c000000); 23195c7671fSmiod 23295c7671fSmiod /* Enable I/O, memory, bus-master */ 23395c7671fSmiod _reg_write_4(SH4_PCICONF1, PCI_COMMAND_IO_ENABLE 23495c7671fSmiod | PCI_COMMAND_MEM_ENABLE 23595c7671fSmiod | PCI_COMMAND_MASTER_ENABLE 23695c7671fSmiod | PCI_COMMAND_STEPPING_ENABLE 23795c7671fSmiod | PCI_STATUS_DEVSEL_MEDIUM); 23895c7671fSmiod 23995c7671fSmiod /* Initialize done. */ 24095c7671fSmiod _reg_write_4(SH4_PCICR, PCICR_BASE | PCICR_CFINIT); 24195c7671fSmiod 24295c7671fSmiod /* set PCI controller interrupt priority */ 243cdc146a0Smiod intpri_intr_priority(SH4_INTEVT_PCIERR, IPL_BIO); /* IPL_HIGH? */ 244cdc146a0Smiod intpri_intr_priority(SH4_INTEVT_PCISERR, IPL_BIO); /* IPL_HIGH? */ 24595c7671fSmiod 2465e123da1Sdrahn sc->sc_membus_space.bus_base = SH4_PCIC_MEM; 2475e123da1Sdrahn sc->sc_membus_space.bus_size = SH4_PCIC_MEM_SIZE; 2485e123da1Sdrahn sc->sc_membus_space.bus_io = 0; 2495e123da1Sdrahn sc->sc_iobus_space.bus_base = SH4_PCIC_IO; /* XXX */ 2505e123da1Sdrahn sc->sc_iobus_space.bus_size = SH4_PCIC_IO_SIZE; 2517581bcc6Stom sc->sc_iobus_space.bus_io = 1; 2525e123da1Sdrahn 25315a455f6Smiod io_ex = extent_create("pciio", 0, 0xffffffff, M_DEVBUF, NULL, 0, 25415a455f6Smiod EX_NOWAIT | EX_FILLED); 25515a455f6Smiod if (io_ex != NULL) 25615a455f6Smiod extent_free(io_ex, SH4_PCIC_IO, SH4_PCIC_IO_SIZE, EX_NOWAIT); 25715a455f6Smiod mem_ex = extent_create("pcimem", 0, 0xffffffff, M_DEVBUF, NULL, 0, 25815a455f6Smiod EX_NOWAIT | EX_FILLED); 25915a455f6Smiod if (mem_ex != NULL) 26015a455f6Smiod extent_free(mem_ex, SH4_PCIC_MEM, SH4_PCIC_MEM_SIZE, EX_NOWAIT); 2611cba604cSkettenis 2625e123da1Sdrahn sc->sc_pci_chipset = shpcic_get_bus_mem_tag(); 2635e123da1Sdrahn 26495c7671fSmiod /* PCI bus */ 26595c7671fSmiod memset(&pba, 0, sizeof(pba)); 266dc923f08Sdrahn pba.pba_busname = "pci"; 26795c7671fSmiod pba.pba_iot = shpcic_get_bus_io_tag(); 26895c7671fSmiod pba.pba_memt = shpcic_get_bus_mem_tag(); 26995c7671fSmiod pba.pba_dmat = shpcic_get_bus_dma_tag(); 2701cba604cSkettenis pba.pba_ioex = io_ex; 2711cba604cSkettenis pba.pba_memex = mem_ex; 27295c7671fSmiod pba.pba_pc = NULL; 273d307f358Skettenis pba.pba_domain = pci_ndomains++; 27495c7671fSmiod pba.pba_bus = 0; 27595c7671fSmiod pba.pba_bridgetag = NULL; 27695c7671fSmiod config_found(self, &pba, NULL); 27795c7671fSmiod } 27895c7671fSmiod 27995c7671fSmiod int 28095c7671fSmiod shpcic_bus_maxdevs(void *v, int busno) 28195c7671fSmiod { 28295c7671fSmiod /* 28395c7671fSmiod * Bus number is irrelevant. Configuration Mechanism 1 is in 28495c7671fSmiod * use, can have devices 0-32 (i.e. the `normal' range). 28595c7671fSmiod */ 28695c7671fSmiod return (32); 28795c7671fSmiod } 28895c7671fSmiod 28995c7671fSmiod pcitag_t 29095c7671fSmiod shpcic_make_tag(void *v, int bus, int device, int function) 29195c7671fSmiod { 29295c7671fSmiod pcitag_t tag; 29395c7671fSmiod 29495c7671fSmiod if (bus >= 256 || device >= 32 || function >= 8) 29595c7671fSmiod panic("pci_make_tag: bad request"); 29695c7671fSmiod 29795c7671fSmiod tag = PCI_MODE1_ENABLE | 29895c7671fSmiod (bus << 16) | (device << 11) | (function << 8); 29995c7671fSmiod 30095c7671fSmiod return (tag); 30195c7671fSmiod } 30295c7671fSmiod 30395c7671fSmiod void 30495c7671fSmiod shpcic_decompose_tag(void *v, pcitag_t tag, int *bp, int *dp, int *fp) 30595c7671fSmiod { 30695c7671fSmiod if (bp != NULL) 30795c7671fSmiod *bp = (tag >> 16) & 0xff; 30895c7671fSmiod if (dp != NULL) 30995c7671fSmiod *dp = (tag >> 11) & 0x1f; 31095c7671fSmiod if (fp != NULL) 31195c7671fSmiod *fp = (tag >> 8) & 0x7; 31295c7671fSmiod } 31395c7671fSmiod 314b1926db3Smiod int 315b1926db3Smiod shpcic_conf_size(void *v, pcitag_t tag) 316b1926db3Smiod { 317b1926db3Smiod return PCI_CONFIG_SPACE_SIZE; 318b1926db3Smiod } 319b1926db3Smiod 32095c7671fSmiod pcireg_t 32195c7671fSmiod shpcic_conf_read(void *v, pcitag_t tag, int reg) 32295c7671fSmiod { 32395c7671fSmiod pcireg_t data; 32495c7671fSmiod int s; 32595c7671fSmiod 32695c7671fSmiod s = splhigh(); 32795c7671fSmiod _reg_write_4(SH4_PCIPAR, tag | reg); 32895c7671fSmiod data = _reg_read_4(SH4_PCIPDR); 32995c7671fSmiod _reg_write_4(SH4_PCIPAR, 0); 33095c7671fSmiod splx(s); 33195c7671fSmiod 33295c7671fSmiod return data; 33395c7671fSmiod } 33495c7671fSmiod 33595c7671fSmiod void 33695c7671fSmiod shpcic_conf_write(void *v, pcitag_t tag, int reg, pcireg_t data) 33795c7671fSmiod { 33895c7671fSmiod int s; 33995c7671fSmiod 34095c7671fSmiod s = splhigh(); 34195c7671fSmiod _reg_write_4(SH4_PCIPAR, tag | reg); 34295c7671fSmiod _reg_write_4(SH4_PCIPDR, data); 34395c7671fSmiod _reg_write_4(SH4_PCIPAR, 0); 34495c7671fSmiod splx(s); 34595c7671fSmiod } 34695c7671fSmiod 34795c7671fSmiod /* 34895c7671fSmiod * shpcic bus space 34995c7671fSmiod */ 35095c7671fSmiod int 35195c7671fSmiod shpcic_iomem_map(void *v, bus_addr_t bpa, bus_size_t size, 35295c7671fSmiod int flags, bus_space_handle_t *bshp) 35395c7671fSmiod { 35495c7671fSmiod *bshp = (bus_space_handle_t)bpa; 35595c7671fSmiod 35695c7671fSmiod return (0); 35795c7671fSmiod } 35895c7671fSmiod 35995c7671fSmiod void 36095c7671fSmiod shpcic_iomem_unmap(void *v, bus_space_handle_t bsh, bus_size_t size) 36195c7671fSmiod { 36295c7671fSmiod /* Nothing to do */ 36395c7671fSmiod } 36495c7671fSmiod 36595c7671fSmiod int 36695c7671fSmiod shpcic_iomem_subregion(void *v, bus_space_handle_t bsh, 36795c7671fSmiod bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp) 36895c7671fSmiod { 36995c7671fSmiod *nbshp = bsh + offset; 37095c7671fSmiod 37195c7671fSmiod return (0); 37295c7671fSmiod } 37395c7671fSmiod 37495c7671fSmiod int 37595c7671fSmiod shpcic_iomem_alloc(void *v, bus_addr_t rstart, bus_addr_t rend, 37695c7671fSmiod bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags, 37795c7671fSmiod bus_addr_t *bpap, bus_space_handle_t *bshp) 37895c7671fSmiod { 37995c7671fSmiod *bshp = *bpap = rstart; 38095c7671fSmiod 38195c7671fSmiod return (0); 38295c7671fSmiod } 38395c7671fSmiod 38495c7671fSmiod void 38595c7671fSmiod shpcic_iomem_free(void *v, bus_space_handle_t bsh, bus_size_t size) 38695c7671fSmiod { 38795c7671fSmiod /* Nothing to do */ 38895c7671fSmiod } 38995c7671fSmiod 390c991c6fcSmiod void * 391c991c6fcSmiod shpcic_iomem_vaddr(void *v, bus_space_handle_t bsh) 392c991c6fcSmiod { 393c991c6fcSmiod return ((void *)bsh); 394c991c6fcSmiod } 395c991c6fcSmiod 39695c7671fSmiod /* 39795c7671fSmiod * shpcic bus space io/mem read/write 39895c7671fSmiod */ 39995c7671fSmiod /* read */ 40095c7671fSmiod static inline uint8_t __shpcic_io_read_1(bus_space_handle_t bsh, 40195c7671fSmiod bus_size_t offset); 40295c7671fSmiod static inline uint16_t __shpcic_io_read_2(bus_space_handle_t bsh, 40395c7671fSmiod bus_size_t offset); 40495c7671fSmiod static inline uint32_t __shpcic_io_read_4(bus_space_handle_t bsh, 40595c7671fSmiod bus_size_t offset); 40695c7671fSmiod static inline uint8_t __shpcic_mem_read_1(bus_space_handle_t bsh, 40795c7671fSmiod bus_size_t offset); 40895c7671fSmiod static inline uint16_t __shpcic_mem_read_2(bus_space_handle_t bsh, 40995c7671fSmiod bus_size_t offset); 41095c7671fSmiod static inline uint32_t __shpcic_mem_read_4(bus_space_handle_t bsh, 41195c7671fSmiod bus_size_t offset); 41295c7671fSmiod 41395c7671fSmiod static inline uint8_t 41495c7671fSmiod __shpcic_io_read_1(bus_space_handle_t bsh, bus_size_t offset) 41595c7671fSmiod { 41695c7671fSmiod u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK; 41795c7671fSmiod 41895c7671fSmiod return *(volatile uint8_t *)(SH4_PCIC_IO + adr); 41995c7671fSmiod } 42095c7671fSmiod 42195c7671fSmiod static inline uint16_t 42295c7671fSmiod __shpcic_io_read_2(bus_space_handle_t bsh, bus_size_t offset) 42395c7671fSmiod { 42495c7671fSmiod u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK; 42595c7671fSmiod 42695c7671fSmiod return *(volatile uint16_t *)(SH4_PCIC_IO + adr); 42795c7671fSmiod } 42895c7671fSmiod 42995c7671fSmiod static inline uint32_t 43095c7671fSmiod __shpcic_io_read_4(bus_space_handle_t bsh, bus_size_t offset) 43195c7671fSmiod { 43295c7671fSmiod u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK; 43395c7671fSmiod 43495c7671fSmiod return *(volatile uint32_t *)(SH4_PCIC_IO + adr); 43595c7671fSmiod } 43695c7671fSmiod 43795c7671fSmiod static inline uint8_t 43895c7671fSmiod __shpcic_mem_read_1(bus_space_handle_t bsh, bus_size_t offset) 43995c7671fSmiod { 44095c7671fSmiod u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK; 44195c7671fSmiod 44295c7671fSmiod return *(volatile uint8_t *)(SH4_PCIC_MEM + adr); 44395c7671fSmiod } 44495c7671fSmiod 44595c7671fSmiod static inline uint16_t 44695c7671fSmiod __shpcic_mem_read_2(bus_space_handle_t bsh, bus_size_t offset) 44795c7671fSmiod { 44895c7671fSmiod u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK; 44995c7671fSmiod 45095c7671fSmiod return *(volatile uint16_t *)(SH4_PCIC_MEM + adr); 45195c7671fSmiod } 45295c7671fSmiod 45395c7671fSmiod static inline uint32_t 45495c7671fSmiod __shpcic_mem_read_4(bus_space_handle_t bsh, bus_size_t offset) 45595c7671fSmiod { 45695c7671fSmiod u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK; 45795c7671fSmiod 45895c7671fSmiod return *(volatile uint32_t *)(SH4_PCIC_MEM + adr); 45995c7671fSmiod } 46095c7671fSmiod 46195c7671fSmiod /* 46295c7671fSmiod * read single 46395c7671fSmiod */ 46495c7671fSmiod uint8_t 46595c7671fSmiod shpcic_io_read_1(void *v, bus_space_handle_t bsh, bus_size_t offset) 46695c7671fSmiod { 46795c7671fSmiod uint8_t value; 46895c7671fSmiod 46995c7671fSmiod value = __shpcic_io_read_1(bsh, offset); 47095c7671fSmiod 47195c7671fSmiod return value; 47295c7671fSmiod } 47395c7671fSmiod 47495c7671fSmiod uint16_t 47595c7671fSmiod shpcic_io_read_2(void *v, bus_space_handle_t bsh, bus_size_t offset) 47695c7671fSmiod { 47795c7671fSmiod uint16_t value; 47895c7671fSmiod 47995c7671fSmiod value = __shpcic_io_read_2(bsh, offset); 48095c7671fSmiod 48195c7671fSmiod return value; 48295c7671fSmiod } 48395c7671fSmiod 48495c7671fSmiod uint32_t 48595c7671fSmiod shpcic_io_read_4(void *v, bus_space_handle_t bsh, bus_size_t offset) 48695c7671fSmiod { 48795c7671fSmiod uint32_t value; 48895c7671fSmiod 48995c7671fSmiod value = __shpcic_io_read_4(bsh, offset); 49095c7671fSmiod 49195c7671fSmiod return value; 49295c7671fSmiod } 49395c7671fSmiod 49495c7671fSmiod uint8_t 49595c7671fSmiod shpcic_mem_read_1(void *v, bus_space_handle_t bsh, bus_size_t offset) 49695c7671fSmiod { 49795c7671fSmiod uint8_t value; 49895c7671fSmiod 49995c7671fSmiod value = __shpcic_mem_read_1(bsh, offset); 50095c7671fSmiod 50195c7671fSmiod return value; 50295c7671fSmiod } 50395c7671fSmiod 50495c7671fSmiod uint16_t 50595c7671fSmiod shpcic_mem_read_2(void *v, bus_space_handle_t bsh, bus_size_t offset) 50695c7671fSmiod { 50795c7671fSmiod uint16_t value; 50895c7671fSmiod 50995c7671fSmiod value = __shpcic_mem_read_2(bsh, offset); 51095c7671fSmiod 51195c7671fSmiod return value; 51295c7671fSmiod } 51395c7671fSmiod 51495c7671fSmiod uint32_t 51595c7671fSmiod shpcic_mem_read_4(void *v, bus_space_handle_t bsh, bus_size_t offset) 51695c7671fSmiod { 51795c7671fSmiod uint32_t value; 51895c7671fSmiod 51995c7671fSmiod value = __shpcic_mem_read_4(bsh, offset); 52095c7671fSmiod 52195c7671fSmiod return value; 52295c7671fSmiod } 52395c7671fSmiod 52495c7671fSmiod /* 52595c7671fSmiod * read multi 52695c7671fSmiod */ 52795c7671fSmiod void 52895c7671fSmiod shpcic_io_read_multi_1(void *v, bus_space_handle_t bsh, 52995c7671fSmiod bus_size_t offset, uint8_t *addr, bus_size_t count) 53095c7671fSmiod { 53195c7671fSmiod while (count--) { 53295c7671fSmiod *addr++ = __shpcic_io_read_1(bsh, offset); 53395c7671fSmiod } 53495c7671fSmiod } 53595c7671fSmiod 53695c7671fSmiod void 53795c7671fSmiod shpcic_io_read_multi_2(void *v, bus_space_handle_t bsh, 53895c7671fSmiod bus_size_t offset, uint16_t *addr, bus_size_t count) 53995c7671fSmiod { 54095c7671fSmiod while (count--) { 54195c7671fSmiod *addr++ = __shpcic_io_read_2(bsh, offset); 54295c7671fSmiod } 54395c7671fSmiod } 54495c7671fSmiod 54595c7671fSmiod void 54695c7671fSmiod shpcic_io_read_multi_4(void *v, bus_space_handle_t bsh, 54795c7671fSmiod bus_size_t offset, uint32_t *addr, bus_size_t count) 54895c7671fSmiod { 54995c7671fSmiod while (count--) { 55095c7671fSmiod *addr++ = __shpcic_io_read_4(bsh, offset); 55195c7671fSmiod } 55295c7671fSmiod } 55395c7671fSmiod 55495c7671fSmiod void 55595c7671fSmiod shpcic_mem_read_multi_1(void *v, bus_space_handle_t bsh, 55695c7671fSmiod bus_size_t offset, uint8_t *addr, bus_size_t count) 55795c7671fSmiod { 55895c7671fSmiod while (count--) { 55995c7671fSmiod *addr++ = __shpcic_mem_read_1(bsh, offset); 56095c7671fSmiod } 56195c7671fSmiod } 56295c7671fSmiod 56395c7671fSmiod void 56495c7671fSmiod shpcic_mem_read_multi_2(void *v, bus_space_handle_t bsh, 56595c7671fSmiod bus_size_t offset, uint16_t *addr, bus_size_t count) 56695c7671fSmiod { 56795c7671fSmiod while (count--) { 56895c7671fSmiod *addr++ = __shpcic_mem_read_2(bsh, offset); 56995c7671fSmiod } 57095c7671fSmiod } 57195c7671fSmiod 57295c7671fSmiod void 57395c7671fSmiod shpcic_mem_read_multi_4(void *v, bus_space_handle_t bsh, 57495c7671fSmiod bus_size_t offset, uint32_t *addr, bus_size_t count) 57595c7671fSmiod { 57695c7671fSmiod while (count--) { 57795c7671fSmiod *addr++ = __shpcic_mem_read_4(bsh, offset); 57895c7671fSmiod } 57995c7671fSmiod } 58095c7671fSmiod 58195c7671fSmiod /* 5828f81a840Smiod * read raw multi 5838f81a840Smiod */ 5848f81a840Smiod 5858f81a840Smiod void 5868f81a840Smiod shpcic_io_read_raw_multi_2(void *v, bus_space_handle_t bsh, 5878f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count) 5888f81a840Smiod { 5898f81a840Smiod count >>= 1; 5908f81a840Smiod while (count--) { 5918f81a840Smiod *(uint16_t *)addr = __shpcic_io_read_2(bsh, offset); 5928f81a840Smiod addr += 2; 5938f81a840Smiod } 5948f81a840Smiod } 5958f81a840Smiod 5968f81a840Smiod void 5978f81a840Smiod shpcic_io_read_raw_multi_4(void *v, bus_space_handle_t bsh, 5988f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count) 5998f81a840Smiod { 6008f81a840Smiod count >>= 2; 6018f81a840Smiod while (count--) { 6028f81a840Smiod *(uint32_t *)addr = __shpcic_io_read_4(bsh, offset); 6038f81a840Smiod addr += 4; 6048f81a840Smiod } 6058f81a840Smiod } 6068f81a840Smiod 6078f81a840Smiod void 6088f81a840Smiod shpcic_mem_read_raw_multi_2(void *v, bus_space_handle_t bsh, 6098f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count) 6108f81a840Smiod { 6118f81a840Smiod count >>= 1; 6128f81a840Smiod while (count--) { 6138f81a840Smiod *(uint16_t *)addr = __shpcic_mem_read_2(bsh, offset); 6148f81a840Smiod addr += 2; 6158f81a840Smiod } 6168f81a840Smiod } 6178f81a840Smiod 6188f81a840Smiod void 6198f81a840Smiod shpcic_mem_read_raw_multi_4(void *v, bus_space_handle_t bsh, 6208f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count) 6218f81a840Smiod { 6228f81a840Smiod count >>= 2; 6238f81a840Smiod while (count--) { 6248f81a840Smiod *(uint32_t *)addr = __shpcic_mem_read_4(bsh, offset); 6258f81a840Smiod addr += 4; 6268f81a840Smiod } 6278f81a840Smiod } 6288f81a840Smiod 6298f81a840Smiod /* 63095c7671fSmiod * read region 63195c7671fSmiod */ 63295c7671fSmiod void 63395c7671fSmiod shpcic_io_read_region_1(void *v, bus_space_handle_t bsh, 63495c7671fSmiod bus_size_t offset, uint8_t *addr, bus_size_t count) 63595c7671fSmiod { 63695c7671fSmiod while (count--) { 63795c7671fSmiod *addr++ = __shpcic_io_read_1(bsh, offset); 63895c7671fSmiod offset += 1; 63995c7671fSmiod } 64095c7671fSmiod } 64195c7671fSmiod 64295c7671fSmiod void 64395c7671fSmiod shpcic_io_read_region_2(void *v, bus_space_handle_t bsh, 64495c7671fSmiod bus_size_t offset, uint16_t *addr, bus_size_t count) 64595c7671fSmiod { 64695c7671fSmiod while (count--) { 64795c7671fSmiod *addr++ = __shpcic_io_read_2(bsh, offset); 64895c7671fSmiod offset += 2; 64995c7671fSmiod } 65095c7671fSmiod } 65195c7671fSmiod 65295c7671fSmiod void 65395c7671fSmiod shpcic_io_read_region_4(void *v, bus_space_handle_t bsh, 65495c7671fSmiod bus_size_t offset, uint32_t *addr, bus_size_t count) 65595c7671fSmiod { 65695c7671fSmiod while (count--) { 65795c7671fSmiod *addr++ = __shpcic_io_read_4(bsh, offset); 65895c7671fSmiod offset += 4; 65995c7671fSmiod } 66095c7671fSmiod } 66195c7671fSmiod 66295c7671fSmiod void 66395c7671fSmiod shpcic_mem_read_region_1(void *v, bus_space_handle_t bsh, 66495c7671fSmiod bus_size_t offset, uint8_t *addr, bus_size_t count) 66595c7671fSmiod { 66695c7671fSmiod while (count--) { 66795c7671fSmiod *addr++ = __shpcic_mem_read_1(bsh, offset); 66895c7671fSmiod offset += 1; 66995c7671fSmiod } 67095c7671fSmiod } 67195c7671fSmiod 67295c7671fSmiod void 67395c7671fSmiod shpcic_mem_read_region_2(void *v, bus_space_handle_t bsh, 67495c7671fSmiod bus_size_t offset, uint16_t *addr, bus_size_t count) 67595c7671fSmiod { 67695c7671fSmiod while (count--) { 67795c7671fSmiod *addr++ = __shpcic_mem_read_2(bsh, offset); 67895c7671fSmiod offset += 2; 67995c7671fSmiod } 68095c7671fSmiod } 68195c7671fSmiod 68295c7671fSmiod void 68395c7671fSmiod shpcic_mem_read_region_4(void *v, bus_space_handle_t bsh, 68495c7671fSmiod bus_size_t offset, uint32_t *addr, bus_size_t count) 68595c7671fSmiod { 68695c7671fSmiod while (count--) { 68795c7671fSmiod *addr++ = __shpcic_mem_read_4(bsh, offset); 68895c7671fSmiod offset += 4; 68995c7671fSmiod } 69095c7671fSmiod } 69195c7671fSmiod 6928f81a840Smiod /* 6938f81a840Smiod * read raw region 6948f81a840Smiod */ 6958f81a840Smiod 6968f81a840Smiod void 6978f81a840Smiod shpcic_io_read_raw_region_2(void *v, bus_space_handle_t bsh, 6988f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count) 6998f81a840Smiod { 7008f81a840Smiod count >>= 1; 7018f81a840Smiod while (count--) { 7028f81a840Smiod *(uint16_t *)addr = __shpcic_io_read_2(bsh, offset); 7038f81a840Smiod addr += 2; 7048f81a840Smiod offset += 2; 7058f81a840Smiod } 7068f81a840Smiod } 7078f81a840Smiod 7088f81a840Smiod void 7098f81a840Smiod shpcic_io_read_raw_region_4(void *v, bus_space_handle_t bsh, 7108f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count) 7118f81a840Smiod { 7128f81a840Smiod count >>= 2; 7138f81a840Smiod while (count--) { 7148f81a840Smiod *(uint32_t *)addr = __shpcic_io_read_4(bsh, offset); 7158f81a840Smiod addr += 4; 7168f81a840Smiod offset += 4; 7178f81a840Smiod } 7188f81a840Smiod } 7198f81a840Smiod 7208f81a840Smiod void 7218f81a840Smiod shpcic_mem_read_raw_region_2(void *v, bus_space_handle_t bsh, 7228f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count) 7238f81a840Smiod { 7248f81a840Smiod count >>= 1; 7258f81a840Smiod while (count--) { 7268f81a840Smiod *(uint16_t *)addr = __shpcic_mem_read_2(bsh, offset); 7278f81a840Smiod addr += 2; 7288f81a840Smiod offset += 2; 7298f81a840Smiod } 7308f81a840Smiod } 7318f81a840Smiod 7328f81a840Smiod void 7338f81a840Smiod shpcic_mem_read_raw_region_4(void *v, bus_space_handle_t bsh, 7348f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count) 7358f81a840Smiod { 7368f81a840Smiod count >>= 2; 7378f81a840Smiod while (count--) { 7388f81a840Smiod *(uint32_t *)addr = __shpcic_mem_read_4(bsh, offset); 7398f81a840Smiod addr += 4; 7408f81a840Smiod offset += 4; 7418f81a840Smiod } 7428f81a840Smiod } 7438f81a840Smiod 74495c7671fSmiod /* write */ 74595c7671fSmiod static inline void __shpcic_io_write_1(bus_space_handle_t bsh, 74695c7671fSmiod bus_size_t offset, uint8_t value); 74795c7671fSmiod static inline void __shpcic_io_write_2(bus_space_handle_t bsh, 74895c7671fSmiod bus_size_t offset, uint16_t value); 74995c7671fSmiod static inline void __shpcic_io_write_4(bus_space_handle_t bsh, 75095c7671fSmiod bus_size_t offset, uint32_t value); 75195c7671fSmiod static inline void __shpcic_mem_write_1(bus_space_handle_t bsh, 75295c7671fSmiod bus_size_t offset, uint8_t value); 75395c7671fSmiod static inline void __shpcic_mem_write_2(bus_space_handle_t bsh, 75495c7671fSmiod bus_size_t offset, uint16_t value); 75595c7671fSmiod static inline void __shpcic_mem_write_4(bus_space_handle_t bsh, 75695c7671fSmiod bus_size_t offset, uint32_t value); 75795c7671fSmiod 75895c7671fSmiod static inline void 75995c7671fSmiod __shpcic_io_write_1(bus_space_handle_t bsh, bus_size_t offset, 76095c7671fSmiod uint8_t value) 76195c7671fSmiod { 76295c7671fSmiod u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK; 76395c7671fSmiod 76495c7671fSmiod *(volatile uint8_t *)(SH4_PCIC_IO + adr) = value; 76595c7671fSmiod } 76695c7671fSmiod 76795c7671fSmiod static inline void 76895c7671fSmiod __shpcic_io_write_2(bus_space_handle_t bsh, bus_size_t offset, 76995c7671fSmiod uint16_t value) 77095c7671fSmiod { 77195c7671fSmiod u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK; 77295c7671fSmiod 77395c7671fSmiod *(volatile uint16_t *)(SH4_PCIC_IO + adr) = value; 77495c7671fSmiod } 77595c7671fSmiod 77695c7671fSmiod static inline void 77795c7671fSmiod __shpcic_io_write_4(bus_space_handle_t bsh, bus_size_t offset, 77895c7671fSmiod uint32_t value) 77995c7671fSmiod { 78095c7671fSmiod u_long adr = (u_long)(bsh + offset) & SH4_PCIC_IO_MASK; 78195c7671fSmiod 78295c7671fSmiod *(volatile uint32_t *)(SH4_PCIC_IO + adr) = value; 78395c7671fSmiod } 78495c7671fSmiod 78595c7671fSmiod static inline void 78695c7671fSmiod __shpcic_mem_write_1(bus_space_handle_t bsh, bus_size_t offset, 78795c7671fSmiod uint8_t value) 78895c7671fSmiod { 78995c7671fSmiod u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK; 79095c7671fSmiod 79195c7671fSmiod *(volatile uint8_t *)(SH4_PCIC_MEM + adr) = value; 79295c7671fSmiod } 79395c7671fSmiod 79495c7671fSmiod static inline void 79595c7671fSmiod __shpcic_mem_write_2(bus_space_handle_t bsh, bus_size_t offset, 79695c7671fSmiod uint16_t value) 79795c7671fSmiod { 79895c7671fSmiod u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK; 79995c7671fSmiod 80095c7671fSmiod *(volatile uint16_t *)(SH4_PCIC_MEM + adr) = value; 80195c7671fSmiod } 80295c7671fSmiod 80395c7671fSmiod static inline void 80495c7671fSmiod __shpcic_mem_write_4(bus_space_handle_t bsh, bus_size_t offset, 80595c7671fSmiod uint32_t value) 80695c7671fSmiod { 80795c7671fSmiod u_long adr = (u_long)(bsh + offset) & SH4_PCIC_MEM_MASK; 80895c7671fSmiod 80995c7671fSmiod *(volatile uint32_t *)(SH4_PCIC_MEM + adr) = value; 81095c7671fSmiod } 81195c7671fSmiod 81295c7671fSmiod /* 81395c7671fSmiod * write single 81495c7671fSmiod */ 81595c7671fSmiod void 81695c7671fSmiod shpcic_io_write_1(void *v, bus_space_handle_t bsh, 81795c7671fSmiod bus_size_t offset, uint8_t value) 81895c7671fSmiod { 81995c7671fSmiod __shpcic_io_write_1(bsh, offset, value); 82095c7671fSmiod } 82195c7671fSmiod 82295c7671fSmiod void 82395c7671fSmiod shpcic_io_write_2(void *v, bus_space_handle_t bsh, 82495c7671fSmiod bus_size_t offset, uint16_t value) 82595c7671fSmiod { 82695c7671fSmiod __shpcic_io_write_2(bsh, offset, value); 82795c7671fSmiod } 82895c7671fSmiod 82995c7671fSmiod void 83095c7671fSmiod shpcic_io_write_4(void *v, bus_space_handle_t bsh, 83195c7671fSmiod bus_size_t offset, uint32_t value) 83295c7671fSmiod { 83395c7671fSmiod __shpcic_io_write_4(bsh, offset, value); 83495c7671fSmiod } 83595c7671fSmiod 83695c7671fSmiod void 83795c7671fSmiod shpcic_mem_write_1(void *v, bus_space_handle_t bsh, 83895c7671fSmiod bus_size_t offset, uint8_t value) 83995c7671fSmiod { 84095c7671fSmiod __shpcic_mem_write_1(bsh, offset, value); 84195c7671fSmiod } 84295c7671fSmiod 84395c7671fSmiod void 84495c7671fSmiod shpcic_mem_write_2(void *v, bus_space_handle_t bsh, 84595c7671fSmiod bus_size_t offset, uint16_t value) 84695c7671fSmiod { 84795c7671fSmiod __shpcic_mem_write_2(bsh, offset, value); 84895c7671fSmiod } 84995c7671fSmiod 85095c7671fSmiod void 85195c7671fSmiod shpcic_mem_write_4(void *v, bus_space_handle_t bsh, 85295c7671fSmiod bus_size_t offset, uint32_t value) 85395c7671fSmiod { 85495c7671fSmiod __shpcic_mem_write_4(bsh, offset, value); 85595c7671fSmiod } 85695c7671fSmiod 85795c7671fSmiod /* 85895c7671fSmiod * write multi 85995c7671fSmiod */ 86095c7671fSmiod void 86195c7671fSmiod shpcic_io_write_multi_1(void *v, bus_space_handle_t bsh, 86295c7671fSmiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 86395c7671fSmiod { 86495c7671fSmiod while (count--) { 86595c7671fSmiod __shpcic_io_write_1(bsh, offset, *addr++); 86695c7671fSmiod } 86795c7671fSmiod } 86895c7671fSmiod 86995c7671fSmiod void 87095c7671fSmiod shpcic_io_write_multi_2(void *v, bus_space_handle_t bsh, 87195c7671fSmiod bus_size_t offset, const uint16_t *addr, bus_size_t count) 87295c7671fSmiod { 87395c7671fSmiod while (count--) { 87495c7671fSmiod __shpcic_io_write_2(bsh, offset, *addr++); 87595c7671fSmiod } 87695c7671fSmiod } 87795c7671fSmiod 87895c7671fSmiod void 87995c7671fSmiod shpcic_io_write_multi_4(void *v, bus_space_handle_t bsh, 88095c7671fSmiod bus_size_t offset, const uint32_t *addr, bus_size_t count) 88195c7671fSmiod { 88295c7671fSmiod while (count--) { 88395c7671fSmiod __shpcic_io_write_4(bsh, offset, *addr++); 88495c7671fSmiod } 88595c7671fSmiod } 88695c7671fSmiod 88795c7671fSmiod void 88895c7671fSmiod shpcic_mem_write_multi_1(void *v, bus_space_handle_t bsh, 88995c7671fSmiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 89095c7671fSmiod { 89195c7671fSmiod while (count--) { 89295c7671fSmiod __shpcic_mem_write_1(bsh, offset, *addr++); 89395c7671fSmiod } 89495c7671fSmiod } 89595c7671fSmiod 89695c7671fSmiod void 89795c7671fSmiod shpcic_mem_write_multi_2(void *v, bus_space_handle_t bsh, 89895c7671fSmiod bus_size_t offset, const uint16_t *addr, bus_size_t count) 89995c7671fSmiod { 90095c7671fSmiod while (count--) { 90195c7671fSmiod __shpcic_mem_write_2(bsh, offset, *addr++); 90295c7671fSmiod } 90395c7671fSmiod } 90495c7671fSmiod 90595c7671fSmiod void 90695c7671fSmiod shpcic_mem_write_multi_4(void *v, bus_space_handle_t bsh, 90795c7671fSmiod bus_size_t offset, const uint32_t *addr, bus_size_t count) 90895c7671fSmiod { 90995c7671fSmiod while (count--) { 91095c7671fSmiod __shpcic_mem_write_4(bsh, offset, *addr++); 91195c7671fSmiod } 91295c7671fSmiod } 91395c7671fSmiod 91495c7671fSmiod /* 9158f81a840Smiod * write raw multi 9168f81a840Smiod */ 9178f81a840Smiod 9188f81a840Smiod void 9198f81a840Smiod shpcic_io_write_raw_multi_2(void *v, bus_space_handle_t bsh, 9208f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 9218f81a840Smiod { 9228f81a840Smiod count >>= 1; 9238f81a840Smiod while (count--) { 9248f81a840Smiod __shpcic_io_write_2(bsh, offset, *(uint16_t *)addr); 9258f81a840Smiod addr += 2; 9268f81a840Smiod } 9278f81a840Smiod } 9288f81a840Smiod 9298f81a840Smiod void 9308f81a840Smiod shpcic_io_write_raw_multi_4(void *v, bus_space_handle_t bsh, 9318f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 9328f81a840Smiod { 9338f81a840Smiod count >>= 2; 9348f81a840Smiod while (count--) { 9358f81a840Smiod __shpcic_io_write_4(bsh, offset, *(uint32_t *)addr); 9368f81a840Smiod addr += 4; 9378f81a840Smiod } 9388f81a840Smiod } 9398f81a840Smiod 9408f81a840Smiod void 9418f81a840Smiod shpcic_mem_write_raw_multi_2(void *v, bus_space_handle_t bsh, 9428f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 9438f81a840Smiod { 9448f81a840Smiod count >>= 1; 9458f81a840Smiod while (count--) { 9468f81a840Smiod __shpcic_mem_write_2(bsh, offset, *(uint16_t *)addr); 9478f81a840Smiod addr += 2; 9488f81a840Smiod } 9498f81a840Smiod } 9508f81a840Smiod 9518f81a840Smiod void 9528f81a840Smiod shpcic_mem_write_raw_multi_4(void *v, bus_space_handle_t bsh, 9538f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 9548f81a840Smiod { 9558f81a840Smiod count >>= 2; 9568f81a840Smiod while (count--) { 9578f81a840Smiod __shpcic_mem_write_4(bsh, offset, *(uint32_t *)addr); 9588f81a840Smiod addr += 4; 9598f81a840Smiod } 9608f81a840Smiod } 9618f81a840Smiod 9628f81a840Smiod /* 96395c7671fSmiod * write region 96495c7671fSmiod */ 96595c7671fSmiod void 96695c7671fSmiod shpcic_io_write_region_1(void *v, bus_space_handle_t bsh, 96795c7671fSmiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 96895c7671fSmiod { 96995c7671fSmiod while (count--) { 97095c7671fSmiod __shpcic_io_write_1(bsh, offset, *addr++); 97195c7671fSmiod offset += 1; 97295c7671fSmiod } 97395c7671fSmiod } 97495c7671fSmiod 97595c7671fSmiod void 97695c7671fSmiod shpcic_io_write_region_2(void *v, bus_space_handle_t bsh, 97795c7671fSmiod bus_size_t offset, const uint16_t *addr, bus_size_t count) 97895c7671fSmiod { 97995c7671fSmiod while (count--) { 98095c7671fSmiod __shpcic_io_write_2(bsh, offset, *addr++); 98195c7671fSmiod offset += 2; 98295c7671fSmiod } 98395c7671fSmiod } 98495c7671fSmiod 98595c7671fSmiod void 98695c7671fSmiod shpcic_io_write_region_4(void *v, bus_space_handle_t bsh, 98795c7671fSmiod bus_size_t offset, const uint32_t *addr, bus_size_t count) 98895c7671fSmiod { 98995c7671fSmiod while (count--) { 99095c7671fSmiod __shpcic_io_write_4(bsh, offset, *addr++); 99195c7671fSmiod offset += 4; 99295c7671fSmiod } 99395c7671fSmiod } 99495c7671fSmiod 99595c7671fSmiod void 99695c7671fSmiod shpcic_mem_write_region_1(void *v, bus_space_handle_t bsh, 99795c7671fSmiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 99895c7671fSmiod { 99995c7671fSmiod while (count--) { 100095c7671fSmiod __shpcic_mem_write_1(bsh, offset, *addr++); 100195c7671fSmiod offset += 1; 100295c7671fSmiod } 100395c7671fSmiod } 100495c7671fSmiod 100595c7671fSmiod void 100695c7671fSmiod shpcic_mem_write_region_2(void *v, bus_space_handle_t bsh, 100795c7671fSmiod bus_size_t offset, const uint16_t *addr, bus_size_t count) 100895c7671fSmiod { 100995c7671fSmiod while (count--) { 101095c7671fSmiod __shpcic_mem_write_2(bsh, offset, *addr++); 101195c7671fSmiod offset += 2; 101295c7671fSmiod } 101395c7671fSmiod } 101495c7671fSmiod 101595c7671fSmiod void 101695c7671fSmiod shpcic_mem_write_region_4(void *v, bus_space_handle_t bsh, 101795c7671fSmiod bus_size_t offset, const uint32_t *addr, bus_size_t count) 101895c7671fSmiod { 101995c7671fSmiod while (count--) { 102095c7671fSmiod __shpcic_mem_write_4(bsh, offset, *addr++); 102195c7671fSmiod offset += 4; 102295c7671fSmiod } 102395c7671fSmiod } 102495c7671fSmiod 102595c7671fSmiod /* 10268f81a840Smiod * write raw region 10278f81a840Smiod */ 10288f81a840Smiod 10298f81a840Smiod void 10308f81a840Smiod shpcic_io_write_raw_region_2(void *v, bus_space_handle_t bsh, 10318f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 10328f81a840Smiod { 10338f81a840Smiod count >>= 1; 10348f81a840Smiod while (count--) { 10358f81a840Smiod __shpcic_io_write_2(bsh, offset, *(uint16_t *)addr); 10368f81a840Smiod addr += 2; 10378f81a840Smiod offset += 2; 10388f81a840Smiod } 10398f81a840Smiod } 10408f81a840Smiod 10418f81a840Smiod void 10428f81a840Smiod shpcic_io_write_raw_region_4(void *v, bus_space_handle_t bsh, 10438f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 10448f81a840Smiod { 10458f81a840Smiod count >>= 1; 10468f81a840Smiod while (count--) { 10478f81a840Smiod __shpcic_io_write_4(bsh, offset, *(uint32_t *)addr); 10488f81a840Smiod addr += 4; 10498f81a840Smiod offset += 4; 10508f81a840Smiod } 10518f81a840Smiod } 10528f81a840Smiod 10538f81a840Smiod void 10548f81a840Smiod shpcic_mem_write_raw_region_2(void *v, bus_space_handle_t bsh, 10558f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 10568f81a840Smiod { 10578f81a840Smiod count >>= 1; 10588f81a840Smiod while (count--) { 10598f81a840Smiod __shpcic_mem_write_2(bsh, offset, *(uint16_t *)addr); 10608f81a840Smiod addr += 2; 10618f81a840Smiod offset += 2; 10628f81a840Smiod } 10638f81a840Smiod } 10648f81a840Smiod 10658f81a840Smiod void 10668f81a840Smiod shpcic_mem_write_raw_region_4(void *v, bus_space_handle_t bsh, 10678f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 10688f81a840Smiod { 10698f81a840Smiod count >>= 2; 10708f81a840Smiod while (count--) { 10718f81a840Smiod __shpcic_mem_write_4(bsh, offset, *(uint32_t *)addr); 10728f81a840Smiod addr += 4; 10738f81a840Smiod offset += 4; 10748f81a840Smiod } 10758f81a840Smiod } 10768f81a840Smiod 10778f81a840Smiod /* 107895c7671fSmiod * set multi 107995c7671fSmiod */ 108095c7671fSmiod void 108195c7671fSmiod shpcic_io_set_multi_1(void *v, bus_space_handle_t bsh, 108295c7671fSmiod bus_size_t offset, uint8_t value, bus_size_t count) 108395c7671fSmiod { 108495c7671fSmiod while (count--) { 108595c7671fSmiod __shpcic_io_write_1(bsh, offset, value); 108695c7671fSmiod } 108795c7671fSmiod } 108895c7671fSmiod 108995c7671fSmiod void 109095c7671fSmiod shpcic_io_set_multi_2(void *v, bus_space_handle_t bsh, 109195c7671fSmiod bus_size_t offset, uint16_t value, bus_size_t count) 109295c7671fSmiod { 109395c7671fSmiod while (count--) { 109495c7671fSmiod __shpcic_io_write_2(bsh, offset, value); 109595c7671fSmiod } 109695c7671fSmiod } 109795c7671fSmiod 109895c7671fSmiod void 109995c7671fSmiod shpcic_io_set_multi_4(void *v, bus_space_handle_t bsh, 110095c7671fSmiod bus_size_t offset, uint32_t value, bus_size_t count) 110195c7671fSmiod { 110295c7671fSmiod while (count--) { 110395c7671fSmiod __shpcic_io_write_4(bsh, offset, value); 110495c7671fSmiod } 110595c7671fSmiod } 110695c7671fSmiod 110795c7671fSmiod void 110895c7671fSmiod shpcic_mem_set_multi_1(void *v, bus_space_handle_t bsh, 110995c7671fSmiod bus_size_t offset, uint8_t value, bus_size_t count) 111095c7671fSmiod { 111195c7671fSmiod while (count--) { 111295c7671fSmiod __shpcic_mem_write_1(bsh, offset, value); 111395c7671fSmiod } 111495c7671fSmiod } 111595c7671fSmiod 111695c7671fSmiod void 111795c7671fSmiod shpcic_mem_set_multi_2(void *v, bus_space_handle_t bsh, 111895c7671fSmiod bus_size_t offset, uint16_t value, bus_size_t count) 111995c7671fSmiod { 112095c7671fSmiod while (count--) { 112195c7671fSmiod __shpcic_mem_write_2(bsh, offset, value); 112295c7671fSmiod } 112395c7671fSmiod } 112495c7671fSmiod 112595c7671fSmiod void 112695c7671fSmiod shpcic_mem_set_multi_4(void *v, bus_space_handle_t bsh, 112795c7671fSmiod bus_size_t offset, uint32_t value, bus_size_t count) 112895c7671fSmiod { 112995c7671fSmiod while (count--) { 113095c7671fSmiod __shpcic_mem_write_4(bsh, offset, value); 113195c7671fSmiod } 113295c7671fSmiod } 113395c7671fSmiod 113495c7671fSmiod /* 113595c7671fSmiod * set region 113695c7671fSmiod */ 113795c7671fSmiod void 113895c7671fSmiod shpcic_io_set_region_1(void *v, bus_space_handle_t bsh, 113995c7671fSmiod bus_size_t offset, uint8_t value, bus_size_t count) 114095c7671fSmiod { 114195c7671fSmiod while (count--) { 114295c7671fSmiod __shpcic_io_write_1(bsh, offset, value); 114395c7671fSmiod offset += 1; 114495c7671fSmiod } 114595c7671fSmiod } 114695c7671fSmiod 114795c7671fSmiod void 114895c7671fSmiod shpcic_io_set_region_2(void *v, bus_space_handle_t bsh, 114995c7671fSmiod bus_size_t offset, uint16_t value, bus_size_t count) 115095c7671fSmiod { 115195c7671fSmiod while (count--) { 115295c7671fSmiod __shpcic_io_write_2(bsh, offset, value); 115395c7671fSmiod offset += 2; 115495c7671fSmiod } 115595c7671fSmiod } 115695c7671fSmiod 115795c7671fSmiod void 115895c7671fSmiod shpcic_io_set_region_4(void *v, bus_space_handle_t bsh, 115995c7671fSmiod bus_size_t offset, uint32_t value, bus_size_t count) 116095c7671fSmiod { 116195c7671fSmiod while (count--) { 116295c7671fSmiod __shpcic_io_write_4(bsh, offset, value); 116395c7671fSmiod offset += 4; 116495c7671fSmiod } 116595c7671fSmiod } 116695c7671fSmiod 116795c7671fSmiod void 116895c7671fSmiod shpcic_mem_set_region_1(void *v, bus_space_handle_t bsh, 116995c7671fSmiod bus_size_t offset, uint8_t value, bus_size_t count) 117095c7671fSmiod { 117195c7671fSmiod while (count--) { 117295c7671fSmiod __shpcic_mem_write_1(bsh, offset, value); 117395c7671fSmiod offset += 1; 117495c7671fSmiod } 117595c7671fSmiod } 117695c7671fSmiod 117795c7671fSmiod void 117895c7671fSmiod shpcic_mem_set_region_2(void *v, bus_space_handle_t bsh, 117995c7671fSmiod bus_size_t offset, uint16_t value, bus_size_t count) 118095c7671fSmiod { 118195c7671fSmiod while (count--) { 118295c7671fSmiod __shpcic_mem_write_2(bsh, offset, value); 118395c7671fSmiod offset += 2; 118495c7671fSmiod } 118595c7671fSmiod } 118695c7671fSmiod 118795c7671fSmiod void 118895c7671fSmiod shpcic_mem_set_region_4(void *v, bus_space_handle_t bsh, 118995c7671fSmiod bus_size_t offset, uint32_t value, bus_size_t count) 119095c7671fSmiod { 119195c7671fSmiod while (count--) { 119295c7671fSmiod __shpcic_mem_write_4(bsh, offset, value); 119395c7671fSmiod offset += 4; 119495c7671fSmiod } 119595c7671fSmiod } 119695c7671fSmiod 119795c7671fSmiod /* 119895c7671fSmiod * copy region 119995c7671fSmiod */ 120095c7671fSmiod void 12010cda87aaSmiod shpcic_io_copy_1(void *v, bus_space_handle_t bsh1, 120295c7671fSmiod bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count) 120395c7671fSmiod { 120495c7671fSmiod u_long addr1 = bsh1 + off1; 120595c7671fSmiod u_long addr2 = bsh2 + off2; 120695c7671fSmiod uint8_t value; 120795c7671fSmiod 120895c7671fSmiod if (addr1 >= addr2) { /* src after dest: copy forward */ 120995c7671fSmiod while (count--) { 121095c7671fSmiod value = __shpcic_io_read_1(bsh1, off1); 121195c7671fSmiod __shpcic_io_write_1(bsh2, off2, value); 121295c7671fSmiod off1 += 1; 121395c7671fSmiod off2 += 1; 121495c7671fSmiod } 121595c7671fSmiod } else { /* dest after src: copy backwards */ 121695c7671fSmiod off1 += (count - 1) * 1; 121795c7671fSmiod off2 += (count - 1) * 1; 121895c7671fSmiod while (count--) { 121995c7671fSmiod value = __shpcic_io_read_1(bsh1, off1); 122095c7671fSmiod __shpcic_io_write_1(bsh2, off2, value); 122195c7671fSmiod off1 -= 1; 122295c7671fSmiod off2 -= 1; 122395c7671fSmiod } 122495c7671fSmiod } 122595c7671fSmiod } 122695c7671fSmiod 122795c7671fSmiod void 12280cda87aaSmiod shpcic_io_copy_2(void *v, bus_space_handle_t bsh1, 122995c7671fSmiod bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count) 123095c7671fSmiod { 123195c7671fSmiod u_long addr1 = bsh1 + off1; 123295c7671fSmiod u_long addr2 = bsh2 + off2; 123395c7671fSmiod uint16_t value; 123495c7671fSmiod 123595c7671fSmiod if (addr1 >= addr2) { /* src after dest: copy forward */ 123695c7671fSmiod while (count--) { 123795c7671fSmiod value = __shpcic_io_read_2(bsh1, off1); 123895c7671fSmiod __shpcic_io_write_2(bsh2, off2, value); 123995c7671fSmiod off1 += 2; 124095c7671fSmiod off2 += 2; 124195c7671fSmiod } 124295c7671fSmiod } else { /* dest after src: copy backwards */ 124395c7671fSmiod off1 += (count - 1) * 2; 124495c7671fSmiod off2 += (count - 1) * 2; 124595c7671fSmiod while (count--) { 124695c7671fSmiod value = __shpcic_io_read_2(bsh1, off1); 124795c7671fSmiod __shpcic_io_write_2(bsh2, off2, value); 124895c7671fSmiod off1 -= 2; 124995c7671fSmiod off2 -= 2; 125095c7671fSmiod } 125195c7671fSmiod } 125295c7671fSmiod } 125395c7671fSmiod 125495c7671fSmiod void 12550cda87aaSmiod shpcic_io_copy_4(void *v, bus_space_handle_t bsh1, 125695c7671fSmiod bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count) 125795c7671fSmiod { 125895c7671fSmiod u_long addr1 = bsh1 + off1; 125995c7671fSmiod u_long addr2 = bsh2 + off2; 126095c7671fSmiod uint32_t value; 126195c7671fSmiod 126295c7671fSmiod if (addr1 >= addr2) { /* src after dest: copy forward */ 126395c7671fSmiod while (count--) { 126495c7671fSmiod value = __shpcic_io_read_4(bsh1, off1); 126595c7671fSmiod __shpcic_io_write_4(bsh2, off2, value); 126695c7671fSmiod off1 += 4; 126795c7671fSmiod off2 += 4; 126895c7671fSmiod } 126995c7671fSmiod } else { /* dest after src: copy backwards */ 127095c7671fSmiod off1 += (count - 1) * 4; 127195c7671fSmiod off2 += (count - 1) * 4; 127295c7671fSmiod while (count--) { 127395c7671fSmiod value = __shpcic_io_read_4(bsh1, off1); 127495c7671fSmiod __shpcic_io_write_4(bsh2, off2, value); 127595c7671fSmiod off1 -= 4; 127695c7671fSmiod off2 -= 4; 127795c7671fSmiod } 127895c7671fSmiod } 127995c7671fSmiod } 128095c7671fSmiod 128195c7671fSmiod void 12820cda87aaSmiod shpcic_mem_copy_1(void *v, bus_space_handle_t bsh1, 128395c7671fSmiod bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count) 128495c7671fSmiod { 128595c7671fSmiod u_long addr1 = bsh1 + off1; 128695c7671fSmiod u_long addr2 = bsh2 + off2; 128795c7671fSmiod uint8_t value; 128895c7671fSmiod 128995c7671fSmiod if (addr1 >= addr2) { /* src after dest: copy forward */ 129095c7671fSmiod while (count--) { 129195c7671fSmiod value = __shpcic_mem_read_1(bsh1, off1); 129295c7671fSmiod __shpcic_mem_write_1(bsh2, off2, value); 129395c7671fSmiod off1 += 1; 129495c7671fSmiod off2 += 1; 129595c7671fSmiod } 129695c7671fSmiod } else { /* dest after src: copy backwards */ 129795c7671fSmiod off1 += (count - 1) * 1; 129895c7671fSmiod off2 += (count - 1) * 1; 129995c7671fSmiod while (count--) { 130095c7671fSmiod value = __shpcic_mem_read_1(bsh1, off1); 130195c7671fSmiod __shpcic_mem_write_1(bsh2, off2, value); 130295c7671fSmiod off1 -= 1; 130395c7671fSmiod off2 -= 1; 130495c7671fSmiod } 130595c7671fSmiod } 130695c7671fSmiod } 130795c7671fSmiod 130895c7671fSmiod void 13090cda87aaSmiod shpcic_mem_copy_2(void *v, bus_space_handle_t bsh1, 131095c7671fSmiod bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count) 131195c7671fSmiod { 131295c7671fSmiod u_long addr1 = bsh1 + off1; 131395c7671fSmiod u_long addr2 = bsh2 + off2; 131495c7671fSmiod uint16_t value; 131595c7671fSmiod 131695c7671fSmiod if (addr1 >= addr2) { /* src after dest: copy forward */ 131795c7671fSmiod while (count--) { 131895c7671fSmiod value = __shpcic_mem_read_2(bsh1, off1); 131995c7671fSmiod __shpcic_mem_write_2(bsh2, off2, value); 132095c7671fSmiod off1 += 2; 132195c7671fSmiod off2 += 2; 132295c7671fSmiod } 132395c7671fSmiod } else { /* dest after src: copy backwards */ 132495c7671fSmiod off1 += (count - 1) * 2; 132595c7671fSmiod off2 += (count - 1) * 2; 132695c7671fSmiod while (count--) { 132795c7671fSmiod value = __shpcic_mem_read_2(bsh1, off1); 132895c7671fSmiod __shpcic_mem_write_2(bsh2, off2, value); 132995c7671fSmiod off1 -= 2; 133095c7671fSmiod off2 -= 2; 133195c7671fSmiod } 133295c7671fSmiod } 133395c7671fSmiod } 133495c7671fSmiod 133595c7671fSmiod void 13360cda87aaSmiod shpcic_mem_copy_4(void *v, bus_space_handle_t bsh1, 133795c7671fSmiod bus_size_t off1, bus_space_handle_t bsh2, bus_size_t off2, bus_size_t count) 133895c7671fSmiod { 133995c7671fSmiod u_long addr1 = bsh1 + off1; 134095c7671fSmiod u_long addr2 = bsh2 + off2; 134195c7671fSmiod uint32_t value; 134295c7671fSmiod 134395c7671fSmiod if (addr1 >= addr2) { /* src after dest: copy forward */ 134495c7671fSmiod while (count--) { 134595c7671fSmiod value = __shpcic_mem_read_4(bsh1, off1); 134695c7671fSmiod __shpcic_mem_write_4(bsh2, off2, value); 134795c7671fSmiod off1 += 4; 134895c7671fSmiod off2 += 4; 134995c7671fSmiod } 135095c7671fSmiod } else { /* dest after src: copy backwards */ 135195c7671fSmiod off1 += (count - 1) * 4; 135295c7671fSmiod off2 += (count - 1) * 4; 135395c7671fSmiod while (count--) { 135495c7671fSmiod value = __shpcic_mem_read_4(bsh1, off1); 135595c7671fSmiod __shpcic_mem_write_4(bsh2, off2, value); 135695c7671fSmiod off1 -= 4; 135795c7671fSmiod off2 -= 4; 135895c7671fSmiod } 135995c7671fSmiod } 136095c7671fSmiod } 1361