1*3836e7c7Smiod /* $OpenBSD: obio.c,v 1.12 2024/11/05 18:58:59 miod Exp $ */ 28f81a840Smiod /* $NetBSD: obio.c,v 1.1 2006/09/01 21:26:18 uwe Exp $ */ 38f81a840Smiod 48f81a840Smiod /*- 58f81a840Smiod * Copyright (c) 1998 The NetBSD Foundation, Inc. 68f81a840Smiod * All rights reserved. 78f81a840Smiod * 88f81a840Smiod * This code is derived from software contributed to The NetBSD Foundation 98f81a840Smiod * by Charles M. Hannum. 108f81a840Smiod * 118f81a840Smiod * Redistribution and use in source and binary forms, with or without 128f81a840Smiod * modification, are permitted provided that the following conditions 138f81a840Smiod * are met: 148f81a840Smiod * 1. Redistributions of source code must retain the above copyright 158f81a840Smiod * notice, this list of conditions and the following disclaimer. 168f81a840Smiod * 2. Redistributions in binary form must reproduce the above copyright 178f81a840Smiod * notice, this list of conditions and the following disclaimer in the 188f81a840Smiod * documentation and/or other materials provided with the distribution. 198f81a840Smiod * 208f81a840Smiod * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 218f81a840Smiod * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 228f81a840Smiod * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 238f81a840Smiod * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 248f81a840Smiod * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 258f81a840Smiod * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 268f81a840Smiod * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 278f81a840Smiod * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 288f81a840Smiod * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 298f81a840Smiod * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 308f81a840Smiod * POSSIBILITY OF SUCH DAMAGE. 318f81a840Smiod */ 328f81a840Smiod 338f81a840Smiod #include <sys/param.h> 348f81a840Smiod #include <sys/systm.h> 358f81a840Smiod #include <sys/device.h> 368f81a840Smiod 378f81a840Smiod #include <uvm/uvm_extern.h> 388f81a840Smiod 398f81a840Smiod #include <sh/devreg.h> 408f81a840Smiod #include <sh/mmu.h> 418f81a840Smiod #include <sh/pmap.h> 428f81a840Smiod #include <sh/pte.h> 438f81a840Smiod 448f81a840Smiod #include <machine/bus.h> 458f81a840Smiod #include <machine/cpu.h> 468f81a840Smiod #include <machine/intr.h> 478f81a840Smiod 488f81a840Smiod #include <landisk/dev/obiovar.h> 498f81a840Smiod 508f81a840Smiod int obio_match(struct device *, void *, void *); 518f81a840Smiod void obio_attach(struct device *, struct device *, void *); 528f81a840Smiod int obio_print(void *, const char *); 538f81a840Smiod int obio_search(struct device *, void *, void *); 548f81a840Smiod 55471aeecfSnaddy const struct cfattach obio_ca = { 560789eb16Smiod sizeof(struct obio_softc), obio_match, obio_attach 578f81a840Smiod }; 588f81a840Smiod 598f81a840Smiod struct cfdriver obio_cd = { 60*3836e7c7Smiod NULL, "obio", DV_DULL 618f81a840Smiod }; 628f81a840Smiod 638f81a840Smiod int 648f81a840Smiod obio_match(struct device *parent, void *vcf, void *aux) 658f81a840Smiod { 668f81a840Smiod struct obiobus_attach_args *oba = aux; 678f81a840Smiod 688f81a840Smiod if (strcmp(oba->oba_busname, obio_cd.cd_name) != 0) 698f81a840Smiod return (0); 708f81a840Smiod 718f81a840Smiod return (1); 728f81a840Smiod } 738f81a840Smiod 748f81a840Smiod void 758f81a840Smiod obio_attach(struct device *parent, struct device *self, void *aux) 768f81a840Smiod { 778f81a840Smiod struct obio_softc *sc = (struct obio_softc *)self; 788f81a840Smiod struct obiobus_attach_args *oba = aux; 798f81a840Smiod 808f81a840Smiod printf("\n"); 818f81a840Smiod 828f81a840Smiod sc->sc_iot = oba->oba_iot; 838f81a840Smiod sc->sc_memt = oba->oba_memt; 848f81a840Smiod 858f81a840Smiod config_search(obio_search, self, NULL); 868f81a840Smiod } 878f81a840Smiod 888f81a840Smiod int 898f81a840Smiod obio_search(struct device *parent, void *vcf, void *aux) 908f81a840Smiod { 918f81a840Smiod struct obio_softc *sc = (struct obio_softc *)parent; 928f81a840Smiod struct cfdata *cf = vcf; 938f81a840Smiod struct obio_attach_args oa; 948f81a840Smiod struct obio_io res_io[1]; 958f81a840Smiod struct obio_iomem res_mem[1]; 968f81a840Smiod struct obio_irq res_irq[1]; 978f81a840Smiod 988f81a840Smiod oa.oa_iot = sc->sc_iot; 998f81a840Smiod oa.oa_memt = sc->sc_memt; 100590c0c6aSkettenis oa.oa_nio = oa.oa_niomem = oa.oa_nirq = 0; 1018f81a840Smiod 102590c0c6aSkettenis if (cf->cf_iobase != IOBASEUNK) { 1038f81a840Smiod res_io[0].or_addr = cf->cf_iobase; 1048f81a840Smiod res_io[0].or_size = cf->cf_iosize; 1058f81a840Smiod oa.oa_io = res_io; 1068f81a840Smiod oa.oa_nio = 1; 107590c0c6aSkettenis } 1088f81a840Smiod 109590c0c6aSkettenis if (cf->cf_maddr != MADDRUNK) { 110590c0c6aSkettenis res_mem[0].or_addr = cf->cf_maddr; 111590c0c6aSkettenis res_mem[0].or_size = cf->cf_msize; 1128f81a840Smiod oa.oa_iomem = res_mem; 1138f81a840Smiod oa.oa_niomem = 1; 114590c0c6aSkettenis } 1158f81a840Smiod 116590c0c6aSkettenis if (cf->cf_irq != IRQUNK) { 117590c0c6aSkettenis res_irq[0].or_irq = cf->cf_irq; 1188f81a840Smiod oa.oa_irq = res_irq; 1198f81a840Smiod oa.oa_nirq = 1; 120590c0c6aSkettenis } 1218f81a840Smiod 1228f81a840Smiod if ((*cf->cf_attach->ca_match)(parent, cf, &oa) == 0) 1238f81a840Smiod return (0); 1248f81a840Smiod 1258f81a840Smiod config_attach(parent, cf, &oa, obio_print); 1268f81a840Smiod return (1); 1278f81a840Smiod } 1288f81a840Smiod 1298f81a840Smiod int 1308f81a840Smiod obio_print(void *args, const char *name) 1318f81a840Smiod { 1328f81a840Smiod struct obio_attach_args *oa = args; 1338f81a840Smiod const char *sep; 1348f81a840Smiod int i; 1358f81a840Smiod 1368f81a840Smiod if (oa->oa_nio) { 1378f81a840Smiod sep = ""; 1388f81a840Smiod printf(" port "); 1398f81a840Smiod for (i = 0; i < oa->oa_nio; i++) { 1408f81a840Smiod if (oa->oa_io[i].or_size == 0) 1418f81a840Smiod continue; 1428f81a840Smiod printf("%s0x%x", sep, oa->oa_io[i].or_addr); 1438f81a840Smiod if (oa->oa_io[i].or_size > 1) 1448f81a840Smiod printf("-0x%x", oa->oa_io[i].or_addr + 1458f81a840Smiod oa->oa_io[i].or_size - 1); 1468f81a840Smiod sep = ","; 1478f81a840Smiod } 1488f81a840Smiod } 1498f81a840Smiod 1508f81a840Smiod if (oa->oa_niomem) { 1518f81a840Smiod sep = ""; 1528f81a840Smiod printf(" iomem "); 1538f81a840Smiod for (i = 0; i < oa->oa_niomem; i++) { 1548f81a840Smiod if (oa->oa_iomem[i].or_size == 0) 1558f81a840Smiod continue; 1568f81a840Smiod printf("%s0x%x", sep, oa->oa_iomem[i].or_addr); 1578f81a840Smiod if (oa->oa_iomem[i].or_size > 1) 1588f81a840Smiod printf("-0x%x", oa->oa_iomem[i].or_addr + 1598f81a840Smiod oa->oa_iomem[i].or_size - 1); 1608f81a840Smiod sep = ","; 1618f81a840Smiod } 1628f81a840Smiod } 1638f81a840Smiod 1648f81a840Smiod if (oa->oa_nirq) { 1658f81a840Smiod sep = ""; 1668f81a840Smiod printf(" irq "); 1678f81a840Smiod for (i = 0; i < oa->oa_nirq; i++) { 1688f81a840Smiod if (oa->oa_irq[i].or_irq == IRQUNK) 1698f81a840Smiod continue; 1708f81a840Smiod printf("%s%d", sep, oa->oa_irq[i].or_irq); 1718f81a840Smiod sep = ","; 1728f81a840Smiod } 1738f81a840Smiod } 1748f81a840Smiod 1758f81a840Smiod return (UNCONF); 1768f81a840Smiod } 1778f81a840Smiod 1788f81a840Smiod /* 1798f81a840Smiod * Set up an interrupt handler to start being called. 1808f81a840Smiod */ 1818f81a840Smiod void * 1828f81a840Smiod obio_intr_establish(int irq, int level, int (*ih_fun)(void *), void *ih_arg, 1838f81a840Smiod const char *ih_name) 1848f81a840Smiod { 1858f81a840Smiod return extintr_establish(irq, level, ih_fun, ih_arg, ih_name); 1868f81a840Smiod } 1878f81a840Smiod 1888f81a840Smiod /* 1898f81a840Smiod * Deregister an interrupt handler. 1908f81a840Smiod */ 1918f81a840Smiod void 1928f81a840Smiod obio_intr_disestablish(void *arg) 1938f81a840Smiod { 1948f81a840Smiod extintr_disestablish(arg); 1958f81a840Smiod } 1968f81a840Smiod 1978f81a840Smiod /* 1988f81a840Smiod * on-board I/O bus space 1998f81a840Smiod */ 2008f81a840Smiod #define OBIO_IOMEM_IO 0 /* space is i/o space */ 2018f81a840Smiod #define OBIO_IOMEM_MEM 1 /* space is mem space */ 2028f81a840Smiod #define OBIO_IOMEM_PCMCIA_IO 2 /* PCMCIA IO space */ 2038f81a840Smiod #define OBIO_IOMEM_PCMCIA_MEM 3 /* PCMCIA Mem space */ 2048f81a840Smiod #define OBIO_IOMEM_PCMCIA_ATT 4 /* PCMCIA Attr space */ 2058f81a840Smiod #define OBIO_IOMEM_PCMCIA_8BIT 0x8000 /* PCMCIA BUS 8 BIT WIDTH */ 2068f81a840Smiod #define OBIO_IOMEM_PCMCIA_IO8 \ 2078f81a840Smiod (OBIO_IOMEM_PCMCIA_IO|OBIO_IOMEM_PCMCIA_8BIT) 2088f81a840Smiod #define OBIO_IOMEM_PCMCIA_MEM8 \ 2098f81a840Smiod (OBIO_IOMEM_PCMCIA_MEM|OBIO_IOMEM_PCMCIA_8BIT) 2108f81a840Smiod #define OBIO_IOMEM_PCMCIA_ATT8 \ 2118f81a840Smiod (OBIO_IOMEM_PCMCIA_ATT|OBIO_IOMEM_PCMCIA_8BIT) 2128f81a840Smiod 2138f81a840Smiod int obio_iomem_map(void *v, bus_addr_t bpa, bus_size_t size, int flags, 2148f81a840Smiod bus_space_handle_t *bshp); 2158f81a840Smiod void obio_iomem_unmap(void *v, bus_space_handle_t bsh, bus_size_t size); 2168f81a840Smiod int obio_iomem_subregion(void *v, bus_space_handle_t bsh, 2178f81a840Smiod bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp); 2188f81a840Smiod int obio_iomem_alloc(void *v, bus_addr_t rstart, bus_addr_t rend, 2198f81a840Smiod bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags, 2208f81a840Smiod bus_addr_t *bpap, bus_space_handle_t *bshp); 2218f81a840Smiod void obio_iomem_free(void *v, bus_space_handle_t bsh, bus_size_t size); 222c991c6fcSmiod void *obio_iomem_vaddr(void *v, bus_space_handle_t bsh); 2238f81a840Smiod 2248f81a840Smiod int obio_iomem_add_mapping(bus_addr_t, bus_size_t, int, 2258f81a840Smiod bus_space_handle_t *); 2268f81a840Smiod 2278f81a840Smiod int 2288f81a840Smiod obio_iomem_add_mapping(bus_addr_t bpa, bus_size_t size, int type, 2298f81a840Smiod bus_space_handle_t *bshp) 2308f81a840Smiod { 2318f81a840Smiod u_long pa, endpa; 2328f81a840Smiod vaddr_t va; 2338f81a840Smiod pt_entry_t *pte; 2348f81a840Smiod unsigned int m = 0; 2358f81a840Smiod int io_type = type & ~OBIO_IOMEM_PCMCIA_8BIT; 2368f81a840Smiod 2378f81a840Smiod pa = trunc_page(bpa); 2388f81a840Smiod endpa = round_page(bpa + size); 2398f81a840Smiod 2408f81a840Smiod #ifdef DIAGNOSTIC 2418f81a840Smiod if (endpa <= pa) 2428f81a840Smiod panic("obio_iomem_add_mapping: overflow"); 2438f81a840Smiod #endif 2448f81a840Smiod 2454d6deb19Skettenis va = (vaddr_t)km_alloc(endpa - pa, &kv_any, &kp_none, &kd_nowait); 246afd72e29Smiod if (va == 0) 2478f81a840Smiod return (ENOMEM); 2488f81a840Smiod 2498f81a840Smiod *bshp = (bus_space_handle_t)(va + (bpa & PGOFSET)); 2508f81a840Smiod 2518f81a840Smiod #define MODE(t, s) \ 2528f81a840Smiod ((t) & OBIO_IOMEM_PCMCIA_8BIT) ? \ 2538f81a840Smiod _PG_PCMCIA_ ## s ## 8 : \ 2548f81a840Smiod _PG_PCMCIA_ ## s ## 16 2558f81a840Smiod switch (io_type) { 2568f81a840Smiod default: 2578f81a840Smiod panic("unknown pcmcia space."); 2588f81a840Smiod /* NOTREACHED */ 2598f81a840Smiod case OBIO_IOMEM_PCMCIA_IO: 2608f81a840Smiod m = MODE(type, IO); 2618f81a840Smiod break; 2628f81a840Smiod case OBIO_IOMEM_PCMCIA_MEM: 2638f81a840Smiod m = MODE(type, MEM); 2648f81a840Smiod break; 2658f81a840Smiod case OBIO_IOMEM_PCMCIA_ATT: 2668f81a840Smiod m = MODE(type, ATTR); 2678f81a840Smiod break; 2688f81a840Smiod } 2698f81a840Smiod #undef MODE 2708f81a840Smiod 2718f81a840Smiod for (; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE) { 2721e8cdc2eSderaadt pmap_kenter_pa(va, pa, PROT_READ | PROT_WRITE); 2738f81a840Smiod pte = __pmap_kpte_lookup(va); 2748f81a840Smiod KDASSERT(pte); 2758f81a840Smiod *pte |= m; /* PTEA PCMCIA assistant bit */ 2768f81a840Smiod sh_tlb_update(0, va, *pte); 2778f81a840Smiod } 2788f81a840Smiod 2798f81a840Smiod return (0); 2808f81a840Smiod } 2818f81a840Smiod 2828f81a840Smiod int 2838f81a840Smiod obio_iomem_map(void *v, bus_addr_t bpa, bus_size_t size, 2848f81a840Smiod int flags, bus_space_handle_t *bshp) 2858f81a840Smiod { 2868f81a840Smiod bus_addr_t addr = SH3_PHYS_TO_P2SEG(bpa); 2878f81a840Smiod int error; 2888f81a840Smiod 2898f81a840Smiod KASSERT((bpa & SH3_PHYS_MASK) == bpa); 2908f81a840Smiod 2918f81a840Smiod if (bpa < 0x14000000 || bpa >= 0x1c000000) { 2928f81a840Smiod /* CS0,1,2,3,4,7 */ 2938f81a840Smiod *bshp = (bus_space_handle_t)addr; 2948f81a840Smiod return (0); 2958f81a840Smiod } 2968f81a840Smiod 2978f81a840Smiod /* CS5,6 */ 2988f81a840Smiod error = obio_iomem_add_mapping(addr, size, (int)(u_long)v, bshp); 2998f81a840Smiod 3008f81a840Smiod return (error); 3018f81a840Smiod } 3028f81a840Smiod 3038f81a840Smiod void 3048f81a840Smiod obio_iomem_unmap(void *v, bus_space_handle_t bsh, bus_size_t size) 3058f81a840Smiod { 3068f81a840Smiod u_long va, endva; 3078f81a840Smiod bus_addr_t bpa; 3088f81a840Smiod 3098f81a840Smiod if (bsh >= SH3_P2SEG_BASE && bsh <= SH3_P2SEG_END) { 3108f81a840Smiod /* maybe CS0,1,2,3,4,7 */ 3118f81a840Smiod return; 3128f81a840Smiod } 3138f81a840Smiod 3148f81a840Smiod /* CS5,6 */ 3158f81a840Smiod va = trunc_page(bsh); 3168f81a840Smiod endva = round_page(bsh + size); 3178f81a840Smiod 3188f81a840Smiod #ifdef DIAGNOSTIC 3198f81a840Smiod if (endva <= va) 3208f81a840Smiod panic("obio_io_unmap: overflow"); 3218f81a840Smiod #endif 3228f81a840Smiod 3238f81a840Smiod pmap_extract(pmap_kernel(), va, &bpa); 3248f81a840Smiod bpa += bsh & PGOFSET; 3258f81a840Smiod 3268f81a840Smiod pmap_kremove(va, endva - va); 3278f81a840Smiod 3288f81a840Smiod /* 3298f81a840Smiod * Free the kernel virtual mapping. 3308f81a840Smiod */ 3314d6deb19Skettenis km_free((void *)va, endva - va, &kv_any, &kp_none); 3328f81a840Smiod } 3338f81a840Smiod 3348f81a840Smiod int 3358f81a840Smiod obio_iomem_subregion(void *v, bus_space_handle_t bsh, 3368f81a840Smiod bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp) 3378f81a840Smiod { 3388f81a840Smiod *nbshp = bsh + offset; 3398f81a840Smiod 3408f81a840Smiod return (0); 3418f81a840Smiod } 3428f81a840Smiod 3438f81a840Smiod int 3448f81a840Smiod obio_iomem_alloc(void *v, bus_addr_t rstart, bus_addr_t rend, 3458f81a840Smiod bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags, 3468f81a840Smiod bus_addr_t *bpap, bus_space_handle_t *bshp) 3478f81a840Smiod { 3488f81a840Smiod *bshp = *bpap = rstart; 3498f81a840Smiod 3508f81a840Smiod return (0); 3518f81a840Smiod } 3528f81a840Smiod 3538f81a840Smiod void 3548f81a840Smiod obio_iomem_free(void *v, bus_space_handle_t bsh, bus_size_t size) 3558f81a840Smiod { 3568f81a840Smiod obio_iomem_unmap(v, bsh, size); 3578f81a840Smiod } 3588f81a840Smiod 359c991c6fcSmiod void * 360c991c6fcSmiod obio_iomem_vaddr(void *v, bus_space_handle_t bsh) 361c991c6fcSmiod { 362c991c6fcSmiod return ((void *)bsh); 363c991c6fcSmiod } 364c991c6fcSmiod 3658f81a840Smiod /* 3668f81a840Smiod * on-board I/O bus space read/write 3678f81a840Smiod */ 3688f81a840Smiod uint8_t obio_iomem_read_1(void *v, bus_space_handle_t bsh, bus_size_t offset); 3698f81a840Smiod uint16_t obio_iomem_read_2(void *v, bus_space_handle_t bsh, bus_size_t offset); 3708f81a840Smiod uint32_t obio_iomem_read_4(void *v, bus_space_handle_t bsh, bus_size_t offset); 3718f81a840Smiod void obio_iomem_read_multi_1(void *v, bus_space_handle_t bsh, 3728f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count); 3738f81a840Smiod void obio_iomem_read_multi_2(void *v, bus_space_handle_t bsh, 3748f81a840Smiod bus_size_t offset, uint16_t *addr, bus_size_t count); 3758f81a840Smiod void obio_iomem_read_multi_4(void *v, bus_space_handle_t bsh, 3768f81a840Smiod bus_size_t offset, uint32_t *addr, bus_size_t count); 3778f81a840Smiod void obio_iomem_read_raw_multi_2(void *v, bus_space_handle_t bsh, 3788f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count); 3798f81a840Smiod void obio_iomem_read_raw_multi_4(void *v, bus_space_handle_t bsh, 3808f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count); 3818f81a840Smiod void obio_iomem_read_region_1(void *v, bus_space_handle_t bsh, 3828f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count); 3838f81a840Smiod void obio_iomem_read_region_2(void *v, bus_space_handle_t bsh, 3848f81a840Smiod bus_size_t offset, uint16_t *addr, bus_size_t count); 3858f81a840Smiod void obio_iomem_read_region_4(void *v, bus_space_handle_t bsh, 3868f81a840Smiod bus_size_t offset, uint32_t *addr, bus_size_t count); 3878f81a840Smiod void obio_iomem_read_raw_region_2(void *v, bus_space_handle_t bsh, 3888f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count); 3898f81a840Smiod void obio_iomem_read_raw_region_4(void *v, bus_space_handle_t bsh, 3908f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count); 3918f81a840Smiod void obio_iomem_write_1(void *v, bus_space_handle_t bsh, bus_size_t offset, 3928f81a840Smiod uint8_t value); 3938f81a840Smiod void obio_iomem_write_2(void *v, bus_space_handle_t bsh, bus_size_t offset, 3948f81a840Smiod uint16_t value); 3958f81a840Smiod void obio_iomem_write_4(void *v, bus_space_handle_t bsh, bus_size_t offset, 3968f81a840Smiod uint32_t value); 3978f81a840Smiod void obio_iomem_write_multi_1(void *v, bus_space_handle_t bsh, 3988f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count); 3998f81a840Smiod void obio_iomem_write_multi_2(void *v, bus_space_handle_t bsh, 4008f81a840Smiod bus_size_t offset, const uint16_t *addr, bus_size_t count); 4018f81a840Smiod void obio_iomem_write_multi_4(void *v, bus_space_handle_t bsh, 4028f81a840Smiod bus_size_t offset, const uint32_t *addr, bus_size_t count); 4038f81a840Smiod void obio_iomem_write_raw_multi_2(void *v, bus_space_handle_t bsh, 4048f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count); 4058f81a840Smiod void obio_iomem_write_raw_multi_4(void *v, bus_space_handle_t bsh, 4068f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count); 4078f81a840Smiod void obio_iomem_write_region_1(void *v, bus_space_handle_t bsh, 4088f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count); 4098f81a840Smiod void obio_iomem_write_region_2(void *v, bus_space_handle_t bsh, 4108f81a840Smiod bus_size_t offset, const uint16_t *addr, bus_size_t count); 4118f81a840Smiod void obio_iomem_write_region_4(void *v, bus_space_handle_t bsh, 4128f81a840Smiod bus_size_t offset, const uint32_t *addr, bus_size_t count); 4138f81a840Smiod void obio_iomem_write_raw_region_2(void *v, bus_space_handle_t bsh, 4148f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count); 4158f81a840Smiod void obio_iomem_write_raw_region_4(void *v, bus_space_handle_t bsh, 4168f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count); 4178f81a840Smiod void obio_iomem_set_multi_1(void *v, bus_space_handle_t bsh, bus_size_t offset, 4188f81a840Smiod uint8_t val, bus_size_t count); 4198f81a840Smiod void obio_iomem_set_multi_2(void *v, bus_space_handle_t bsh, bus_size_t offset, 4208f81a840Smiod uint16_t val, bus_size_t count); 4218f81a840Smiod void obio_iomem_set_multi_4(void *v, bus_space_handle_t bsh, bus_size_t offset, 4228f81a840Smiod uint32_t val, bus_size_t count); 4238f81a840Smiod void obio_iomem_set_region_1(void *v, bus_space_handle_t bsh, 4248f81a840Smiod bus_size_t offset, uint8_t val, bus_size_t count); 4258f81a840Smiod void obio_iomem_set_region_2(void *v, bus_space_handle_t bsh, 4268f81a840Smiod bus_size_t offset, uint16_t val, bus_size_t count); 4278f81a840Smiod void obio_iomem_set_region_4(void *v, bus_space_handle_t bsh, 4288f81a840Smiod bus_size_t offset, uint32_t val, bus_size_t count); 4290cda87aaSmiod void obio_iomem_copy_1(void *v, bus_space_handle_t h1, bus_size_t o1, 4308f81a840Smiod bus_space_handle_t h2, bus_size_t o2, bus_size_t count); 4310cda87aaSmiod void obio_iomem_copy_2(void *v, bus_space_handle_t h1, bus_size_t o1, 4328f81a840Smiod bus_space_handle_t h2, bus_size_t o2, bus_size_t count); 4330cda87aaSmiod void obio_iomem_copy_4(void *v, bus_space_handle_t h1, bus_size_t o1, 4348f81a840Smiod bus_space_handle_t h2, bus_size_t o2, bus_size_t count); 4358f81a840Smiod 4368f81a840Smiod struct _bus_space obio_bus_io = 4378f81a840Smiod { 4388f81a840Smiod .bs_cookie = (void *)OBIO_IOMEM_PCMCIA_IO, 4398f81a840Smiod 4408f81a840Smiod .bs_map = obio_iomem_map, 4418f81a840Smiod .bs_unmap = obio_iomem_unmap, 4428f81a840Smiod .bs_subregion = obio_iomem_subregion, 4438f81a840Smiod 4448f81a840Smiod .bs_alloc = obio_iomem_alloc, 4458f81a840Smiod .bs_free = obio_iomem_free, 4468f81a840Smiod 447c991c6fcSmiod .bs_vaddr = obio_iomem_vaddr, 448c991c6fcSmiod 4498f81a840Smiod .bs_r_1 = obio_iomem_read_1, 4508f81a840Smiod .bs_r_2 = obio_iomem_read_2, 4518f81a840Smiod .bs_r_4 = obio_iomem_read_4, 4528f81a840Smiod 4538f81a840Smiod .bs_rm_1 = obio_iomem_read_multi_1, 4548f81a840Smiod .bs_rm_2 = obio_iomem_read_multi_2, 4558f81a840Smiod .bs_rm_4 = obio_iomem_read_multi_4, 4568f81a840Smiod 4578f81a840Smiod .bs_rrm_2 = obio_iomem_read_raw_multi_2, 4588f81a840Smiod .bs_rrm_4 = obio_iomem_read_raw_multi_4, 4598f81a840Smiod 4608f81a840Smiod .bs_rr_1 = obio_iomem_read_region_1, 4618f81a840Smiod .bs_rr_2 = obio_iomem_read_region_2, 4628f81a840Smiod .bs_rr_4 = obio_iomem_read_region_4, 4638f81a840Smiod 4648f81a840Smiod .bs_rrr_2 = obio_iomem_read_raw_region_2, 4658f81a840Smiod .bs_rrr_4 = obio_iomem_read_raw_region_4, 4668f81a840Smiod 4678f81a840Smiod .bs_w_1 = obio_iomem_write_1, 4688f81a840Smiod .bs_w_2 = obio_iomem_write_2, 4698f81a840Smiod .bs_w_4 = obio_iomem_write_4, 4708f81a840Smiod 4718f81a840Smiod .bs_wm_1 = obio_iomem_write_multi_1, 4728f81a840Smiod .bs_wm_2 = obio_iomem_write_multi_2, 4738f81a840Smiod .bs_wm_4 = obio_iomem_write_multi_4, 4748f81a840Smiod 4758f81a840Smiod .bs_wrm_2 = obio_iomem_write_raw_multi_2, 4768f81a840Smiod .bs_wrm_4 = obio_iomem_write_raw_multi_4, 4778f81a840Smiod 4788f81a840Smiod .bs_wr_1 = obio_iomem_write_region_1, 4798f81a840Smiod .bs_wr_2 = obio_iomem_write_region_2, 4808f81a840Smiod .bs_wr_4 = obio_iomem_write_region_4, 4818f81a840Smiod 4828f81a840Smiod .bs_wrr_2 = obio_iomem_write_raw_region_2, 4838f81a840Smiod .bs_wrr_4 = obio_iomem_write_raw_region_4, 4848f81a840Smiod 4858f81a840Smiod .bs_sm_1 = obio_iomem_set_multi_1, 4868f81a840Smiod .bs_sm_2 = obio_iomem_set_multi_2, 4878f81a840Smiod .bs_sm_4 = obio_iomem_set_multi_4, 4888f81a840Smiod 4898f81a840Smiod .bs_sr_1 = obio_iomem_set_region_1, 4908f81a840Smiod .bs_sr_2 = obio_iomem_set_region_2, 4918f81a840Smiod .bs_sr_4 = obio_iomem_set_region_4, 4928f81a840Smiod 4930cda87aaSmiod .bs_c_1 = obio_iomem_copy_1, 4940cda87aaSmiod .bs_c_2 = obio_iomem_copy_2, 4950cda87aaSmiod .bs_c_4 = obio_iomem_copy_4, 4968f81a840Smiod }; 4978f81a840Smiod 4988f81a840Smiod struct _bus_space obio_bus_mem = 4998f81a840Smiod { 5008f81a840Smiod .bs_cookie = (void *)OBIO_IOMEM_PCMCIA_MEM, 5018f81a840Smiod 5028f81a840Smiod .bs_map = obio_iomem_map, 5038f81a840Smiod .bs_unmap = obio_iomem_unmap, 5048f81a840Smiod .bs_subregion = obio_iomem_subregion, 5058f81a840Smiod 5068f81a840Smiod .bs_alloc = obio_iomem_alloc, 5078f81a840Smiod .bs_free = obio_iomem_free, 5088f81a840Smiod 509c991c6fcSmiod .bs_vaddr = obio_iomem_vaddr, 510c991c6fcSmiod 5118f81a840Smiod .bs_r_1 = obio_iomem_read_1, 5128f81a840Smiod .bs_r_2 = obio_iomem_read_2, 5138f81a840Smiod .bs_r_4 = obio_iomem_read_4, 5148f81a840Smiod 5158f81a840Smiod .bs_rm_1 = obio_iomem_read_multi_1, 5168f81a840Smiod .bs_rm_2 = obio_iomem_read_multi_2, 5178f81a840Smiod .bs_rm_4 = obio_iomem_read_multi_4, 5188f81a840Smiod 5198f81a840Smiod .bs_rrm_2 = obio_iomem_read_raw_multi_2, 5208f81a840Smiod .bs_rrm_4 = obio_iomem_read_raw_multi_4, 5218f81a840Smiod 5228f81a840Smiod .bs_rr_1 = obio_iomem_read_region_1, 5238f81a840Smiod .bs_rr_2 = obio_iomem_read_region_2, 5248f81a840Smiod .bs_rr_4 = obio_iomem_read_region_4, 5258f81a840Smiod 5268f81a840Smiod .bs_rrr_2 = obio_iomem_read_raw_region_2, 5278f81a840Smiod .bs_rrr_4 = obio_iomem_read_raw_region_4, 5288f81a840Smiod 5298f81a840Smiod .bs_w_1 = obio_iomem_write_1, 5308f81a840Smiod .bs_w_2 = obio_iomem_write_2, 5318f81a840Smiod .bs_w_4 = obio_iomem_write_4, 5328f81a840Smiod 5338f81a840Smiod .bs_wm_1 = obio_iomem_write_multi_1, 5348f81a840Smiod .bs_wm_2 = obio_iomem_write_multi_2, 5358f81a840Smiod .bs_wm_4 = obio_iomem_write_multi_4, 5368f81a840Smiod 5378f81a840Smiod .bs_wrm_2 = obio_iomem_write_raw_multi_2, 5388f81a840Smiod .bs_wrm_4 = obio_iomem_write_raw_multi_4, 5398f81a840Smiod 5408f81a840Smiod .bs_wr_1 = obio_iomem_write_region_1, 5418f81a840Smiod .bs_wr_2 = obio_iomem_write_region_2, 5428f81a840Smiod .bs_wr_4 = obio_iomem_write_region_4, 5438f81a840Smiod 5448f81a840Smiod .bs_wrr_2 = obio_iomem_write_raw_region_2, 5458f81a840Smiod .bs_wrr_4 = obio_iomem_write_raw_region_4, 5468f81a840Smiod 5478f81a840Smiod .bs_sm_1 = obio_iomem_set_multi_1, 5488f81a840Smiod .bs_sm_2 = obio_iomem_set_multi_2, 5498f81a840Smiod .bs_sm_4 = obio_iomem_set_multi_4, 5508f81a840Smiod 5518f81a840Smiod .bs_sr_1 = obio_iomem_set_region_1, 5528f81a840Smiod .bs_sr_2 = obio_iomem_set_region_2, 5538f81a840Smiod .bs_sr_4 = obio_iomem_set_region_4, 5548f81a840Smiod 5550cda87aaSmiod .bs_c_1 = obio_iomem_copy_1, 5560cda87aaSmiod .bs_c_2 = obio_iomem_copy_2, 5570cda87aaSmiod .bs_c_4 = obio_iomem_copy_4, 5588f81a840Smiod }; 5598f81a840Smiod 5608f81a840Smiod /* read */ 5618f81a840Smiod uint8_t 5628f81a840Smiod obio_iomem_read_1(void *v, bus_space_handle_t bsh, bus_size_t offset) 5638f81a840Smiod { 5648f81a840Smiod return *(volatile uint8_t *)(bsh + offset); 5658f81a840Smiod } 5668f81a840Smiod 5678f81a840Smiod uint16_t 5688f81a840Smiod obio_iomem_read_2(void *v, bus_space_handle_t bsh, bus_size_t offset) 5698f81a840Smiod { 5708f81a840Smiod return *(volatile uint16_t *)(bsh + offset); 5718f81a840Smiod } 5728f81a840Smiod 5738f81a840Smiod uint32_t 5748f81a840Smiod obio_iomem_read_4(void *v, bus_space_handle_t bsh, bus_size_t offset) 5758f81a840Smiod { 5768f81a840Smiod return *(volatile uint32_t *)(bsh + offset); 5778f81a840Smiod } 5788f81a840Smiod 5798f81a840Smiod void 5808f81a840Smiod obio_iomem_read_multi_1(void *v, bus_space_handle_t bsh, 5818f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count) 5828f81a840Smiod { 5838f81a840Smiod volatile uint8_t *p = (void *)(bsh + offset); 5848f81a840Smiod 5858f81a840Smiod while (count--) { 5868f81a840Smiod *addr++ = *p; 5878f81a840Smiod } 5888f81a840Smiod } 5898f81a840Smiod 5908f81a840Smiod void 5918f81a840Smiod obio_iomem_read_multi_2(void *v, bus_space_handle_t bsh, 5928f81a840Smiod bus_size_t offset, uint16_t *addr, bus_size_t count) 5938f81a840Smiod { 5948f81a840Smiod volatile uint16_t *p = (void *)(bsh + offset); 5958f81a840Smiod 5968f81a840Smiod while (count--) { 5978f81a840Smiod *addr++ = *p; 5988f81a840Smiod } 5998f81a840Smiod } 6008f81a840Smiod 6018f81a840Smiod void 6028f81a840Smiod obio_iomem_read_multi_4(void *v, bus_space_handle_t bsh, 6038f81a840Smiod bus_size_t offset, uint32_t *addr, bus_size_t count) 6048f81a840Smiod { 6058f81a840Smiod volatile uint32_t *p = (void *)(bsh + offset); 6068f81a840Smiod 6078f81a840Smiod while (count--) { 6088f81a840Smiod *addr++ = *p; 6098f81a840Smiod } 6108f81a840Smiod } 6118f81a840Smiod 6128f81a840Smiod void 6138f81a840Smiod obio_iomem_read_raw_multi_2(void *v, bus_space_handle_t bsh, 6148f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count) 6158f81a840Smiod { 6168f81a840Smiod volatile uint16_t *p = (void *)(bsh + offset); 6178f81a840Smiod 6188f81a840Smiod count >>= 1; 6198f81a840Smiod while (count--) { 6208f81a840Smiod *(uint16_t *)addr = *p; 6218f81a840Smiod addr += 2; 6228f81a840Smiod } 6238f81a840Smiod } 6248f81a840Smiod 6258f81a840Smiod void 6268f81a840Smiod obio_iomem_read_raw_multi_4(void *v, bus_space_handle_t bsh, 6278f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count) 6288f81a840Smiod { 6298f81a840Smiod volatile uint32_t *p = (void *)(bsh + offset); 6308f81a840Smiod 6318f81a840Smiod count >>= 2; 6328f81a840Smiod while (count--) { 6338f81a840Smiod *(uint32_t *)addr = *p; 6348f81a840Smiod addr += 4; 6358f81a840Smiod } 6368f81a840Smiod } 6378f81a840Smiod 6388f81a840Smiod void 6398f81a840Smiod obio_iomem_read_region_1(void *v, bus_space_handle_t bsh, 6408f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count) 6418f81a840Smiod { 6428f81a840Smiod volatile uint8_t *p = (void *)(bsh + offset); 6438f81a840Smiod 6448f81a840Smiod while (count--) { 6458f81a840Smiod *addr++ = *p++; 6468f81a840Smiod } 6478f81a840Smiod } 6488f81a840Smiod 6498f81a840Smiod void 6508f81a840Smiod obio_iomem_read_region_2(void *v, bus_space_handle_t bsh, 6518f81a840Smiod bus_size_t offset, uint16_t *addr, bus_size_t count) 6528f81a840Smiod { 6538f81a840Smiod volatile uint16_t *p = (void *)(bsh + offset); 6548f81a840Smiod 6558f81a840Smiod while (count--) { 6568f81a840Smiod *addr++ = *p++; 6578f81a840Smiod } 6588f81a840Smiod } 6598f81a840Smiod 6608f81a840Smiod void 6618f81a840Smiod obio_iomem_read_region_4(void *v, bus_space_handle_t bsh, 6628f81a840Smiod bus_size_t offset, uint32_t *addr, bus_size_t count) 6638f81a840Smiod { 6648f81a840Smiod volatile uint32_t *p = (void *)(bsh + offset); 6658f81a840Smiod 6668f81a840Smiod while (count--) { 6678f81a840Smiod *addr++ = *p++; 6688f81a840Smiod } 6698f81a840Smiod } 6708f81a840Smiod 6718f81a840Smiod void 6728f81a840Smiod obio_iomem_read_raw_region_2(void *v, bus_space_handle_t bsh, 6738f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count) 6748f81a840Smiod { 6758f81a840Smiod volatile uint16_t *p = (void *)(bsh + offset); 6768f81a840Smiod 6778f81a840Smiod count >>= 1; 6788f81a840Smiod while (count--) { 6798f81a840Smiod *(uint16_t *)addr = *p++; 6808f81a840Smiod addr += 2; 6818f81a840Smiod } 6828f81a840Smiod } 6838f81a840Smiod 6848f81a840Smiod void 6858f81a840Smiod obio_iomem_read_raw_region_4(void *v, bus_space_handle_t bsh, 6868f81a840Smiod bus_size_t offset, uint8_t *addr, bus_size_t count) 6878f81a840Smiod { 6888f81a840Smiod volatile uint32_t *p = (void *)(bsh + offset); 6898f81a840Smiod 6908f81a840Smiod count >>= 2; 6918f81a840Smiod while (count--) { 6928f81a840Smiod *(uint32_t *)addr = *p++; 6938f81a840Smiod addr += 4; 6948f81a840Smiod } 6958f81a840Smiod } 6968f81a840Smiod 6978f81a840Smiod /* write */ 6988f81a840Smiod void 6998f81a840Smiod obio_iomem_write_1(void *v, bus_space_handle_t bsh, bus_size_t offset, 7008f81a840Smiod uint8_t value) 7018f81a840Smiod { 7028f81a840Smiod *(volatile uint8_t *)(bsh + offset) = value; 7038f81a840Smiod } 7048f81a840Smiod 7058f81a840Smiod void 7068f81a840Smiod obio_iomem_write_2(void *v, bus_space_handle_t bsh, bus_size_t offset, 7078f81a840Smiod uint16_t value) 7088f81a840Smiod { 7098f81a840Smiod *(volatile uint16_t *)(bsh + offset) = value; 7108f81a840Smiod } 7118f81a840Smiod 7128f81a840Smiod void 7138f81a840Smiod obio_iomem_write_4(void *v, bus_space_handle_t bsh, bus_size_t offset, 7148f81a840Smiod uint32_t value) 7158f81a840Smiod { 7168f81a840Smiod *(volatile uint32_t *)(bsh + offset) = value; 7178f81a840Smiod } 7188f81a840Smiod 7198f81a840Smiod void 7208f81a840Smiod obio_iomem_write_multi_1(void *v, bus_space_handle_t bsh, 7218f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 7228f81a840Smiod { 7238f81a840Smiod volatile uint8_t *p = (void *)(bsh + offset); 7248f81a840Smiod 7258f81a840Smiod while (count--) { 7268f81a840Smiod *p = *addr++; 7278f81a840Smiod } 7288f81a840Smiod } 7298f81a840Smiod 7308f81a840Smiod void 7318f81a840Smiod obio_iomem_write_multi_2(void *v, bus_space_handle_t bsh, 7328f81a840Smiod bus_size_t offset, const uint16_t *addr, bus_size_t count) 7338f81a840Smiod { 7348f81a840Smiod volatile uint16_t *p = (void *)(bsh + offset); 7358f81a840Smiod 7368f81a840Smiod while (count--) { 7378f81a840Smiod *p = *addr++; 7388f81a840Smiod } 7398f81a840Smiod } 7408f81a840Smiod 7418f81a840Smiod void 7428f81a840Smiod obio_iomem_write_multi_4(void *v, bus_space_handle_t bsh, 7438f81a840Smiod bus_size_t offset, const uint32_t *addr, bus_size_t count) 7448f81a840Smiod { 7458f81a840Smiod volatile uint32_t *p = (void *)(bsh + offset); 7468f81a840Smiod 7478f81a840Smiod while (count--) { 7488f81a840Smiod *p = *addr++; 7498f81a840Smiod } 7508f81a840Smiod } 7518f81a840Smiod 7528f81a840Smiod void 7538f81a840Smiod obio_iomem_write_raw_multi_2(void *v, bus_space_handle_t bsh, 7548f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 7558f81a840Smiod { 7568f81a840Smiod volatile uint16_t *p = (void *)(bsh + offset); 7578f81a840Smiod 7588f81a840Smiod count >>= 1; 7598f81a840Smiod while (count--) { 7608f81a840Smiod *p = *(uint16_t *)addr; 7618f81a840Smiod addr += 2; 7628f81a840Smiod } 7638f81a840Smiod } 7648f81a840Smiod 7658f81a840Smiod void 7668f81a840Smiod obio_iomem_write_raw_multi_4(void *v, bus_space_handle_t bsh, 7678f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 7688f81a840Smiod { 7698f81a840Smiod volatile uint32_t *p = (void *)(bsh + offset); 7708f81a840Smiod 7718f81a840Smiod count >>= 2; 7728f81a840Smiod while (count--) { 7738f81a840Smiod *p = *(uint32_t *)addr; 7748f81a840Smiod addr += 4; 7758f81a840Smiod } 7768f81a840Smiod } 7778f81a840Smiod 7788f81a840Smiod void 7798f81a840Smiod obio_iomem_write_region_1(void *v, bus_space_handle_t bsh, 7808f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 7818f81a840Smiod { 7828f81a840Smiod volatile uint8_t *p = (void *)(bsh + offset); 7838f81a840Smiod 7848f81a840Smiod while (count--) { 7858f81a840Smiod *p++ = *addr++; 7868f81a840Smiod } 7878f81a840Smiod } 7888f81a840Smiod 7898f81a840Smiod void 7908f81a840Smiod obio_iomem_write_region_2(void *v, bus_space_handle_t bsh, 7918f81a840Smiod bus_size_t offset, const uint16_t *addr, bus_size_t count) 7928f81a840Smiod { 7938f81a840Smiod volatile uint16_t *p = (void *)(bsh + offset); 7948f81a840Smiod 7958f81a840Smiod while (count--) { 7968f81a840Smiod *p++ = *addr++; 7978f81a840Smiod } 7988f81a840Smiod } 7998f81a840Smiod 8008f81a840Smiod void 8018f81a840Smiod obio_iomem_write_region_4(void *v, bus_space_handle_t bsh, 8028f81a840Smiod bus_size_t offset, const uint32_t *addr, bus_size_t count) 8038f81a840Smiod { 8048f81a840Smiod volatile uint32_t *p = (void *)(bsh + offset); 8058f81a840Smiod 8068f81a840Smiod while (count--) { 8078f81a840Smiod *p++ = *addr++; 8088f81a840Smiod } 8098f81a840Smiod } 8108f81a840Smiod 8118f81a840Smiod void 8128f81a840Smiod obio_iomem_write_raw_region_2(void *v, bus_space_handle_t bsh, 8138f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 8148f81a840Smiod { 8158f81a840Smiod volatile uint16_t *p = (void *)(bsh + offset); 8168f81a840Smiod 8178f81a840Smiod count >>= 1; 8188f81a840Smiod while (count--) { 8198f81a840Smiod *p++ = *(uint16_t *)addr; 8208f81a840Smiod addr += 2; 8218f81a840Smiod } 8228f81a840Smiod } 8238f81a840Smiod 8248f81a840Smiod void 8258f81a840Smiod obio_iomem_write_raw_region_4(void *v, bus_space_handle_t bsh, 8268f81a840Smiod bus_size_t offset, const uint8_t *addr, bus_size_t count) 8278f81a840Smiod { 8288f81a840Smiod volatile uint32_t *p = (void *)(bsh + offset); 8298f81a840Smiod 8308f81a840Smiod count >>= 2; 8318f81a840Smiod while (count--) { 8328f81a840Smiod *p++ = *(uint32_t *)addr; 8338f81a840Smiod addr += 4; 8348f81a840Smiod } 8358f81a840Smiod } 8368f81a840Smiod 8378f81a840Smiod void 8388f81a840Smiod obio_iomem_set_multi_1(void *v, bus_space_handle_t bsh, 8398f81a840Smiod bus_size_t offset, uint8_t val, bus_size_t count) 8408f81a840Smiod { 8418f81a840Smiod volatile uint8_t *p = (void *)(bsh + offset); 8428f81a840Smiod 8438f81a840Smiod while (count--) { 8448f81a840Smiod *p = val; 8458f81a840Smiod } 8468f81a840Smiod } 8478f81a840Smiod 8488f81a840Smiod void 8498f81a840Smiod obio_iomem_set_multi_2(void *v, bus_space_handle_t bsh, 8508f81a840Smiod bus_size_t offset, uint16_t val, bus_size_t count) 8518f81a840Smiod { 8528f81a840Smiod volatile uint16_t *p = (void *)(bsh + offset); 8538f81a840Smiod 8548f81a840Smiod while (count--) { 8558f81a840Smiod *p = val; 8568f81a840Smiod } 8578f81a840Smiod } 8588f81a840Smiod 8598f81a840Smiod void 8608f81a840Smiod obio_iomem_set_multi_4(void *v, bus_space_handle_t bsh, 8618f81a840Smiod bus_size_t offset, uint32_t val, bus_size_t count) 8628f81a840Smiod { 8638f81a840Smiod volatile uint32_t *p = (void *)(bsh + offset); 8648f81a840Smiod 8658f81a840Smiod while (count--) { 8668f81a840Smiod *p = val; 8678f81a840Smiod } 8688f81a840Smiod } 8698f81a840Smiod 8708f81a840Smiod void 8718f81a840Smiod obio_iomem_set_region_1(void *v, bus_space_handle_t bsh, 8728f81a840Smiod bus_size_t offset, uint8_t val, bus_size_t count) 8738f81a840Smiod { 8748f81a840Smiod volatile uint8_t *addr = (void *)(bsh + offset); 8758f81a840Smiod 8768f81a840Smiod while (count--) { 8778f81a840Smiod *addr++ = val; 8788f81a840Smiod } 8798f81a840Smiod } 8808f81a840Smiod 8818f81a840Smiod void 8828f81a840Smiod obio_iomem_set_region_2(void *v, bus_space_handle_t bsh, 8838f81a840Smiod bus_size_t offset, uint16_t val, bus_size_t count) 8848f81a840Smiod { 8858f81a840Smiod volatile uint16_t *addr = (void *)(bsh + offset); 8868f81a840Smiod 8878f81a840Smiod while (count--) { 8888f81a840Smiod *addr++ = val; 8898f81a840Smiod } 8908f81a840Smiod } 8918f81a840Smiod 8928f81a840Smiod void 8938f81a840Smiod obio_iomem_set_region_4(void *v, bus_space_handle_t bsh, 8948f81a840Smiod bus_size_t offset, uint32_t val, bus_size_t count) 8958f81a840Smiod { 8968f81a840Smiod volatile uint32_t *addr = (void *)(bsh + offset); 8978f81a840Smiod 8988f81a840Smiod while (count--) { 8998f81a840Smiod *addr++ = val; 9008f81a840Smiod } 9018f81a840Smiod } 9028f81a840Smiod 9038f81a840Smiod void 9040cda87aaSmiod obio_iomem_copy_1(void *v, bus_space_handle_t h1, bus_size_t o1, 9058f81a840Smiod bus_space_handle_t h2, bus_size_t o2, bus_size_t count) 9068f81a840Smiod { 9078f81a840Smiod volatile uint8_t *addr1 = (void *)(h1 + o1); 9088f81a840Smiod volatile uint8_t *addr2 = (void *)(h2 + o2); 9098f81a840Smiod 9108f81a840Smiod if (addr1 >= addr2) { /* src after dest: copy forward */ 9118f81a840Smiod while (count--) { 9128f81a840Smiod *addr2++ = *addr1++; 9138f81a840Smiod } 9148f81a840Smiod } else { /* dest after src: copy backwards */ 9158f81a840Smiod addr1 += count - 1; 9168f81a840Smiod addr2 += count - 1; 9178f81a840Smiod while (count--) { 9188f81a840Smiod *addr2-- = *addr1--; 9198f81a840Smiod } 9208f81a840Smiod } 9218f81a840Smiod } 9228f81a840Smiod 9238f81a840Smiod void 9240cda87aaSmiod obio_iomem_copy_2(void *v, bus_space_handle_t h1, bus_size_t o1, 9258f81a840Smiod bus_space_handle_t h2, bus_size_t o2, bus_size_t count) 9268f81a840Smiod { 9278f81a840Smiod volatile uint16_t *addr1 = (void *)(h1 + o1); 9288f81a840Smiod volatile uint16_t *addr2 = (void *)(h2 + o2); 9298f81a840Smiod 9308f81a840Smiod if (addr1 >= addr2) { /* src after dest: copy forward */ 9318f81a840Smiod while (count--) { 9328f81a840Smiod *addr2++ = *addr1++; 9338f81a840Smiod } 9348f81a840Smiod } else { /* dest after src: copy backwards */ 9358f81a840Smiod addr1 += count - 1; 9368f81a840Smiod addr2 += count - 1; 9378f81a840Smiod while (count--) { 9388f81a840Smiod *addr2-- = *addr1--; 9398f81a840Smiod } 9408f81a840Smiod } 9418f81a840Smiod } 9428f81a840Smiod 9438f81a840Smiod void 9440cda87aaSmiod obio_iomem_copy_4(void *v, bus_space_handle_t h1, bus_size_t o1, 9458f81a840Smiod bus_space_handle_t h2, bus_size_t o2, bus_size_t count) 9468f81a840Smiod { 9478f81a840Smiod volatile uint32_t *addr1 = (void *)(h1 + o1); 9488f81a840Smiod volatile uint32_t *addr2 = (void *)(h2 + o2); 9498f81a840Smiod 9508f81a840Smiod if (addr1 >= addr2) { /* src after dest: copy forward */ 9518f81a840Smiod while (count--) { 9528f81a840Smiod *addr2++ = *addr1++; 9538f81a840Smiod } 9548f81a840Smiod } else { /* dest after src: copy backwards */ 9558f81a840Smiod addr1 += count - 1; 9568f81a840Smiod addr2 += count - 1; 9578f81a840Smiod while (count--) { 9588f81a840Smiod *addr2-- = *addr1--; 9598f81a840Smiod } 9608f81a840Smiod } 9618f81a840Smiod } 962