xref: /openbsd-src/sys/arch/hppa/dev/dino.c (revision 78d5ff0ec949396ff3bbc97f51b741a17179ba18)
1*78d5ff0eSmpi /*	$OpenBSD: dino.c,v 1.33 2022/03/13 08:04:38 mpi Exp $	*/
225327569Smickey 
325327569Smickey /*
48ff2eafdSmickey  * Copyright (c) 2003-2005 Michael Shalayeff
525327569Smickey  * All rights reserved.
625327569Smickey  *
725327569Smickey  * Redistribution and use in source and binary forms, with or without
825327569Smickey  * modification, are permitted provided that the following conditions
925327569Smickey  * are met:
1025327569Smickey  * 1. Redistributions of source code must retain the above copyright
1125327569Smickey  *    notice, this list of conditions and the following disclaimer.
1225327569Smickey  * 2. Redistributions in binary form must reproduce the above copyright
1325327569Smickey  *    notice, this list of conditions and the following disclaimer in the
1425327569Smickey  *    documentation and/or other materials provided with the distribution.
1525327569Smickey  *
1625327569Smickey  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1725327569Smickey  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1825327569Smickey  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1925327569Smickey  * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
2025327569Smickey  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
2125327569Smickey  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
2225327569Smickey  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2325327569Smickey  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
2425327569Smickey  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
2525327569Smickey  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2625327569Smickey  * THE POSSIBILITY OF SUCH DAMAGE.
2725327569Smickey  */
2825327569Smickey 
2925327569Smickey #include "cardbus.h"
3025327569Smickey 
3125327569Smickey #include <sys/param.h>
3225327569Smickey #include <sys/systm.h>
3325327569Smickey #include <sys/device.h>
3425327569Smickey #include <sys/reboot.h>
3525327569Smickey #include <sys/malloc.h>
3625327569Smickey #include <sys/extent.h>
3725327569Smickey 
3825327569Smickey #include <machine/iomod.h>
3925327569Smickey #include <machine/autoconf.h>
4025327569Smickey 
4125327569Smickey #include <hppa/dev/cpudevs.h>
4225327569Smickey 
4325327569Smickey #if NCARDBUS > 0
4425327569Smickey #include <dev/cardbus/rbus.h>
4525327569Smickey #endif
4625327569Smickey 
4725327569Smickey #include <dev/pci/pcireg.h>
4825327569Smickey #include <dev/pci/pcivar.h>
4925327569Smickey #include <dev/pci/pcidevs.h>
5025327569Smickey 
5160b727f0Smiod #include <machine/pdc.h>
5260b727f0Smiod #include <dev/cons.h>
5360b727f0Smiod 
5425327569Smickey #define	DINO_MEM_CHUNK	0x800000
5525327569Smickey #define	DINO_MEM_WINDOW	(2 * DINO_MEM_CHUNK)
5625327569Smickey 
5725327569Smickey struct dino_regs {
5825327569Smickey 	u_int32_t	pad0;		/* 0x000 */
5925327569Smickey 	u_int32_t	iar0;		/* 0x004 rw intr addr reg 0 */
6025327569Smickey 	u_int32_t	iodc;		/* 0x008 rw iodc data/addr */
6125327569Smickey 	u_int32_t	irr0;		/* 0x00c r  intr req reg 0 */
6225327569Smickey 	u_int32_t	iar1;		/* 0x010 rw intr addr reg 1 */
6325327569Smickey 	u_int32_t	irr1;		/* 0x014 r  intr req reg 1 */
6425327569Smickey 	u_int32_t	imr;		/* 0x018 rw intr mask reg */
6525327569Smickey 	u_int32_t	ipr;		/* 0x01c rw intr pending reg */
6625327569Smickey 	u_int32_t	toc_addr;	/* 0x020 rw TOC addr reg */
6725327569Smickey 	u_int32_t	icr;		/* 0x024 rw intr control reg */
6825327569Smickey 	u_int32_t	ilr;		/* 0x028 r  intr level reg */
6925327569Smickey 	u_int32_t	pad1;		/* 0x02c */
7025327569Smickey 	u_int32_t	io_command;	/* 0x030  w command register */
7125327569Smickey 	u_int32_t	io_status;	/* 0x034 r  status register */
7225327569Smickey 	u_int32_t	io_control;	/* 0x038 rw control register */
7325327569Smickey 	u_int32_t	pad2;		/* 0x03c AUX registers follow */
7425327569Smickey 	u_int32_t	io_gsc_err_addr;/* 0x040 GSC error address */
7525327569Smickey 	u_int32_t	io_err_info;	/* 0x044 error info register */
7625327569Smickey 	u_int32_t	io_pci_err_addr;/* 0x048 PCI error address */
7725327569Smickey 	u_int32_t	pad3[4];	/* 0x04c */
7825327569Smickey 	u_int32_t	io_fbb_en;	/* 0x05c fast back2back enable reg */
7925327569Smickey 	u_int32_t	io_addr_en;	/* 0x060 address enable reg */
8025327569Smickey 	u_int32_t	pci_addr;	/* 0x064 PCI conf/io/mem addr reg */
8125327569Smickey 	u_int32_t	pci_conf_data;	/* 0x068 PCI conf data reg */
8225327569Smickey 	u_int32_t	pci_io_data;	/* 0x06c PCI io data reg */
8325327569Smickey 	u_int32_t	pci_mem_data;	/* 0x070 PCI memory data reg */
8425327569Smickey 	u_int32_t	pad4[0x740/4];	/* 0x074 */
8525327569Smickey 	u_int32_t	gsc2x_config;	/* 0x7b4 GSC2X config reg */
8625327569Smickey 	u_int32_t	pad5[0x48/4];	/* 0x7b8: BSRS registers follow */
8725327569Smickey 	u_int32_t	gmask;		/* 0x800 GSC arbitration mask */
8825327569Smickey 	u_int32_t	pamr;		/* 0x804 PCI arbitration mask */
8925327569Smickey 	u_int32_t	papr;		/* 0x808 PCI arbitration priority */
9025327569Smickey 	u_int32_t	damode;		/* 0x80c PCI arbitration mode */
9125327569Smickey 	u_int32_t	pcicmd;		/* 0x810 PCI command register */
9225327569Smickey 	u_int32_t	pcists;		/* 0x814 PCI status register */
9325327569Smickey 	u_int32_t	pad6;		/* 0x818 */
9425327569Smickey 	u_int32_t	mltim;		/* 0x81c PCI master latency timer */
9525327569Smickey 	u_int32_t	brdg_feat;	/* 0x820 PCI bridge feature enable */
9625327569Smickey 	u_int32_t	pciror;		/* 0x824 PCI read optimization reg */
9725327569Smickey 	u_int32_t	pciwor;		/* 0x828 PCI write optimization reg */
9825327569Smickey 	u_int32_t	pad7;		/* 0x82c */
9925327569Smickey 	u_int32_t	tltim;		/* 0x830 PCI target latency reg */
10025327569Smickey };
10125327569Smickey 
10225327569Smickey struct dino_softc {
10325327569Smickey 	struct  device sc_dv;
10425327569Smickey 
10525327569Smickey 	int sc_ver;
10625327569Smickey 	void *sc_ih;
10725327569Smickey 	u_int32_t sc_imr;
10825327569Smickey 	bus_space_tag_t sc_bt;
10925327569Smickey 	bus_space_handle_t sc_bh;
11025327569Smickey 	bus_dma_tag_t sc_dmat;
11125327569Smickey 	volatile struct dino_regs *sc_regs;
11225327569Smickey 
11325327569Smickey 	struct hppa_pci_chipset_tag sc_pc;
11425327569Smickey 	struct hppa_bus_space_tag sc_iot;
11525327569Smickey 	char sc_ioexname[20];
11625327569Smickey 	struct extent *sc_ioex;
11725327569Smickey 	struct hppa_bus_space_tag sc_memt;
11825327569Smickey 	char sc_memexname[20];
11925327569Smickey 	struct extent *sc_memex;
12025327569Smickey 	struct hppa_bus_dma_tag sc_dmatag;
12160b727f0Smiod 
12260b727f0Smiod 	u_int32_t io_shadow;
12325327569Smickey };
12425327569Smickey 
12525327569Smickey int	dinomatch(struct device *, void *, void *);
12625327569Smickey void	dinoattach(struct device *, struct device *, void *);
12725327569Smickey int	dino_intr(void *);
12825327569Smickey 
129*78d5ff0eSmpi const struct cfattach dino_ca = {
13025327569Smickey 	sizeof(struct dino_softc), dinomatch, dinoattach
13125327569Smickey };
13225327569Smickey 
13325327569Smickey struct cfdriver dino_cd = {
13425327569Smickey 	NULL, "dino", DV_DULL
13525327569Smickey };
13625327569Smickey 
13725327569Smickey int
dinomatch(parent,cfdata,aux)13825327569Smickey dinomatch(parent, cfdata, aux)
13925327569Smickey 	struct device *parent;
14025327569Smickey 	void *cfdata;
14125327569Smickey 	void *aux;
14225327569Smickey {
14325327569Smickey 	struct confargs *ca = aux;
14425327569Smickey 	/* struct cfdata *cf = cfdata; */
14525327569Smickey 
14625327569Smickey 	/* there will be only one */
14725327569Smickey 	if (ca->ca_type.iodc_type != HPPA_TYPE_BRIDGE ||
14825327569Smickey 	    ca->ca_type.iodc_sv_model != HPPA_BRIDGE_DINO)
14925327569Smickey 		return (0);
15025327569Smickey 
151bcdbf0f1Smickey 	/* do not match on the elroy family */
152bcdbf0f1Smickey 	if (ca->ca_type.iodc_model == 0x78)
153bcdbf0f1Smickey 		return (0);
154bcdbf0f1Smickey 
15525327569Smickey 	return (1);
15625327569Smickey }
15725327569Smickey 
15860b727f0Smiod void	dino_attach_hook(struct device *, struct device *,
15960b727f0Smiod 	    struct pcibus_attach_args *);
16060b727f0Smiod int	dino_maxdevs(void *, int);
16160b727f0Smiod pcitag_t dino_make_tag(void *, int, int, int);
16260b727f0Smiod void	dino_decompose_tag(void *, pcitag_t, int *, int *, int *);
163b1926db3Smiod int	dino_conf_size(void *, pcitag_t);
16460b727f0Smiod pcireg_t dino_conf_read(void *, pcitag_t, int);
16560b727f0Smiod void	dino_conf_write(void *, pcitag_t, int, pcireg_t);
16660b727f0Smiod int	dino_intr_map(struct pci_attach_args *, pci_intr_handle_t *);
16760b727f0Smiod const char *dino_intr_string(void *, pci_intr_handle_t);
16860b727f0Smiod void *	dino_intr_establish(void *, pci_intr_handle_t, int, int (*)(void *),
169c03b1b92Smk 	    void *, const char *);
17060b727f0Smiod void	dino_intr_disestablish(void *, void *);
17160b727f0Smiod int	dino_iomap(void *, bus_addr_t, bus_size_t, int, bus_space_handle_t *);
17260b727f0Smiod int	dino_memmap(void *, bus_addr_t, bus_size_t, int, bus_space_handle_t *);
17360b727f0Smiod int	dino_subregion(void *, bus_space_handle_t, bus_size_t, bus_size_t,
17460b727f0Smiod 	    bus_space_handle_t *);
17560b727f0Smiod int	dino_ioalloc(void *, bus_addr_t, bus_addr_t, bus_size_t, bus_size_t,
17660b727f0Smiod 	    bus_size_t, int, bus_addr_t *, bus_space_handle_t *);
17760b727f0Smiod int	dino_memalloc(void *, bus_addr_t, bus_addr_t, bus_size_t, bus_size_t,
17860b727f0Smiod 	    bus_size_t, int, bus_addr_t *, bus_space_handle_t *);
17960b727f0Smiod void	dino_unmap(void *, bus_space_handle_t, bus_size_t);
18060b727f0Smiod void	dino_free(void *, bus_space_handle_t, bus_size_t);
18160b727f0Smiod void	dino_barrier(void *, bus_space_handle_t, bus_size_t, bus_size_t, int);
18260b727f0Smiod void *	dino_alloc_parent(struct device *, struct pci_attach_args *, int);
18387b07e5cSkettenis void *	dino_vaddr(void *, bus_space_handle_t);
18460b727f0Smiod u_int8_t dino_r1(void *, bus_space_handle_t, bus_size_t);
18560b727f0Smiod u_int16_t dino_r2(void *, bus_space_handle_t, bus_size_t);
18660b727f0Smiod u_int32_t dino_r4(void *, bus_space_handle_t, bus_size_t);
18760b727f0Smiod u_int64_t dino_r8(void *, bus_space_handle_t, bus_size_t);
18860b727f0Smiod void	dino_w1(void *, bus_space_handle_t, bus_size_t, u_int8_t);
18960b727f0Smiod void	dino_w2(void *, bus_space_handle_t, bus_size_t, u_int16_t);
19060b727f0Smiod void	dino_w4(void *, bus_space_handle_t, bus_size_t, u_int32_t);
19160b727f0Smiod void	dino_w8(void *, bus_space_handle_t, bus_size_t, u_int64_t);
19260b727f0Smiod void	dino_rm_1(void *, bus_space_handle_t, bus_size_t, u_int8_t *,
19360b727f0Smiod 	    bus_size_t);
19460b727f0Smiod void	dino_rm_2(void *, bus_space_handle_t, bus_size_t, u_int16_t *,
19560b727f0Smiod 	    bus_size_t);
19660b727f0Smiod void	dino_rm_4(void *, bus_space_handle_t, bus_size_t, u_int32_t *,
19760b727f0Smiod 	    bus_size_t);
19860b727f0Smiod void	dino_rm_8(void *, bus_space_handle_t, bus_size_t, u_int64_t *,
19960b727f0Smiod 	    bus_size_t);
20060b727f0Smiod void	dino_wm_1(void *, bus_space_handle_t, bus_size_t, const u_int8_t *,
20160b727f0Smiod 	    bus_size_t);
20260b727f0Smiod void	dino_wm_2(void *, bus_space_handle_t, bus_size_t, const u_int16_t *,
20360b727f0Smiod 	    bus_size_t);
20460b727f0Smiod void	dino_wm_4(void *, bus_space_handle_t, bus_size_t, const u_int32_t *,
20560b727f0Smiod 	    bus_size_t);
20660b727f0Smiod void	dino_wm_8(void *, bus_space_handle_t, bus_size_t, const u_int64_t *,
20760b727f0Smiod 	    bus_size_t);
20860b727f0Smiod void	dino_sm_1(void *, bus_space_handle_t, bus_size_t, u_int8_t, bus_size_t);
20960b727f0Smiod void	dino_sm_2(void *, bus_space_handle_t, bus_size_t, u_int16_t,
21060b727f0Smiod 	    bus_size_t);
21160b727f0Smiod void	dino_sm_4(void *, bus_space_handle_t, bus_size_t, u_int32_t,
21260b727f0Smiod 	    bus_size_t);
21360b727f0Smiod void	dino_sm_8(void *, bus_space_handle_t, bus_size_t, u_int64_t,
21460b727f0Smiod 	    bus_size_t);
21560b727f0Smiod void	dino_rrm_2(void *, bus_space_handle_t, bus_size_t, u_int8_t *,
21660b727f0Smiod 	    bus_size_t);
21760b727f0Smiod void	dino_rrm_4(void *, bus_space_handle_t, bus_size_t, u_int8_t *,
21860b727f0Smiod 	    bus_size_t);
21960b727f0Smiod void	dino_rrm_8(void *, bus_space_handle_t, bus_size_t, u_int8_t *,
22060b727f0Smiod 	    bus_size_t);
22160b727f0Smiod void	dino_wrm_2(void *, bus_space_handle_t, bus_size_t, const u_int8_t *,
22260b727f0Smiod 	    bus_size_t);
22360b727f0Smiod void	dino_wrm_4(void *, bus_space_handle_t, bus_size_t, const u_int8_t *,
22460b727f0Smiod 	    bus_size_t);
22560b727f0Smiod void	dino_wrm_8(void *, bus_space_handle_t, bus_size_t, const u_int8_t *,
22660b727f0Smiod 	    bus_size_t);
22760b727f0Smiod void	dino_rr_1(void *, bus_space_handle_t, bus_size_t, u_int8_t *,
22860b727f0Smiod 	    bus_size_t);
22960b727f0Smiod void	dino_rr_2(void *, bus_space_handle_t, bus_size_t, u_int16_t *,
23060b727f0Smiod 	    bus_size_t);
23160b727f0Smiod void	dino_rr_4(void *, bus_space_handle_t, bus_size_t, u_int32_t *,
23260b727f0Smiod 	    bus_size_t);
23360b727f0Smiod void	dino_rr_8(void *, bus_space_handle_t, bus_size_t, u_int64_t *,
23460b727f0Smiod 	    bus_size_t);
23560b727f0Smiod void	dino_wr_1(void *, bus_space_handle_t, bus_size_t, const u_int8_t *,
23660b727f0Smiod 	    bus_size_t);
23760b727f0Smiod void	dino_wr_2(void *, bus_space_handle_t, bus_size_t, const u_int16_t *,
23860b727f0Smiod 	    bus_size_t);
23960b727f0Smiod void	dino_wr_4(void *, bus_space_handle_t, bus_size_t, const u_int32_t *,
24060b727f0Smiod 	    bus_size_t);
24160b727f0Smiod void	dino_wr_8(void *, bus_space_handle_t, bus_size_t, const u_int64_t *,
24260b727f0Smiod 	    bus_size_t);
24360b727f0Smiod void	dino_rrr_2(void *, bus_space_handle_t, bus_size_t, u_int8_t *,
24460b727f0Smiod 	    bus_size_t);
24560b727f0Smiod void	dino_rrr_4(void *, bus_space_handle_t, bus_size_t, u_int8_t *,
24660b727f0Smiod 	    bus_size_t);
24760b727f0Smiod void	dino_rrr_8(void *, bus_space_handle_t, bus_size_t, u_int8_t *,
24860b727f0Smiod 	    bus_size_t);
24960b727f0Smiod void	dino_wrr_2(void *, bus_space_handle_t, bus_size_t, const u_int8_t *,
25060b727f0Smiod 	    bus_size_t);
25160b727f0Smiod void	dino_wrr_4(void *, bus_space_handle_t, bus_size_t, const u_int8_t *,
25260b727f0Smiod 	    bus_size_t);
25360b727f0Smiod void	dino_wrr_8(void *, bus_space_handle_t, bus_size_t, const u_int8_t *,
25460b727f0Smiod 	    bus_size_t);
25560b727f0Smiod void	dino_sr_1(void *, bus_space_handle_t, bus_size_t, u_int8_t, bus_size_t);
25660b727f0Smiod void	dino_sr_2(void *, bus_space_handle_t, bus_size_t, u_int16_t,
25760b727f0Smiod 	    bus_size_t);
25860b727f0Smiod void	dino_sr_4(void *, bus_space_handle_t, bus_size_t, u_int32_t,
25960b727f0Smiod 	    bus_size_t);
26060b727f0Smiod void	dino_sr_8(void *, bus_space_handle_t, bus_size_t, u_int64_t,
26160b727f0Smiod 	    bus_size_t);
26260b727f0Smiod void	dino_cp_1(void *, bus_space_handle_t, bus_size_t, bus_space_handle_t,
26360b727f0Smiod 	    bus_size_t, bus_size_t);
26460b727f0Smiod void	dino_cp_2(void *, bus_space_handle_t, bus_size_t, bus_space_handle_t,
26560b727f0Smiod 	    bus_size_t, bus_size_t);
26660b727f0Smiod void	dino_cp_4(void *, bus_space_handle_t, bus_size_t, bus_space_handle_t,
26760b727f0Smiod 	    bus_size_t, bus_size_t);
26860b727f0Smiod void	dino_cp_8(void *, bus_space_handle_t, bus_size_t, bus_space_handle_t,
26960b727f0Smiod 	    bus_size_t, bus_size_t);
27060b727f0Smiod int	dino_dmamap_create(void *, bus_size_t, int, bus_size_t, bus_size_t, int,
27160b727f0Smiod 	    bus_dmamap_t *);
27260b727f0Smiod void	dino_dmamap_destroy(void *, bus_dmamap_t);
27360b727f0Smiod int	dino_dmamap_load(void *, bus_dmamap_t, void *, bus_size_t,
27460b727f0Smiod 	    struct proc *, int);
27560b727f0Smiod int	dino_dmamap_load_mbuf(void *, bus_dmamap_t, struct mbuf *, int);
27660b727f0Smiod int	dino_dmamap_load_uio(void *, bus_dmamap_t, struct uio *, int);
27760b727f0Smiod int	dino_dmamap_load_raw(void *, bus_dmamap_t, bus_dma_segment_t *, int,
27860b727f0Smiod 	    bus_size_t, int);
27960b727f0Smiod void	dino_dmamap_unload(void *, bus_dmamap_t);
28060b727f0Smiod void	dino_dmamap_sync(void *, bus_dmamap_t, bus_addr_t, bus_size_t, int);
28160b727f0Smiod int	dino_dmamem_alloc(void *, bus_size_t, bus_size_t, bus_size_t,
28260b727f0Smiod 	    bus_dma_segment_t *, int, int *, int);
28360b727f0Smiod void	dino_dmamem_free(void *, bus_dma_segment_t *, int);
28460b727f0Smiod int	dino_dmamem_map(void *, bus_dma_segment_t *, int, size_t, caddr_t *,
28560b727f0Smiod 	    int);
28660b727f0Smiod void	dino_dmamem_unmap(void *, caddr_t, size_t);
28760b727f0Smiod paddr_t	dino_dmamem_mmap(void *, bus_dma_segment_t *, int, off_t, int, int);
28860b727f0Smiod int	dinoprint(void *, const char *);
28960b727f0Smiod void	dino_clear_pdc_mappings(void *);
29060b727f0Smiod 
29125327569Smickey void
dino_attach_hook(struct device * parent,struct device * self,struct pcibus_attach_args * pba)29225327569Smickey dino_attach_hook(struct device *parent, struct device *self,
29325327569Smickey     struct pcibus_attach_args *pba)
29425327569Smickey {
29525327569Smickey 
29625327569Smickey }
29725327569Smickey 
29825327569Smickey int
dino_maxdevs(void * v,int bus)29925327569Smickey dino_maxdevs(void *v, int bus)
30025327569Smickey {
30125327569Smickey 	return (32);
30225327569Smickey }
30325327569Smickey 
30425327569Smickey pcitag_t
dino_make_tag(void * v,int bus,int dev,int func)30525327569Smickey dino_make_tag(void *v, int bus, int dev, int func)
30625327569Smickey {
30725327569Smickey 	if (bus > 255 || dev > 31 || func > 7)
30825327569Smickey 		panic("dino_make_tag: bad request");
30925327569Smickey 
31025327569Smickey 	return ((bus << 16) | (dev << 11) | (func << 8));
31125327569Smickey }
31225327569Smickey 
31325327569Smickey void
dino_decompose_tag(void * v,pcitag_t tag,int * bus,int * dev,int * func)31425327569Smickey dino_decompose_tag(void *v, pcitag_t tag, int *bus, int *dev, int *func)
31525327569Smickey {
3167a1810dbSkettenis 	if (bus)
31725327569Smickey 		*bus = (tag >> 16) & 0xff;
3187a1810dbSkettenis 	if (dev)
31925327569Smickey 		*dev = (tag >> 11) & 0x1f;
3207a1810dbSkettenis 	if (func)
32125327569Smickey 		*func= (tag >>  8) & 0x07;
32225327569Smickey }
32325327569Smickey 
324b1926db3Smiod int
dino_conf_size(void * v,pcitag_t tag)325b1926db3Smiod dino_conf_size(void *v, pcitag_t tag)
326b1926db3Smiod {
327b1926db3Smiod 	return PCI_CONFIG_SPACE_SIZE;
328b1926db3Smiod }
329b1926db3Smiod 
33025327569Smickey pcireg_t
dino_conf_read(void * v,pcitag_t tag,int reg)33125327569Smickey dino_conf_read(void *v, pcitag_t tag, int reg)
33225327569Smickey {
33325327569Smickey 	struct dino_softc *sc = v;
33425327569Smickey 	volatile struct dino_regs *r = sc->sc_regs;
33525327569Smickey 	pcireg_t data;
3368ff2eafdSmickey 	u_int32_t pamr;
3378ff2eafdSmickey 
3388ff2eafdSmickey 	/* fix arbitration errata by disabling all pci devs on config read */
3398ff2eafdSmickey 	pamr = r->pamr;
3408ff2eafdSmickey 	r->pamr = 0;
34125327569Smickey 
34225327569Smickey 	r->pci_addr = tag | reg;
34325327569Smickey 	data = r->pci_conf_data;
3448ff2eafdSmickey 
3458ff2eafdSmickey 	/* restore arbitration */
3468ff2eafdSmickey 	r->pamr = pamr;
3478ff2eafdSmickey 
34825327569Smickey 	return (letoh32(data));
34925327569Smickey }
35025327569Smickey 
35125327569Smickey void
dino_conf_write(void * v,pcitag_t tag,int reg,pcireg_t data)35225327569Smickey dino_conf_write(void *v, pcitag_t tag, int reg, pcireg_t data)
35325327569Smickey {
35425327569Smickey 	struct dino_softc *sc = v;
35525327569Smickey 	volatile struct dino_regs *r = sc->sc_regs;
3568deaac0fSmickey 	pcireg_t data1;
3578ff2eafdSmickey 	u_int32_t pamr;
3588deaac0fSmickey 
3598ff2eafdSmickey 	/* fix arbitration errata by disabling all pci devs on config read */
3608ff2eafdSmickey 	pamr = r->pamr;
3618ff2eafdSmickey 	r->pamr = 0;
36225327569Smickey 
36325327569Smickey 	r->pci_addr = tag | reg;
36425327569Smickey 	r->pci_conf_data = htole32(data);
3658ff2eafdSmickey 
3668ff2eafdSmickey 	/* fix coalescing config and io writes by interleaving w/ a read */
3678ff2eafdSmickey 	r->pci_addr = tag | PCI_ID_REG;
3688ff2eafdSmickey 	data1 = r->pci_conf_data;
3698ff2eafdSmickey 
3708ff2eafdSmickey 	/* restore arbitration */
3718ff2eafdSmickey 	r->pamr = pamr;
37225327569Smickey }
37325327569Smickey 
37425327569Smickey int
dino_intr_map(struct pci_attach_args * pa,pci_intr_handle_t * ihp)37525327569Smickey dino_intr_map(struct pci_attach_args *pa, pci_intr_handle_t *ihp)
37625327569Smickey {
37725327569Smickey 	/* struct dino_softc *sc = v;
37825327569Smickey 	volatile struct dino_regs *r = sc->sc_regs; */
37925327569Smickey 	pci_chipset_tag_t pc = pa->pa_pc;
38025327569Smickey 	pcitag_t tag = pa->pa_tag;
38125327569Smickey 	pcireg_t reg;
38225327569Smickey 
38325327569Smickey 	reg = pci_conf_read(pc, tag, PCI_INTERRUPT_REG);
3848922cf83Smiod 
3858922cf83Smiod 	if (PCI_INTERRUPT_LINE(reg) == 0xff)
3868922cf83Smiod 		return (1);
3878922cf83Smiod 
38825327569Smickey 	*ihp = PCI_INTERRUPT_LINE(reg) + 1;
3898922cf83Smiod 	return (0);
39025327569Smickey }
39125327569Smickey 
39225327569Smickey const char *
dino_intr_string(void * v,pci_intr_handle_t ih)39325327569Smickey dino_intr_string(void *v, pci_intr_handle_t ih)
39425327569Smickey {
39525327569Smickey 	static char buf[32];
39625327569Smickey 
39751f66ac7Skettenis 	snprintf(buf, 32, "dino irq %ld", ih);
39825327569Smickey 
39925327569Smickey 	return (buf);
40025327569Smickey }
40125327569Smickey 
40225327569Smickey void *
dino_intr_establish(void * v,pci_intr_handle_t ih,int pri,int (* handler)(void *),void * arg,const char * name)40325327569Smickey dino_intr_establish(void *v, pci_intr_handle_t ih,
404c03b1b92Smk     int pri, int (*handler)(void *), void *arg, const char *name)
40525327569Smickey {
40625327569Smickey 	struct dino_softc *sc = v;
40725327569Smickey 	volatile struct dino_regs *r = sc->sc_regs;
40825327569Smickey 	void *iv;
40925327569Smickey 
4104a74495bSmickey 	/* no mapping or bogus */
4114a74495bSmickey 	if (ih <= 0 || ih > 11)
41225327569Smickey 		return (NULL);
41325327569Smickey 
41425327569Smickey 	if ((iv = cpu_intr_map(sc->sc_ih, pri, ih - 1, handler, arg, name))) {
41525327569Smickey 		if (cold)
41625327569Smickey 			sc->sc_imr |= (1 << (ih - 1));
41725327569Smickey 		else
4184a74495bSmickey 			r->imr = sc->sc_imr |= (1 << (ih - 1));
41925327569Smickey 	}
42025327569Smickey 
42125327569Smickey 	return (iv);
42225327569Smickey }
42325327569Smickey 
42425327569Smickey void
dino_intr_disestablish(void * v,void * cookie)42525327569Smickey dino_intr_disestablish(void *v, void *cookie)
42625327569Smickey {
42725327569Smickey #if 0
42825327569Smickey 	struct dino_softc *sc = v;
42925327569Smickey 	volatile struct dino_regs *r = sc->sc_regs;
43025327569Smickey 
43125327569Smickey 	r->imr &= ~(1 << (ih - 1));
43225327569Smickey 
43325327569Smickey 	TODO cpu_intr_unmap(sc->sc_ih, cookie);
43425327569Smickey #endif
43525327569Smickey }
43625327569Smickey 
43725327569Smickey int
dino_iomap(void * v,bus_addr_t bpa,bus_size_t size,int flags,bus_space_handle_t * bshp)43825327569Smickey dino_iomap(void *v, bus_addr_t bpa, bus_size_t size,
43925327569Smickey     int flags, bus_space_handle_t *bshp)
44025327569Smickey {
44125327569Smickey 	struct dino_softc *sc = v;
44225327569Smickey 	int error;
44325327569Smickey 
4448a1b199bSmickey 	if ((error = extent_alloc_region(sc->sc_ioex, bpa, size, EX_NOWAIT)))
44525327569Smickey 		return (error);
44625327569Smickey 
44725327569Smickey 	if (bshp)
44825327569Smickey 		*bshp = bpa;
44925327569Smickey 
45025327569Smickey 	return (0);
45125327569Smickey }
45225327569Smickey 
45325327569Smickey int
dino_memmap(void * v,bus_addr_t bpa,bus_size_t size,int flags,bus_space_handle_t * bshp)45425327569Smickey dino_memmap(void *v, bus_addr_t bpa, bus_size_t size,
45525327569Smickey     int flags, bus_space_handle_t *bshp)
45625327569Smickey {
45725327569Smickey 	struct dino_softc *sc = v;
45825327569Smickey 	volatile struct dino_regs *r = sc->sc_regs;
459b5822bcaSmiod 	bus_addr_t sbpa;
46060b727f0Smiod 	bus_space_handle_t bush;
46125327569Smickey 	u_int32_t reg;
462b5822bcaSmiod 	int first = 1;
46325327569Smickey 	int error;
46425327569Smickey 
465b5822bcaSmiod 	while (size != 0) {
466b5822bcaSmiod 		sbpa = bpa & 0xff800000;
46760b727f0Smiod 		reg = sc->io_shadow;
46825327569Smickey 		reg |= 1 << ((bpa >> 23) & 0x1f);
4698922cf83Smiod 		if (reg & 0x80000001) {
47025327569Smickey #ifdef DEBUG
47125327569Smickey 			panic("mapping outside the mem extent range");
47225327569Smickey #endif
4738922cf83Smiod 			return (EINVAL);
4748922cf83Smiod 		}
47525327569Smickey 		/* map into the upper bus space, if not yet mapped this 8M */
47660b727f0Smiod 		if (reg != sc->io_shadow) {
47725327569Smickey 
478b5822bcaSmiod 			if ((error = bus_space_map(sc->sc_bt, sbpa,
47960b727f0Smiod 			    DINO_MEM_CHUNK, flags, &bush))) {
48025327569Smickey 				return (error);
48125327569Smickey 			}
48260b727f0Smiod 			r->io_addr_en |= reg;
48360b727f0Smiod 			sc->io_shadow = reg;
48425327569Smickey 
485b5822bcaSmiod 			if (first) {
48625327569Smickey 				if (bshp)
48760b727f0Smiod 					*bshp = bush + (bpa - sbpa);
488b5822bcaSmiod 			}
489b5822bcaSmiod 		} else {
490b5822bcaSmiod 			if (first) {
491b5822bcaSmiod 				if (bshp)
49225327569Smickey 					*bshp = bpa;
493b5822bcaSmiod 			}
494b5822bcaSmiod 		}
495b5822bcaSmiod 
496b5822bcaSmiod 		if (first) {
497b5822bcaSmiod 			size += (bpa - sbpa);
498b5822bcaSmiod 			first = 0;
499b5822bcaSmiod 		}
500b5822bcaSmiod 
501b5822bcaSmiod 		if (size < DINO_MEM_CHUNK)
502b5822bcaSmiod 			size = 0;
503b5822bcaSmiod 		else {
504b5822bcaSmiod 			size -= DINO_MEM_CHUNK;
505b5822bcaSmiod 			bpa = sbpa + DINO_MEM_CHUNK;
506b5822bcaSmiod 		}
507b5822bcaSmiod 	}
50825327569Smickey 
50925327569Smickey 	return (0);
51025327569Smickey }
51125327569Smickey 
51225327569Smickey int
dino_subregion(void * v,bus_space_handle_t bsh,bus_size_t offset,bus_size_t size,bus_space_handle_t * nbshp)51325327569Smickey dino_subregion(void *v, bus_space_handle_t bsh, bus_size_t offset,
51425327569Smickey     bus_size_t size, bus_space_handle_t *nbshp)
51525327569Smickey {
51625327569Smickey 	*nbshp = bsh + offset;
51725327569Smickey 	return (0);
51825327569Smickey }
51925327569Smickey 
52025327569Smickey int
dino_ioalloc(void * v,bus_addr_t rstart,bus_addr_t rend,bus_size_t size,bus_size_t align,bus_size_t boundary,int flags,bus_addr_t * addrp,bus_space_handle_t * bshp)52125327569Smickey dino_ioalloc(void *v, bus_addr_t rstart, bus_addr_t rend, bus_size_t size,
52225327569Smickey     bus_size_t align, bus_size_t boundary, int flags, bus_addr_t *addrp,
52325327569Smickey     bus_space_handle_t *bshp)
52425327569Smickey {
52525327569Smickey 	struct dino_softc *sc = v;
52625327569Smickey 	struct extent *ex = sc->sc_ioex;
52725327569Smickey 	bus_addr_t bpa;
52825327569Smickey 	int error;
52925327569Smickey 
53025327569Smickey 	if (rstart < ex->ex_start || rend > ex->ex_end)
53125327569Smickey 		panic("dino_ioalloc: bad region start/end");
53225327569Smickey 
53325327569Smickey 	if ((error = extent_alloc_subregion(ex, rstart, rend, size,
53425327569Smickey 	    align, 0, boundary, EX_NOWAIT, &bpa)))
53525327569Smickey 		return (error);
53625327569Smickey 
53725327569Smickey 	if (addrp)
53825327569Smickey 		*addrp = bpa;
53925327569Smickey 	if (bshp)
54025327569Smickey 		*bshp = bpa;
54125327569Smickey 
54225327569Smickey 	return (0);
54325327569Smickey }
54425327569Smickey 
54525327569Smickey int
dino_memalloc(void * v,bus_addr_t rstart,bus_addr_t rend,bus_size_t size,bus_size_t align,bus_size_t boundary,int flags,bus_addr_t * addrp,bus_space_handle_t * bshp)54625327569Smickey dino_memalloc(void *v, bus_addr_t rstart, bus_addr_t rend, bus_size_t size,
54725327569Smickey     bus_size_t align, bus_size_t boundary, int flags, bus_addr_t *addrp,
54825327569Smickey     bus_space_handle_t *bshp)
54925327569Smickey {
5508a1b199bSmickey 	struct dino_softc *sc = v;
5518a1b199bSmickey 	volatile struct dino_regs *r = sc->sc_regs;
5528a1b199bSmickey 	u_int32_t reg;
5538a1b199bSmickey 
5548a1b199bSmickey 	if (bus_space_alloc(sc->sc_bt, rstart, rend, size,
5558a1b199bSmickey 	    align, boundary, flags, addrp, bshp))
5568a1b199bSmickey 		return (ENOMEM);
5578a1b199bSmickey 
55860b727f0Smiod 	reg = sc->io_shadow;
5598a1b199bSmickey 	reg |= 1 << ((*addrp >> 23) & 0x1f);
5608922cf83Smiod 	if (reg & 0x80000001) {
5618a1b199bSmickey #ifdef DEBUG
5628a1b199bSmickey 		panic("mapping outside the mem extent range");
5638a1b199bSmickey #endif
5648922cf83Smiod 		return (EINVAL);
5658922cf83Smiod 	}
56660b727f0Smiod 	r->io_addr_en |= reg;
56760b727f0Smiod 	sc->io_shadow = reg;
5688a1b199bSmickey 
5698a1b199bSmickey 	return (0);
57025327569Smickey }
57125327569Smickey 
57225327569Smickey void
dino_unmap(void * v,bus_space_handle_t bsh,bus_size_t size)57325327569Smickey dino_unmap(void *v, bus_space_handle_t bsh, bus_size_t size)
57425327569Smickey {
57525327569Smickey 	struct dino_softc *sc = v;
57625327569Smickey 	struct extent *ex;
57725327569Smickey 	bus_addr_t bpa;
57825327569Smickey 
57925327569Smickey 	bpa = bsh;
58025327569Smickey 	if (bsh & 0xf0000000) {
58125327569Smickey 		/* TODO dino_unmap mem */
58225327569Smickey 		/* TODO unmap from the upper bus if the last use in this 8M */
58325327569Smickey 		return;
58425327569Smickey 	} else
58525327569Smickey 		ex = sc->sc_ioex;
58625327569Smickey 
58725327569Smickey 	if (extent_free(ex, bpa, size, EX_NOWAIT))
58825327569Smickey 		printf("dino_unmap: ps 0x%lx, size 0x%lx\n"
58925327569Smickey 		    "dino_unmap: can't free region\n", bpa, size);
59025327569Smickey }
59125327569Smickey 
59225327569Smickey void
dino_free(void * v,bus_space_handle_t bh,bus_size_t size)59325327569Smickey dino_free(void *v, bus_space_handle_t bh, bus_size_t size)
59425327569Smickey {
59525327569Smickey 	/* should be enough */
59625327569Smickey 	dino_unmap(v, bh, size);
59725327569Smickey }
59825327569Smickey 
59925327569Smickey void
dino_barrier(void * v,bus_space_handle_t h,bus_size_t o,bus_size_t l,int op)60025327569Smickey dino_barrier(void *v, bus_space_handle_t h, bus_size_t o, bus_size_t l, int op)
60125327569Smickey {
60225327569Smickey 	sync_caches();
60325327569Smickey }
60425327569Smickey 
605fe822451Smickey #if NCARDBUS > 0
606fe822451Smickey void *
dino_alloc_parent(struct device * self,struct pci_attach_args * pa,int io)607fe822451Smickey dino_alloc_parent(struct device *self, struct pci_attach_args *pa, int io)
608fe822451Smickey {
609fe822451Smickey 	struct dino_softc *sc = pa->pa_pc->_cookie;
610fe822451Smickey 	struct extent *ex;
611fe822451Smickey 	bus_space_tag_t tag;
612fe822451Smickey 	bus_addr_t start;
613fe822451Smickey 	bus_size_t size;
614fe822451Smickey 
615fe822451Smickey 	if (io) {
616fe822451Smickey 		ex = sc->sc_ioex;
617fe822451Smickey 		tag = pa->pa_iot;
618fe822451Smickey 		start = 0xa000;
619fe822451Smickey 		size = 0x1000;
620fe822451Smickey 	} else {
621fe822451Smickey 		if (!sc->sc_memex) {
622fe822451Smickey 			bus_space_handle_t memh;
623fe822451Smickey 			bus_addr_t mem_start;
624fe822451Smickey 
625fe822451Smickey 			if (dino_memalloc(sc, 0xf0800000, 0xff7fffff,
626fe822451Smickey 			    DINO_MEM_WINDOW, DINO_MEM_WINDOW, EX_NOBOUNDARY,
627fe822451Smickey 			    0, &mem_start, &memh))
628fe822451Smickey 				return (NULL);
629fe822451Smickey 
630fe822451Smickey 			snprintf(sc->sc_memexname, sizeof(sc->sc_memexname),
631fe822451Smickey 			    "%s_mem", sc->sc_dv.dv_xname);
632fe822451Smickey 			if ((sc->sc_memex = extent_create(sc->sc_memexname,
633fe822451Smickey 			    mem_start, mem_start + DINO_MEM_WINDOW, M_DEVBUF,
634fe822451Smickey 			    NULL, 0, EX_NOWAIT | EX_MALLOCOK)) == NULL) {
635fe822451Smickey 				extent_destroy(sc->sc_ioex);
636fe822451Smickey 				bus_space_free(sc->sc_bt, memh,
637fe822451Smickey 				    DINO_MEM_WINDOW);
638fe822451Smickey 				return (NULL);
639fe822451Smickey 			}
640fe822451Smickey 		}
641fe822451Smickey 		ex = sc->sc_memex;
642fe822451Smickey 		tag = pa->pa_memt;
643fe822451Smickey 		start = ex->ex_start;
644fe822451Smickey 		size = DINO_MEM_CHUNK;
645fe822451Smickey 	}
646fe822451Smickey 
647fe822451Smickey 	if (extent_alloc_subregion(ex, start, ex->ex_end, size, size, 0,
648fe822451Smickey 	    EX_NOBOUNDARY, EX_NOWAIT, &start))
649fe822451Smickey 		return (NULL);
650fe822451Smickey 
651fe822451Smickey 	extent_free(ex, start, size, EX_NOWAIT);
652a5c223f8Sjsg 	return rbus_new_root_share(tag, ex, start, size);
653fe822451Smickey }
654fe822451Smickey #endif
655fe822451Smickey 
65687b07e5cSkettenis void *
dino_vaddr(void * v,bus_space_handle_t h)65787b07e5cSkettenis dino_vaddr(void *v, bus_space_handle_t h)
65887b07e5cSkettenis {
65987b07e5cSkettenis 	if (h & 0xf0000000)
66087b07e5cSkettenis 		return ((void *)h);
66187b07e5cSkettenis 	else
66287b07e5cSkettenis 		return (NULL);
66387b07e5cSkettenis }
66487b07e5cSkettenis 
66525327569Smickey u_int8_t
dino_r1(void * v,bus_space_handle_t h,bus_size_t o)66625327569Smickey dino_r1(void *v, bus_space_handle_t h, bus_size_t o)
66725327569Smickey {
66825327569Smickey 	h += o;
66925327569Smickey 	if (h & 0xf0000000)
67025327569Smickey 		return *(volatile u_int8_t *)h;
67125327569Smickey 	else {
67225327569Smickey 		struct dino_softc *sc = v;
67325327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
67425327569Smickey 		u_int8_t data;
67525327569Smickey 
676ad4f706dSkettenis 		r->pci_addr = h;
67725327569Smickey 		data = *((volatile u_int8_t *)&r->pci_io_data + (h & 3));
67825327569Smickey 		return (data);
67925327569Smickey 	}
68025327569Smickey }
68125327569Smickey 
68225327569Smickey u_int16_t
dino_r2(void * v,bus_space_handle_t h,bus_size_t o)68325327569Smickey dino_r2(void *v, bus_space_handle_t h, bus_size_t o)
68425327569Smickey {
685e5da3b35Smickey 	volatile u_int16_t *p;
68625327569Smickey 
68725327569Smickey 	h += o;
68825327569Smickey 	if (h & 0xf0000000)
689e5da3b35Smickey 		p = (volatile u_int16_t *)h;
69025327569Smickey 	else {
69125327569Smickey 		struct dino_softc *sc = v;
69225327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
69325327569Smickey 
694ad4f706dSkettenis 		r->pci_addr = h;
695e5da3b35Smickey 		p = (volatile u_int16_t *)&r->pci_io_data;
696e5da3b35Smickey 		if (h & 2)
697e5da3b35Smickey 			p++;
69825327569Smickey 	}
69925327569Smickey 
700e5da3b35Smickey 	return (letoh16(*p));
70125327569Smickey }
70225327569Smickey 
70325327569Smickey u_int32_t
dino_r4(void * v,bus_space_handle_t h,bus_size_t o)70425327569Smickey dino_r4(void *v, bus_space_handle_t h, bus_size_t o)
70525327569Smickey {
70625327569Smickey 	u_int32_t data;
70725327569Smickey 
70825327569Smickey 	h += o;
70925327569Smickey 	if (h & 0xf0000000)
71025327569Smickey 		data = *(volatile u_int32_t *)h;
71125327569Smickey 	else {
71225327569Smickey 		struct dino_softc *sc = v;
71325327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
71425327569Smickey 
71525327569Smickey 		r->pci_addr = h;
71625327569Smickey 		data = r->pci_io_data;
71725327569Smickey 	}
71825327569Smickey 
71925327569Smickey 	return (letoh32(data));
72025327569Smickey }
72125327569Smickey 
72225327569Smickey u_int64_t
dino_r8(void * v,bus_space_handle_t h,bus_size_t o)72325327569Smickey dino_r8(void *v, bus_space_handle_t h, bus_size_t o)
72425327569Smickey {
725dcb765c4Smickey 	u_int64_t data;
726dcb765c4Smickey 
72725327569Smickey 	h += o;
72825327569Smickey 	if (h & 0xf0000000)
729dcb765c4Smickey 		data = *(volatile u_int64_t *)h;
73025327569Smickey 	else
73125327569Smickey 		panic("dino_r8: not implemented");
732dcb765c4Smickey 
733dcb765c4Smickey 	return (letoh64(data));
73425327569Smickey }
73525327569Smickey 
73625327569Smickey void
dino_w1(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t vv)73725327569Smickey dino_w1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t vv)
73825327569Smickey {
73925327569Smickey 	h += o;
74025327569Smickey 	if (h & 0xf0000000)
74125327569Smickey 		*(volatile u_int8_t *)h = vv;
74225327569Smickey 	else {
74325327569Smickey 		struct dino_softc *sc = v;
74425327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
74525327569Smickey 
746ad4f706dSkettenis 		r->pci_addr = h;
74725327569Smickey 		*((volatile u_int8_t *)&r->pci_io_data + (h & 3)) = vv;
74825327569Smickey 	}
74925327569Smickey }
75025327569Smickey 
75125327569Smickey void
dino_w2(void * v,bus_space_handle_t h,bus_size_t o,u_int16_t vv)75225327569Smickey dino_w2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t vv)
75325327569Smickey {
754e5da3b35Smickey 	volatile u_int16_t *p;
755e5da3b35Smickey 
75625327569Smickey 	h += o;
75725327569Smickey 	if (h & 0xf0000000)
758e5da3b35Smickey 		p = (volatile u_int16_t *)h;
75925327569Smickey 	else {
76025327569Smickey 		struct dino_softc *sc = v;
76125327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
76225327569Smickey 
763ad4f706dSkettenis 		r->pci_addr = h;
764e5da3b35Smickey 		p = (volatile u_int16_t *)&r->pci_io_data;
765e5da3b35Smickey 		if (h & 2)
766e5da3b35Smickey 			p++;
76725327569Smickey 	}
768e5da3b35Smickey 
769e5da3b35Smickey 	*p = htole16(vv);
77025327569Smickey }
77125327569Smickey 
77225327569Smickey void
dino_w4(void * v,bus_space_handle_t h,bus_size_t o,u_int32_t vv)77325327569Smickey dino_w4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t vv)
77425327569Smickey {
77525327569Smickey 	h += o;
77625327569Smickey 	vv = htole32(vv);
77725327569Smickey 	if (h & 0xf0000000)
77825327569Smickey 		*(volatile u_int32_t *)h = vv;
77925327569Smickey 	else {
78025327569Smickey 		struct dino_softc *sc = v;
78125327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
78225327569Smickey 
78325327569Smickey 		r->pci_addr = h;
78425327569Smickey 		r->pci_io_data = vv;
78525327569Smickey 	}
78625327569Smickey }
78725327569Smickey 
78825327569Smickey void
dino_w8(void * v,bus_space_handle_t h,bus_size_t o,u_int64_t vv)78925327569Smickey dino_w8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t vv)
79025327569Smickey {
79125327569Smickey 	h += o;
79225327569Smickey 	if (h & 0xf0000000)
793dcb765c4Smickey 		*(volatile u_int64_t *)h = htole64(vv);
79425327569Smickey 	else
79525327569Smickey 		panic("dino_w8: not implemented");
79625327569Smickey }
79725327569Smickey 
79825327569Smickey 
79925327569Smickey void
dino_rm_1(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t c)80025327569Smickey dino_rm_1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t *a, bus_size_t c)
80125327569Smickey {
80225327569Smickey 	volatile u_int8_t *p;
80325327569Smickey 
80425327569Smickey 	h += o;
80525327569Smickey 	if (h & 0xf0000000)
80625327569Smickey 		p = (volatile u_int8_t *)h;
80725327569Smickey 	else {
80825327569Smickey 		struct dino_softc *sc = v;
80925327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
81025327569Smickey 
811ad4f706dSkettenis 		r->pci_addr = h;
81225327569Smickey 		p = (volatile u_int8_t *)&r->pci_io_data + (h & 3);
81325327569Smickey 	}
81425327569Smickey 
81525327569Smickey 	while (c--)
81625327569Smickey 		*a++ = *p;
81725327569Smickey }
81825327569Smickey 
81925327569Smickey void
dino_rm_2(void * v,bus_space_handle_t h,bus_size_t o,u_int16_t * a,bus_size_t c)82025327569Smickey dino_rm_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t c)
82125327569Smickey {
82225327569Smickey 	volatile u_int16_t *p;
82325327569Smickey 
82425327569Smickey 	h += o;
82525327569Smickey 	if (h & 0xf0000000)
82625327569Smickey 		p = (volatile u_int16_t *)h;
82725327569Smickey 	else {
82825327569Smickey 		struct dino_softc *sc = v;
82925327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
83025327569Smickey 
831ad4f706dSkettenis 		r->pci_addr = h;
832e5da3b35Smickey 		p = (volatile u_int16_t *)&r->pci_io_data;
833e5da3b35Smickey 		if (h & 2)
834e5da3b35Smickey 			p++;
83525327569Smickey 	}
83625327569Smickey 
83725327569Smickey 	while (c--)
838dcb765c4Smickey 		*a++ = letoh16(*p);
83925327569Smickey }
84025327569Smickey 
84125327569Smickey void
dino_rm_4(void * v,bus_space_handle_t h,bus_size_t o,u_int32_t * a,bus_size_t c)84225327569Smickey dino_rm_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t *a, bus_size_t c)
84325327569Smickey {
84425327569Smickey 	volatile u_int32_t *p;
84525327569Smickey 
84625327569Smickey 	h += o;
84725327569Smickey 	if (h & 0xf0000000)
84825327569Smickey 		p = (volatile u_int32_t *)h;
84925327569Smickey 	else {
85025327569Smickey 		struct dino_softc *sc = v;
85125327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
85225327569Smickey 
85325327569Smickey 		r->pci_addr = h;
85425327569Smickey 		p = (volatile u_int32_t *)&r->pci_io_data;
85525327569Smickey 	}
85625327569Smickey 
85725327569Smickey 	while (c--)
858dcb765c4Smickey 		*a++ = letoh32(*p);
85925327569Smickey }
86025327569Smickey 
86125327569Smickey void
dino_rm_8(void * v,bus_space_handle_t h,bus_size_t o,u_int64_t * a,bus_size_t c)86225327569Smickey dino_rm_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t *a, bus_size_t c)
86325327569Smickey {
86425327569Smickey 	panic("dino_rm_8: not implemented");
86525327569Smickey }
86625327569Smickey 
86725327569Smickey void
dino_wm_1(void * v,bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t c)86825327569Smickey dino_wm_1(void *v, bus_space_handle_t h, bus_size_t o, const u_int8_t *a, bus_size_t c)
86925327569Smickey {
87025327569Smickey 	volatile u_int8_t *p;
87125327569Smickey 
87225327569Smickey 	h += o;
87325327569Smickey 	if (h & 0xf0000000)
87425327569Smickey 		p = (volatile u_int8_t *)h;
87525327569Smickey 	else {
87625327569Smickey 		struct dino_softc *sc = v;
87725327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
87825327569Smickey 
879ad4f706dSkettenis 		r->pci_addr = h;
88025327569Smickey 		p = (volatile u_int8_t *)&r->pci_io_data + (h & 3);
88125327569Smickey 	}
88225327569Smickey 
88325327569Smickey 	while (c--)
88425327569Smickey 		*p = *a++;
88525327569Smickey }
88625327569Smickey 
88725327569Smickey void
dino_wm_2(void * v,bus_space_handle_t h,bus_size_t o,const u_int16_t * a,bus_size_t c)88825327569Smickey dino_wm_2(void *v, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c)
88925327569Smickey {
89025327569Smickey 	volatile u_int16_t *p;
89125327569Smickey 
89225327569Smickey 	h += o;
89325327569Smickey 	if (h & 0xf0000000)
89425327569Smickey 		p = (volatile u_int16_t *)h;
89525327569Smickey 	else {
89625327569Smickey 		struct dino_softc *sc = v;
89725327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
89825327569Smickey 
899ad4f706dSkettenis 		r->pci_addr = h;
900e5da3b35Smickey 		p = (volatile u_int16_t *)&r->pci_io_data;
901e5da3b35Smickey 		if (h & 2)
902e5da3b35Smickey 			p++;
90325327569Smickey 	}
90425327569Smickey 
90525327569Smickey 	while (c--)
906dcb765c4Smickey 		*p = htole16(*a++);
90725327569Smickey }
90825327569Smickey 
90925327569Smickey void
dino_wm_4(void * v,bus_space_handle_t h,bus_size_t o,const u_int32_t * a,bus_size_t c)91025327569Smickey dino_wm_4(void *v, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c)
91125327569Smickey {
91225327569Smickey 	volatile u_int32_t *p;
91325327569Smickey 
91425327569Smickey 	h += o;
91525327569Smickey 	if (h & 0xf0000000)
91625327569Smickey 		p = (volatile u_int32_t *)h;
91725327569Smickey 	else {
91825327569Smickey 		struct dino_softc *sc = v;
91925327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
92025327569Smickey 
92125327569Smickey 		r->pci_addr = h;
92225327569Smickey 		p = (volatile u_int32_t *)&r->pci_io_data;
92325327569Smickey 	}
92425327569Smickey 
92525327569Smickey 	while (c--)
926dcb765c4Smickey 		*p = htole32(*a++);
92725327569Smickey }
92825327569Smickey 
92925327569Smickey void
dino_wm_8(void * v,bus_space_handle_t h,bus_size_t o,const u_int64_t * a,bus_size_t c)93025327569Smickey dino_wm_8(void *v, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c)
93125327569Smickey {
93225327569Smickey 	panic("dino_wm_8: not implemented");
93325327569Smickey }
93425327569Smickey 
93525327569Smickey void
dino_sm_1(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t vv,bus_size_t c)93625327569Smickey dino_sm_1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t vv, bus_size_t c)
93725327569Smickey {
93825327569Smickey 	volatile u_int8_t *p;
93925327569Smickey 
94025327569Smickey 	h += o;
94125327569Smickey 	if (h & 0xf0000000)
94225327569Smickey 		p = (volatile u_int8_t *)h;
94325327569Smickey 	else {
94425327569Smickey 		struct dino_softc *sc = v;
94525327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
94625327569Smickey 
947ad4f706dSkettenis 		r->pci_addr = h;
94825327569Smickey 		p = (volatile u_int8_t *)&r->pci_io_data + (h & 3);
94925327569Smickey 	}
95025327569Smickey 
95125327569Smickey 	while (c--)
95225327569Smickey 		*p = vv;
95325327569Smickey }
95425327569Smickey 
95525327569Smickey void
dino_sm_2(void * v,bus_space_handle_t h,bus_size_t o,u_int16_t vv,bus_size_t c)95625327569Smickey dino_sm_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t vv, bus_size_t c)
95725327569Smickey {
95825327569Smickey 	volatile u_int16_t *p;
95925327569Smickey 
96025327569Smickey 	h += o;
96125327569Smickey 	if (h & 0xf0000000)
96225327569Smickey 		p = (volatile u_int16_t *)h;
96325327569Smickey 	else {
96425327569Smickey 		struct dino_softc *sc = v;
96525327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
96625327569Smickey 
967ad4f706dSkettenis 		r->pci_addr = h;
968e5da3b35Smickey 		p = (volatile u_int16_t *)&r->pci_io_data;
969e5da3b35Smickey 		if (h & 2)
970e5da3b35Smickey 			p++;
97125327569Smickey 	}
97225327569Smickey 
973dcb765c4Smickey 	vv = htole16(vv);
97425327569Smickey 	while (c--)
97525327569Smickey 		*p = vv;
97625327569Smickey }
97725327569Smickey 
97825327569Smickey void
dino_sm_4(void * v,bus_space_handle_t h,bus_size_t o,u_int32_t vv,bus_size_t c)97925327569Smickey dino_sm_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t vv, bus_size_t c)
98025327569Smickey {
98125327569Smickey 	volatile u_int32_t *p;
98225327569Smickey 
98325327569Smickey 	h += o;
98425327569Smickey 	if (h & 0xf0000000)
98525327569Smickey 		p = (volatile u_int32_t *)h;
98625327569Smickey 	else {
98725327569Smickey 		struct dino_softc *sc = v;
98825327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
98925327569Smickey 
99025327569Smickey 		r->pci_addr = h;
99125327569Smickey 		p = (volatile u_int32_t *)&r->pci_io_data;
99225327569Smickey 	}
99325327569Smickey 
994dcb765c4Smickey 	vv = htole32(vv);
99525327569Smickey 	while (c--)
99625327569Smickey 		*p = vv;
99725327569Smickey }
99825327569Smickey 
99925327569Smickey void
dino_sm_8(void * v,bus_space_handle_t h,bus_size_t o,u_int64_t vv,bus_size_t c)100025327569Smickey dino_sm_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t vv, bus_size_t c)
100125327569Smickey {
100225327569Smickey 	panic("dino_sm_8: not implemented");
100325327569Smickey }
100425327569Smickey 
100525327569Smickey void
dino_rrm_2(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t c)100625327569Smickey dino_rrm_2(void *v, bus_space_handle_t h, bus_size_t o,
100725327569Smickey     u_int8_t *a, bus_size_t c)
100825327569Smickey {
1009f333f8ddSmickey 	volatile u_int16_t *p, *q = (u_int16_t *)a;
101025327569Smickey 
101125327569Smickey 	h += o;
101225327569Smickey 	if (h & 0xf0000000)
101325327569Smickey 		p = (volatile u_int16_t *)h;
101425327569Smickey 	else {
101525327569Smickey 		struct dino_softc *sc = v;
101625327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
101725327569Smickey 
1018ad4f706dSkettenis 		r->pci_addr = h;
1019e5da3b35Smickey 		p = (volatile u_int16_t *)&r->pci_io_data;
1020e5da3b35Smickey 		if (h & 2)
1021e5da3b35Smickey 			p++;
102225327569Smickey 	}
102325327569Smickey 
1024f333f8ddSmickey 	c /= 2;
102525327569Smickey 	while (c--)
1026f333f8ddSmickey 		*q++ = *p;
102725327569Smickey }
102825327569Smickey 
102925327569Smickey void
dino_rrm_4(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t c)103025327569Smickey dino_rrm_4(void *v, bus_space_handle_t h, bus_size_t o,
103125327569Smickey     u_int8_t *a, bus_size_t c)
103225327569Smickey {
1033f333f8ddSmickey 	volatile u_int32_t *p, *q = (u_int32_t *)a;
103425327569Smickey 
103525327569Smickey 	h += o;
103625327569Smickey 	if (h & 0xf0000000)
103725327569Smickey 		p = (volatile u_int32_t *)h;
103825327569Smickey 	else {
103925327569Smickey 		struct dino_softc *sc = v;
104025327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
104125327569Smickey 
104225327569Smickey 		r->pci_addr = h;
104325327569Smickey 		p = (volatile u_int32_t *)&r->pci_io_data;
104425327569Smickey 	}
104525327569Smickey 
1046f333f8ddSmickey 	c /= 4;
104725327569Smickey 	while (c--)
1048f333f8ddSmickey 		*q++ = *p;
104925327569Smickey }
105025327569Smickey 
105125327569Smickey void
dino_rrm_8(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t c)105225327569Smickey dino_rrm_8(void *v, bus_space_handle_t h, bus_size_t o,
105325327569Smickey     u_int8_t *a, bus_size_t c)
105425327569Smickey {
105525327569Smickey 	panic("dino_rrm_8: not implemented");
105625327569Smickey }
105725327569Smickey 
105825327569Smickey void
dino_wrm_2(void * v,bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t c)105925327569Smickey dino_wrm_2(void *v, bus_space_handle_t h, bus_size_t o,
106025327569Smickey     const u_int8_t *a, bus_size_t c)
106125327569Smickey {
106225327569Smickey 	volatile u_int16_t *p;
1063f333f8ddSmickey 	const u_int16_t *q = (const u_int16_t *)a;
106425327569Smickey 
106525327569Smickey 	h += o;
106625327569Smickey 	if (h & 0xf0000000)
106725327569Smickey 		p = (volatile u_int16_t *)h;
106825327569Smickey 	else {
106925327569Smickey 		struct dino_softc *sc = v;
107025327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
107125327569Smickey 
1072ad4f706dSkettenis 		r->pci_addr = h;
1073e5da3b35Smickey 		p = (volatile u_int16_t *)&r->pci_io_data;
1074e5da3b35Smickey 		if (h & 2)
1075e5da3b35Smickey 			p++;
107625327569Smickey 	}
107725327569Smickey 
1078f333f8ddSmickey 	c /= 2;
107925327569Smickey 	while (c--)
1080f333f8ddSmickey 		*p = *q++;
108125327569Smickey }
108225327569Smickey 
108325327569Smickey void
dino_wrm_4(void * v,bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t c)108425327569Smickey dino_wrm_4(void *v, bus_space_handle_t h, bus_size_t o,
108525327569Smickey     const u_int8_t *a, bus_size_t c)
108625327569Smickey {
108725327569Smickey 	volatile u_int32_t *p;
1088f333f8ddSmickey 	const u_int32_t *q = (const u_int32_t *)a;
108925327569Smickey 
109025327569Smickey 	h += o;
109125327569Smickey 	if (h & 0xf0000000)
109225327569Smickey 		p = (volatile u_int32_t *)h;
109325327569Smickey 	else {
109425327569Smickey 		struct dino_softc *sc = v;
109525327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
109625327569Smickey 
109725327569Smickey 		r->pci_addr = h;
109825327569Smickey 		p = (volatile u_int32_t *)&r->pci_io_data;
109925327569Smickey 	}
110025327569Smickey 
1101f333f8ddSmickey 	c /= 4;
110225327569Smickey 	while (c--)
1103f333f8ddSmickey 		*p = *q++;
110425327569Smickey }
110525327569Smickey 
110625327569Smickey void
dino_wrm_8(void * v,bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t c)110725327569Smickey dino_wrm_8(void *v, bus_space_handle_t h, bus_size_t o,
110825327569Smickey     const u_int8_t *a, bus_size_t c)
110925327569Smickey {
111025327569Smickey 	panic("dino_wrm_8: not implemented");
111125327569Smickey }
111225327569Smickey 
111325327569Smickey void
dino_rr_1(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t c)111425327569Smickey dino_rr_1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t *a, bus_size_t c)
111525327569Smickey {
111625327569Smickey 	volatile u_int8_t *p;
111725327569Smickey 
111825327569Smickey 	h += o;
111925327569Smickey 	if (h & 0xf0000000) {
112025327569Smickey 		p = (volatile u_int8_t *)h;
112125327569Smickey 		while (c--)
112225327569Smickey 			*a++ = *p++;
112325327569Smickey 	} else {
112425327569Smickey 		struct dino_softc *sc = v;
112525327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
112625327569Smickey 
1127ad4f706dSkettenis 		for (; c--; h++) {
1128ad4f706dSkettenis 		  	r->pci_addr = h;
112925327569Smickey 			p = (volatile u_int8_t *)&r->pci_io_data + (h & 3);
113025327569Smickey 			*a++ = *p;
113125327569Smickey 		}
113225327569Smickey 	}
113325327569Smickey }
113425327569Smickey 
113525327569Smickey void
dino_rr_2(void * v,bus_space_handle_t h,bus_size_t o,u_int16_t * a,bus_size_t c)113625327569Smickey dino_rr_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t c)
113725327569Smickey {
1138dcb765c4Smickey 	volatile u_int16_t *p, data;
113925327569Smickey 
114025327569Smickey 	h += o;
114125327569Smickey 	if (h & 0xf0000000) {
114225327569Smickey 		p = (volatile u_int16_t *)h;
1143dcb765c4Smickey 		while (c--) {
1144dcb765c4Smickey 			data = *p++;
1145dcb765c4Smickey 			*a++ = letoh16(data);
1146dcb765c4Smickey 		}
114725327569Smickey 	} else {
114825327569Smickey 		struct dino_softc *sc = v;
114925327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
115025327569Smickey 
1151ad4f706dSkettenis 		for (; c--; h += 2) {
1152ad4f706dSkettenis 			r->pci_addr = h;
1153e5da3b35Smickey 			p = (volatile u_int16_t *)&r->pci_io_data;
1154e5da3b35Smickey 			if (h & 2)
1155e5da3b35Smickey 				p++;
1156dcb765c4Smickey 			data = *p;
1157dcb765c4Smickey 			*a++ = letoh16(data);
115825327569Smickey 		}
115925327569Smickey 	}
116025327569Smickey }
116125327569Smickey 
116225327569Smickey void
dino_rr_4(void * v,bus_space_handle_t h,bus_size_t o,u_int32_t * a,bus_size_t c)116325327569Smickey dino_rr_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t *a, bus_size_t c)
116425327569Smickey {
1165dcb765c4Smickey 	volatile u_int32_t *p, data;
116625327569Smickey 
116725327569Smickey 	h += o;
116825327569Smickey 	if (h & 0xf0000000) {
116925327569Smickey 		p = (volatile u_int32_t *)h;
1170dcb765c4Smickey 		while (c--) {
1171dcb765c4Smickey 			data = *p++;
1172dcb765c4Smickey 			*a++ = letoh32(data);
1173dcb765c4Smickey 		}
117425327569Smickey 	} else {
117525327569Smickey 		struct dino_softc *sc = v;
117625327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
117725327569Smickey 
117825327569Smickey 		for (; c--; h += 4) {
117925327569Smickey 			r->pci_addr = h;
1180dcb765c4Smickey 			data = r->pci_io_data;
1181dcb765c4Smickey 			*a++ = letoh32(data);
118225327569Smickey 		}
118325327569Smickey 	}
118425327569Smickey }
118525327569Smickey 
118625327569Smickey void
dino_rr_8(void * v,bus_space_handle_t h,bus_size_t o,u_int64_t * a,bus_size_t c)118725327569Smickey dino_rr_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t *a, bus_size_t c)
118825327569Smickey {
118925327569Smickey 	panic("dino_rr_8: not implemented");
119025327569Smickey }
119125327569Smickey 
119225327569Smickey void
dino_wr_1(void * v,bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t c)119325327569Smickey dino_wr_1(void *v, bus_space_handle_t h, bus_size_t o, const u_int8_t *a, bus_size_t c)
119425327569Smickey {
119525327569Smickey 	volatile u_int8_t *p;
119625327569Smickey 
119725327569Smickey 	h += o;
119825327569Smickey 	if (h & 0xf0000000) {
119925327569Smickey 		p = (volatile u_int8_t *)h;
120025327569Smickey 		while (c--)
120125327569Smickey 			*p++ = *a++;
120225327569Smickey 	} else {
120325327569Smickey 		struct dino_softc *sc = v;
120425327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
120525327569Smickey 
1206ad4f706dSkettenis 		for (; c--; h++) {
1207ad4f706dSkettenis 			r->pci_addr = h;
120825327569Smickey 			p = (volatile u_int8_t *)&r->pci_io_data + (h & 3);
120925327569Smickey 			*p = *a++;
121025327569Smickey 		}
121125327569Smickey 	}
121225327569Smickey }
121325327569Smickey 
121425327569Smickey void
dino_wr_2(void * v,bus_space_handle_t h,bus_size_t o,const u_int16_t * a,bus_size_t c)121525327569Smickey dino_wr_2(void *v, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c)
121625327569Smickey {
1217dcb765c4Smickey 	volatile u_int16_t *p, data;
1218dcb765c4Smickey 
1219dcb765c4Smickey 	h += o;
1220dcb765c4Smickey 	if (h & 0xf0000000) {
1221dcb765c4Smickey 		p = (volatile u_int16_t *)h;
1222dcb765c4Smickey 		while (c--) {
1223dcb765c4Smickey 			data = *a++;
1224dcb765c4Smickey 			*p++ = htole16(data);
1225dcb765c4Smickey 		}
1226dcb765c4Smickey 	} else {
1227dcb765c4Smickey 		struct dino_softc *sc = v;
1228dcb765c4Smickey 		volatile struct dino_regs *r = sc->sc_regs;
1229dcb765c4Smickey 
1230ad4f706dSkettenis 		for (; c--; h += 2) {
1231ad4f706dSkettenis 			r->pci_addr = h;
1232dcb765c4Smickey 			p = (volatile u_int16_t *)&r->pci_io_data;
1233dcb765c4Smickey 			if (h & 2)
1234dcb765c4Smickey 				p++;
1235dcb765c4Smickey 			data = *a++;
1236dcb765c4Smickey 			*p = htole16(data);
1237dcb765c4Smickey 		}
1238dcb765c4Smickey 	}
1239dcb765c4Smickey }
1240dcb765c4Smickey 
1241dcb765c4Smickey void
dino_wr_4(void * v,bus_space_handle_t h,bus_size_t o,const u_int32_t * a,bus_size_t c)1242dcb765c4Smickey dino_wr_4(void *v, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c)
1243dcb765c4Smickey {
1244dcb765c4Smickey 	volatile u_int32_t *p, data;
1245dcb765c4Smickey 
1246dcb765c4Smickey 	h += o;
1247dcb765c4Smickey 	if (h & 0xf0000000) {
1248dcb765c4Smickey 		p = (volatile u_int32_t *)h;
1249dcb765c4Smickey 		while (c--) {
1250dcb765c4Smickey 			data = *a++;
1251dcb765c4Smickey 			*p++ = htole32(data);
1252dcb765c4Smickey 		}
1253dcb765c4Smickey 	} else {
1254dcb765c4Smickey 		struct dino_softc *sc = v;
1255dcb765c4Smickey 		volatile struct dino_regs *r = sc->sc_regs;
1256dcb765c4Smickey 
1257dcb765c4Smickey 		for (; c--; h += 4) {
1258dcb765c4Smickey 			r->pci_addr = h;
1259dcb765c4Smickey 			data = *a++;
1260dcb765c4Smickey 			r->pci_io_data = htole32(data);
1261dcb765c4Smickey 		}
1262dcb765c4Smickey 	}
1263dcb765c4Smickey }
1264dcb765c4Smickey 
1265dcb765c4Smickey void
dino_wr_8(void * v,bus_space_handle_t h,bus_size_t o,const u_int64_t * a,bus_size_t c)1266dcb765c4Smickey dino_wr_8(void *v, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c)
1267dcb765c4Smickey {
1268dcb765c4Smickey 	panic("dino_wr_8: not implemented");
1269dcb765c4Smickey }
1270dcb765c4Smickey 
1271dcb765c4Smickey void
dino_rrr_2(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t c)1272dcb765c4Smickey dino_rrr_2(void *v, bus_space_handle_t h, bus_size_t o,
1273dcb765c4Smickey     u_int8_t *a, bus_size_t c)
1274dcb765c4Smickey {
1275f333f8ddSmickey 	volatile u_int16_t *p, *q = (u_int16_t *)a;
1276dcb765c4Smickey 
1277f333f8ddSmickey 	c /= 2;
1278dcb765c4Smickey 	h += o;
1279dcb765c4Smickey 	if (h & 0xf0000000) {
1280dcb765c4Smickey 		p = (volatile u_int16_t *)h;
1281dcb765c4Smickey 		while (c--)
1282f333f8ddSmickey 			*q++ = *p++;
1283dcb765c4Smickey 	} else {
1284dcb765c4Smickey 		struct dino_softc *sc = v;
1285dcb765c4Smickey 		volatile struct dino_regs *r = sc->sc_regs;
1286dcb765c4Smickey 
1287ad4f706dSkettenis 		for (; c--; h += 2) {
1288ad4f706dSkettenis 			r->pci_addr = h;
1289dcb765c4Smickey 			p = (volatile u_int16_t *)&r->pci_io_data;
1290dcb765c4Smickey 			if (h & 2)
1291dcb765c4Smickey 				p++;
1292f333f8ddSmickey 			*q++ = *p;
1293dcb765c4Smickey 		}
1294dcb765c4Smickey 	}
1295dcb765c4Smickey }
1296dcb765c4Smickey 
1297dcb765c4Smickey void
dino_rrr_4(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t c)1298dcb765c4Smickey dino_rrr_4(void *v, bus_space_handle_t h, bus_size_t o,
1299dcb765c4Smickey     u_int8_t *a, bus_size_t c)
1300dcb765c4Smickey {
1301f333f8ddSmickey 	volatile u_int32_t *p, *q = (u_int32_t *)a;
1302dcb765c4Smickey 
1303f333f8ddSmickey 	c /= 4;
1304dcb765c4Smickey 	h += o;
1305dcb765c4Smickey 	if (h & 0xf0000000) {
1306dcb765c4Smickey 		p = (volatile u_int32_t *)h;
1307dcb765c4Smickey 		while (c--)
1308f333f8ddSmickey 			*q++ = *p++;
1309dcb765c4Smickey 	} else {
1310dcb765c4Smickey 		struct dino_softc *sc = v;
1311dcb765c4Smickey 		volatile struct dino_regs *r = sc->sc_regs;
1312dcb765c4Smickey 
1313dcb765c4Smickey 		for (; c--; h += 4) {
1314dcb765c4Smickey 			r->pci_addr = h;
1315f333f8ddSmickey 			*q++ = r->pci_io_data;
1316dcb765c4Smickey 		}
1317dcb765c4Smickey 	}
1318dcb765c4Smickey }
1319dcb765c4Smickey 
1320dcb765c4Smickey void
dino_rrr_8(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t c)1321dcb765c4Smickey dino_rrr_8(void *v, bus_space_handle_t h, bus_size_t o,
1322dcb765c4Smickey     u_int8_t *a, bus_size_t c)
1323dcb765c4Smickey {
1324dcb765c4Smickey 	panic("dino_rrr_8: not implemented");
1325dcb765c4Smickey }
1326dcb765c4Smickey 
1327dcb765c4Smickey void
dino_wrr_2(void * v,bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t c)1328dcb765c4Smickey dino_wrr_2(void *v, bus_space_handle_t h, bus_size_t o,
1329dcb765c4Smickey     const u_int8_t *a, bus_size_t c)
1330dcb765c4Smickey {
133125327569Smickey 	volatile u_int16_t *p;
1332f333f8ddSmickey 	const u_int16_t *q = (u_int16_t *)a;
133325327569Smickey 
1334f333f8ddSmickey 	c /= 2;
133525327569Smickey 	h += o;
133625327569Smickey 	if (h & 0xf0000000) {
133725327569Smickey 		p = (volatile u_int16_t *)h;
133825327569Smickey 		while (c--)
1339f333f8ddSmickey 			*p++ = *q++;
134025327569Smickey 	} else {
134125327569Smickey 		struct dino_softc *sc = v;
134225327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
134325327569Smickey 
1344ad4f706dSkettenis 		for (; c--; h += 2) {
1345ad4f706dSkettenis 			r->pci_addr = h;
1346e5da3b35Smickey 			p = (volatile u_int16_t *)&r->pci_io_data;
1347e5da3b35Smickey 			if (h & 2)
1348e5da3b35Smickey 				p++;
1349f333f8ddSmickey 			*p = *q++;
135025327569Smickey 		}
135125327569Smickey 	}
135225327569Smickey }
135325327569Smickey 
135425327569Smickey void
dino_wrr_4(void * v,bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t c)1355dcb765c4Smickey dino_wrr_4(void *v, bus_space_handle_t h, bus_size_t o,
1356dcb765c4Smickey     const u_int8_t *a, bus_size_t c)
135725327569Smickey {
135825327569Smickey 	volatile u_int32_t *p;
1359f333f8ddSmickey 	const u_int32_t *q = (u_int32_t *)a;
136025327569Smickey 
1361f333f8ddSmickey 	c /= 4;
136225327569Smickey 	h += o;
136325327569Smickey 	if (h & 0xf0000000) {
136425327569Smickey 		p = (volatile u_int32_t *)h;
136525327569Smickey 		while (c--)
1366f333f8ddSmickey 			*p++ = *q++;
136725327569Smickey 	} else {
136825327569Smickey 		struct dino_softc *sc = v;
136925327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
137025327569Smickey 
137125327569Smickey 		for (; c--; h += 4) {
137225327569Smickey 			r->pci_addr = h;
1373f333f8ddSmickey 			r->pci_io_data = *q++;
137425327569Smickey 		}
137525327569Smickey 	}
137625327569Smickey }
137725327569Smickey 
137825327569Smickey void
dino_wrr_8(void * v,bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t c)137925327569Smickey dino_wrr_8(void *v, bus_space_handle_t h, bus_size_t o,
138025327569Smickey     const u_int8_t *a, bus_size_t c)
138125327569Smickey {
138225327569Smickey 	panic("dino_wrr_8: not implemented");
138325327569Smickey }
138425327569Smickey 
138525327569Smickey void
dino_sr_1(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t vv,bus_size_t c)138625327569Smickey dino_sr_1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t vv, bus_size_t c)
138725327569Smickey {
138825327569Smickey 	volatile u_int8_t *p;
138925327569Smickey 
139025327569Smickey 	h += o;
139125327569Smickey 	if (h & 0xf0000000) {
139225327569Smickey 		p = (volatile u_int8_t *)h;
139325327569Smickey 		while (c--)
139425327569Smickey 			*p++ = vv;
139525327569Smickey 	} else {
139625327569Smickey 		struct dino_softc *sc = v;
139725327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
139825327569Smickey 
1399ad4f706dSkettenis 		for (; c--; h++) {
1400ad4f706dSkettenis 			r->pci_addr = h;
140125327569Smickey 			p = (volatile u_int8_t *)&r->pci_io_data + (h & 3);
140225327569Smickey 			*p = vv;
140325327569Smickey 		}
140425327569Smickey 	}
140525327569Smickey }
140625327569Smickey 
140725327569Smickey void
dino_sr_2(void * v,bus_space_handle_t h,bus_size_t o,u_int16_t vv,bus_size_t c)140825327569Smickey dino_sr_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t vv, bus_size_t c)
140925327569Smickey {
141025327569Smickey 	volatile u_int16_t *p;
141125327569Smickey 
141225327569Smickey 	h += o;
1413dcb765c4Smickey 	vv = htole16(vv);
141425327569Smickey 	if (h & 0xf0000000) {
141525327569Smickey 		p = (volatile u_int16_t *)h;
141625327569Smickey 		while (c--)
141725327569Smickey 			*p++ = vv;
141825327569Smickey 	} else {
141925327569Smickey 		struct dino_softc *sc = v;
142025327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
142125327569Smickey 
1422ad4f706dSkettenis 		for (; c--; h += 2) {
1423ad4f706dSkettenis 			r->pci_addr = h;
1424e5da3b35Smickey 			p = (volatile u_int16_t *)&r->pci_io_data;
1425e5da3b35Smickey 			if (h & 2)
1426e5da3b35Smickey 				p++;
142725327569Smickey 			*p = vv;
142825327569Smickey 		}
142925327569Smickey 	}
143025327569Smickey }
143125327569Smickey 
143225327569Smickey void
dino_sr_4(void * v,bus_space_handle_t h,bus_size_t o,u_int32_t vv,bus_size_t c)143325327569Smickey dino_sr_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t vv, bus_size_t c)
143425327569Smickey {
143525327569Smickey 	volatile u_int32_t *p;
143625327569Smickey 
143725327569Smickey 	h += o;
1438dcb765c4Smickey 	vv = htole32(vv);
143925327569Smickey 	if (h & 0xf0000000) {
144025327569Smickey 		p = (volatile u_int32_t *)h;
144125327569Smickey 		while (c--)
144225327569Smickey 			*p++ = vv;
144325327569Smickey 	} else {
144425327569Smickey 		struct dino_softc *sc = v;
144525327569Smickey 		volatile struct dino_regs *r = sc->sc_regs;
144625327569Smickey 
144725327569Smickey 		for (; c--; h += 4) {
144825327569Smickey 			r->pci_addr = h;
144925327569Smickey 			r->pci_io_data = vv;
145025327569Smickey 		}
145125327569Smickey 	}
145225327569Smickey }
145325327569Smickey 
145425327569Smickey void
dino_sr_8(void * v,bus_space_handle_t h,bus_size_t o,u_int64_t vv,bus_size_t c)145525327569Smickey dino_sr_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t vv, bus_size_t c)
145625327569Smickey {
145725327569Smickey 	panic("dino_sr_8: not implemented");
145825327569Smickey }
145925327569Smickey 
146025327569Smickey void
dino_cp_1(void * v,bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,bus_size_t c)146125327569Smickey dino_cp_1(void *v, bus_space_handle_t h1, bus_size_t o1,
146225327569Smickey 	  bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
146325327569Smickey {
146425327569Smickey 	while (c--)
146525327569Smickey 		dino_w1(v, h1, o1++, dino_r1(v, h2, o2++));
146625327569Smickey }
146725327569Smickey 
146825327569Smickey void
dino_cp_2(void * v,bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,bus_size_t c)146925327569Smickey dino_cp_2(void *v, bus_space_handle_t h1, bus_size_t o1,
147025327569Smickey 	  bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
147125327569Smickey {
147225327569Smickey 	while (c--) {
147325327569Smickey 		dino_w2(v, h1, o1, dino_r2(v, h2, o2));
147425327569Smickey 		o1 += 2;
147525327569Smickey 		o2 += 2;
147625327569Smickey 	}
147725327569Smickey }
147825327569Smickey 
147925327569Smickey void
dino_cp_4(void * v,bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,bus_size_t c)148025327569Smickey dino_cp_4(void *v, bus_space_handle_t h1, bus_size_t o1,
148125327569Smickey 	  bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
148225327569Smickey {
148325327569Smickey 	while (c--) {
148425327569Smickey 		dino_w4(v, h1, o1, dino_r4(v, h2, o2));
148525327569Smickey 		o1 += 4;
148625327569Smickey 		o2 += 4;
148725327569Smickey 	}
148825327569Smickey }
148925327569Smickey 
149025327569Smickey void
dino_cp_8(void * v,bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,bus_size_t c)149125327569Smickey dino_cp_8(void *v, bus_space_handle_t h1, bus_size_t o1,
149225327569Smickey 	  bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
149325327569Smickey {
149425327569Smickey 	while (c--) {
149525327569Smickey 		dino_w8(v, h1, o1, dino_r8(v, h2, o2));
149625327569Smickey 		o1 += 8;
149725327569Smickey 		o2 += 8;
149825327569Smickey 	}
149925327569Smickey }
150025327569Smickey 
150125327569Smickey 
150225327569Smickey const struct hppa_bus_space_tag dino_iomemt = {
150325327569Smickey 	NULL,
150425327569Smickey 
150525327569Smickey 	NULL, dino_unmap, dino_subregion, NULL, dino_free,
150687b07e5cSkettenis 	dino_barrier, dino_vaddr,
150725327569Smickey 	dino_r1,    dino_r2,    dino_r4,    dino_r8,
150825327569Smickey 	dino_w1,    dino_w2,    dino_w4,    dino_w8,
150925327569Smickey 	dino_rm_1,  dino_rm_2,  dino_rm_4,  dino_rm_8,
151025327569Smickey 	dino_wm_1,  dino_wm_2,  dino_wm_4,  dino_wm_8,
151125327569Smickey 	dino_sm_1,  dino_sm_2,  dino_sm_4,  dino_sm_8,
151225327569Smickey 	            dino_rrm_2, dino_rrm_4, dino_rrm_8,
151325327569Smickey 	            dino_wrm_2, dino_wrm_4, dino_wrm_8,
151425327569Smickey 	dino_rr_1,  dino_rr_2,  dino_rr_4,  dino_rr_8,
151525327569Smickey 	dino_wr_1,  dino_wr_2,  dino_wr_4,  dino_wr_8,
151625327569Smickey 	            dino_rrr_2, dino_rrr_4, dino_rrr_8,
151725327569Smickey 	            dino_wrr_2, dino_wrr_4, dino_wrr_8,
151825327569Smickey 	dino_sr_1,  dino_sr_2,  dino_sr_4,  dino_sr_8,
151925327569Smickey 	dino_cp_1,  dino_cp_2,  dino_cp_4,  dino_cp_8
152025327569Smickey };
152125327569Smickey 
152225327569Smickey int
dino_dmamap_create(void * v,bus_size_t size,int nsegments,bus_size_t maxsegsz,bus_size_t boundary,int flags,bus_dmamap_t * dmamp)152325327569Smickey dino_dmamap_create(void *v, bus_size_t size, int nsegments,
152425327569Smickey     bus_size_t maxsegsz, bus_size_t boundary, int flags, bus_dmamap_t *dmamp)
152525327569Smickey {
152625327569Smickey 	struct dino_softc *sc = v;
152725327569Smickey 
152825327569Smickey 	/* TODO check the addresses, boundary, enable dma */
152925327569Smickey 
153025327569Smickey 	return (bus_dmamap_create(sc->sc_dmat, size, nsegments,
153125327569Smickey 	    maxsegsz, boundary, flags, dmamp));
153225327569Smickey }
153325327569Smickey 
153425327569Smickey void
dino_dmamap_destroy(void * v,bus_dmamap_t map)153525327569Smickey dino_dmamap_destroy(void *v, bus_dmamap_t map)
153625327569Smickey {
153725327569Smickey 	struct dino_softc *sc = v;
153825327569Smickey 
153925327569Smickey 	bus_dmamap_destroy(sc->sc_dmat, map);
154025327569Smickey }
154125327569Smickey 
154225327569Smickey int
dino_dmamap_load(void * v,bus_dmamap_t map,void * addr,bus_size_t size,struct proc * p,int flags)154325327569Smickey dino_dmamap_load(void *v, bus_dmamap_t map, void *addr, bus_size_t size,
154425327569Smickey     struct proc *p, int flags)
154525327569Smickey {
154625327569Smickey 	struct dino_softc *sc = v;
154725327569Smickey 
154825327569Smickey 	return (bus_dmamap_load(sc->sc_dmat, map, addr, size, p, flags));
154925327569Smickey }
155025327569Smickey 
155125327569Smickey int
dino_dmamap_load_mbuf(void * v,bus_dmamap_t map,struct mbuf * m,int flags)155225327569Smickey dino_dmamap_load_mbuf(void *v, bus_dmamap_t map, struct mbuf *m, int flags)
155325327569Smickey {
155425327569Smickey 	struct dino_softc *sc = v;
155525327569Smickey 
155625327569Smickey 	return (bus_dmamap_load_mbuf(sc->sc_dmat, map, m, flags));
155725327569Smickey }
155825327569Smickey 
155925327569Smickey int
dino_dmamap_load_uio(void * v,bus_dmamap_t map,struct uio * uio,int flags)156025327569Smickey dino_dmamap_load_uio(void *v, bus_dmamap_t map, struct uio *uio, int flags)
156125327569Smickey {
156225327569Smickey 	struct dino_softc *sc = v;
156325327569Smickey 
156425327569Smickey 	return (bus_dmamap_load_uio(sc->sc_dmat, map, uio, flags));
156525327569Smickey }
156625327569Smickey 
156725327569Smickey int
dino_dmamap_load_raw(void * v,bus_dmamap_t map,bus_dma_segment_t * segs,int nsegs,bus_size_t size,int flags)156825327569Smickey dino_dmamap_load_raw(void *v, bus_dmamap_t map, bus_dma_segment_t *segs,
156925327569Smickey     int nsegs, bus_size_t size, int flags)
157025327569Smickey {
157125327569Smickey 	struct dino_softc *sc = v;
157225327569Smickey 
157325327569Smickey 	return (bus_dmamap_load_raw(sc->sc_dmat, map, segs, nsegs, size, flags));
157425327569Smickey }
157525327569Smickey 
157625327569Smickey void
dino_dmamap_unload(void * v,bus_dmamap_t map)157725327569Smickey dino_dmamap_unload(void *v, bus_dmamap_t map)
157825327569Smickey {
157925327569Smickey 	struct dino_softc *sc = v;
158025327569Smickey 
158125327569Smickey 	bus_dmamap_unload(sc->sc_dmat, map);
158225327569Smickey }
158325327569Smickey 
158425327569Smickey void
dino_dmamap_sync(void * v,bus_dmamap_t map,bus_addr_t off,bus_size_t len,int ops)158525327569Smickey dino_dmamap_sync(void *v, bus_dmamap_t map, bus_addr_t off,
158625327569Smickey     bus_size_t len, int ops)
158725327569Smickey {
158825327569Smickey 	struct dino_softc *sc = v;
158925327569Smickey 
159025327569Smickey 	return (bus_dmamap_sync(sc->sc_dmat, map, off, len, ops));
159125327569Smickey }
159225327569Smickey 
159325327569Smickey int
dino_dmamem_alloc(void * v,bus_size_t size,bus_size_t alignment,bus_size_t boundary,bus_dma_segment_t * segs,int nsegs,int * rsegs,int flags)159425327569Smickey dino_dmamem_alloc(void *v, bus_size_t size, bus_size_t alignment,
159525327569Smickey     bus_size_t boundary, bus_dma_segment_t *segs,
159625327569Smickey     int nsegs, int *rsegs, int flags)
159725327569Smickey {
159825327569Smickey 	struct dino_softc *sc = v;
159925327569Smickey 
160025327569Smickey 	return (bus_dmamem_alloc(sc->sc_dmat, size, alignment, boundary,
160125327569Smickey 	    segs, nsegs, rsegs, flags));
160225327569Smickey }
160325327569Smickey 
160425327569Smickey void
dino_dmamem_free(void * v,bus_dma_segment_t * segs,int nsegs)160525327569Smickey dino_dmamem_free(void *v, bus_dma_segment_t *segs, int nsegs)
160625327569Smickey {
160725327569Smickey 	struct dino_softc *sc = v;
160825327569Smickey 
160925327569Smickey 	bus_dmamem_free(sc->sc_dmat, segs, nsegs);
161025327569Smickey }
161125327569Smickey 
161225327569Smickey int
dino_dmamem_map(void * v,bus_dma_segment_t * segs,int nsegs,size_t size,caddr_t * kvap,int flags)161325327569Smickey dino_dmamem_map(void *v, bus_dma_segment_t *segs, int nsegs, size_t size,
161425327569Smickey     caddr_t *kvap, int flags)
161525327569Smickey {
161625327569Smickey 	struct dino_softc *sc = v;
161725327569Smickey 
161825327569Smickey 	return (bus_dmamem_map(sc->sc_dmat, segs, nsegs, size, kvap, flags));
161925327569Smickey }
162025327569Smickey 
162125327569Smickey void
dino_dmamem_unmap(void * v,caddr_t kva,size_t size)162225327569Smickey dino_dmamem_unmap(void *v, caddr_t kva, size_t size)
162325327569Smickey {
162425327569Smickey 	struct dino_softc *sc = v;
162525327569Smickey 
162625327569Smickey 	bus_dmamem_unmap(sc->sc_dmat, kva, size);
162725327569Smickey }
162825327569Smickey 
162925327569Smickey paddr_t
dino_dmamem_mmap(void * v,bus_dma_segment_t * segs,int nsegs,off_t off,int prot,int flags)163025327569Smickey dino_dmamem_mmap(void *v, bus_dma_segment_t *segs, int nsegs, off_t off,
163125327569Smickey     int prot, int flags)
163225327569Smickey {
163325327569Smickey 	struct dino_softc *sc = v;
163425327569Smickey 
163525327569Smickey 	return (bus_dmamem_mmap(sc->sc_dmat, segs, nsegs, off, prot, flags));
163625327569Smickey }
163725327569Smickey 
163825327569Smickey const struct hppa_bus_dma_tag dino_dmat = {
163925327569Smickey 	NULL,
164025327569Smickey 	dino_dmamap_create, dino_dmamap_destroy,
164125327569Smickey 	dino_dmamap_load, dino_dmamap_load_mbuf,
164225327569Smickey 	dino_dmamap_load_uio, dino_dmamap_load_raw,
164325327569Smickey 	dino_dmamap_unload, dino_dmamap_sync,
164425327569Smickey 
164525327569Smickey 	dino_dmamem_alloc, dino_dmamem_free, dino_dmamem_map,
164625327569Smickey 	dino_dmamem_unmap, dino_dmamem_mmap
164725327569Smickey };
164825327569Smickey 
164925327569Smickey const struct hppa_pci_chipset_tag dino_pc = {
165025327569Smickey 	NULL,
165125327569Smickey 	dino_attach_hook, dino_maxdevs, dino_make_tag, dino_decompose_tag,
1652b1926db3Smiod 	dino_conf_size, dino_conf_read, dino_conf_write,
165325327569Smickey 	dino_intr_map, dino_intr_string,
165425327569Smickey 	dino_intr_establish, dino_intr_disestablish,
165525327569Smickey #if NCARDBUS > 0
165625327569Smickey 	dino_alloc_parent
165725327569Smickey #else
165825327569Smickey 	NULL
165925327569Smickey #endif
166025327569Smickey };
166125327569Smickey 
166225327569Smickey int
dinoprint(void * aux,const char * pnp)166325327569Smickey dinoprint(void *aux, const char *pnp)
166425327569Smickey {
166525327569Smickey 	struct pcibus_attach_args *pba = aux;
166625327569Smickey 
166725327569Smickey 	if (pnp)
166825327569Smickey 		printf("%s at %s\n", pba->pba_busname, pnp);
166925327569Smickey 	return (UNCONF);
167025327569Smickey }
167125327569Smickey 
167225327569Smickey void
dinoattach(parent,self,aux)167325327569Smickey dinoattach(parent, self, aux)
167425327569Smickey 	struct device *parent;
167525327569Smickey 	struct device *self;
167625327569Smickey 	void *aux;
167725327569Smickey {
167825327569Smickey 	struct dino_softc *sc = (struct dino_softc *)self;
167925327569Smickey 	struct confargs *ca = (struct confargs *)aux;
168025327569Smickey 	struct pcibus_attach_args pba;
168125327569Smickey 	volatile struct dino_regs *r;
1682fe822451Smickey 	const char *p = NULL;
168325327569Smickey 	u_int data;
168451f66ac7Skettenis 	int s, irqbit;
168525327569Smickey 
168625327569Smickey 	sc->sc_bt = ca->ca_iot;
168725327569Smickey 	sc->sc_dmat = ca->ca_dmatag;
168825327569Smickey 	if (bus_space_map(sc->sc_bt, ca->ca_hpa, PAGE_SIZE, 0, &sc->sc_bh)) {
168925327569Smickey 		printf(": can't map space\n");
169025327569Smickey 		return;
169125327569Smickey 	}
169225327569Smickey 
169325327569Smickey 	sc->sc_regs = r = (volatile struct dino_regs *)sc->sc_bh;
1694c739703cSmickey 	r->pciror = 0;
1695c739703cSmickey 	r->pciwor = 0;
169660b727f0Smiod 
169760b727f0Smiod 	/*
169860b727f0Smiod 	 * Do not reset enabled io mappings mask if we are still running
169960b727f0Smiod 	 * with PDC console - we'll do it after autoconf.
170060b727f0Smiod 	 */
170160b727f0Smiod 	if (cn_tab->cn_putc != pdccnputc)
1702c739703cSmickey 		r->io_addr_en = 0;
170360b727f0Smiod 	sc->io_shadow = 0;
170460b727f0Smiod 
1705c739703cSmickey 	r->gmask &= ~1;	/* allow GSC bus req */
17068a1b199bSmickey 	r->brdg_feat &= ~0xf00;
17078a1b199bSmickey 	r->brdg_feat |= 3;
1708c739703cSmickey #ifdef notyet_card_mode
170925327569Smickey 	r->io_control = 0x80;
171025327569Smickey 	r->pamr = 0;
171125327569Smickey 	r->papr = 0;
171225327569Smickey 	r->io_fbb_en |= 1;
171325327569Smickey 	r->damode = 0;
1714c739703cSmickey 	r->brdg_feat = 0xc0000000 XXX;
1715c739703cSmickey 	r->mltim = 0x40;	/* 64 clocks */
1716c739703cSmickey 	r->tltim = 0x8c;	/* 12 clocks */
171725327569Smickey 
171825327569Smickey 	/* PCI reset */
171925327569Smickey 	r->pcicmd = 0x6f;
1720c739703cSmickey 	DELAY(10000);		/* 10ms for reset to settle */
1721c739703cSmickey #endif
172225327569Smickey 
172325327569Smickey 	snprintf(sc->sc_ioexname, sizeof(sc->sc_ioexname),
172425327569Smickey 	    "%s_io", sc->sc_dv.dv_xname);
172525327569Smickey 	if ((sc->sc_ioex = extent_create(sc->sc_ioexname, 0, 0xffff,
172625327569Smickey 	    M_DEVBUF, NULL, 0, EX_NOWAIT | EX_MALLOCOK)) == NULL) {
172725327569Smickey 		printf(": cannot allocate I/O extent map\n");
172825327569Smickey 		bus_space_unmap(sc->sc_bt, sc->sc_bh, PAGE_SIZE);
172925327569Smickey 		return;
173025327569Smickey 	}
173125327569Smickey 
173225327569Smickey 	/* TODO reserve dino's pci space ? */
173325327569Smickey 
1734fe822451Smickey 	sc->sc_ver = ca->ca_type.iodc_revision;
1735fe822451Smickey 	switch ((ca->ca_type.iodc_model << 4) |
1736fe822451Smickey 	    (ca->ca_type.iodc_revision >> 4)) {
1737fe822451Smickey 	case 0x05d:	/* j2240 */
1738fe822451Smickey 		p = "Dino(card)";
1739fe822451Smickey 	case 0x680:
1740fe822451Smickey 		if (!p)
1741fe822451Smickey 			p = "Dino";
1742fe822451Smickey 		switch (ca->ca_type.iodc_revision & 0xf) {
1743fe822451Smickey 		case 0:	sc->sc_ver = 0x20;	break;
1744fe822451Smickey 		case 1:	sc->sc_ver = 0x21;	break;
1745fe822451Smickey 		case 2:	sc->sc_ver = 0x30;	break;
1746fe822451Smickey 		case 3:	sc->sc_ver = 0x31;	break;
174725327569Smickey 		}
174825327569Smickey 		break;
174925327569Smickey 
1750fe822451Smickey 	case 0x682:
1751fe822451Smickey 		p = "Cujo";
1752fe822451Smickey 		switch (ca->ca_type.iodc_revision & 0xf) {
1753fe822451Smickey 		case 0:	sc->sc_ver = 0x10;	break;
1754fe822451Smickey 		case 1:	sc->sc_ver = 0x20;	break;
175525327569Smickey 		}
175625327569Smickey 		break;
175725327569Smickey 
1758fe822451Smickey 	default:
1759fe822451Smickey 		p = "Mojo";
176025327569Smickey 		break;
176125327569Smickey 	}
1762fe822451Smickey 
176351f66ac7Skettenis 	irqbit = cpu_intr_findirq();
176451f66ac7Skettenis 	if (irqbit >= 0)
176551f66ac7Skettenis 		printf(" irq %d", irqbit);
176651f66ac7Skettenis 
1767fe822451Smickey 	printf(": %s V%d.%d\n", p, sc->sc_ver >> 4, sc->sc_ver & 0xf);
176825327569Smickey 
176951f66ac7Skettenis 	s = splhigh();
177051f66ac7Skettenis 	r->imr = ~0;
177151f66ac7Skettenis 	data = r->irr0;
177251f66ac7Skettenis 	data = r->irr1;
177351f66ac7Skettenis 	r->imr = 0;
177451f66ac7Skettenis 	__asm volatile ("" ::: "memory");
177551f66ac7Skettenis 	r->icr = 0;
177651f66ac7Skettenis 	if (irqbit >= 0)
177751f66ac7Skettenis 		r->iar0 = cpu_gethpa(0) | (31 - irqbit);
177851f66ac7Skettenis 	splx(s);
177951f66ac7Skettenis 
178051f66ac7Skettenis 	if (irqbit < 0)
178151f66ac7Skettenis 		sc->sc_ih = NULL;
178251f66ac7Skettenis 	else
178351f66ac7Skettenis 		sc->sc_ih = cpu_intr_establish(IPL_NESTED, irqbit,
178451f66ac7Skettenis 		    dino_intr, (void *)sc->sc_regs, sc->sc_dv.dv_xname);
178551f66ac7Skettenis 	if (sc->sc_ih == NULL) {
178651f66ac7Skettenis 		printf("%s: can't establish interrupt\n", sc->sc_dv.dv_xname);
178751f66ac7Skettenis 		return;
178851f66ac7Skettenis 	}
178951f66ac7Skettenis 
179051f66ac7Skettenis 	/* TODO establish the bus error interrupt */
179151f66ac7Skettenis 
179251f66ac7Skettenis 	/* scan for ps2 kbd/ms, serial, and flying toasters */
179351f66ac7Skettenis 	ca->ca_hpamask = -1;
179451f66ac7Skettenis 	pdc_scanbus(self, ca, MAXMODBUS, 0, 0);
179551f66ac7Skettenis 
179625327569Smickey 	sc->sc_iot = dino_iomemt;
179725327569Smickey 	sc->sc_iot.hbt_cookie = sc;
179825327569Smickey 	sc->sc_iot.hbt_map = dino_iomap;
179925327569Smickey 	sc->sc_iot.hbt_alloc = dino_ioalloc;
180025327569Smickey 	sc->sc_memt = dino_iomemt;
180125327569Smickey 	sc->sc_memt.hbt_cookie = sc;
180225327569Smickey 	sc->sc_memt.hbt_map = dino_memmap;
180325327569Smickey 	sc->sc_memt.hbt_alloc = dino_memalloc;
180425327569Smickey 	sc->sc_pc = dino_pc;
180525327569Smickey 	sc->sc_pc._cookie = sc;
180625327569Smickey 	sc->sc_dmatag = dino_dmat;
180725327569Smickey 	sc->sc_dmatag._cookie = sc;
180825327569Smickey 
18095464da24Skettenis 	bzero(&pba, sizeof(pba));
181025327569Smickey 	pba.pba_busname = "pci";
181125327569Smickey 	pba.pba_iot = &sc->sc_iot;
181225327569Smickey 	pba.pba_memt = &sc->sc_memt;
181325327569Smickey 	pba.pba_dmat = &sc->sc_dmatag;
181425327569Smickey 	pba.pba_pc = &sc->sc_pc;
1815d307f358Skettenis 	pba.pba_domain = pci_ndomains++;
181625327569Smickey 	pba.pba_bus = 0;
181725327569Smickey 	config_found(self, &pba, dinoprint);
181825327569Smickey 
181960b727f0Smiod 	/* postpone cleanup if necessary */
182060b727f0Smiod 	if (r->io_addr_en != sc->io_shadow)
182160b727f0Smiod 		startuphook_establish(dino_clear_pdc_mappings, sc);
182260b727f0Smiod 
182355a3c5f9Smickey 	/* enable interrupts now that all the devices are there */
182425327569Smickey 	r->imr = sc->sc_imr;
182525327569Smickey }
182660b727f0Smiod 
182760b727f0Smiod void
dino_clear_pdc_mappings(void * v)182860b727f0Smiod dino_clear_pdc_mappings(void *v)
182960b727f0Smiod {
183060b727f0Smiod 	struct dino_softc *sc = (struct dino_softc *)v;
183160b727f0Smiod 	volatile struct dino_regs *r;
183260b727f0Smiod 
183360b727f0Smiod 	if (cn_tab->cn_putc == pdccnputc) {
183460b727f0Smiod 		/* damn! */
183560b727f0Smiod 		return;
183660b727f0Smiod 	}
183760b727f0Smiod 
183860b727f0Smiod 	r = sc->sc_regs;
183960b727f0Smiod 	r->io_addr_en = sc->io_shadow;
184060b727f0Smiod }
1841