arbus.c revision 1.11.2.1 1 1.11.2.1 jruoho /* $Id: arbus.c,v 1.11.2.1 2011/06/06 09:06:02 jruoho Exp $ */
2 1.1 gdamore /*
3 1.1 gdamore * Copyright (c) 2006 Urbana-Champaign Independent Media Center.
4 1.1 gdamore * Copyright (c) 2006 Garrett D'Amore.
5 1.1 gdamore * All rights reserved.
6 1.1 gdamore *
7 1.1 gdamore * This code was written by Garrett D'Amore for the Champaign-Urbana
8 1.1 gdamore * Community Wireless Network Project.
9 1.1 gdamore *
10 1.1 gdamore * Redistribution and use in source and binary forms, with or
11 1.1 gdamore * without modification, are permitted provided that the following
12 1.1 gdamore * conditions are met:
13 1.1 gdamore * 1. Redistributions of source code must retain the above copyright
14 1.1 gdamore * notice, this list of conditions and the following disclaimer.
15 1.1 gdamore * 2. Redistributions in binary form must reproduce the above
16 1.1 gdamore * copyright notice, this list of conditions and the following
17 1.1 gdamore * disclaimer in the documentation and/or other materials provided
18 1.1 gdamore * with the distribution.
19 1.1 gdamore * 3. All advertising materials mentioning features or use of this
20 1.1 gdamore * software must display the following acknowledgements:
21 1.1 gdamore * This product includes software developed by the Urbana-Champaign
22 1.1 gdamore * Independent Media Center.
23 1.1 gdamore * This product includes software developed by Garrett D'Amore.
24 1.1 gdamore * 4. Urbana-Champaign Independent Media Center's name and Garrett
25 1.1 gdamore * D'Amore's name may not be used to endorse or promote products
26 1.1 gdamore * derived from this software without specific prior written permission.
27 1.1 gdamore *
28 1.1 gdamore * THIS SOFTWARE IS PROVIDED BY THE URBANA-CHAMPAIGN INDEPENDENT
29 1.1 gdamore * MEDIA CENTER AND GARRETT D'AMORE ``AS IS'' AND ANY EXPRESS OR
30 1.1 gdamore * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
31 1.1 gdamore * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
32 1.1 gdamore * ARE DISCLAIMED. IN NO EVENT SHALL THE URBANA-CHAMPAIGN INDEPENDENT
33 1.1 gdamore * MEDIA CENTER OR GARRETT D'AMORE BE LIABLE FOR ANY DIRECT, INDIRECT,
34 1.1 gdamore * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
35 1.1 gdamore * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
36 1.1 gdamore * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
37 1.1 gdamore * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
38 1.1 gdamore * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
39 1.1 gdamore * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
40 1.1 gdamore * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
41 1.1 gdamore */
42 1.1 gdamore
43 1.1 gdamore #include <sys/cdefs.h>
44 1.11.2.1 jruoho __KERNEL_RCSID(0, "$NetBSD: arbus.c,v 1.11.2.1 2011/06/06 09:06:02 jruoho Exp $");
45 1.1 gdamore
46 1.1 gdamore #include "locators.h"
47 1.1 gdamore #include <sys/param.h>
48 1.1 gdamore #include <sys/systm.h>
49 1.1 gdamore #include <sys/device.h>
50 1.1 gdamore #include <sys/extent.h>
51 1.1 gdamore #include <sys/malloc.h>
52 1.1 gdamore
53 1.1 gdamore #define _MIPS_BUS_DMA_PRIVATE
54 1.1 gdamore #include <machine/bus.h>
55 1.9 gdamore #include <mips/atheros/include/ar5312reg.h>
56 1.1 gdamore #include <mips/atheros/include/ar531xvar.h>
57 1.1 gdamore #include <mips/atheros/include/arbusvar.h>
58 1.1 gdamore
59 1.11.2.1 jruoho static int arbus_match(device_t, struct cfdata *, void *);
60 1.11.2.1 jruoho static void arbus_attach(device_t, device_t, void *);
61 1.1 gdamore static int arbus_print(void *, const char *);
62 1.1 gdamore static void arbus_bus_mem_init(bus_space_tag_t, void *);
63 1.1 gdamore
64 1.1 gdamore struct arbus_intrhand {
65 1.10 gdamore int ih_cirq;
66 1.10 gdamore int ih_mirq;
67 1.1 gdamore void *ih_cookie;
68 1.1 gdamore };
69 1.1 gdamore
70 1.11.2.1 jruoho CFATTACH_DECL_NEW(arbus, 0, arbus_match, arbus_attach, NULL, NULL);
71 1.1 gdamore
72 1.1 gdamore struct mips_bus_space arbus_mbst;
73 1.11.2.1 jruoho struct mips_bus_dma_tag arbus_mdt = {
74 1.11.2.1 jruoho ._dmamap_ops = _BUS_DMAMAP_OPS_INITIALIZER,
75 1.11.2.1 jruoho ._dmamem_ops = _BUS_DMAMEM_OPS_INITIALIZER,
76 1.11.2.1 jruoho ._dmatag_ops = _BUS_DMATAG_OPS_INITIALIZER,
77 1.11.2.1 jruoho };
78 1.1 gdamore
79 1.1 gdamore void
80 1.1 gdamore arbus_init(void)
81 1.1 gdamore {
82 1.11.2.1 jruoho static bool done = false;
83 1.1 gdamore if (done)
84 1.1 gdamore return;
85 1.11.2.1 jruoho done = true;
86 1.1 gdamore
87 1.1 gdamore arbus_bus_mem_init(&arbus_mbst, NULL);
88 1.1 gdamore }
89 1.1 gdamore
90 1.1 gdamore /* this primarily exists so we can get to the console... */
91 1.1 gdamore bus_space_tag_t
92 1.1 gdamore arbus_get_bus_space_tag(void)
93 1.1 gdamore {
94 1.1 gdamore arbus_init();
95 1.1 gdamore return (&arbus_mbst);
96 1.1 gdamore }
97 1.1 gdamore
98 1.1 gdamore bus_dma_tag_t
99 1.1 gdamore arbus_get_bus_dma_tag(void)
100 1.1 gdamore {
101 1.1 gdamore arbus_init();
102 1.1 gdamore return (&arbus_mdt);
103 1.1 gdamore }
104 1.1 gdamore
105 1.1 gdamore int
106 1.11.2.1 jruoho arbus_match(device_t parent, cfdata_t match, void *aux)
107 1.1 gdamore {
108 1.1 gdamore
109 1.1 gdamore return 1;
110 1.1 gdamore }
111 1.1 gdamore
112 1.1 gdamore void
113 1.11.2.1 jruoho arbus_attach(device_t parent, device_t self, void *aux)
114 1.1 gdamore {
115 1.1 gdamore struct arbus_attach_args aa;
116 1.10 gdamore const struct ar531x_device *devices;
117 1.1 gdamore int i;
118 1.1 gdamore
119 1.1 gdamore printf("\n");
120 1.1 gdamore int locs[ARBUSCF_NLOCS];
121 1.1 gdamore
122 1.1 gdamore arbus_init();
123 1.1 gdamore
124 1.10 gdamore for (i = 0, devices = ar531x_get_devices(); devices[i].name; i++) {
125 1.10 gdamore
126 1.10 gdamore aa.aa_name = devices[i].name;
127 1.10 gdamore aa.aa_size = devices[i].size;
128 1.1 gdamore aa.aa_dmat = &arbus_mdt;
129 1.1 gdamore aa.aa_bst = &arbus_mbst;
130 1.10 gdamore aa.aa_cirq = devices[i].cirq;
131 1.10 gdamore aa.aa_mirq = devices[i].mirq;
132 1.10 gdamore aa.aa_addr = devices[i].addr;
133 1.1 gdamore
134 1.1 gdamore locs[ARBUSCF_ADDR] = aa.aa_addr;
135 1.1 gdamore
136 1.10 gdamore if (ar531x_enable_device(&devices[i]) != 0) {
137 1.10 gdamore continue;
138 1.1 gdamore }
139 1.1 gdamore
140 1.1 gdamore (void) config_found_sm_loc(self, "arbus", locs, &aa,
141 1.1 gdamore arbus_print, config_stdsubmatch);
142 1.1 gdamore }
143 1.1 gdamore }
144 1.1 gdamore
145 1.1 gdamore int
146 1.1 gdamore arbus_print(void *aux, const char *pnp)
147 1.1 gdamore {
148 1.1 gdamore struct arbus_attach_args *aa = aux;
149 1.1 gdamore
150 1.1 gdamore if (pnp)
151 1.1 gdamore aprint_normal("%s at %s", aa->aa_name, pnp);
152 1.1 gdamore
153 1.1 gdamore if (aa->aa_addr)
154 1.11 matt aprint_normal(" addr 0x%" PRIxBUSADDR, aa->aa_addr);
155 1.1 gdamore
156 1.10 gdamore if (aa->aa_cirq >= 0)
157 1.10 gdamore aprint_normal(" cpu irq %d", aa->aa_cirq);
158 1.1 gdamore
159 1.10 gdamore if (aa->aa_mirq >= 0)
160 1.10 gdamore aprint_normal(" misc irq %d", aa->aa_mirq);
161 1.1 gdamore
162 1.1 gdamore return (UNCONF);
163 1.1 gdamore }
164 1.1 gdamore
165 1.1 gdamore void *
166 1.10 gdamore arbus_intr_establish(int cirq, int mirq, int (*handler)(void *), void *arg)
167 1.1 gdamore {
168 1.1 gdamore struct arbus_intrhand *ih;
169 1.1 gdamore
170 1.1 gdamore ih = malloc(sizeof(*ih), M_DEVBUF, M_NOWAIT);
171 1.1 gdamore if (ih == NULL)
172 1.1 gdamore return NULL;
173 1.1 gdamore
174 1.10 gdamore ih->ih_cirq = ih->ih_mirq = -1;
175 1.1 gdamore ih->ih_cookie = NULL;
176 1.1 gdamore
177 1.10 gdamore if (mirq >= 0) {
178 1.10 gdamore ih->ih_mirq = mirq;
179 1.10 gdamore ih->ih_cookie = ar531x_misc_intr_establish(mirq, handler, arg);
180 1.10 gdamore } else if (cirq >= 0) {
181 1.10 gdamore ih->ih_cirq = cirq;
182 1.10 gdamore ih->ih_cookie = ar531x_cpu_intr_establish(cirq, handler, arg);
183 1.10 gdamore } else
184 1.10 gdamore return ih;
185 1.1 gdamore
186 1.1 gdamore if (ih->ih_cookie == NULL) {
187 1.1 gdamore free(ih, M_DEVBUF);
188 1.1 gdamore return NULL;
189 1.1 gdamore }
190 1.1 gdamore return ih;
191 1.1 gdamore }
192 1.1 gdamore
193 1.1 gdamore void
194 1.1 gdamore arbus_intr_disestablish(void *arg)
195 1.1 gdamore {
196 1.1 gdamore struct arbus_intrhand *ih = arg;
197 1.10 gdamore if (ih->ih_mirq >= 0)
198 1.1 gdamore ar531x_misc_intr_disestablish(ih->ih_cookie);
199 1.10 gdamore else if (ih->ih_cirq >= 0)
200 1.10 gdamore ar531x_cpu_intr_disestablish(ih->ih_cookie);
201 1.1 gdamore free(ih, M_DEVBUF);
202 1.1 gdamore }
203 1.1 gdamore
204 1.1 gdamore /*
205 1.1 gdamore * CPU memory/register stuff
206 1.1 gdamore */
207 1.1 gdamore
208 1.1 gdamore #define CHIP arbus
209 1.1 gdamore #define CHIP_MEM /* defined */
210 1.1 gdamore #define CHIP_W1_BUS_START(v) 0x00000000UL
211 1.1 gdamore #define CHIP_W1_BUS_END(v) 0x1fffffffUL
212 1.1 gdamore #define CHIP_W1_SYS_START(v) CHIP_W1_BUS_START(v)
213 1.1 gdamore #define CHIP_W1_SYS_END(v) CHIP_W1_BUS_END(v)
214 1.1 gdamore
215 1.1 gdamore #include <mips/mips/bus_space_alignstride_chipdep.c>
216