design_gsrd1.c revision 1.1.4.2 1 1.1.4.2 yamt /* $NetBSD: design_gsrd1.c,v 1.1.4.2 2006/12/30 20:45:54 yamt Exp $ */
2 1.1.4.2 yamt
3 1.1.4.2 yamt /*
4 1.1.4.2 yamt * Copyright (c) 2006 Jachym Holecek
5 1.1.4.2 yamt * All rights reserved.
6 1.1.4.2 yamt *
7 1.1.4.2 yamt * Written for DFC Design, s.r.o.
8 1.1.4.2 yamt *
9 1.1.4.2 yamt * Redistribution and use in source and binary forms, with or without
10 1.1.4.2 yamt * modification, are permitted provided that the following conditions
11 1.1.4.2 yamt * are met:
12 1.1.4.2 yamt *
13 1.1.4.2 yamt * 1. Redistributions of source code must retain the above copyright
14 1.1.4.2 yamt * notice, this list of conditions and the following disclaimer.
15 1.1.4.2 yamt *
16 1.1.4.2 yamt * 2. Redistributions in binary form must reproduce the above copyright
17 1.1.4.2 yamt * notice, this list of conditions and the following disclaimer in the
18 1.1.4.2 yamt * documentation and/or other materials provided with the distribution.
19 1.1.4.2 yamt *
20 1.1.4.2 yamt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 1.1.4.2 yamt * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 1.1.4.2 yamt * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 1.1.4.2 yamt * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 1.1.4.2 yamt * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 1.1.4.2 yamt * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 1.1.4.2 yamt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 1.1.4.2 yamt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 1.1.4.2 yamt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 1.1.4.2 yamt * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 1.1.4.2 yamt */
31 1.1.4.2 yamt
32 1.1.4.2 yamt #include <sys/cdefs.h>
33 1.1.4.2 yamt __KERNEL_RCSID(0, "$NetBSD: design_gsrd1.c,v 1.1.4.2 2006/12/30 20:45:54 yamt Exp $");
34 1.1.4.2 yamt
35 1.1.4.2 yamt #include <sys/param.h>
36 1.1.4.2 yamt #include <sys/systm.h>
37 1.1.4.2 yamt #include <sys/device.h>
38 1.1.4.2 yamt #include <sys/kernel.h>
39 1.1.4.2 yamt #include <sys/malloc.h>
40 1.1.4.2 yamt
41 1.1.4.2 yamt #include <machine/cpu.h>
42 1.1.4.2 yamt #include <machine/bus.h>
43 1.1.4.2 yamt #include <machine/intr.h>
44 1.1.4.2 yamt
45 1.1.4.2 yamt #include <powerpc/ibm4xx/dev/plbvar.h>
46 1.1.4.2 yamt
47 1.1.4.2 yamt #include <evbppc/virtex/dev/xcvbusvar.h>
48 1.1.4.2 yamt
49 1.1.4.2 yamt #include <evbppc/virtex/dev/xlcomreg.h>
50 1.1.4.2 yamt #include <evbppc/virtex/dev/cdmacreg.h>
51 1.1.4.2 yamt #include <evbppc/virtex/dev/temacreg.h>
52 1.1.4.2 yamt #include <evbppc/virtex/dev/tftreg.h>
53 1.1.4.2 yamt
54 1.1.4.2 yamt #include <evbppc/virtex/virtex.h>
55 1.1.4.2 yamt #include <evbppc/virtex/dcr.h>
56 1.1.4.2 yamt
57 1.1.4.2 yamt
58 1.1.4.2 yamt #define DCR_CDMAC_BASE 0x0140
59 1.1.4.2 yamt #define DCR_XLCOM_BASE 0x0000
60 1.1.4.2 yamt #define DCR_TEMAC_BASE 0x0030
61 1.1.4.2 yamt #define DCR_LLFB_BASE 0x0080
62 1.1.4.2 yamt
63 1.1.4.2 yamt #define CDMAC_TX0_STAT CDMAC_STAT_BASE(0)
64 1.1.4.2 yamt #define CDMAC_RX0_STAT CDMAC_STAT_BASE(1)
65 1.1.4.2 yamt #define CDMAC_TX1_STAT CDMAC_STAT_BASE(2)
66 1.1.4.2 yamt #define CDMAC_RX1_STAT CDMAC_STAT_BASE(3)
67 1.1.4.2 yamt
68 1.1.4.2 yamt #define CDMAC_TX0_BASE CDMAC_CTRL_BASE(0)
69 1.1.4.2 yamt #define CDMAC_RX0_BASE CDMAC_CTRL_BASE(1)
70 1.1.4.2 yamt #define CDMAC_TX1_BASE CDMAC_CTRL_BASE(2)
71 1.1.4.2 yamt #define CDMAC_RX1_BASE CDMAC_CTRL_BASE(3)
72 1.1.4.2 yamt
73 1.1.4.2 yamt #define CDMAC_INTR_LINE 2
74 1.1.4.2 yamt #define CDMAC_NCHAN 4
75 1.1.4.2 yamt
76 1.1.4.2 yamt #define IPL_CDMAC IPL_NET
77 1.1.4.2 yamt #define splcdmac() splnet()
78 1.1.4.2 yamt
79 1.1.4.2 yamt
80 1.1.4.2 yamt /*
81 1.1.4.2 yamt * CDMAC per-channel interrupt handler. CDMAC has only one interrupt signal
82 1.1.4.2 yamt * shared by all channels on GSRD, so we have to dispatch channels manually.
83 1.1.4.2 yamt *
84 1.1.4.2 yamt * Note: we hardwire priority to IPL_NET, temac(4) is the only device that
85 1.1.4.2 yamt * needs to service DMA interrupts anyway.
86 1.1.4.2 yamt */
87 1.1.4.2 yamt struct cdmac_intr_handle {
88 1.1.4.2 yamt void (*cih_func)(void *);
89 1.1.4.2 yamt void *cih_arg;
90 1.1.4.2 yamt };
91 1.1.4.2 yamt
92 1.1.4.2 yamt static void *cdmac_ih = NULL; /* real CDMAC intr */
93 1.1.4.2 yamt static struct cdmac_intr_handle *cdmac_intrs[CDMAC_NCHAN];
94 1.1.4.2 yamt
95 1.1.4.2 yamt
96 1.1.4.2 yamt /*
97 1.1.4.2 yamt * DCR bus space leaf access routines.
98 1.1.4.2 yamt */
99 1.1.4.2 yamt
100 1.1.4.2 yamt static void
101 1.1.4.2 yamt xlcom0_write_4(bus_space_tag_t t, bus_space_handle_t h, uint32_t addr,
102 1.1.4.2 yamt uint32_t val)
103 1.1.4.2 yamt {
104 1.1.4.2 yamt addr += h;
105 1.1.4.2 yamt
106 1.1.4.2 yamt switch (addr) {
107 1.1.4.2 yamt WCASE(DCR_XLCOM_BASE, XLCOM_TX_FIFO);
108 1.1.4.2 yamt WCASE(DCR_XLCOM_BASE, XLCOM_STAT);
109 1.1.4.2 yamt WCASE(DCR_XLCOM_BASE, XLCOM_CNTL);
110 1.1.4.2 yamt WDEAD(addr);
111 1.1.4.2 yamt }
112 1.1.4.2 yamt }
113 1.1.4.2 yamt
114 1.1.4.2 yamt static uint32_t
115 1.1.4.2 yamt xlcom0_read_4(bus_space_tag_t t, bus_space_handle_t h, uint32_t addr)
116 1.1.4.2 yamt {
117 1.1.4.2 yamt uint32_t val;
118 1.1.4.2 yamt
119 1.1.4.2 yamt addr += h;
120 1.1.4.2 yamt
121 1.1.4.2 yamt switch (addr) {
122 1.1.4.2 yamt RCASE(DCR_XLCOM_BASE, XLCOM_RX_FIFO);
123 1.1.4.2 yamt RCASE(DCR_XLCOM_BASE, XLCOM_STAT);
124 1.1.4.2 yamt RCASE(DCR_XLCOM_BASE, XLCOM_CNTL);
125 1.1.4.2 yamt RDEAD(addr);
126 1.1.4.2 yamt }
127 1.1.4.2 yamt
128 1.1.4.2 yamt return (val);
129 1.1.4.2 yamt }
130 1.1.4.2 yamt
131 1.1.4.2 yamt static void
132 1.1.4.2 yamt tft0_write_4(bus_space_tag_t t, bus_space_handle_t h, uint32_t addr,
133 1.1.4.2 yamt uint32_t val)
134 1.1.4.2 yamt {
135 1.1.4.2 yamt addr += h;
136 1.1.4.2 yamt
137 1.1.4.2 yamt switch (addr) {
138 1.1.4.2 yamt WCASE(DCR_LLFB_BASE, TFT_CTRL);
139 1.1.4.2 yamt WDEAD(addr);
140 1.1.4.2 yamt }
141 1.1.4.2 yamt }
142 1.1.4.2 yamt
143 1.1.4.2 yamt static uint32_t
144 1.1.4.2 yamt tft0_read_4(bus_space_tag_t t, bus_space_handle_t h, uint32_t addr)
145 1.1.4.2 yamt {
146 1.1.4.2 yamt uint32_t val;
147 1.1.4.2 yamt
148 1.1.4.2 yamt addr += h;
149 1.1.4.2 yamt
150 1.1.4.2 yamt switch (addr) {
151 1.1.4.2 yamt RCASE(DCR_LLFB_BASE, TFT_CTRL);
152 1.1.4.2 yamt RDEAD(addr);
153 1.1.4.2 yamt }
154 1.1.4.2 yamt
155 1.1.4.2 yamt return (val);
156 1.1.4.2 yamt }
157 1.1.4.2 yamt
158 1.1.4.2 yamt #define DOCHAN(op, channel) \
159 1.1.4.2 yamt op(DCR_CDMAC_BASE, channel + CDMAC_NEXT); \
160 1.1.4.2 yamt op(DCR_CDMAC_BASE, channel + CDMAC_CURADDR); \
161 1.1.4.2 yamt op(DCR_CDMAC_BASE, channel + CDMAC_CURSIZE); \
162 1.1.4.2 yamt op(DCR_CDMAC_BASE, channel + CDMAC_CURDESC)
163 1.1.4.2 yamt
164 1.1.4.2 yamt static void
165 1.1.4.2 yamt cdmac0_write_4(bus_space_tag_t t, bus_space_handle_t h, uint32_t addr,
166 1.1.4.2 yamt uint32_t val)
167 1.1.4.2 yamt {
168 1.1.4.2 yamt addr += h;
169 1.1.4.2 yamt
170 1.1.4.2 yamt switch (addr) {
171 1.1.4.2 yamt WCASE(DCR_CDMAC_BASE, CDMAC_INTR);
172 1.1.4.2 yamt WCASE(DCR_CDMAC_BASE, CDMAC_TX0_STAT);
173 1.1.4.2 yamt WCASE(DCR_CDMAC_BASE, CDMAC_RX0_STAT);
174 1.1.4.2 yamt WCASE(DCR_CDMAC_BASE, CDMAC_TX1_STAT);
175 1.1.4.2 yamt WCASE(DCR_CDMAC_BASE, CDMAC_RX1_STAT);
176 1.1.4.2 yamt DOCHAN(WCASE, CDMAC_TX0_BASE);
177 1.1.4.2 yamt DOCHAN(WCASE, CDMAC_RX0_BASE);
178 1.1.4.2 yamt DOCHAN(WCASE, CDMAC_TX1_BASE);
179 1.1.4.2 yamt DOCHAN(WCASE, CDMAC_RX1_BASE);
180 1.1.4.2 yamt WDEAD(addr);
181 1.1.4.2 yamt }
182 1.1.4.2 yamt }
183 1.1.4.2 yamt
184 1.1.4.2 yamt static uint32_t
185 1.1.4.2 yamt cdmac0_read_4(bus_space_tag_t t, bus_space_handle_t h, uint32_t addr)
186 1.1.4.2 yamt {
187 1.1.4.2 yamt uint32_t val;
188 1.1.4.2 yamt
189 1.1.4.2 yamt addr += h;
190 1.1.4.2 yamt
191 1.1.4.2 yamt switch (addr) {
192 1.1.4.2 yamt RCASE(DCR_CDMAC_BASE, CDMAC_INTR);
193 1.1.4.2 yamt RCASE(DCR_CDMAC_BASE, CDMAC_TX0_STAT);
194 1.1.4.2 yamt RCASE(DCR_CDMAC_BASE, CDMAC_RX0_STAT);
195 1.1.4.2 yamt RCASE(DCR_CDMAC_BASE, CDMAC_TX1_STAT);
196 1.1.4.2 yamt RCASE(DCR_CDMAC_BASE, CDMAC_RX1_STAT);
197 1.1.4.2 yamt DOCHAN(RCASE, CDMAC_TX0_BASE);
198 1.1.4.2 yamt DOCHAN(RCASE, CDMAC_RX0_BASE);
199 1.1.4.2 yamt DOCHAN(RCASE, CDMAC_TX1_BASE);
200 1.1.4.2 yamt DOCHAN(RCASE, CDMAC_RX1_BASE);
201 1.1.4.2 yamt RDEAD(addr);
202 1.1.4.2 yamt }
203 1.1.4.2 yamt
204 1.1.4.2 yamt return (val);
205 1.1.4.2 yamt }
206 1.1.4.2 yamt
207 1.1.4.2 yamt #undef DOCHAN
208 1.1.4.2 yamt
209 1.1.4.2 yamt static void
210 1.1.4.2 yamt temac0_write_4(bus_space_tag_t t, bus_space_handle_t h, uint32_t addr,
211 1.1.4.2 yamt uint32_t val)
212 1.1.4.2 yamt {
213 1.1.4.2 yamt addr += h;
214 1.1.4.2 yamt
215 1.1.4.2 yamt switch (addr) {
216 1.1.4.2 yamt WCASE(DCR_TEMAC_BASE, TEMAC_RESET);
217 1.1.4.2 yamt WDEAD(addr);
218 1.1.4.2 yamt }
219 1.1.4.2 yamt }
220 1.1.4.2 yamt
221 1.1.4.2 yamt static const struct powerpc_bus_space xlcom_bst = {
222 1.1.4.2 yamt DCR_BST_BODY(DCR_XLCOM_BASE, xlcom0_read_4, xlcom0_write_4)
223 1.1.4.2 yamt };
224 1.1.4.2 yamt
225 1.1.4.2 yamt static const struct powerpc_bus_space cdmac_bst = {
226 1.1.4.2 yamt DCR_BST_BODY(DCR_CDMAC_BASE, cdmac0_read_4, cdmac0_write_4)
227 1.1.4.2 yamt };
228 1.1.4.2 yamt
229 1.1.4.2 yamt static const struct powerpc_bus_space temac_bst = {
230 1.1.4.2 yamt DCR_BST_BODY(DCR_TEMAC_BASE, NULL, temac0_write_4)
231 1.1.4.2 yamt };
232 1.1.4.2 yamt
233 1.1.4.2 yamt static const struct powerpc_bus_space tft_bst = {
234 1.1.4.2 yamt DCR_BST_BODY(DCR_LLFB_BASE, tft0_read_4, tft0_write_4)
235 1.1.4.2 yamt };
236 1.1.4.2 yamt
237 1.1.4.2 yamt /*
238 1.1.4.2 yamt * Master device configuration table for GSRD design.
239 1.1.4.2 yamt */
240 1.1.4.2 yamt static const struct gsrddev {
241 1.1.4.2 yamt const char *gdv_name;
242 1.1.4.2 yamt const char *gdv_attr;
243 1.1.4.2 yamt bus_space_tag_t gdv_bst;
244 1.1.4.2 yamt bus_addr_t gdv_addr;
245 1.1.4.2 yamt int gdv_intr;
246 1.1.4.2 yamt int gdv_rx_dma;
247 1.1.4.2 yamt int gdv_tx_dma;
248 1.1.4.2 yamt } gsrd_devices[] = {
249 1.1.4.2 yamt { /* gsrd_devices[0] */
250 1.1.4.2 yamt .gdv_name = "xlcom",
251 1.1.4.2 yamt .gdv_attr = "xcvbus",
252 1.1.4.2 yamt .gdv_bst = &xlcom_bst,
253 1.1.4.2 yamt .gdv_addr = 0,
254 1.1.4.2 yamt .gdv_intr = 0,
255 1.1.4.2 yamt .gdv_rx_dma = -1,
256 1.1.4.2 yamt .gdv_tx_dma = -1,
257 1.1.4.2 yamt },
258 1.1.4.2 yamt { /* gsrd_devices[1] */
259 1.1.4.2 yamt .gdv_name = "temac",
260 1.1.4.2 yamt .gdv_attr = "xcvbus",
261 1.1.4.2 yamt .gdv_bst = &temac_bst,
262 1.1.4.2 yamt .gdv_addr = 0,
263 1.1.4.2 yamt .gdv_intr = 1,
264 1.1.4.2 yamt .gdv_rx_dma = 3,
265 1.1.4.2 yamt .gdv_tx_dma = 2,
266 1.1.4.2 yamt },
267 1.1.4.2 yamt { /* gsrd_devices[2] */
268 1.1.4.2 yamt .gdv_name = "tft",
269 1.1.4.2 yamt .gdv_attr = "llbus",
270 1.1.4.2 yamt .gdv_bst = &tft_bst,
271 1.1.4.2 yamt .gdv_addr = 0,
272 1.1.4.2 yamt .gdv_intr = -1,
273 1.1.4.2 yamt .gdv_rx_dma = -1,
274 1.1.4.2 yamt .gdv_tx_dma = 0,
275 1.1.4.2 yamt }
276 1.1.4.2 yamt };
277 1.1.4.2 yamt
278 1.1.4.2 yamt static struct ll_dmac *
279 1.1.4.2 yamt virtex_mpmc_mapdma(int n, struct ll_dmac *chan)
280 1.1.4.2 yamt {
281 1.1.4.2 yamt if (n == -1)
282 1.1.4.2 yamt return (NULL);
283 1.1.4.2 yamt
284 1.1.4.2 yamt chan->dmac_iot = &cdmac_bst;
285 1.1.4.2 yamt chan->dmac_ctrl_addr = CDMAC_CTRL_BASE(n);
286 1.1.4.2 yamt chan->dmac_stat_addr = CDMAC_STAT_BASE(n);
287 1.1.4.2 yamt chan->dmac_chan = n;
288 1.1.4.2 yamt
289 1.1.4.2 yamt return (chan);
290 1.1.4.2 yamt }
291 1.1.4.2 yamt
292 1.1.4.2 yamt static int
293 1.1.4.2 yamt cdmac_intr(void *arg)
294 1.1.4.2 yamt {
295 1.1.4.2 yamt uint32_t isr;
296 1.1.4.2 yamt int i;
297 1.1.4.2 yamt int did = 0;
298 1.1.4.2 yamt
299 1.1.4.2 yamt isr = bus_space_read_4(&cdmac_bst, 0, CDMAC_INTR);
300 1.1.4.2 yamt bus_space_write_4(&cdmac_bst, 0, CDMAC_INTR, isr); /* ack */
301 1.1.4.2 yamt
302 1.1.4.2 yamt for (i = 0; i < CDMAC_NCHAN; i++)
303 1.1.4.2 yamt if (ISSET(isr, CDMAC_CHAN_INTR(i)) &&
304 1.1.4.2 yamt cdmac_intrs[i] != NULL) {
305 1.1.4.2 yamt (cdmac_intrs[i]->cih_func)(cdmac_intrs[i]->cih_arg);
306 1.1.4.2 yamt did++;
307 1.1.4.2 yamt }
308 1.1.4.2 yamt
309 1.1.4.2 yamt /* XXX: This happens all the time under load... bug? */
310 1.1.4.2 yamt #if 0
311 1.1.4.2 yamt if (did == 0)
312 1.1.4.2 yamt aprint_normal("WARNING: stray cdmac isr 0x%x\n", isr);
313 1.1.4.2 yamt #endif
314 1.1.4.2 yamt
315 1.1.4.2 yamt return (0);
316 1.1.4.2 yamt }
317 1.1.4.2 yamt
318 1.1.4.2 yamt /*
319 1.1.4.2 yamt * Public interface.
320 1.1.4.2 yamt */
321 1.1.4.2 yamt
322 1.1.4.2 yamt void
323 1.1.4.2 yamt virtex_autoconf(device_t self, struct plb_attach_args *paa)
324 1.1.4.2 yamt {
325 1.1.4.2 yamt struct xcvbus_attach_args vaa;
326 1.1.4.2 yamt struct ll_dmac rx, tx;
327 1.1.4.2 yamt int i;
328 1.1.4.2 yamt
329 1.1.4.2 yamt /* Reset all CDMAC engines, disable interrupt. */
330 1.1.4.2 yamt bus_space_write_4(&cdmac_bst, 0, CDMAC_STAT_BASE(0), CDMAC_STAT_RESET);
331 1.1.4.2 yamt bus_space_write_4(&cdmac_bst, 0, CDMAC_STAT_BASE(1), CDMAC_STAT_RESET);
332 1.1.4.2 yamt bus_space_write_4(&cdmac_bst, 0, CDMAC_STAT_BASE(2), CDMAC_STAT_RESET);
333 1.1.4.2 yamt bus_space_write_4(&cdmac_bst, 0, CDMAC_STAT_BASE(3), CDMAC_STAT_RESET);
334 1.1.4.2 yamt bus_space_write_4(&cdmac_bst, 0, CDMAC_INTR, 0);
335 1.1.4.2 yamt
336 1.1.4.2 yamt vaa.vaa_dmat = paa->plb_dmat;
337 1.1.4.2 yamt vaa._vaa_is_dcr = 1; /* XXX bst flag */
338 1.1.4.2 yamt
339 1.1.4.2 yamt /* Attach all we have. */
340 1.1.4.2 yamt for (i = 0; i < __arraycount(gsrd_devices); i++) {
341 1.1.4.2 yamt const struct gsrddev *g = &gsrd_devices[i];
342 1.1.4.2 yamt
343 1.1.4.2 yamt vaa.vaa_name = g->gdv_name;
344 1.1.4.2 yamt vaa.vaa_addr = g->gdv_addr;
345 1.1.4.2 yamt vaa.vaa_intr = g->gdv_intr;
346 1.1.4.2 yamt vaa.vaa_iot = g->gdv_bst;
347 1.1.4.2 yamt
348 1.1.4.2 yamt vaa.vaa_rx_dmac = virtex_mpmc_mapdma(g->gdv_rx_dma, &rx);
349 1.1.4.2 yamt vaa.vaa_tx_dmac = virtex_mpmc_mapdma(g->gdv_tx_dma, &tx);
350 1.1.4.2 yamt
351 1.1.4.2 yamt config_found_ia(self, g->gdv_attr, &vaa, xcvbus_print);
352 1.1.4.2 yamt }
353 1.1.4.2 yamt
354 1.1.4.2 yamt /* Setup the dispatch handler. */
355 1.1.4.2 yamt cdmac_ih = intr_establish(CDMAC_INTR_LINE, IST_LEVEL, IPL_CDMAC,
356 1.1.4.2 yamt cdmac_intr, NULL);
357 1.1.4.2 yamt if (cdmac_ih == NULL)
358 1.1.4.2 yamt panic("virtex_autoconf: could not establish cdmac intr");
359 1.1.4.2 yamt
360 1.1.4.2 yamt /* Enable CDMAC interrupt. */
361 1.1.4.2 yamt bus_space_write_4(&cdmac_bst, 0, CDMAC_INTR, ~CDMAC_INTR_MIE);
362 1.1.4.2 yamt bus_space_write_4(&cdmac_bst, 0, CDMAC_INTR, CDMAC_INTR_MIE);
363 1.1.4.2 yamt }
364 1.1.4.2 yamt
365 1.1.4.2 yamt void *
366 1.1.4.2 yamt ll_dmac_intr_establish(int chan, void (*func)(void *), void *arg)
367 1.1.4.2 yamt {
368 1.1.4.2 yamt struct cdmac_intr_handle *ih;
369 1.1.4.2 yamt
370 1.1.4.2 yamt KASSERT(chan > 0 && chan < CDMAC_NCHAN);
371 1.1.4.2 yamt
372 1.1.4.2 yamt /* We only allow one handler per channel, somewhat arbitrarily. */
373 1.1.4.2 yamt if (cdmac_intrs[chan] != NULL)
374 1.1.4.2 yamt return (NULL);
375 1.1.4.2 yamt
376 1.1.4.2 yamt ih = malloc(sizeof(struct cdmac_intr_handle), M_DEVBUF,
377 1.1.4.2 yamt cold ? M_NOWAIT : M_WAITOK);
378 1.1.4.2 yamt if (ih == NULL)
379 1.1.4.2 yamt return (NULL);
380 1.1.4.2 yamt
381 1.1.4.2 yamt ih->cih_func = func;
382 1.1.4.2 yamt ih->cih_arg = arg;
383 1.1.4.2 yamt
384 1.1.4.2 yamt return (cdmac_intrs[chan] = ih);
385 1.1.4.2 yamt }
386 1.1.4.2 yamt
387 1.1.4.2 yamt void
388 1.1.4.2 yamt ll_dmac_intr_disestablish(int chan, void *handle)
389 1.1.4.2 yamt {
390 1.1.4.2 yamt int s;
391 1.1.4.2 yamt
392 1.1.4.2 yamt KASSERT(chan > 0 && chan < CDMAC_NCHAN);
393 1.1.4.2 yamt KASSERT(cdmac_intrs[chan] == handle);
394 1.1.4.2 yamt
395 1.1.4.2 yamt s = splcdmac();
396 1.1.4.2 yamt cdmac_intrs[chan] = NULL;
397 1.1.4.2 yamt splx(s);
398 1.1.4.2 yamt
399 1.1.4.2 yamt free(handle, M_DEVBUF);
400 1.1.4.2 yamt }
401 1.1.4.2 yamt
402 1.1.4.2 yamt int
403 1.1.4.2 yamt virtex_console_tag(const char *xname, bus_space_tag_t *bst)
404 1.1.4.2 yamt {
405 1.1.4.2 yamt if (strncmp(xname, "xlcom", 5) == 0) {
406 1.1.4.2 yamt *bst = &xlcom_bst;
407 1.1.4.2 yamt return (0);
408 1.1.4.2 yamt }
409 1.1.4.2 yamt
410 1.1.4.2 yamt return (ENODEV);
411 1.1.4.2 yamt }
412 1.1.4.2 yamt
413 1.1.4.2 yamt void
414 1.1.4.2 yamt virtex_machdep_init(vaddr_t endva, vsize_t maxsz, struct mem_region *phys,
415 1.1.4.2 yamt struct mem_region *avail)
416 1.1.4.2 yamt {
417 1.1.4.2 yamt /* Nothing to do -- no memory-mapped devices. */
418 1.1.4.2 yamt }
419 1.1.4.2 yamt
420 1.1.4.2 yamt void
421 1.1.4.2 yamt device_register(struct device *dev, void *aux)
422 1.1.4.2 yamt {
423 1.1.4.2 yamt /* Nothing to do -- no property hacks needed. */
424 1.1.4.2 yamt }
425