xref: /netbsd-src/sys/arch/landisk/dev/obio.c (revision c7fb772b85b2b5d4cfb282f868f454b4701534fd)
1*c7fb772bSthorpej /*	$NetBSD: obio.c,v 1.11 2021/08/07 16:18:57 thorpej Exp $	*/
21fd097bfSuwe 
31fd097bfSuwe /*-
41fd097bfSuwe  * Copyright (c) 1998 The NetBSD Foundation, Inc.
51fd097bfSuwe  * All rights reserved.
61fd097bfSuwe  *
71fd097bfSuwe  * This code is derived from software contributed to The NetBSD Foundation
81fd097bfSuwe  * by Charles M. Hannum.
91fd097bfSuwe  *
101fd097bfSuwe  * Redistribution and use in source and binary forms, with or without
111fd097bfSuwe  * modification, are permitted provided that the following conditions
121fd097bfSuwe  * are met:
131fd097bfSuwe  * 1. Redistributions of source code must retain the above copyright
141fd097bfSuwe  *    notice, this list of conditions and the following disclaimer.
151fd097bfSuwe  * 2. Redistributions in binary form must reproduce the above copyright
161fd097bfSuwe  *    notice, this list of conditions and the following disclaimer in the
171fd097bfSuwe  *    documentation and/or other materials provided with the distribution.
181fd097bfSuwe  *
191fd097bfSuwe  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
201fd097bfSuwe  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
211fd097bfSuwe  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
221fd097bfSuwe  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
231fd097bfSuwe  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
241fd097bfSuwe  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
251fd097bfSuwe  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
261fd097bfSuwe  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
271fd097bfSuwe  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
281fd097bfSuwe  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
291fd097bfSuwe  * POSSIBILITY OF SUCH DAMAGE.
301fd097bfSuwe  */
311fd097bfSuwe 
321fd097bfSuwe #include <sys/cdefs.h>
33*c7fb772bSthorpej __KERNEL_RCSID(0, "$NetBSD: obio.c,v 1.11 2021/08/07 16:18:57 thorpej Exp $");
341fd097bfSuwe 
351fd097bfSuwe #include "btn_obio.h"
361fd097bfSuwe #include "pwrsw_obio.h"
371fd097bfSuwe 
381fd097bfSuwe #include <sys/param.h>
391fd097bfSuwe #include <sys/systm.h>
401fd097bfSuwe #include <sys/device.h>
411fd097bfSuwe 
421fd097bfSuwe #include <uvm/uvm_extern.h>
431fd097bfSuwe 
441fd097bfSuwe #include <sh3/devreg.h>
451fd097bfSuwe #include <sh3/mmu.h>
461fd097bfSuwe #include <sh3/pmap.h>
471fd097bfSuwe #include <sh3/pte.h>
481fd097bfSuwe 
49cf10107dSdyoung #include <sys/bus.h>
501fd097bfSuwe #include <machine/cpu.h>
511fd097bfSuwe #include <machine/intr.h>
521fd097bfSuwe 
531fd097bfSuwe #include <landisk/dev/obiovar.h>
541fd097bfSuwe 
551fd097bfSuwe #if (NPWRSW_OBIO > 0) || (NBTN_OBIO > 0)
561fd097bfSuwe #include <dev/sysmon/sysmonvar.h>
571fd097bfSuwe #include <dev/sysmon/sysmon_taskq.h>
581fd097bfSuwe #endif
591fd097bfSuwe 
601fd097bfSuwe #include "locators.h"
611fd097bfSuwe 
62907d9513Suwe 
63907d9513Suwe struct obio_softc {
64907d9513Suwe 	device_t sc_dev;
65907d9513Suwe 
66907d9513Suwe 	bus_space_tag_t sc_iot;		/* io space tag */
67907d9513Suwe 	bus_space_tag_t sc_memt;	/* mem space tag */
68907d9513Suwe };
69907d9513Suwe 
70907d9513Suwe static int	obio_match(device_t, cfdata_t, void *);
718b4bf162Suwe static void	obio_attach(device_t, device_t, void *);
721fd097bfSuwe static int	obio_print(void *, const char *);
73907d9513Suwe static int	obio_search(device_t, cfdata_t, const int *, void *);
741fd097bfSuwe 
75907d9513Suwe CFATTACH_DECL_NEW(obio, sizeof(struct obio_softc),
761fd097bfSuwe     obio_match, obio_attach, NULL, NULL);
771fd097bfSuwe 
781fd097bfSuwe static int
obio_match(device_t parent,cfdata_t cf,void * aux)79907d9513Suwe obio_match(device_t parent, cfdata_t cf, void *aux)
801fd097bfSuwe {
811fd097bfSuwe 	struct obiobus_attach_args *oba = aux;
821fd097bfSuwe 
831fd097bfSuwe 	if (strcmp(oba->oba_busname, cf->cf_name))
841fd097bfSuwe 		return (0);
851fd097bfSuwe 
861fd097bfSuwe 	return (1);
871fd097bfSuwe }
881fd097bfSuwe 
891fd097bfSuwe static void
obio_attach(device_t parent,device_t self,void * aux)908b4bf162Suwe obio_attach(device_t parent, device_t self, void *aux)
911fd097bfSuwe {
928b4bf162Suwe 	struct obio_softc *sc = device_private(self);
931fd097bfSuwe 	struct obiobus_attach_args *oba = aux;
941fd097bfSuwe 
958b4bf162Suwe 	aprint_naive("\n");
968b4bf162Suwe 	aprint_normal("\n");
971fd097bfSuwe 
98907d9513Suwe 	sc->sc_dev = self;
99907d9513Suwe 
1001fd097bfSuwe 	sc->sc_iot = oba->oba_iot;
1011fd097bfSuwe 	sc->sc_memt = oba->oba_memt;
1021fd097bfSuwe 
1031fd097bfSuwe #if (NPWRSW_OBIO > 0) || (NBTN_OBIO > 0)
1041fd097bfSuwe 	sysmon_power_settype("landisk");
1051fd097bfSuwe 	sysmon_task_queue_init();
1061fd097bfSuwe #endif
1071fd097bfSuwe 
1082685996bSthorpej 	config_search(self, NULL,
109*c7fb772bSthorpej 	    CFARGS(.search = obio_search));
1101fd097bfSuwe }
1111fd097bfSuwe 
1121fd097bfSuwe static int
obio_search(device_t parent,cfdata_t cf,const int * ldesc,void * aux)113907d9513Suwe obio_search(device_t parent, cfdata_t cf, const int *ldesc, void *aux)
1141fd097bfSuwe {
1151fd097bfSuwe 	struct obio_io res_io[1];
1161fd097bfSuwe 	struct obio_iomem res_mem[1];
1171fd097bfSuwe 	struct obio_irq res_irq[1];
1188b4bf162Suwe 	struct obio_softc *sc = device_private(parent);
1191fd097bfSuwe 	struct obio_attach_args oa;
1201fd097bfSuwe 	int tryagain;
1211fd097bfSuwe 
1221fd097bfSuwe 	do {
1231fd097bfSuwe 		oa.oa_iot = sc->sc_iot;
1241fd097bfSuwe 		oa.oa_memt = sc->sc_memt;
1251fd097bfSuwe 
1261fd097bfSuwe 		res_io[0].or_addr = cf->cf_iobase;
1271fd097bfSuwe 		res_io[0].or_size = cf->cf_iosize;
1281fd097bfSuwe 
1291fd097bfSuwe 		res_mem[0].or_addr = cf->cf_maddr;
1301fd097bfSuwe 		res_mem[0].or_size = cf->cf_msize;
1311fd097bfSuwe 
1321fd097bfSuwe 		res_irq[0].or_irq = cf->cf_irq;
1331fd097bfSuwe 
1341fd097bfSuwe 		oa.oa_io = res_io;
1351fd097bfSuwe 		oa.oa_nio = 1;
1361fd097bfSuwe 
1371fd097bfSuwe 		oa.oa_iomem = res_mem;
1381fd097bfSuwe 		oa.oa_niomem = 1;
1391fd097bfSuwe 
1401fd097bfSuwe 		oa.oa_irq = res_irq;
1411fd097bfSuwe 		oa.oa_nirq = 1;
1421fd097bfSuwe 
1431fd097bfSuwe 		tryagain = 0;
1442685996bSthorpej 		if (config_probe(parent, cf, &oa)) {
145*c7fb772bSthorpej 			config_attach(parent, cf, &oa, obio_print, CFARGS_NONE);
1461fd097bfSuwe 			tryagain = (cf->cf_fstate == FSTATE_STAR);
1471fd097bfSuwe 		}
1481fd097bfSuwe 	} while (tryagain);
1491fd097bfSuwe 
1501fd097bfSuwe 	return (0);
1511fd097bfSuwe }
1521fd097bfSuwe 
1531fd097bfSuwe static int
obio_print(void * args,const char * name)1541fd097bfSuwe obio_print(void *args, const char *name)
1551fd097bfSuwe {
1561fd097bfSuwe 	struct obio_attach_args *oa = args;
1571fd097bfSuwe 	const char *sep;
1581fd097bfSuwe 	int i;
1591fd097bfSuwe 
1601fd097bfSuwe 	if (oa->oa_nio) {
1611fd097bfSuwe 		sep = "";
1621fd097bfSuwe 		aprint_normal(" port ");
1631fd097bfSuwe 		for (i = 0; i < oa->oa_nio; i++) {
1641fd097bfSuwe 			if (oa->oa_io[i].or_size == 0)
1651fd097bfSuwe 				continue;
1661fd097bfSuwe 			aprint_normal("%s0x%x", sep, oa->oa_io[i].or_addr);
1671fd097bfSuwe 			if (oa->oa_io[i].or_size > 1)
1681fd097bfSuwe 				aprint_normal("-0x%x", oa->oa_io[i].or_addr +
1691fd097bfSuwe 				    oa->oa_io[i].or_size - 1);
1701fd097bfSuwe 			sep = ",";
1711fd097bfSuwe 		}
1721fd097bfSuwe 	}
1731fd097bfSuwe 
1741fd097bfSuwe 	if (oa->oa_niomem) {
1751fd097bfSuwe 		sep = "";
1761fd097bfSuwe 		aprint_normal(" iomem ");
1771fd097bfSuwe 		for (i = 0; i < oa->oa_niomem; i++) {
1781fd097bfSuwe 			if (oa->oa_iomem[i].or_size == 0)
1791fd097bfSuwe 				continue;
1801fd097bfSuwe 			aprint_normal("%s0x%x", sep, oa->oa_iomem[i].or_addr);
1811fd097bfSuwe 			if (oa->oa_iomem[i].or_size > 1)
1821fd097bfSuwe 				aprint_normal("-0x%x", oa->oa_iomem[i].or_addr +
1831fd097bfSuwe 				    oa->oa_iomem[i].or_size - 1);
1841fd097bfSuwe 			sep = ",";
1851fd097bfSuwe 		}
1861fd097bfSuwe 	}
1871fd097bfSuwe 
1881fd097bfSuwe 	if (oa->oa_nirq) {
1891fd097bfSuwe 		sep = "";
1901fd097bfSuwe 		aprint_normal(" irq ");
1911fd097bfSuwe 		for (i = 0; i < oa->oa_nirq; i++) {
1921fd097bfSuwe 			if (oa->oa_irq[i].or_irq == IRQUNK)
1931fd097bfSuwe 				continue;
1941fd097bfSuwe 			aprint_normal("%s%d", sep, oa->oa_irq[i].or_irq);
1951fd097bfSuwe 			sep = ",";
1961fd097bfSuwe 		}
1971fd097bfSuwe 	}
1981fd097bfSuwe 
1991fd097bfSuwe 	return (UNCONF);
2001fd097bfSuwe }
2011fd097bfSuwe 
2021fd097bfSuwe /*
2031fd097bfSuwe  * Set up an interrupt handler to start being called.
2041fd097bfSuwe  */
2051fd097bfSuwe void *
obio_intr_establish(int irq,int level,int (* ih_fun)(void *),void * ih_arg)2061fd097bfSuwe obio_intr_establish(int irq, int level, int (*ih_fun)(void *), void *ih_arg)
2071fd097bfSuwe {
2081fd097bfSuwe 
2091fd097bfSuwe 	return extintr_establish(irq, level, ih_fun, ih_arg);
2101fd097bfSuwe }
2111fd097bfSuwe 
2121fd097bfSuwe /*
2131fd097bfSuwe  * Deregister an interrupt handler.
2141fd097bfSuwe  */
2151fd097bfSuwe void
obio_intr_disestablish(void * arg)2161fd097bfSuwe obio_intr_disestablish(void *arg)
2171fd097bfSuwe {
2181fd097bfSuwe 
2191fd097bfSuwe 	extintr_disestablish(arg);
2201fd097bfSuwe }
2211fd097bfSuwe 
2221fd097bfSuwe /*
2231fd097bfSuwe  * on-board I/O bus space
2241fd097bfSuwe  */
2251fd097bfSuwe #define	OBIO_IOMEM_IO		0	/* space is i/o space */
2261fd097bfSuwe #define	OBIO_IOMEM_MEM		1	/* space is mem space */
2271fd097bfSuwe #define	OBIO_IOMEM_PCMCIA_IO	2	/* PCMCIA IO space */
2281fd097bfSuwe #define	OBIO_IOMEM_PCMCIA_MEM	3	/* PCMCIA Mem space */
2291fd097bfSuwe #define	OBIO_IOMEM_PCMCIA_ATT	4	/* PCMCIA Attr space */
2301fd097bfSuwe #define	OBIO_IOMEM_PCMCIA_8BIT	0x8000	/* PCMCIA BUS 8 BIT WIDTH */
2311fd097bfSuwe #define	OBIO_IOMEM_PCMCIA_IO8 \
2321fd097bfSuwe 	    (OBIO_IOMEM_PCMCIA_IO|OBIO_IOMEM_PCMCIA_8BIT)
2331fd097bfSuwe #define	OBIO_IOMEM_PCMCIA_MEM8 \
2341fd097bfSuwe 	    (OBIO_IOMEM_PCMCIA_MEM|OBIO_IOMEM_PCMCIA_8BIT)
2351fd097bfSuwe #define	OBIO_IOMEM_PCMCIA_ATT8 \
2361fd097bfSuwe 	    (OBIO_IOMEM_PCMCIA_ATT|OBIO_IOMEM_PCMCIA_8BIT)
2371fd097bfSuwe 
2381fd097bfSuwe int obio_iomem_map(void *v, bus_addr_t bpa, bus_size_t size, int flags,
2391fd097bfSuwe     bus_space_handle_t *bshp);
2401fd097bfSuwe void obio_iomem_unmap(void *v, bus_space_handle_t bsh, bus_size_t size);
2411fd097bfSuwe int obio_iomem_subregion(void *v, bus_space_handle_t bsh,
2421fd097bfSuwe     bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp);
2431fd097bfSuwe int obio_iomem_alloc(void *v, bus_addr_t rstart, bus_addr_t rend,
2441fd097bfSuwe     bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags,
2451fd097bfSuwe     bus_addr_t *bpap, bus_space_handle_t *bshp);
2461fd097bfSuwe void obio_iomem_free(void *v, bus_space_handle_t bsh, bus_size_t size);
2474a585bfaSnonaka paddr_t obio_iomem_mmap(void *v, bus_addr_t addr, off_t off, int prot,
2484a585bfaSnonaka     int flags);
2491fd097bfSuwe 
2501fd097bfSuwe static int obio_iomem_add_mapping(bus_addr_t, bus_size_t, int,
2511fd097bfSuwe     bus_space_handle_t *);
2521fd097bfSuwe 
2531fd097bfSuwe static int
obio_iomem_add_mapping(bus_addr_t bpa,bus_size_t size,int type,bus_space_handle_t * bshp)2541fd097bfSuwe obio_iomem_add_mapping(bus_addr_t bpa, bus_size_t size, int type,
2551fd097bfSuwe     bus_space_handle_t *bshp)
2561fd097bfSuwe {
2571fd097bfSuwe 	u_long pa, endpa;
2581fd097bfSuwe 	vaddr_t va;
2591fd097bfSuwe 	pt_entry_t *pte;
2601fd097bfSuwe 	unsigned int m = 0;
2611fd097bfSuwe 	int io_type = type & ~OBIO_IOMEM_PCMCIA_8BIT;
2621fd097bfSuwe 
2631fd097bfSuwe 	pa = sh3_trunc_page(bpa);
2641fd097bfSuwe 	endpa = sh3_round_page(bpa + size);
2651fd097bfSuwe 
2661fd097bfSuwe #ifdef DIAGNOSTIC
2671fd097bfSuwe 	if (endpa <= pa)
2681fd097bfSuwe 		panic("obio_iomem_add_mapping: overflow");
2691fd097bfSuwe #endif
2701fd097bfSuwe 
2711fd097bfSuwe 	va = uvm_km_alloc(kernel_map, endpa - pa, 0, UVM_KMF_VAONLY);
2721fd097bfSuwe 	if (va == 0){
2731fd097bfSuwe 		printf("obio_iomem_add_mapping: nomem\n");
2741fd097bfSuwe 		return (ENOMEM);
2751fd097bfSuwe 	}
2761fd097bfSuwe 
2771fd097bfSuwe 	*bshp = (bus_space_handle_t)(va + (bpa & PGOFSET));
2781fd097bfSuwe 
2791fd097bfSuwe #define MODE(t, s)							\
2801fd097bfSuwe 	((t) & OBIO_IOMEM_PCMCIA_8BIT) ?				\
2811fd097bfSuwe 		_PG_PCMCIA_ ## s ## 8 :					\
2821fd097bfSuwe 		_PG_PCMCIA_ ## s ## 16
2831fd097bfSuwe 	switch (io_type) {
2841fd097bfSuwe 	default:
2851fd097bfSuwe 		panic("unknown pcmcia space.");
2861fd097bfSuwe 		/* NOTREACHED */
2871fd097bfSuwe 	case OBIO_IOMEM_PCMCIA_IO:
2881fd097bfSuwe 		m = MODE(type, IO);
2891fd097bfSuwe 		break;
2901fd097bfSuwe 	case OBIO_IOMEM_PCMCIA_MEM:
2911fd097bfSuwe 		m = MODE(type, MEM);
2921fd097bfSuwe 		break;
2931fd097bfSuwe 	case OBIO_IOMEM_PCMCIA_ATT:
2941fd097bfSuwe 		m = MODE(type, ATTR);
2951fd097bfSuwe 		break;
2961fd097bfSuwe 	}
2971fd097bfSuwe #undef MODE
2981fd097bfSuwe 
2991fd097bfSuwe 	for (; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE) {
3009480c51bScegger 		pmap_kenter_pa(va, pa, VM_PROT_READ | VM_PROT_WRITE, 0);
3011fd097bfSuwe 		pte = __pmap_kpte_lookup(va);
3021fd097bfSuwe 		KDASSERT(pte);
3031fd097bfSuwe 		*pte |= m;  /* PTEA PCMCIA assistant bit */
3041fd097bfSuwe 		sh_tlb_update(0, va, *pte);
3051fd097bfSuwe 	}
3061fd097bfSuwe 
3071fd097bfSuwe 	return (0);
3081fd097bfSuwe }
3091fd097bfSuwe 
3101fd097bfSuwe int
obio_iomem_map(void * v,bus_addr_t bpa,bus_size_t size,int flags,bus_space_handle_t * bshp)3111fd097bfSuwe obio_iomem_map(void *v, bus_addr_t bpa, bus_size_t size,
3121fd097bfSuwe     int flags, bus_space_handle_t *bshp)
3131fd097bfSuwe {
3141fd097bfSuwe 	bus_addr_t addr = SH3_PHYS_TO_P2SEG(bpa);
3151fd097bfSuwe 	int error;
3161fd097bfSuwe 
3171fd097bfSuwe 	KASSERT((bpa & SH3_PHYS_MASK) == bpa);
3181fd097bfSuwe 
3191fd097bfSuwe 	if (bpa < 0x14000000 || bpa >= 0x1c000000) {
3201fd097bfSuwe 		/* CS0,1,2,3,4,7 */
3211fd097bfSuwe 		*bshp = (bus_space_handle_t)addr;
3221fd097bfSuwe 		return (0);
3231fd097bfSuwe 	}
3241fd097bfSuwe 
3251fd097bfSuwe 	/* CS5,6 */
3261fd097bfSuwe 	error = obio_iomem_add_mapping(addr, size, (int)(u_long)v, bshp);
3271fd097bfSuwe 
3281fd097bfSuwe 	return (error);
3291fd097bfSuwe }
3301fd097bfSuwe 
3311fd097bfSuwe void
obio_iomem_unmap(void * v,bus_space_handle_t bsh,bus_size_t size)3321fd097bfSuwe obio_iomem_unmap(void *v, bus_space_handle_t bsh, bus_size_t size)
3331fd097bfSuwe {
3341fd097bfSuwe 	u_long va, endva;
3351fd097bfSuwe 	bus_addr_t bpa;
3361fd097bfSuwe 
3371fd097bfSuwe 	if (bsh >= SH3_P2SEG_BASE && bsh <= SH3_P2SEG_END) {
3381fd097bfSuwe 		/* maybe CS0,1,2,3,4,7 */
3391fd097bfSuwe 		return;
3401fd097bfSuwe 	}
3411fd097bfSuwe 
3421fd097bfSuwe 	/* CS5,6 */
3431fd097bfSuwe 	va = sh3_trunc_page(bsh);
3441fd097bfSuwe 	endva = sh3_round_page(bsh + size);
3451fd097bfSuwe 
3461fd097bfSuwe #ifdef DIAGNOSTIC
3471fd097bfSuwe 	if (endva <= va)
3481fd097bfSuwe 		panic("obio_io_unmap: overflow");
3491fd097bfSuwe #endif
3501fd097bfSuwe 
3511fd097bfSuwe 	pmap_extract(pmap_kernel(), va, &bpa);
3521fd097bfSuwe 	bpa += bsh & PGOFSET;
3531fd097bfSuwe 
3541fd097bfSuwe 	pmap_kremove(va, endva - va);
3551fd097bfSuwe 
3561fd097bfSuwe 	/*
3571fd097bfSuwe 	 * Free the kernel virtual mapping.
3581fd097bfSuwe 	 */
3591fd097bfSuwe 	uvm_km_free(kernel_map, va, endva - va, UVM_KMF_VAONLY);
3601fd097bfSuwe }
3611fd097bfSuwe 
3621fd097bfSuwe int
obio_iomem_subregion(void * v,bus_space_handle_t bsh,bus_size_t offset,bus_size_t size,bus_space_handle_t * nbshp)3631fd097bfSuwe obio_iomem_subregion(void *v, bus_space_handle_t bsh,
3641fd097bfSuwe     bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp)
3651fd097bfSuwe {
3661fd097bfSuwe 
3671fd097bfSuwe 	*nbshp = bsh + offset;
3681fd097bfSuwe 
3691fd097bfSuwe 	return (0);
3701fd097bfSuwe }
3711fd097bfSuwe 
3721fd097bfSuwe int
obio_iomem_alloc(void * v,bus_addr_t rstart,bus_addr_t rend,bus_size_t size,bus_size_t alignment,bus_size_t boundary,int flags,bus_addr_t * bpap,bus_space_handle_t * bshp)3731fd097bfSuwe obio_iomem_alloc(void *v, bus_addr_t rstart, bus_addr_t rend,
3741fd097bfSuwe     bus_size_t size, bus_size_t alignment, bus_size_t boundary, int flags,
3751fd097bfSuwe     bus_addr_t *bpap, bus_space_handle_t *bshp)
3761fd097bfSuwe {
3771fd097bfSuwe 
3781fd097bfSuwe 	*bshp = *bpap = rstart;
3791fd097bfSuwe 
3801fd097bfSuwe 	return (0);
3811fd097bfSuwe }
3821fd097bfSuwe 
3831fd097bfSuwe void
obio_iomem_free(void * v,bus_space_handle_t bsh,bus_size_t size)3841fd097bfSuwe obio_iomem_free(void *v, bus_space_handle_t bsh, bus_size_t size)
3851fd097bfSuwe {
3861fd097bfSuwe 
3871fd097bfSuwe 	obio_iomem_unmap(v, bsh, size);
3881fd097bfSuwe }
3891fd097bfSuwe 
3904a585bfaSnonaka paddr_t
obio_iomem_mmap(void * v,bus_addr_t addr,off_t off,int prot,int flags)3914a585bfaSnonaka obio_iomem_mmap(void *v, bus_addr_t addr, off_t off, int prot, int flags)
3924a585bfaSnonaka {
3934a585bfaSnonaka 
3944a585bfaSnonaka 	return (paddr_t)-1;
3954a585bfaSnonaka }
3964a585bfaSnonaka 
3971fd097bfSuwe /*
3981fd097bfSuwe  * on-board I/O bus space read/write
3991fd097bfSuwe  */
4001fd097bfSuwe uint8_t obio_iomem_read_1(void *v, bus_space_handle_t bsh, bus_size_t offset);
4011fd097bfSuwe uint16_t obio_iomem_read_2(void *v, bus_space_handle_t bsh, bus_size_t offset);
4021fd097bfSuwe uint32_t obio_iomem_read_4(void *v, bus_space_handle_t bsh, bus_size_t offset);
4031fd097bfSuwe void obio_iomem_read_multi_1(void *v, bus_space_handle_t bsh,
4041fd097bfSuwe     bus_size_t offset, uint8_t *addr, bus_size_t count);
4051fd097bfSuwe void obio_iomem_read_multi_2(void *v, bus_space_handle_t bsh,
4061fd097bfSuwe     bus_size_t offset, uint16_t *addr, bus_size_t count);
4071fd097bfSuwe void obio_iomem_read_multi_4(void *v, bus_space_handle_t bsh,
4081fd097bfSuwe     bus_size_t offset, uint32_t *addr, bus_size_t count);
4091fd097bfSuwe void obio_iomem_read_region_1(void *v, bus_space_handle_t bsh,
4101fd097bfSuwe     bus_size_t offset, uint8_t *addr, bus_size_t count);
4111fd097bfSuwe void obio_iomem_read_region_2(void *v, bus_space_handle_t bsh,
4121fd097bfSuwe     bus_size_t offset, uint16_t *addr, bus_size_t count);
4131fd097bfSuwe void obio_iomem_read_region_4(void *v, bus_space_handle_t bsh,
4141fd097bfSuwe     bus_size_t offset, uint32_t *addr, bus_size_t count);
4151fd097bfSuwe void obio_iomem_write_1(void *v, bus_space_handle_t bsh, bus_size_t offset,
4161fd097bfSuwe     uint8_t value);
4171fd097bfSuwe void obio_iomem_write_2(void *v, bus_space_handle_t bsh, bus_size_t offset,
4181fd097bfSuwe     uint16_t value);
4191fd097bfSuwe void obio_iomem_write_4(void *v, bus_space_handle_t bsh, bus_size_t offset,
4201fd097bfSuwe     uint32_t value);
4211fd097bfSuwe void obio_iomem_write_multi_1(void *v, bus_space_handle_t bsh,
4221fd097bfSuwe     bus_size_t offset, const uint8_t *addr, bus_size_t count);
4231fd097bfSuwe void obio_iomem_write_multi_2(void *v, bus_space_handle_t bsh,
4241fd097bfSuwe     bus_size_t offset, const uint16_t *addr, bus_size_t count);
4251fd097bfSuwe void obio_iomem_write_multi_4(void *v, bus_space_handle_t bsh,
4261fd097bfSuwe     bus_size_t offset, const uint32_t *addr, bus_size_t count);
4271fd097bfSuwe void obio_iomem_write_region_1(void *v, bus_space_handle_t bsh,
4281fd097bfSuwe     bus_size_t offset, const uint8_t *addr, bus_size_t count);
4291fd097bfSuwe void obio_iomem_write_region_2(void *v, bus_space_handle_t bsh,
4301fd097bfSuwe     bus_size_t offset, const uint16_t *addr, bus_size_t count);
4311fd097bfSuwe void obio_iomem_write_region_4(void *v, bus_space_handle_t bsh,
4321fd097bfSuwe     bus_size_t offset, const uint32_t *addr, bus_size_t count);
4331fd097bfSuwe void obio_iomem_set_multi_1(void *v, bus_space_handle_t bsh, bus_size_t offset,
4341fd097bfSuwe     uint8_t val, bus_size_t count);
4351fd097bfSuwe void obio_iomem_set_multi_2(void *v, bus_space_handle_t bsh, bus_size_t offset,
4361fd097bfSuwe     uint16_t val, bus_size_t count);
4371fd097bfSuwe void obio_iomem_set_multi_4(void *v, bus_space_handle_t bsh, bus_size_t offset,
4381fd097bfSuwe     uint32_t val, bus_size_t count);
4391fd097bfSuwe void obio_iomem_set_region_1(void *v, bus_space_handle_t bsh,
4401fd097bfSuwe     bus_size_t offset, uint8_t val, bus_size_t count);
4411fd097bfSuwe void obio_iomem_set_region_2(void *v, bus_space_handle_t bsh,
4421fd097bfSuwe     bus_size_t offset, uint16_t val, bus_size_t count);
4431fd097bfSuwe void obio_iomem_set_region_4(void *v, bus_space_handle_t bsh,
4441fd097bfSuwe     bus_size_t offset, uint32_t val, bus_size_t count);
4451fd097bfSuwe void obio_iomem_copy_region_1(void *v, bus_space_handle_t h1, bus_size_t o1,
4461fd097bfSuwe     bus_space_handle_t h2, bus_size_t o2, bus_size_t count);
4471fd097bfSuwe void obio_iomem_copy_region_2(void *v, bus_space_handle_t h1, bus_size_t o1,
4481fd097bfSuwe     bus_space_handle_t h2, bus_size_t o2, bus_size_t count);
4491fd097bfSuwe void obio_iomem_copy_region_4(void *v, bus_space_handle_t h1, bus_size_t o1,
4501fd097bfSuwe     bus_space_handle_t h2, bus_size_t o2, bus_size_t count);
4511fd097bfSuwe 
4521fd097bfSuwe struct _bus_space obio_bus_io =
4531fd097bfSuwe {
4541fd097bfSuwe 	.bs_cookie = (void *)OBIO_IOMEM_PCMCIA_IO,
4551fd097bfSuwe 
4561fd097bfSuwe 	.bs_map = obio_iomem_map,
4571fd097bfSuwe 	.bs_unmap = obio_iomem_unmap,
4581fd097bfSuwe 	.bs_subregion = obio_iomem_subregion,
4591fd097bfSuwe 
4601fd097bfSuwe 	.bs_alloc = obio_iomem_alloc,
4611fd097bfSuwe 	.bs_free = obio_iomem_free,
4621fd097bfSuwe 
4634a585bfaSnonaka 	.bs_mmap = obio_iomem_mmap,
4644a585bfaSnonaka 
4651fd097bfSuwe 	.bs_r_1 = obio_iomem_read_1,
4661fd097bfSuwe 	.bs_r_2 = obio_iomem_read_2,
4671fd097bfSuwe 	.bs_r_4 = obio_iomem_read_4,
4681fd097bfSuwe 
4691fd097bfSuwe 	.bs_rm_1 = obio_iomem_read_multi_1,
4701fd097bfSuwe 	.bs_rm_2 = obio_iomem_read_multi_2,
4711fd097bfSuwe 	.bs_rm_4 = obio_iomem_read_multi_4,
4721fd097bfSuwe 
4731fd097bfSuwe 	.bs_rr_1 = obio_iomem_read_region_1,
4741fd097bfSuwe 	.bs_rr_2 = obio_iomem_read_region_2,
4751fd097bfSuwe 	.bs_rr_4 = obio_iomem_read_region_4,
4761fd097bfSuwe 
4771fd097bfSuwe 	.bs_w_1 = obio_iomem_write_1,
4781fd097bfSuwe 	.bs_w_2 = obio_iomem_write_2,
4791fd097bfSuwe 	.bs_w_4 = obio_iomem_write_4,
4801fd097bfSuwe 
4811fd097bfSuwe 	.bs_wm_1 = obio_iomem_write_multi_1,
4821fd097bfSuwe 	.bs_wm_2 = obio_iomem_write_multi_2,
4831fd097bfSuwe 	.bs_wm_4 = obio_iomem_write_multi_4,
4841fd097bfSuwe 
4851fd097bfSuwe 	.bs_wr_1 = obio_iomem_write_region_1,
4861fd097bfSuwe 	.bs_wr_2 = obio_iomem_write_region_2,
4871fd097bfSuwe 	.bs_wr_4 = obio_iomem_write_region_4,
4881fd097bfSuwe 
4891fd097bfSuwe 	.bs_sm_1 = obio_iomem_set_multi_1,
4901fd097bfSuwe 	.bs_sm_2 = obio_iomem_set_multi_2,
4911fd097bfSuwe 	.bs_sm_4 = obio_iomem_set_multi_4,
4921fd097bfSuwe 
4931fd097bfSuwe 	.bs_sr_1 = obio_iomem_set_region_1,
4941fd097bfSuwe 	.bs_sr_2 = obio_iomem_set_region_2,
4951fd097bfSuwe 	.bs_sr_4 = obio_iomem_set_region_4,
4961fd097bfSuwe 
4971fd097bfSuwe 	.bs_c_1 = obio_iomem_copy_region_1,
4981fd097bfSuwe 	.bs_c_2 = obio_iomem_copy_region_2,
4991fd097bfSuwe 	.bs_c_4 = obio_iomem_copy_region_4,
5001fd097bfSuwe };
5011fd097bfSuwe 
5021fd097bfSuwe struct _bus_space obio_bus_mem =
5031fd097bfSuwe {
5041fd097bfSuwe 	.bs_cookie = (void *)OBIO_IOMEM_PCMCIA_MEM,
5051fd097bfSuwe 
5061fd097bfSuwe 	.bs_map = obio_iomem_map,
5071fd097bfSuwe 	.bs_unmap = obio_iomem_unmap,
5081fd097bfSuwe 	.bs_subregion = obio_iomem_subregion,
5091fd097bfSuwe 
5101fd097bfSuwe 	.bs_alloc = obio_iomem_alloc,
5111fd097bfSuwe 	.bs_free = obio_iomem_free,
5121fd097bfSuwe 
5131fd097bfSuwe 	.bs_r_1 = obio_iomem_read_1,
5141fd097bfSuwe 	.bs_r_2 = obio_iomem_read_2,
5151fd097bfSuwe 	.bs_r_4 = obio_iomem_read_4,
5161fd097bfSuwe 
5171fd097bfSuwe 	.bs_rm_1 = obio_iomem_read_multi_1,
5181fd097bfSuwe 	.bs_rm_2 = obio_iomem_read_multi_2,
5191fd097bfSuwe 	.bs_rm_4 = obio_iomem_read_multi_4,
5201fd097bfSuwe 
5211fd097bfSuwe 	.bs_rr_1 = obio_iomem_read_region_1,
5221fd097bfSuwe 	.bs_rr_2 = obio_iomem_read_region_2,
5231fd097bfSuwe 	.bs_rr_4 = obio_iomem_read_region_4,
5241fd097bfSuwe 
5251fd097bfSuwe 	.bs_w_1 = obio_iomem_write_1,
5261fd097bfSuwe 	.bs_w_2 = obio_iomem_write_2,
5271fd097bfSuwe 	.bs_w_4 = obio_iomem_write_4,
5281fd097bfSuwe 
5291fd097bfSuwe 	.bs_wm_1 = obio_iomem_write_multi_1,
5301fd097bfSuwe 	.bs_wm_2 = obio_iomem_write_multi_2,
5311fd097bfSuwe 	.bs_wm_4 = obio_iomem_write_multi_4,
5321fd097bfSuwe 
5331fd097bfSuwe 	.bs_wr_1 = obio_iomem_write_region_1,
5341fd097bfSuwe 	.bs_wr_2 = obio_iomem_write_region_2,
5351fd097bfSuwe 	.bs_wr_4 = obio_iomem_write_region_4,
5361fd097bfSuwe 
5371fd097bfSuwe 	.bs_sm_1 = obio_iomem_set_multi_1,
5381fd097bfSuwe 	.bs_sm_2 = obio_iomem_set_multi_2,
5391fd097bfSuwe 	.bs_sm_4 = obio_iomem_set_multi_4,
5401fd097bfSuwe 
5411fd097bfSuwe 	.bs_sr_1 = obio_iomem_set_region_1,
5421fd097bfSuwe 	.bs_sr_2 = obio_iomem_set_region_2,
5431fd097bfSuwe 	.bs_sr_4 = obio_iomem_set_region_4,
5441fd097bfSuwe 
5451fd097bfSuwe 	.bs_c_1 = obio_iomem_copy_region_1,
5461fd097bfSuwe 	.bs_c_2 = obio_iomem_copy_region_2,
5471fd097bfSuwe 	.bs_c_4 = obio_iomem_copy_region_4,
5481fd097bfSuwe };
5491fd097bfSuwe 
5501fd097bfSuwe /* read */
5511fd097bfSuwe uint8_t
obio_iomem_read_1(void * v,bus_space_handle_t bsh,bus_size_t offset)5521fd097bfSuwe obio_iomem_read_1(void *v, bus_space_handle_t bsh, bus_size_t offset)
5531fd097bfSuwe {
5541fd097bfSuwe 
5551fd097bfSuwe 	return *(volatile uint8_t *)(bsh + offset);
5561fd097bfSuwe }
5571fd097bfSuwe 
5581fd097bfSuwe uint16_t
obio_iomem_read_2(void * v,bus_space_handle_t bsh,bus_size_t offset)5591fd097bfSuwe obio_iomem_read_2(void *v, bus_space_handle_t bsh, bus_size_t offset)
5601fd097bfSuwe {
5611fd097bfSuwe 
5621fd097bfSuwe 	return *(volatile uint16_t *)(bsh + offset);
5631fd097bfSuwe }
5641fd097bfSuwe 
5651fd097bfSuwe uint32_t
obio_iomem_read_4(void * v,bus_space_handle_t bsh,bus_size_t offset)5661fd097bfSuwe obio_iomem_read_4(void *v, bus_space_handle_t bsh, bus_size_t offset)
5671fd097bfSuwe {
5681fd097bfSuwe 
5691fd097bfSuwe 	return *(volatile uint32_t *)(bsh + offset);
5701fd097bfSuwe }
5711fd097bfSuwe 
5721fd097bfSuwe void
obio_iomem_read_multi_1(void * v,bus_space_handle_t bsh,bus_size_t offset,uint8_t * addr,bus_size_t count)5731fd097bfSuwe obio_iomem_read_multi_1(void *v, bus_space_handle_t bsh,
5741fd097bfSuwe     bus_size_t offset, uint8_t *addr, bus_size_t count)
5751fd097bfSuwe {
5761fd097bfSuwe 	volatile uint8_t *p = (void *)(bsh + offset);
5771fd097bfSuwe 
5781fd097bfSuwe 	while (count--) {
5791fd097bfSuwe 		*addr++ = *p;
5801fd097bfSuwe 	}
5811fd097bfSuwe }
5821fd097bfSuwe 
5831fd097bfSuwe void
obio_iomem_read_multi_2(void * v,bus_space_handle_t bsh,bus_size_t offset,uint16_t * addr,bus_size_t count)5841fd097bfSuwe obio_iomem_read_multi_2(void *v, bus_space_handle_t bsh,
5851fd097bfSuwe     bus_size_t offset, uint16_t *addr, bus_size_t count)
5861fd097bfSuwe {
5871fd097bfSuwe 	volatile uint16_t *p = (void *)(bsh + offset);
5881fd097bfSuwe 
5891fd097bfSuwe 	while (count--) {
5901fd097bfSuwe 		*addr++ = *p;
5911fd097bfSuwe 	}
5921fd097bfSuwe }
5931fd097bfSuwe 
5941fd097bfSuwe void
obio_iomem_read_multi_4(void * v,bus_space_handle_t bsh,bus_size_t offset,uint32_t * addr,bus_size_t count)5951fd097bfSuwe obio_iomem_read_multi_4(void *v, bus_space_handle_t bsh,
5961fd097bfSuwe     bus_size_t offset, uint32_t *addr, bus_size_t count)
5971fd097bfSuwe {
5981fd097bfSuwe 	volatile uint32_t *p = (void *)(bsh + offset);
5991fd097bfSuwe 
6001fd097bfSuwe 	while (count--) {
6011fd097bfSuwe 		*addr++ = *p;
6021fd097bfSuwe 	}
6031fd097bfSuwe }
6041fd097bfSuwe 
6051fd097bfSuwe void
obio_iomem_read_region_1(void * v,bus_space_handle_t bsh,bus_size_t offset,uint8_t * addr,bus_size_t count)6061fd097bfSuwe obio_iomem_read_region_1(void *v, bus_space_handle_t bsh,
6071fd097bfSuwe     bus_size_t offset, uint8_t *addr, bus_size_t count)
6081fd097bfSuwe {
6091fd097bfSuwe 	volatile uint8_t *p = (void *)(bsh + offset);
6101fd097bfSuwe 
6111fd097bfSuwe 	while (count--) {
6121fd097bfSuwe 		*addr++ = *p++;
6131fd097bfSuwe 	}
6141fd097bfSuwe }
6151fd097bfSuwe 
6161fd097bfSuwe void
obio_iomem_read_region_2(void * v,bus_space_handle_t bsh,bus_size_t offset,uint16_t * addr,bus_size_t count)6171fd097bfSuwe obio_iomem_read_region_2(void *v, bus_space_handle_t bsh,
6181fd097bfSuwe     bus_size_t offset, uint16_t *addr, bus_size_t count)
6191fd097bfSuwe {
6201fd097bfSuwe 	volatile uint16_t *p = (void *)(bsh + offset);
6211fd097bfSuwe 
6221fd097bfSuwe 	while (count--) {
6231fd097bfSuwe 		*addr++ = *p++;
6241fd097bfSuwe 	}
6251fd097bfSuwe }
6261fd097bfSuwe 
6271fd097bfSuwe void
obio_iomem_read_region_4(void * v,bus_space_handle_t bsh,bus_size_t offset,uint32_t * addr,bus_size_t count)6281fd097bfSuwe obio_iomem_read_region_4(void *v, bus_space_handle_t bsh,
6291fd097bfSuwe     bus_size_t offset, uint32_t *addr, bus_size_t count)
6301fd097bfSuwe {
6311fd097bfSuwe 	volatile uint32_t *p = (void *)(bsh + offset);
6321fd097bfSuwe 
6331fd097bfSuwe 	while (count--) {
6341fd097bfSuwe 		*addr++ = *p++;
6351fd097bfSuwe 	}
6361fd097bfSuwe }
6371fd097bfSuwe 
6381fd097bfSuwe /* write */
6391fd097bfSuwe void
obio_iomem_write_1(void * v,bus_space_handle_t bsh,bus_size_t offset,uint8_t value)6401fd097bfSuwe obio_iomem_write_1(void *v, bus_space_handle_t bsh, bus_size_t offset,
6411fd097bfSuwe     uint8_t value)
6421fd097bfSuwe {
6431fd097bfSuwe 
6441fd097bfSuwe 	*(volatile uint8_t *)(bsh + offset) = value;
6451fd097bfSuwe }
6461fd097bfSuwe 
6471fd097bfSuwe void
obio_iomem_write_2(void * v,bus_space_handle_t bsh,bus_size_t offset,uint16_t value)6481fd097bfSuwe obio_iomem_write_2(void *v, bus_space_handle_t bsh, bus_size_t offset,
6491fd097bfSuwe     uint16_t value)
6501fd097bfSuwe {
6511fd097bfSuwe 
6521fd097bfSuwe 	*(volatile uint16_t *)(bsh + offset) = value;
6531fd097bfSuwe }
6541fd097bfSuwe 
6551fd097bfSuwe void
obio_iomem_write_4(void * v,bus_space_handle_t bsh,bus_size_t offset,uint32_t value)6561fd097bfSuwe obio_iomem_write_4(void *v, bus_space_handle_t bsh, bus_size_t offset,
6571fd097bfSuwe     uint32_t value)
6581fd097bfSuwe {
6591fd097bfSuwe 
6601fd097bfSuwe 	*(volatile uint32_t *)(bsh + offset) = value;
6611fd097bfSuwe }
6621fd097bfSuwe 
6631fd097bfSuwe void
obio_iomem_write_multi_1(void * v,bus_space_handle_t bsh,bus_size_t offset,const uint8_t * addr,bus_size_t count)6641fd097bfSuwe obio_iomem_write_multi_1(void *v, bus_space_handle_t bsh,
6651fd097bfSuwe     bus_size_t offset, const uint8_t *addr, bus_size_t count)
6661fd097bfSuwe {
6671fd097bfSuwe 	volatile uint8_t *p = (void *)(bsh + offset);
6681fd097bfSuwe 
6691fd097bfSuwe 	while (count--) {
6701fd097bfSuwe 		*p = *addr++;
6711fd097bfSuwe 	}
6721fd097bfSuwe }
6731fd097bfSuwe 
6741fd097bfSuwe void
obio_iomem_write_multi_2(void * v,bus_space_handle_t bsh,bus_size_t offset,const uint16_t * addr,bus_size_t count)6751fd097bfSuwe obio_iomem_write_multi_2(void *v, bus_space_handle_t bsh,
6761fd097bfSuwe     bus_size_t offset, const uint16_t *addr, bus_size_t count)
6771fd097bfSuwe {
6781fd097bfSuwe 	volatile uint16_t *p = (void *)(bsh + offset);
6791fd097bfSuwe 
6801fd097bfSuwe 	while (count--) {
6811fd097bfSuwe 		*p = *addr++;
6821fd097bfSuwe 	}
6831fd097bfSuwe }
6841fd097bfSuwe 
6851fd097bfSuwe void
obio_iomem_write_multi_4(void * v,bus_space_handle_t bsh,bus_size_t offset,const uint32_t * addr,bus_size_t count)6861fd097bfSuwe obio_iomem_write_multi_4(void *v, bus_space_handle_t bsh,
6871fd097bfSuwe     bus_size_t offset, const uint32_t *addr, bus_size_t count)
6881fd097bfSuwe {
6891fd097bfSuwe 	volatile uint32_t *p = (void *)(bsh + offset);
6901fd097bfSuwe 
6911fd097bfSuwe 	while (count--) {
6921fd097bfSuwe 		*p = *addr++;
6931fd097bfSuwe 	}
6941fd097bfSuwe }
6951fd097bfSuwe 
6961fd097bfSuwe void
obio_iomem_write_region_1(void * v,bus_space_handle_t bsh,bus_size_t offset,const uint8_t * addr,bus_size_t count)6971fd097bfSuwe obio_iomem_write_region_1(void *v, bus_space_handle_t bsh,
6981fd097bfSuwe     bus_size_t offset, const uint8_t *addr, bus_size_t count)
6991fd097bfSuwe {
7001fd097bfSuwe 	volatile uint8_t *p = (void *)(bsh + offset);
7011fd097bfSuwe 
7021fd097bfSuwe 	while (count--) {
7031fd097bfSuwe 		*p++ = *addr++;
7041fd097bfSuwe 	}
7051fd097bfSuwe }
7061fd097bfSuwe 
7071fd097bfSuwe void
obio_iomem_write_region_2(void * v,bus_space_handle_t bsh,bus_size_t offset,const uint16_t * addr,bus_size_t count)7081fd097bfSuwe obio_iomem_write_region_2(void *v, bus_space_handle_t bsh,
7091fd097bfSuwe     bus_size_t offset, const uint16_t *addr, bus_size_t count)
7101fd097bfSuwe {
7111fd097bfSuwe 	volatile uint16_t *p = (void *)(bsh + offset);
7121fd097bfSuwe 
7131fd097bfSuwe 	while (count--) {
7141fd097bfSuwe 		*p++ = *addr++;
7151fd097bfSuwe 	}
7161fd097bfSuwe }
7171fd097bfSuwe 
7181fd097bfSuwe void
obio_iomem_write_region_4(void * v,bus_space_handle_t bsh,bus_size_t offset,const uint32_t * addr,bus_size_t count)7191fd097bfSuwe obio_iomem_write_region_4(void *v, bus_space_handle_t bsh,
7201fd097bfSuwe     bus_size_t offset, const uint32_t *addr, bus_size_t count)
7211fd097bfSuwe {
7221fd097bfSuwe 	volatile uint32_t *p = (void *)(bsh + offset);
7231fd097bfSuwe 
7241fd097bfSuwe 	while (count--) {
7251fd097bfSuwe 		*p++ = *addr++;
7261fd097bfSuwe 	}
7271fd097bfSuwe }
7281fd097bfSuwe 
7291fd097bfSuwe void
obio_iomem_set_multi_1(void * v,bus_space_handle_t bsh,bus_size_t offset,uint8_t val,bus_size_t count)7301fd097bfSuwe obio_iomem_set_multi_1(void *v, bus_space_handle_t bsh,
7311fd097bfSuwe     bus_size_t offset, uint8_t val, bus_size_t count)
7321fd097bfSuwe {
7331fd097bfSuwe 	volatile uint8_t *p = (void *)(bsh + offset);
7341fd097bfSuwe 
7351fd097bfSuwe 	while (count--) {
7361fd097bfSuwe 		*p = val;
7371fd097bfSuwe 	}
7381fd097bfSuwe }
7391fd097bfSuwe 
7401fd097bfSuwe void
obio_iomem_set_multi_2(void * v,bus_space_handle_t bsh,bus_size_t offset,uint16_t val,bus_size_t count)7411fd097bfSuwe obio_iomem_set_multi_2(void *v, bus_space_handle_t bsh,
7421fd097bfSuwe     bus_size_t offset, uint16_t val, bus_size_t count)
7431fd097bfSuwe {
7441fd097bfSuwe 	volatile uint16_t *p = (void *)(bsh + offset);
7451fd097bfSuwe 
7461fd097bfSuwe 	while (count--) {
7471fd097bfSuwe 		*p = val;
7481fd097bfSuwe 	}
7491fd097bfSuwe }
7501fd097bfSuwe 
7511fd097bfSuwe void
obio_iomem_set_multi_4(void * v,bus_space_handle_t bsh,bus_size_t offset,uint32_t val,bus_size_t count)7521fd097bfSuwe obio_iomem_set_multi_4(void *v, bus_space_handle_t bsh,
7531fd097bfSuwe     bus_size_t offset, uint32_t val, bus_size_t count)
7541fd097bfSuwe {
7551fd097bfSuwe 	volatile uint32_t *p = (void *)(bsh + offset);
7561fd097bfSuwe 
7571fd097bfSuwe 	while (count--) {
7581fd097bfSuwe 		*p = val;
7591fd097bfSuwe 	}
7601fd097bfSuwe }
7611fd097bfSuwe 
7621fd097bfSuwe void
obio_iomem_set_region_1(void * v,bus_space_handle_t bsh,bus_size_t offset,uint8_t val,bus_size_t count)7631fd097bfSuwe obio_iomem_set_region_1(void *v, bus_space_handle_t bsh,
7641fd097bfSuwe     bus_size_t offset, uint8_t val, bus_size_t count)
7651fd097bfSuwe {
7661fd097bfSuwe 	volatile uint8_t *addr = (void *)(bsh + offset);
7671fd097bfSuwe 
7681fd097bfSuwe 	while (count--) {
7691fd097bfSuwe 		*addr++ = val;
7701fd097bfSuwe 	}
7711fd097bfSuwe }
7721fd097bfSuwe 
7731fd097bfSuwe void
obio_iomem_set_region_2(void * v,bus_space_handle_t bsh,bus_size_t offset,uint16_t val,bus_size_t count)7741fd097bfSuwe obio_iomem_set_region_2(void *v, bus_space_handle_t bsh,
7751fd097bfSuwe     bus_size_t offset, uint16_t val, bus_size_t count)
7761fd097bfSuwe {
7771fd097bfSuwe 	volatile uint16_t *addr = (void *)(bsh + offset);
7781fd097bfSuwe 
7791fd097bfSuwe 	while (count--) {
7801fd097bfSuwe 		*addr++ = val;
7811fd097bfSuwe 	}
7821fd097bfSuwe }
7831fd097bfSuwe 
7841fd097bfSuwe void
obio_iomem_set_region_4(void * v,bus_space_handle_t bsh,bus_size_t offset,uint32_t val,bus_size_t count)7851fd097bfSuwe obio_iomem_set_region_4(void *v, bus_space_handle_t bsh,
7861fd097bfSuwe     bus_size_t offset, uint32_t val, bus_size_t count)
7871fd097bfSuwe {
7881fd097bfSuwe 	volatile uint32_t *addr = (void *)(bsh + offset);
7891fd097bfSuwe 
7901fd097bfSuwe 	while (count--) {
7911fd097bfSuwe 		*addr++ = val;
7921fd097bfSuwe 	}
7931fd097bfSuwe }
7941fd097bfSuwe 
7951fd097bfSuwe void
obio_iomem_copy_region_1(void * v,bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,bus_size_t count)7961fd097bfSuwe obio_iomem_copy_region_1(void *v, bus_space_handle_t h1, bus_size_t o1,
7971fd097bfSuwe     bus_space_handle_t h2, bus_size_t o2, bus_size_t count)
7981fd097bfSuwe {
7991fd097bfSuwe 	volatile uint8_t *addr1 = (void *)(h1 + o1);
8001fd097bfSuwe 	volatile uint8_t *addr2 = (void *)(h2 + o2);
8011fd097bfSuwe 
8021fd097bfSuwe 	if (addr1 >= addr2) {	/* src after dest: copy forward */
8031fd097bfSuwe 		while (count--) {
8041fd097bfSuwe 			*addr2++ = *addr1++;
8051fd097bfSuwe 		}
8061fd097bfSuwe 	} else {		/* dest after src: copy backwards */
8071fd097bfSuwe 		addr1 += count - 1;
8081fd097bfSuwe 		addr2 += count - 1;
8091fd097bfSuwe 		while (count--) {
8101fd097bfSuwe 			*addr2-- = *addr1--;
8111fd097bfSuwe 		}
8121fd097bfSuwe 	}
8131fd097bfSuwe }
8141fd097bfSuwe 
8151fd097bfSuwe void
obio_iomem_copy_region_2(void * v,bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,bus_size_t count)8161fd097bfSuwe obio_iomem_copy_region_2(void *v, bus_space_handle_t h1, bus_size_t o1,
8171fd097bfSuwe     bus_space_handle_t h2, bus_size_t o2, bus_size_t count)
8181fd097bfSuwe {
8191fd097bfSuwe 	volatile uint16_t *addr1 = (void *)(h1 + o1);
8201fd097bfSuwe 	volatile uint16_t *addr2 = (void *)(h2 + o2);
8211fd097bfSuwe 
8221fd097bfSuwe 	if (addr1 >= addr2) {	/* src after dest: copy forward */
8231fd097bfSuwe 		while (count--) {
8241fd097bfSuwe 			*addr2++ = *addr1++;
8251fd097bfSuwe 		}
8261fd097bfSuwe 	} else {		/* dest after src: copy backwards */
8271fd097bfSuwe 		addr1 += count - 1;
8281fd097bfSuwe 		addr2 += count - 1;
8291fd097bfSuwe 		while (count--) {
8301fd097bfSuwe 			*addr2-- = *addr1--;
8311fd097bfSuwe 		}
8321fd097bfSuwe 	}
8331fd097bfSuwe }
8341fd097bfSuwe 
8351fd097bfSuwe void
obio_iomem_copy_region_4(void * v,bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,bus_size_t count)8361fd097bfSuwe obio_iomem_copy_region_4(void *v, bus_space_handle_t h1, bus_size_t o1,
8371fd097bfSuwe     bus_space_handle_t h2, bus_size_t o2, bus_size_t count)
8381fd097bfSuwe {
8391fd097bfSuwe 	volatile uint32_t *addr1 = (void *)(h1 + o1);
8401fd097bfSuwe 	volatile uint32_t *addr2 = (void *)(h2 + o2);
8411fd097bfSuwe 
8421fd097bfSuwe 	if (addr1 >= addr2) {	/* src after dest: copy forward */
8431fd097bfSuwe 		while (count--) {
8441fd097bfSuwe 			*addr2++ = *addr1++;
8451fd097bfSuwe 		}
8461fd097bfSuwe 	} else {		/* dest after src: copy backwards */
8471fd097bfSuwe 		addr1 += count - 1;
8481fd097bfSuwe 		addr2 += count - 1;
8491fd097bfSuwe 		while (count--) {
8501fd097bfSuwe 			*addr2-- = *addr1--;
8511fd097bfSuwe 		}
8521fd097bfSuwe 	}
8531fd097bfSuwe }
854