xref: /netbsd-src/sys/arch/evbppc/virtex/design_gsrd1.c (revision 9d087e317d1a08b043d1a5e3ac055e7dab2b788c)
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