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