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