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