xref: /openbsd-src/sys/arch/landisk/dev/obio.c (revision 3836e7c723d9c621d1bfafcdf2fb1c68075fdb93)
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