1*c7fb772bSthorpej /* $NetBSD: gemini_obio.c,v 1.12 2021/08/07 16:18:44 thorpej Exp $ */
2f5d7ce3dSmatt
3f5d7ce3dSmatt /* adapted from:
40fbe2f86Scliff * NetBSD: omap2_obio.c,v 1.5 2008/10/21 18:50:25 matt Exp
5f5d7ce3dSmatt */
6f5d7ce3dSmatt
7f5d7ce3dSmatt /*
80fbe2f86Scliff * Autoconfiguration support for the Gemini "On Board" I/O.
9f5d7ce3dSmatt *
100fbe2f86Scliff * Based on arm/omap/omap2_obio.c which in turn was derived
11f5d7ce3dSmatt * Based on arm/omap/omap_emifs.c which in turn was derived
12f5d7ce3dSmatt * Based on arm/xscale/pxa2x0.c which in turn was derived
13f5d7ce3dSmatt * from arm/sa11x0/sa11x0.c
14f5d7ce3dSmatt *
15f5d7ce3dSmatt * Copyright (c) 2002, 2005 Genetec Corporation. All rights reserved.
16f5d7ce3dSmatt * Written by Hiroyuki Bessho for Genetec Corporation.
17f5d7ce3dSmatt *
18f5d7ce3dSmatt * Redistribution and use in source and binary forms, with or without
19f5d7ce3dSmatt * modification, are permitted provided that the following conditions
20f5d7ce3dSmatt * are met:
21f5d7ce3dSmatt * 1. Redistributions of source code must retain the above copyright
22f5d7ce3dSmatt * notice, this list of conditions and the following disclaimer.
23f5d7ce3dSmatt * 2. Redistributions in binary form must reproduce the above copyright
24f5d7ce3dSmatt * notice, this list of conditions and the following disclaimer in the
25f5d7ce3dSmatt * documentation and/or other materials provided with the distribution.
26f5d7ce3dSmatt * 3. All advertising materials mentioning features or use of this software
27f5d7ce3dSmatt * must display the following acknowledgement:
28f5d7ce3dSmatt * This product includes software developed for the NetBSD Project by
29f5d7ce3dSmatt * Genetec Corporation.
30f5d7ce3dSmatt * 4. The name of Genetec Corporation may not be used to endorse or
31f5d7ce3dSmatt * promote products derived from this software without specific prior
32f5d7ce3dSmatt * written permission.
33f5d7ce3dSmatt *
34f5d7ce3dSmatt * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
35f5d7ce3dSmatt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
36f5d7ce3dSmatt * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
37f5d7ce3dSmatt * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GENETEC CORPORATION
38f5d7ce3dSmatt * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
39f5d7ce3dSmatt * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
40f5d7ce3dSmatt * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
41f5d7ce3dSmatt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
42f5d7ce3dSmatt * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
43f5d7ce3dSmatt * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
44f5d7ce3dSmatt * POSSIBILITY OF SUCH DAMAGE.
45f5d7ce3dSmatt *
46f5d7ce3dSmatt * Copyright (c) 1997,1998, 2001, The NetBSD Foundation, Inc.
47f5d7ce3dSmatt * All rights reserved.
48f5d7ce3dSmatt *
49f5d7ce3dSmatt * This code is derived from software contributed to The NetBSD Foundation
50f5d7ce3dSmatt * by IWAMOTO Toshihiro, Ichiro FUKUHARA and Paul Kranenburg.
51f5d7ce3dSmatt *
52f5d7ce3dSmatt * Redistribution and use in source and binary forms, with or without
53f5d7ce3dSmatt * modification, are permitted provided that the following conditions
54f5d7ce3dSmatt * are met:
55f5d7ce3dSmatt * 1. Redistributions of source code must retain the above copyright
56f5d7ce3dSmatt * notice, this list of conditions and the following disclaimer.
57f5d7ce3dSmatt * 2. Redistributions in binary form must reproduce the above copyright
58f5d7ce3dSmatt * notice, this list of conditions and the following disclaimer in the
59f5d7ce3dSmatt * documentation and/or other materials provided with the distribution.
60f5d7ce3dSmatt *
61f5d7ce3dSmatt * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
62f5d7ce3dSmatt * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
63f5d7ce3dSmatt * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
64f5d7ce3dSmatt * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
65f5d7ce3dSmatt * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
66f5d7ce3dSmatt * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
67f5d7ce3dSmatt * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
68f5d7ce3dSmatt * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
69f5d7ce3dSmatt * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
70f5d7ce3dSmatt * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
71f5d7ce3dSmatt * POSSIBILITY OF SUCH DAMAGE.
72f5d7ce3dSmatt *
73f5d7ce3dSmatt * Copyright (c) 1999
74f5d7ce3dSmatt * Shin Takemura and PocketBSD Project. All rights reserved.
75f5d7ce3dSmatt *
76f5d7ce3dSmatt * Redistribution and use in source and binary forms, with or without
77f5d7ce3dSmatt * modification, are permitted provided that the following conditions
78f5d7ce3dSmatt * are met:
79f5d7ce3dSmatt * 1. Redistributions of source code must retain the above copyright
80f5d7ce3dSmatt * notice, this list of conditions and the following disclaimer.
81f5d7ce3dSmatt * 2. Redistributions in binary form must reproduce the above copyright
82f5d7ce3dSmatt * notice, this list of conditions and the following disclaimer in the
83f5d7ce3dSmatt * documentation and/or other materials provided with the distribution.
84f5d7ce3dSmatt * 3. All advertising materials mentioning features or use of this software
85f5d7ce3dSmatt * must display the following acknowledgement:
86f5d7ce3dSmatt * This product includes software developed by the PocketBSD project
87f5d7ce3dSmatt * and its contributors.
88f5d7ce3dSmatt * 4. Neither the name of the project nor the names of its contributors
89f5d7ce3dSmatt * may be used to endorse or promote products derived from this software
90f5d7ce3dSmatt * without specific prior written permission.
91f5d7ce3dSmatt *
92f5d7ce3dSmatt * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
93f5d7ce3dSmatt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94f5d7ce3dSmatt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
95f5d7ce3dSmatt * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
96f5d7ce3dSmatt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
97f5d7ce3dSmatt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
98f5d7ce3dSmatt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
99f5d7ce3dSmatt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
100f5d7ce3dSmatt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
101f5d7ce3dSmatt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
102f5d7ce3dSmatt * SUCH DAMAGE.
103f5d7ce3dSmatt */
104f5d7ce3dSmatt
105f5d7ce3dSmatt #include "opt_gemini.h"
106f5d7ce3dSmatt #include <sys/cdefs.h>
107*c7fb772bSthorpej __KERNEL_RCSID(0, "$NetBSD: gemini_obio.c,v 1.12 2021/08/07 16:18:44 thorpej Exp $");
108f5d7ce3dSmatt
109f5d7ce3dSmatt #include "locators.h"
110f5d7ce3dSmatt #include "obio.h"
111f5d7ce3dSmatt #include "geminiicu.h"
112694f117aScliff #include "pci.h"
113f5d7ce3dSmatt
114f5d7ce3dSmatt #include <sys/param.h>
115f5d7ce3dSmatt #include <sys/systm.h>
116f5d7ce3dSmatt #include <sys/device.h>
117f5d7ce3dSmatt #include <sys/kernel.h>
118f5d7ce3dSmatt #include <sys/reboot.h>
119f5d7ce3dSmatt
120f5d7ce3dSmatt #include <machine/cpu.h>
121cf10107dSdyoung #include <sys/bus.h>
122f5d7ce3dSmatt
123f5d7ce3dSmatt #include <arm/cpufunc.h>
124f5d7ce3dSmatt #include <arm/mainbus/mainbus.h>
125f5d7ce3dSmatt #include <arm/gemini/gemini_var.h>
126f5d7ce3dSmatt #include <arm/gemini/gemini_reg.h>
127f5d7ce3dSmatt
128f5d7ce3dSmatt #include <arm/gemini/gemini_obiovar.h>
129f5d7ce3dSmatt
130f5d7ce3dSmatt typedef struct {
131f5d7ce3dSmatt boolean_t cs_valid;
132f5d7ce3dSmatt ulong cs_addr;
133f5d7ce3dSmatt ulong cs_size;
134f5d7ce3dSmatt } obio_csconfig_t;
135f5d7ce3dSmatt
136f5d7ce3dSmatt /* prototypes */
137f5d7ce3dSmatt static int obio_match(device_t, cfdata_t, void *);
138f5d7ce3dSmatt static void obio_attach(device_t, device_t, void *);
139f5d7ce3dSmatt static int obio_search(device_t, cfdata_t, const int *, void *);
140f5d7ce3dSmatt static int obio_find(device_t, cfdata_t, const int *, void *);
141f5d7ce3dSmatt static int obio_print(void *, const char *);
142f5d7ce3dSmatt static void obio_attach_critical(struct obio_softc *);
143f5d7ce3dSmatt
144f5d7ce3dSmatt /* attach structures */
145c20cc9bcScliff CFATTACH_DECL_NEW(obio, sizeof(struct obio_softc),
146f5d7ce3dSmatt obio_match, obio_attach, NULL, NULL);
147f5d7ce3dSmatt
148f5d7ce3dSmatt
149f5d7ce3dSmatt static int
obio_match(device_t parent,cfdata_t match,void * aux)150f5d7ce3dSmatt obio_match(device_t parent, cfdata_t match, void *aux)
151f5d7ce3dSmatt {
152f5d7ce3dSmatt return 1;
153f5d7ce3dSmatt }
154f5d7ce3dSmatt
155f5d7ce3dSmatt static void
obio_attach(device_t parent,device_t self,void * aux)156f5d7ce3dSmatt obio_attach(device_t parent, device_t self, void *aux)
157f5d7ce3dSmatt {
158f5d7ce3dSmatt struct obio_softc *sc = device_private(self);
159f5d7ce3dSmatt struct mainbus_attach_args *mb = (struct mainbus_attach_args *)aux;
160694f117aScliff #if NPCI > 0
161f5d7ce3dSmatt struct pcibus_attach_args pba;
162694f117aScliff #endif
163f5d7ce3dSmatt
164c20cc9bcScliff sc->sc_dev = self;
165c20cc9bcScliff
166f5d7ce3dSmatt sc->sc_iot = &gemini_bs_tag;
167f5d7ce3dSmatt
168f5d7ce3dSmatt aprint_normal(": On-Board IO\n");
169f5d7ce3dSmatt
1700fbe2f86Scliff #if (GEMINI_BUSBASE != 0)
17106c16f24Scliff sc->sc_dmarange.dr_sysbase = 0;
1720fbe2f86Scliff sc->sc_dmarange.dr_busbase = (GEMINI_BUSBASE * 1024 * 1024);
17306c16f24Scliff sc->sc_dmarange.dr_len = MEMSIZE * 1024 * 1024;
17406c16f24Scliff gemini_bus_dma_tag._ranges = &sc->sc_dmarange;
17506c16f24Scliff gemini_bus_dma_tag._nranges = 1;
17606c16f24Scliff #endif
17706c16f24Scliff
178f5d7ce3dSmatt sc->sc_ioh = 0;
179f5d7ce3dSmatt sc->sc_dmat = &gemini_bus_dma_tag;
180f5d7ce3dSmatt sc->sc_base = mb->mb_iobase;
181f5d7ce3dSmatt sc->sc_size = mb->mb_iosize;
182f5d7ce3dSmatt
183f5d7ce3dSmatt /*
184f5d7ce3dSmatt * Attach critical devices first.
185f5d7ce3dSmatt */
186f5d7ce3dSmatt obio_attach_critical(sc);
187f5d7ce3dSmatt
188694f117aScliff #if NPCI > 0
189f5d7ce3dSmatt /*
190f5d7ce3dSmatt * map PCI controller registers
191f5d7ce3dSmatt */
192f5d7ce3dSmatt if (bus_space_map(sc->sc_iot, GEMINI_PCICFG_BASE,
193f5d7ce3dSmatt GEMINI_PCI_CFG_DATA+4, 0, &sc->sc_pcicfg_ioh)) {
194f5d7ce3dSmatt aprint_error("cannot map PCI controller at %#x\n",
195f5d7ce3dSmatt GEMINI_PCICFG_BASE);
196f5d7ce3dSmatt return;
197f5d7ce3dSmatt }
198f5d7ce3dSmatt /*
199f5d7ce3dSmatt * initialize the PCI chipset tag
200f5d7ce3dSmatt */
201f5d7ce3dSmatt gemini_pci_init(&sc->sc_pci_chipset, sc);
202694f117aScliff #endif /* NPCI */
203f5d7ce3dSmatt
204f5d7ce3dSmatt /*
205f5d7ce3dSmatt * attach the rest of our devices
206f5d7ce3dSmatt */
2072685996bSthorpej config_search(self, NULL,
208*c7fb772bSthorpej CFARGS(.search = obio_search,
209*c7fb772bSthorpej .iattr = "obio"));
210f5d7ce3dSmatt
211694f117aScliff #if NPCI > 0
212f5d7ce3dSmatt /*
213f5d7ce3dSmatt * attach the PCI bus
214f5d7ce3dSmatt */
215f5d7ce3dSmatt pba.pba_memt = sc->sc_iot;
216bd2482b5Smbalmer pba.pba_iot = sc->sc_iot;
217f5d7ce3dSmatt pba.pba_dmat = sc->sc_dmat;
218f5d7ce3dSmatt pba.pba_dmat64 = NULL;
219f5d7ce3dSmatt pba.pba_pc = &sc->sc_pci_chipset;
220f5d7ce3dSmatt pba.pba_bus = 0;
221f5d7ce3dSmatt pba.pba_bridgetag = NULL;
222f5d7ce3dSmatt pba.pba_intrswiz = 0;
223f5d7ce3dSmatt pba.pba_intrtag = 0;
224a6b2b839Sdyoung pba.pba_flags = PCI_FLAGS_IO_OKAY | PCI_FLAGS_MEM_OKAY |
225f5d7ce3dSmatt PCI_FLAGS_MRL_OKAY | PCI_FLAGS_MRM_OKAY | PCI_FLAGS_MWI_OKAY;
226f5d7ce3dSmatt
2272685996bSthorpej config_found(sc->sc_dev, &pba, pcibusprint,
228*c7fb772bSthorpej CFARGS(.iattr = "pcibus"));
229694f117aScliff #endif /* NPCI */
230f5d7ce3dSmatt
231f5d7ce3dSmatt }
232f5d7ce3dSmatt
233f5d7ce3dSmatt static int
obio_search(device_t parent,cfdata_t cf,const int * ldesc,void * aux)234f5d7ce3dSmatt obio_search(device_t parent, cfdata_t cf, const int *ldesc, void *aux)
235f5d7ce3dSmatt {
236f5d7ce3dSmatt struct obio_softc * const sc = device_private(parent);
237f5d7ce3dSmatt struct obio_attach_args oa;
238f5d7ce3dSmatt
239f5d7ce3dSmatt /* Set up the attach args. */
240f5d7ce3dSmatt if (cf->cf_loc[OBIOCF_NOBYTEACC] == 1) {
241f5d7ce3dSmatt #if 0
242f5d7ce3dSmatt if (cf->cf_loc[OBIOCF_MULT] == 1)
243f5d7ce3dSmatt oa.obio_iot = &nobyteacc_bs_tag;
244f5d7ce3dSmatt else
245f5d7ce3dSmatt #endif
246f5d7ce3dSmatt panic("nobyteacc specified for device with "
247f5d7ce3dSmatt "non-byte multiplier\n");
248f5d7ce3dSmatt } else {
249f5d7ce3dSmatt switch (cf->cf_loc[OBIOCF_MULT]) {
250f5d7ce3dSmatt case 1:
251f5d7ce3dSmatt oa.obio_iot = &gemini_bs_tag;
252f5d7ce3dSmatt break;
253f5d7ce3dSmatt #if 0
254f5d7ce3dSmatt case 2:
255f5d7ce3dSmatt oa.obio_iot = &gemini_a2x_bs_tag;
256f5d7ce3dSmatt break;
257f5d7ce3dSmatt #endif
258f5d7ce3dSmatt case 4:
259f5d7ce3dSmatt oa.obio_iot = &gemini_a4x_bs_tag;
260f5d7ce3dSmatt break;
261f5d7ce3dSmatt default:
262f5d7ce3dSmatt panic("Unsupported obio bus multiplier.");
263f5d7ce3dSmatt break;
264f5d7ce3dSmatt }
265f5d7ce3dSmatt }
266f5d7ce3dSmatt
267f5d7ce3dSmatt oa.obio_dmat = sc->sc_dmat;
268f5d7ce3dSmatt oa.obio_addr = cf->cf_loc[OBIOCF_ADDR];
269f5d7ce3dSmatt oa.obio_size = cf->cf_loc[OBIOCF_SIZE];
270f5d7ce3dSmatt oa.obio_intr = cf->cf_loc[OBIOCF_INTR];
271f5d7ce3dSmatt oa.obio_intrbase = cf->cf_loc[OBIOCF_INTRBASE];
272f5d7ce3dSmatt
2732685996bSthorpej if (config_probe(parent, cf, &oa)) {
274*c7fb772bSthorpej config_attach(parent, cf, &oa, obio_print, CFARGS_NONE);
275f5d7ce3dSmatt return 0; /* love it */
276f5d7ce3dSmatt }
277f5d7ce3dSmatt
278f5d7ce3dSmatt return UNCONF; /* NG */
279f5d7ce3dSmatt }
280f5d7ce3dSmatt
281f5d7ce3dSmatt static int
obio_find(device_t parent,cfdata_t cf,const int * ldesc,void * aux)282f5d7ce3dSmatt obio_find(device_t parent, cfdata_t cf, const int *ldesc, void *aux)
283f5d7ce3dSmatt {
284f5d7ce3dSmatt struct obio_attach_args * const oa = aux;
285f5d7ce3dSmatt
286f5d7ce3dSmatt if (oa->obio_addr != OBIOCF_ADDR_DEFAULT
287f5d7ce3dSmatt && oa->obio_addr != cf->cf_loc[OBIOCF_ADDR])
288f5d7ce3dSmatt return 0;
289f5d7ce3dSmatt if (oa->obio_size != OBIOCF_SIZE_DEFAULT
290f5d7ce3dSmatt && oa->obio_size != cf->cf_loc[OBIOCF_SIZE])
291f5d7ce3dSmatt return 0;
292f5d7ce3dSmatt if (oa->obio_intr != OBIOCF_INTR_DEFAULT
293f5d7ce3dSmatt && oa->obio_intr != cf->cf_loc[OBIOCF_INTR])
294f5d7ce3dSmatt return 0;
295f5d7ce3dSmatt if (oa->obio_intrbase != OBIOCF_INTRBASE_DEFAULT
296f5d7ce3dSmatt && oa->obio_intrbase != cf->cf_loc[OBIOCF_INTRBASE])
297f5d7ce3dSmatt return 0;
298f5d7ce3dSmatt
299f5d7ce3dSmatt /* Set up the attach args. */
300f5d7ce3dSmatt if (cf->cf_loc[OBIOCF_NOBYTEACC] == 1) {
301f5d7ce3dSmatt #if 0
302f5d7ce3dSmatt if (cf->cf_loc[OBIOCF_MULT] == 1)
303f5d7ce3dSmatt oa->obio_iot = &nobyteacc_bs_tag;
304f5d7ce3dSmatt else
305f5d7ce3dSmatt #endif
306f5d7ce3dSmatt panic("nobyteacc specified for device with "
307f5d7ce3dSmatt "non-byte multiplier\n");
308f5d7ce3dSmatt } else {
309f5d7ce3dSmatt switch (cf->cf_loc[OBIOCF_MULT]) {
310f5d7ce3dSmatt case 1:
311f5d7ce3dSmatt oa->obio_iot = &gemini_bs_tag;
312f5d7ce3dSmatt break;
313f5d7ce3dSmatt #if 0
314f5d7ce3dSmatt case 2:
315f5d7ce3dSmatt oa->obio_iot = &gemini_a2x_bs_tag;
316f5d7ce3dSmatt break;
317f5d7ce3dSmatt #endif
318f5d7ce3dSmatt case 4:
319f5d7ce3dSmatt oa->obio_iot = &gemini_a4x_bs_tag;
320f5d7ce3dSmatt break;
321f5d7ce3dSmatt default:
322f5d7ce3dSmatt panic("Unsupported obio bus multiplier.");
323f5d7ce3dSmatt break;
324f5d7ce3dSmatt }
325f5d7ce3dSmatt }
326f5d7ce3dSmatt oa->obio_addr = cf->cf_loc[OBIOCF_ADDR];
327f5d7ce3dSmatt oa->obio_size = cf->cf_loc[OBIOCF_SIZE];
328f5d7ce3dSmatt oa->obio_intr = cf->cf_loc[OBIOCF_INTR];
329f5d7ce3dSmatt oa->obio_intrbase = cf->cf_loc[OBIOCF_INTRBASE];
330f5d7ce3dSmatt
331f5d7ce3dSmatt return config_match(parent, cf, oa);
332f5d7ce3dSmatt }
333f5d7ce3dSmatt
334f5d7ce3dSmatt #if NGEMINIICU == 0
335f5d7ce3dSmatt #error no geminiicu present in config file
336f5d7ce3dSmatt #endif
337f5d7ce3dSmatt
338f5d7ce3dSmatt static const struct {
339f5d7ce3dSmatt const char *name;
340f5d7ce3dSmatt bus_addr_t addr;
341f5d7ce3dSmatt bool required;
342f5d7ce3dSmatt } critical_devs[] = {
34301b65de4Scliff #if defined(GEMINI_MASTER) || defined(GEMINI_SINGLE)
344f5d7ce3dSmatt { .name = "geminiicu0", .addr = 0x48000000, .required = true },
345f5d7ce3dSmatt { .name = "geminiwdt0", .addr = 0x41000000, .required = true },
346f5d7ce3dSmatt { .name = "geminitmr0", .addr = 0x43000000, .required = true },
347694f117aScliff { .name = "geminitmr2", .addr = 0x43000000, .required = true },
348a8ab989cScliff { .name = "com0", .addr = 0x42000000, .required = true },
34901b65de4Scliff #elif defined(GEMINI_SLAVE)
350694f117aScliff { .name = "geminiicu1", .addr = 0x49000000, .required = true },
351f5d7ce3dSmatt { .name = "geminitmr1", .addr = 0x43000000, .required = true },
352f5d7ce3dSmatt { .name = "geminitmr2", .addr = 0x43000000, .required = true },
353a8ab989cScliff { .name = "geminilpchc0", .addr = 0x47000000, .required = true },
354694f117aScliff #endif
355f5d7ce3dSmatt };
356f5d7ce3dSmatt
357f5d7ce3dSmatt static void
obio_attach_critical(struct obio_softc * sc)358f5d7ce3dSmatt obio_attach_critical(struct obio_softc *sc)
359f5d7ce3dSmatt {
360f5d7ce3dSmatt struct obio_attach_args oa;
361f5d7ce3dSmatt cfdata_t cf;
362f5d7ce3dSmatt size_t i;
363f5d7ce3dSmatt
364f5d7ce3dSmatt for (i = 0; i < __arraycount(critical_devs); i++) {
365f5d7ce3dSmatt oa.obio_iot = sc->sc_iot;
366f5d7ce3dSmatt oa.obio_dmat = sc->sc_dmat;
367f5d7ce3dSmatt
368f5d7ce3dSmatt oa.obio_addr = critical_devs[i].addr;
369f5d7ce3dSmatt oa.obio_size = OBIOCF_SIZE_DEFAULT;
370f5d7ce3dSmatt oa.obio_intr = OBIOCF_INTR_DEFAULT;
371f5d7ce3dSmatt oa.obio_intrbase = OBIOCF_INTRBASE_DEFAULT;
372f5d7ce3dSmatt
373f5d7ce3dSmatt #if 0
374f5d7ce3dSmatt if (oa.obio_addr != OBIOCF_ADDR_DEFAULT
375f5d7ce3dSmatt && (oa.obio_addr < sc->sc_base
376f5d7ce3dSmatt || oa.obio_addr >= sc->sc_base + sc->sc_size))
377f5d7ce3dSmatt continue;
378f5d7ce3dSmatt #endif
379f5d7ce3dSmatt
3802685996bSthorpej cf = config_search(sc->sc_dev, &oa,
381*c7fb772bSthorpej CFARGS(.submatch = obio_find,
382*c7fb772bSthorpej .iattr = "obio"));
383f5d7ce3dSmatt if (cf == NULL && critical_devs[i].required)
384f5d7ce3dSmatt panic("obio_attach_critical: failed to find %s!",
385f5d7ce3dSmatt critical_devs[i].name);
386f5d7ce3dSmatt
387f5d7ce3dSmatt oa.obio_addr = cf->cf_loc[OBIOCF_ADDR];
388f5d7ce3dSmatt oa.obio_size = cf->cf_loc[OBIOCF_SIZE];
389f5d7ce3dSmatt oa.obio_intr = cf->cf_loc[OBIOCF_INTR];
390f5d7ce3dSmatt oa.obio_intrbase = cf->cf_loc[OBIOCF_INTRBASE];
391*c7fb772bSthorpej config_attach(sc->sc_dev, cf, &oa, obio_print, CFARGS_NONE);
392f5d7ce3dSmatt }
393f5d7ce3dSmatt }
394f5d7ce3dSmatt
395f5d7ce3dSmatt static int
obio_print(void * aux,const char * name)396f5d7ce3dSmatt obio_print(void *aux, const char *name)
397f5d7ce3dSmatt {
398f5d7ce3dSmatt struct obio_attach_args *oa = (struct obio_attach_args*)aux;
399f5d7ce3dSmatt
400f5d7ce3dSmatt if (oa->obio_addr != OBIOCF_ADDR_DEFAULT) {
401f5d7ce3dSmatt aprint_normal(" addr 0x%08lx", oa->obio_addr);
402f5d7ce3dSmatt if (oa->obio_size != OBIOCF_SIZE_DEFAULT)
403f5d7ce3dSmatt aprint_normal("-0x%08lx",
404f5d7ce3dSmatt oa->obio_addr + oa->obio_size-1);
405f5d7ce3dSmatt }
406f5d7ce3dSmatt if (oa->obio_intr != OBIOCF_INTR_DEFAULT)
407f5d7ce3dSmatt aprint_normal(" intr %d", oa->obio_intr);
408f5d7ce3dSmatt if (oa->obio_intrbase != OBIOCF_INTRBASE_DEFAULT)
409f5d7ce3dSmatt aprint_normal(" intrbase %d", oa->obio_intrbase);
410f5d7ce3dSmatt
411f5d7ce3dSmatt return UNCONF;
412f5d7ce3dSmatt }
413