xref: /freebsd/sys/powerpc/include/bus.h (revision f9bac91b18fc344fe5967f4367a1994588a26b10)
1f9bac91bSBenno Rice /*-
2f9bac91bSBenno Rice  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
3f9bac91bSBenno Rice  * All rights reserved.
4f9bac91bSBenno Rice  *
5f9bac91bSBenno Rice  * This code is derived from software contributed to The NetBSD Foundation
6f9bac91bSBenno Rice  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
7f9bac91bSBenno Rice  * NASA Ames Research Center.
8f9bac91bSBenno Rice  *
9f9bac91bSBenno Rice  * Redistribution and use in source and binary forms, with or without
10f9bac91bSBenno Rice  * modification, are permitted provided that the following conditions
11f9bac91bSBenno Rice  * are met:
12f9bac91bSBenno Rice  * 1. Redistributions of source code must retain the above copyright
13f9bac91bSBenno Rice  *    notice, this list of conditions and the following disclaimer.
14f9bac91bSBenno Rice  * 2. Redistributions in binary form must reproduce the above copyright
15f9bac91bSBenno Rice  *    notice, this list of conditions and the following disclaimer in the
16f9bac91bSBenno Rice  *    documentation and/or other materials provided with the distribution.
17f9bac91bSBenno Rice  * 3. All advertising materials mentioning features or use of this software
18f9bac91bSBenno Rice  *    must display the following acknowledgement:
19f9bac91bSBenno Rice  *	This product includes software developed by the NetBSD
20f9bac91bSBenno Rice  *	Foundation, Inc. and its contributors.
21f9bac91bSBenno Rice  * 4. Neither the name of The NetBSD Foundation nor the names of its
22f9bac91bSBenno Rice  *    contributors may be used to endorse or promote products derived
23f9bac91bSBenno Rice  *    from this software without specific prior written permission.
24f9bac91bSBenno Rice  *
25f9bac91bSBenno Rice  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
26f9bac91bSBenno Rice  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27f9bac91bSBenno Rice  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28f9bac91bSBenno Rice  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
29f9bac91bSBenno Rice  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30f9bac91bSBenno Rice  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31f9bac91bSBenno Rice  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32f9bac91bSBenno Rice  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33f9bac91bSBenno Rice  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34f9bac91bSBenno Rice  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35f9bac91bSBenno Rice  * POSSIBILITY OF SUCH DAMAGE.
36f9bac91bSBenno Rice  */
37f9bac91bSBenno Rice 
38f9bac91bSBenno Rice /*
39f9bac91bSBenno Rice  * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
40f9bac91bSBenno Rice  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
41f9bac91bSBenno Rice  *
42f9bac91bSBenno Rice  * Redistribution and use in source and binary forms, with or without
43f9bac91bSBenno Rice  * modification, are permitted provided that the following conditions
44f9bac91bSBenno Rice  * are met:
45f9bac91bSBenno Rice  * 1. Redistributions of source code must retain the above copyright
46f9bac91bSBenno Rice  *    notice, this list of conditions and the following disclaimer.
47f9bac91bSBenno Rice  * 2. Redistributions in binary form must reproduce the above copyright
48f9bac91bSBenno Rice  *    notice, this list of conditions and the following disclaimer in the
49f9bac91bSBenno Rice  *    documentation and/or other materials provided with the distribution.
50f9bac91bSBenno Rice  * 3. All advertising materials mentioning features or use of this software
51f9bac91bSBenno Rice  *    must display the following acknowledgement:
52f9bac91bSBenno Rice  *      This product includes software developed by Christopher G. Demetriou
53f9bac91bSBenno Rice  *	for the NetBSD Project.
54f9bac91bSBenno Rice  * 4. The name of the author may not be used to endorse or promote products
55f9bac91bSBenno Rice  *    derived from this software without specific prior written permission
56f9bac91bSBenno Rice  *
57f9bac91bSBenno Rice  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
58f9bac91bSBenno Rice  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
59f9bac91bSBenno Rice  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
60f9bac91bSBenno Rice  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
61f9bac91bSBenno Rice  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
62f9bac91bSBenno Rice  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
63f9bac91bSBenno Rice  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
64f9bac91bSBenno Rice  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
65f9bac91bSBenno Rice  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
66f9bac91bSBenno Rice  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
67f9bac91bSBenno Rice  *
68f9bac91bSBenno Rice  *	$NetBSD: bus.h,v 1.9.4.1 2000/06/30 16:27:30 simonb Exp $
69f9bac91bSBenno Rice  * $FreeBSD$
70f9bac91bSBenno Rice  */
71f9bac91bSBenno Rice 
72f9bac91bSBenno Rice #ifndef	_MACPPC_BUS_H_
73f9bac91bSBenno Rice #define	_MACPPC_BUS_H_
74f9bac91bSBenno Rice 
75f9bac91bSBenno Rice #include <machine/pio.h>
76f9bac91bSBenno Rice 
77f9bac91bSBenno Rice /*
78f9bac91bSBenno Rice  * Values for the macppc bus space tag, not to be used directly by MI code.
79f9bac91bSBenno Rice  */
80f9bac91bSBenno Rice 
81f9bac91bSBenno Rice #define	__BUS_SPACE_HAS_STREAM_METHODS
82f9bac91bSBenno Rice 
83f9bac91bSBenno Rice #define	MACPPC_BUS_ADDR_MASK	0xfffff000
84f9bac91bSBenno Rice #define	MACPPC_BUS_STRIDE_MASK	0x0000000f
85f9bac91bSBenno Rice 
86f9bac91bSBenno Rice #define macppc_make_bus_space_tag(addr, stride) \
87f9bac91bSBenno Rice 	(((addr) & MACPPC_BUS_ADDR_MASK) | (stride))
88f9bac91bSBenno Rice #define	__BA(t, h, o) ((void *)((h) + ((o) << ((t) & MACPPC_BUS_STRIDE_MASK))))
89f9bac91bSBenno Rice 
90f9bac91bSBenno Rice /*
91f9bac91bSBenno Rice  * Bus address and size types
92f9bac91bSBenno Rice  */
93f9bac91bSBenno Rice typedef u_int32_t bus_addr_t;
94f9bac91bSBenno Rice typedef u_int32_t bus_size_t;
95f9bac91bSBenno Rice 
96f9bac91bSBenno Rice /*
97f9bac91bSBenno Rice  * Access methods for bus resources and address space.
98f9bac91bSBenno Rice  */
99f9bac91bSBenno Rice typedef u_int32_t bus_space_tag_t;
100f9bac91bSBenno Rice typedef u_int32_t bus_space_handle_t;
101f9bac91bSBenno Rice 
102f9bac91bSBenno Rice /*
103f9bac91bSBenno Rice  *	int bus_space_map  __P((bus_space_tag_t t, bus_addr_t addr,
104f9bac91bSBenno Rice  *	    bus_size_t size, int flags, bus_space_handle_t *bshp));
105f9bac91bSBenno Rice  *
106f9bac91bSBenno Rice  * Map a region of bus space.
107f9bac91bSBenno Rice  */
108f9bac91bSBenno Rice 
109f9bac91bSBenno Rice #define	BUS_SPACE_MAP_CACHEABLE		0x01
110f9bac91bSBenno Rice #define	BUS_SPACE_MAP_LINEAR		0x02
111f9bac91bSBenno Rice #define	BUS_SPACE_MAP_PREFETCHABLE	0x04
112f9bac91bSBenno Rice 
113f9bac91bSBenno Rice extern void *mapiodev(vm_offset_t, vm_size_t);
114f9bac91bSBenno Rice 
115f9bac91bSBenno Rice static __inline int
116f9bac91bSBenno Rice bus_space_map(bus_space_tag_t t, bus_addr_t addr, bus_size_t size, int flags,
117f9bac91bSBenno Rice     bus_space_handle_t *bshp)
118f9bac91bSBenno Rice {
119f9bac91bSBenno Rice 	vm_offset_t base = t & MACPPC_BUS_ADDR_MASK;
120f9bac91bSBenno Rice 	int stride = t & MACPPC_BUS_STRIDE_MASK;
121f9bac91bSBenno Rice 
122f9bac91bSBenno Rice 	*bshp = (bus_space_handle_t)
123f9bac91bSBenno Rice 		mapiodev(base + (addr << stride), size << stride);
124f9bac91bSBenno Rice 	return 0;
125f9bac91bSBenno Rice }
126f9bac91bSBenno Rice 
127f9bac91bSBenno Rice /*
128f9bac91bSBenno Rice  *	int bus_space_unmap __P((bus_space_tag_t t,
129f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t size));
130f9bac91bSBenno Rice  *
131f9bac91bSBenno Rice  * Unmap a region of bus space.
132f9bac91bSBenno Rice  */
133f9bac91bSBenno Rice 
134f9bac91bSBenno Rice #define bus_space_unmap(t, bsh, size)
135f9bac91bSBenno Rice 
136f9bac91bSBenno Rice /*
137f9bac91bSBenno Rice  *	int bus_space_subregion __P((bus_space_tag_t t,
138f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset, bus_size_t size,
139f9bac91bSBenno Rice  *	    bus_space_handle_t *nbshp));
140f9bac91bSBenno Rice  *
141f9bac91bSBenno Rice  * Get a new handle for a subregion of an already-mapped area of bus space.
142f9bac91bSBenno Rice  */
143f9bac91bSBenno Rice 
144f9bac91bSBenno Rice #define	bus_space_subregion(t, bsh, offset, size, bshp)			\
145f9bac91bSBenno Rice 	((*(bshp) = (bus_space_handle_t)__BA(t, bsh, offset)), 0)
146f9bac91bSBenno Rice 
147f9bac91bSBenno Rice /*
148f9bac91bSBenno Rice  *	int bus_space_alloc __P((bus_space_tag_t t, bus_addr_t rstart,
149f9bac91bSBenno Rice  *	    bus_addr_t rend, bus_size_t size, bus_size_t align,
150f9bac91bSBenno Rice  *	    bus_size_t boundary, int flags, bus_addr_t *addrp,
151f9bac91bSBenno Rice  *	    bus_space_handle_t *bshp));
152f9bac91bSBenno Rice  *
153f9bac91bSBenno Rice  * Allocate a region of bus space.
154f9bac91bSBenno Rice  */
155f9bac91bSBenno Rice 
156f9bac91bSBenno Rice #if 0
157f9bac91bSBenno Rice #define	bus_space_alloc(t, rs, re, s, a, b, f, ap, hp)	!!! unimplemented !!!
158f9bac91bSBenno Rice #endif
159f9bac91bSBenno Rice 
160f9bac91bSBenno Rice /*
161f9bac91bSBenno Rice  *	int bus_space_free __P((bus_space_tag_t t,
162f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t size));
163f9bac91bSBenno Rice  *
164f9bac91bSBenno Rice  * Free a region of bus space.
165f9bac91bSBenno Rice  */
166f9bac91bSBenno Rice #if 0
167f9bac91bSBenno Rice #define	bus_space_free(t, h, s)		!!! unimplemented !!!
168f9bac91bSBenno Rice #endif
169f9bac91bSBenno Rice 
170f9bac91bSBenno Rice /*
171f9bac91bSBenno Rice  *	u_intN_t bus_space_read_N __P((bus_space_tag_t tag,
172f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset));
173f9bac91bSBenno Rice  *
174f9bac91bSBenno Rice  * Read a 1, 2, 4, or 8 byte quantity from bus space
175f9bac91bSBenno Rice  * described by tag/handle/offset.
176f9bac91bSBenno Rice  */
177f9bac91bSBenno Rice 
178f9bac91bSBenno Rice #define	bus_space_read_1(t, h, o)	(in8(__BA(t, h, o)))
179f9bac91bSBenno Rice #define	bus_space_read_2(t, h, o)	(in16rb(__BA(t, h, o)))
180f9bac91bSBenno Rice #define	bus_space_read_4(t, h, o)	(in32rb(__BA(t, h, o)))
181f9bac91bSBenno Rice #if 0	/* Cause a link error for bus_space_read_8 */
182f9bac91bSBenno Rice #define	bus_space_read_8(t, h, o)	!!! unimplemented !!!
183f9bac91bSBenno Rice #endif
184f9bac91bSBenno Rice 
185f9bac91bSBenno Rice #define	bus_space_read_stream_1(t, h, o)	(in8(__BA(t, h, o)))
186f9bac91bSBenno Rice #define	bus_space_read_stream_2(t, h, o)	(in16(__BA(t, h, o)))
187f9bac91bSBenno Rice #define	bus_space_read_stream_4(t, h, o)	(in32(__BA(t, h, o)))
188f9bac91bSBenno Rice #if 0	/* Cause a link error for bus_space_read_stream_8 */
189f9bac91bSBenno Rice #define	bus_space_read_8(t, h, o)	!!! unimplemented !!!
190f9bac91bSBenno Rice #endif
191f9bac91bSBenno Rice 
192f9bac91bSBenno Rice /*
193f9bac91bSBenno Rice  *	void bus_space_read_multi_N __P((bus_space_tag_t tag,
194f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset,
195f9bac91bSBenno Rice  *	    u_intN_t *addr, size_t count));
196f9bac91bSBenno Rice  *
197f9bac91bSBenno Rice  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
198f9bac91bSBenno Rice  * described by tag/handle/offset and copy into buffer provided.
199f9bac91bSBenno Rice  */
200f9bac91bSBenno Rice 
201f9bac91bSBenno Rice #define	bus_space_read_multi_1(t, h, o, a, c) do {			\
202f9bac91bSBenno Rice 		ins8(__BA(t, h, o), (a), (c));				\
203f9bac91bSBenno Rice 	} while (0)
204f9bac91bSBenno Rice 
205f9bac91bSBenno Rice #define	bus_space_read_multi_2(t, h, o, a, c) do {			\
206f9bac91bSBenno Rice 		ins16rb(__BA(t, h, o), (a), (c));			\
207f9bac91bSBenno Rice 	} while (0)
208f9bac91bSBenno Rice 
209f9bac91bSBenno Rice #define	bus_space_read_multi_4(t, h, o, a, c) do {			\
210f9bac91bSBenno Rice 		ins32rb(__BA(t, h, o), (a), (c));			\
211f9bac91bSBenno Rice 	} while (0)
212f9bac91bSBenno Rice 
213f9bac91bSBenno Rice #if 0	/* Cause a link error for bus_space_read_multi_8 */
214f9bac91bSBenno Rice #define	bus_space_read_multi_8		!!! unimplemented !!!
215f9bac91bSBenno Rice #endif
216f9bac91bSBenno Rice 
217f9bac91bSBenno Rice #define	bus_space_read_multi_stream_1(t, h, o, a, c) do {		\
218f9bac91bSBenno Rice 		ins8(__BA(t, h, o), (a), (c));				\
219f9bac91bSBenno Rice 	} while (0)
220f9bac91bSBenno Rice 
221f9bac91bSBenno Rice #define	bus_space_read_multi_stream_2(t, h, o, a, c) do {		\
222f9bac91bSBenno Rice 		ins16(__BA(t, h, o), (a), (c));				\
223f9bac91bSBenno Rice 	} while (0)
224f9bac91bSBenno Rice 
225f9bac91bSBenno Rice #define	bus_space_read_multi_stream_4(t, h, o, a, c) do {		\
226f9bac91bSBenno Rice 		ins32(__BA(t, h, o), (a), (c));				\
227f9bac91bSBenno Rice 	} while (0)
228f9bac91bSBenno Rice 
229f9bac91bSBenno Rice #if 0	/* Cause a link error for bus_space_read_multi_stream_8 */
230f9bac91bSBenno Rice #define	bus_space_read_multi_stream_8	!!! unimplemented !!!
231f9bac91bSBenno Rice #endif
232f9bac91bSBenno Rice 
233f9bac91bSBenno Rice /*
234f9bac91bSBenno Rice  *	void bus_space_read_region_N __P((bus_space_tag_t tag,
235f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset,
236f9bac91bSBenno Rice  *	    u_intN_t *addr, size_t count));
237f9bac91bSBenno Rice  *
238f9bac91bSBenno Rice  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
239f9bac91bSBenno Rice  * described by tag/handle and starting at `offset' and copy into
240f9bac91bSBenno Rice  * buffer provided.
241f9bac91bSBenno Rice  */
242f9bac91bSBenno Rice 
243f9bac91bSBenno Rice static __inline void
244f9bac91bSBenno Rice bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t bsh,
245f9bac91bSBenno Rice     bus_size_t offset, u_int8_t *addr, size_t count)
246f9bac91bSBenno Rice {
247f9bac91bSBenno Rice 	volatile u_int8_t *s = __BA(tag, bsh, offset);
248f9bac91bSBenno Rice 
249f9bac91bSBenno Rice 	while (count--)
250f9bac91bSBenno Rice 		*addr++ = *s++;
251f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
252f9bac91bSBenno Rice }
253f9bac91bSBenno Rice 
254f9bac91bSBenno Rice static __inline void
255f9bac91bSBenno Rice bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t bsh,
256f9bac91bSBenno Rice     bus_size_t offset, u_int16_t *addr, size_t count)
257f9bac91bSBenno Rice {
258f9bac91bSBenno Rice 	volatile u_int16_t *s = __BA(tag, bsh, offset);
259f9bac91bSBenno Rice 
260f9bac91bSBenno Rice 	while (count--)
261f9bac91bSBenno Rice 		__asm __volatile("lhbrx %0, 0, %1" :
262f9bac91bSBenno Rice 			"=r"(*addr++) : "r"(s++));
263f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
264f9bac91bSBenno Rice }
265f9bac91bSBenno Rice 
266f9bac91bSBenno Rice static __inline void
267f9bac91bSBenno Rice bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t bsh,
268f9bac91bSBenno Rice     bus_size_t offset, u_int32_t *addr, size_t count)
269f9bac91bSBenno Rice {
270f9bac91bSBenno Rice 	volatile u_int32_t *s = __BA(tag, bsh, offset);
271f9bac91bSBenno Rice 
272f9bac91bSBenno Rice 	while (count--)
273f9bac91bSBenno Rice 		__asm __volatile("lwbrx %0, 0, %1" :
274f9bac91bSBenno Rice 			"=r"(*addr++) : "r"(s++));
275f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
276f9bac91bSBenno Rice }
277f9bac91bSBenno Rice 
278f9bac91bSBenno Rice #if 0	/* Cause a link error for bus_space_read_region_8 */
279f9bac91bSBenno Rice #define	bus_space_read_region_8		!!! unimplemented !!!
280f9bac91bSBenno Rice #endif
281f9bac91bSBenno Rice 
282f9bac91bSBenno Rice static __inline void
283f9bac91bSBenno Rice bus_space_read_region_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh,
284f9bac91bSBenno Rice     bus_size_t offset, u_int16_t *addr, size_t count)
285f9bac91bSBenno Rice {
286f9bac91bSBenno Rice 	volatile u_int16_t *s = __BA(tag, bsh, offset);
287f9bac91bSBenno Rice 
288f9bac91bSBenno Rice 	while (count--)
289f9bac91bSBenno Rice 		*addr++ = *s++;
290f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
291f9bac91bSBenno Rice }
292f9bac91bSBenno Rice 
293f9bac91bSBenno Rice static __inline void
294f9bac91bSBenno Rice bus_space_read_region_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh,
295f9bac91bSBenno Rice     bus_size_t offset, u_int32_t *addr, size_t count)
296f9bac91bSBenno Rice {
297f9bac91bSBenno Rice 	volatile u_int32_t *s = __BA(tag, bsh, offset);
298f9bac91bSBenno Rice 
299f9bac91bSBenno Rice 	while (count--)
300f9bac91bSBenno Rice 		*addr++ = *s++;
301f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
302f9bac91bSBenno Rice }
303f9bac91bSBenno Rice 
304f9bac91bSBenno Rice #if 0	/* Cause a link error */
305f9bac91bSBenno Rice #define	bus_space_read_region_stream_8		!!! unimplemented !!!
306f9bac91bSBenno Rice #endif
307f9bac91bSBenno Rice 
308f9bac91bSBenno Rice /*
309f9bac91bSBenno Rice  *	void bus_space_write_N __P((bus_space_tag_t tag,
310f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset,
311f9bac91bSBenno Rice  *	    u_intN_t value));
312f9bac91bSBenno Rice  *
313f9bac91bSBenno Rice  * Write the 1, 2, 4, or 8 byte value `value' to bus space
314f9bac91bSBenno Rice  * described by tag/handle/offset.
315f9bac91bSBenno Rice  */
316f9bac91bSBenno Rice 
317f9bac91bSBenno Rice #define bus_space_write_1(t, h, o, v)	out8(__BA(t, h, o), (v))
318f9bac91bSBenno Rice #define bus_space_write_2(t, h, o, v)	out16rb(__BA(t, h, o), (v))
319f9bac91bSBenno Rice #define bus_space_write_4(t, h, o, v)	out32rb(__BA(t, h, o), (v))
320f9bac91bSBenno Rice 
321f9bac91bSBenno Rice #define bus_space_write_stream_1(t, h, o, v)	out8(__BA(t, h, o), (v))
322f9bac91bSBenno Rice #define bus_space_write_stream_2(t, h, o, v)	out16(__BA(t, h, o), (v))
323f9bac91bSBenno Rice #define bus_space_write_stream_4(t, h, o, v)	out32(__BA(t, h, o), (v))
324f9bac91bSBenno Rice 
325f9bac91bSBenno Rice #if 0	/* Cause a link error for bus_space_write_8 */
326f9bac91bSBenno Rice #define bus_space_write_8		!!! unimplemented !!!
327f9bac91bSBenno Rice #endif
328f9bac91bSBenno Rice 
329f9bac91bSBenno Rice /*
330f9bac91bSBenno Rice  *	void bus_space_write_multi_N __P((bus_space_tag_t tag,
331f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset,
332f9bac91bSBenno Rice  *	    const u_intN_t *addr, size_t count));
333f9bac91bSBenno Rice  *
334f9bac91bSBenno Rice  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
335f9bac91bSBenno Rice  * provided to bus space described by tag/handle/offset.
336f9bac91bSBenno Rice  */
337f9bac91bSBenno Rice 
338f9bac91bSBenno Rice #define bus_space_write_multi_1(t, h, o, a, c) do {			\
339f9bac91bSBenno Rice 		outsb(__BA(t, h, o), (a), (c));				\
340f9bac91bSBenno Rice 	} while (0)
341f9bac91bSBenno Rice 
342f9bac91bSBenno Rice #define bus_space_write_multi_2(t, h, o, a, c) do {			\
343f9bac91bSBenno Rice 		outsw(__BA(t, h, o), (a), (c));				\
344f9bac91bSBenno Rice 	} while (0)
345f9bac91bSBenno Rice 
346f9bac91bSBenno Rice #define bus_space_write_multi_4(t, h, o, a, c) do {			\
347f9bac91bSBenno Rice 		outsl(__BA(t, h, o), (a), (c));				\
348f9bac91bSBenno Rice 	} while (0)
349f9bac91bSBenno Rice 
350f9bac91bSBenno Rice #if 0
351f9bac91bSBenno Rice #define bus_space_write_multi_8		!!! unimplemented !!!
352f9bac91bSBenno Rice #endif
353f9bac91bSBenno Rice 
354f9bac91bSBenno Rice #define bus_space_write_multi_stream_2(t, h, o, a, c) do {		\
355f9bac91bSBenno Rice 		outsw(__BA(t, h, o), (a), (c));				\
356f9bac91bSBenno Rice 	} while (0)
357f9bac91bSBenno Rice 
358f9bac91bSBenno Rice #define bus_space_write_multi_stream_4(t, h, o, a, c) do {		\
359f9bac91bSBenno Rice 		outsl(__BA(t, h, o), (a), (c));				\
360f9bac91bSBenno Rice 	} while (0)
361f9bac91bSBenno Rice 
362f9bac91bSBenno Rice #if 0
363f9bac91bSBenno Rice #define bus_space_write_multi_stream_8	!!! unimplemented !!!
364f9bac91bSBenno Rice #endif
365f9bac91bSBenno Rice 
366f9bac91bSBenno Rice /*
367f9bac91bSBenno Rice  *	void bus_space_write_region_N __P((bus_space_tag_t tag,
368f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset,
369f9bac91bSBenno Rice  *	    const u_intN_t *addr, size_t count));
370f9bac91bSBenno Rice  *
371f9bac91bSBenno Rice  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided
372f9bac91bSBenno Rice  * to bus space described by tag/handle starting at `offset'.
373f9bac91bSBenno Rice  */
374f9bac91bSBenno Rice 
375f9bac91bSBenno Rice static __inline void
376f9bac91bSBenno Rice bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t bsh,
377f9bac91bSBenno Rice     bus_size_t offset, const u_int8_t *addr, size_t count)
378f9bac91bSBenno Rice {
379f9bac91bSBenno Rice 	volatile u_int8_t *d = __BA(tag, bsh, offset);
380f9bac91bSBenno Rice 
381f9bac91bSBenno Rice 	while (count--)
382f9bac91bSBenno Rice 		*d++ = *addr++;
383f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
384f9bac91bSBenno Rice }
385f9bac91bSBenno Rice 
386f9bac91bSBenno Rice static __inline void
387f9bac91bSBenno Rice bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t bsh,
388f9bac91bSBenno Rice     bus_size_t offset, const u_int16_t *addr, size_t count)
389f9bac91bSBenno Rice {
390f9bac91bSBenno Rice 	volatile u_int16_t *d = __BA(tag, bsh, offset);
391f9bac91bSBenno Rice 
392f9bac91bSBenno Rice 	while (count--)
393f9bac91bSBenno Rice 		__asm __volatile("sthbrx %0, 0, %1" ::
394f9bac91bSBenno Rice 			"r"(*addr++), "r"(d++));
395f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
396f9bac91bSBenno Rice }
397f9bac91bSBenno Rice 
398f9bac91bSBenno Rice static __inline void
399f9bac91bSBenno Rice bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t bsh,
400f9bac91bSBenno Rice     bus_size_t offset, const u_int32_t *addr, size_t count)
401f9bac91bSBenno Rice {
402f9bac91bSBenno Rice 	volatile u_int32_t *d = __BA(tag, bsh, offset);
403f9bac91bSBenno Rice 
404f9bac91bSBenno Rice 	while (count--)
405f9bac91bSBenno Rice 		__asm __volatile("stwbrx %0, 0, %1" ::
406f9bac91bSBenno Rice 			"r"(*addr++), "r"(d++));
407f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
408f9bac91bSBenno Rice }
409f9bac91bSBenno Rice 
410f9bac91bSBenno Rice #if 0
411f9bac91bSBenno Rice #define	bus_space_write_region_8 !!! bus_space_write_region_8 unimplemented !!!
412f9bac91bSBenno Rice #endif
413f9bac91bSBenno Rice 
414f9bac91bSBenno Rice static __inline void
415f9bac91bSBenno Rice bus_space_write_region_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh,
416f9bac91bSBenno Rice     bus_size_t offset, const u_int16_t *addr, size_t count)
417f9bac91bSBenno Rice {
418f9bac91bSBenno Rice 	volatile u_int16_t *d = __BA(tag, bsh, offset);
419f9bac91bSBenno Rice 
420f9bac91bSBenno Rice 	while (count--)
421f9bac91bSBenno Rice 		*d++ = *addr++;
422f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
423f9bac91bSBenno Rice }
424f9bac91bSBenno Rice 
425f9bac91bSBenno Rice static __inline void
426f9bac91bSBenno Rice bus_space_write_region_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh,
427f9bac91bSBenno Rice     bus_size_t offset, const u_int32_t *addr, size_t count)
428f9bac91bSBenno Rice {
429f9bac91bSBenno Rice 	volatile u_int32_t *d = __BA(tag, bsh, offset);
430f9bac91bSBenno Rice 
431f9bac91bSBenno Rice 	while (count--)
432f9bac91bSBenno Rice 		*d++ = *addr++;
433f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
434f9bac91bSBenno Rice }
435f9bac91bSBenno Rice 
436f9bac91bSBenno Rice #if 0
437f9bac91bSBenno Rice #define	bus_space_write_region_stream_8	!!! unimplemented !!!
438f9bac91bSBenno Rice #endif
439f9bac91bSBenno Rice 
440f9bac91bSBenno Rice /*
441f9bac91bSBenno Rice  *	void bus_space_set_multi_N __P((bus_space_tag_t tag,
442f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
443f9bac91bSBenno Rice  *	    size_t count));
444f9bac91bSBenno Rice  *
445f9bac91bSBenno Rice  * Write the 1, 2, 4, or 8 byte value `val' to bus space described
446f9bac91bSBenno Rice  * by tag/handle/offset `count' times.
447f9bac91bSBenno Rice  */
448f9bac91bSBenno Rice 
449f9bac91bSBenno Rice static __inline void
450f9bac91bSBenno Rice bus_space_set_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh,
451f9bac91bSBenno Rice     bus_size_t offset, u_int8_t val, size_t count)
452f9bac91bSBenno Rice {
453f9bac91bSBenno Rice 	volatile u_int8_t *d = __BA(tag, bsh, offset);
454f9bac91bSBenno Rice 
455f9bac91bSBenno Rice 	while (count--)
456f9bac91bSBenno Rice 		*d = val;
457f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
458f9bac91bSBenno Rice }
459f9bac91bSBenno Rice 
460f9bac91bSBenno Rice static __inline void
461f9bac91bSBenno Rice bus_space_set_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh,
462f9bac91bSBenno Rice     bus_size_t offset, u_int16_t val, size_t count)
463f9bac91bSBenno Rice {
464f9bac91bSBenno Rice 	volatile u_int16_t *d = __BA(tag, bsh, offset);
465f9bac91bSBenno Rice 
466f9bac91bSBenno Rice 	while (count--)
467f9bac91bSBenno Rice 		__asm __volatile("sthbrx %0, 0, %1" ::
468f9bac91bSBenno Rice 			"r"(val), "r"(d));
469f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
470f9bac91bSBenno Rice }
471f9bac91bSBenno Rice 
472f9bac91bSBenno Rice static __inline void
473f9bac91bSBenno Rice bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh,
474f9bac91bSBenno Rice     bus_size_t offset, u_int32_t val, size_t count)
475f9bac91bSBenno Rice {
476f9bac91bSBenno Rice 	volatile u_int32_t *d = __BA(tag, bsh, offset);
477f9bac91bSBenno Rice 
478f9bac91bSBenno Rice 	while (count--)
479f9bac91bSBenno Rice 		__asm __volatile("stwbrx %0, 0, %1" ::
480f9bac91bSBenno Rice 			"r"(val), "r"(d));
481f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
482f9bac91bSBenno Rice }
483f9bac91bSBenno Rice 
484f9bac91bSBenno Rice #if 0
485f9bac91bSBenno Rice #define	bus_space_set_multi_8 !!! bus_space_set_multi_8 unimplemented !!!
486f9bac91bSBenno Rice #endif
487f9bac91bSBenno Rice 
488f9bac91bSBenno Rice static __inline void
489f9bac91bSBenno Rice bus_space_set_multi_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh,
490f9bac91bSBenno Rice     bus_size_t offset, u_int16_t val, size_t count)
491f9bac91bSBenno Rice {
492f9bac91bSBenno Rice 	volatile u_int16_t *d = __BA(tag, bsh, offset);
493f9bac91bSBenno Rice 
494f9bac91bSBenno Rice 	while (count--)
495f9bac91bSBenno Rice 		*d = val;
496f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
497f9bac91bSBenno Rice }
498f9bac91bSBenno Rice 
499f9bac91bSBenno Rice static __inline void
500f9bac91bSBenno Rice bus_space_set_multi_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh,
501f9bac91bSBenno Rice     bus_size_t offset, u_int32_t val, size_t count)
502f9bac91bSBenno Rice {
503f9bac91bSBenno Rice 	volatile u_int32_t *d = __BA(tag, bsh, offset);
504f9bac91bSBenno Rice 
505f9bac91bSBenno Rice 	while (count--)
506f9bac91bSBenno Rice 		*d = val;
507f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
508f9bac91bSBenno Rice }
509f9bac91bSBenno Rice 
510f9bac91bSBenno Rice #if 0
511f9bac91bSBenno Rice #define	bus_space_set_multi_stream_8	!!! unimplemented !!!
512f9bac91bSBenno Rice #endif
513f9bac91bSBenno Rice 
514f9bac91bSBenno Rice /*
515f9bac91bSBenno Rice  *	void bus_space_set_region_N __P((bus_space_tag_t tag,
516f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
517f9bac91bSBenno Rice  *	    size_t count));
518f9bac91bSBenno Rice  *
519f9bac91bSBenno Rice  * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
520f9bac91bSBenno Rice  * by tag/handle starting at `offset'.
521f9bac91bSBenno Rice  */
522f9bac91bSBenno Rice 
523f9bac91bSBenno Rice static __inline void
524f9bac91bSBenno Rice bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t bsh,
525f9bac91bSBenno Rice     bus_size_t offset, u_int8_t val, size_t count)
526f9bac91bSBenno Rice {
527f9bac91bSBenno Rice 	volatile u_int8_t *d = __BA(tag, bsh, offset);
528f9bac91bSBenno Rice 
529f9bac91bSBenno Rice 	while (count--)
530f9bac91bSBenno Rice 		*d++ = val;
531f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
532f9bac91bSBenno Rice }
533f9bac91bSBenno Rice 
534f9bac91bSBenno Rice static __inline void
535f9bac91bSBenno Rice bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t bsh,
536f9bac91bSBenno Rice     bus_size_t offset, u_int16_t val, size_t count)
537f9bac91bSBenno Rice {
538f9bac91bSBenno Rice 	volatile u_int16_t *d = __BA(tag, bsh, offset);
539f9bac91bSBenno Rice 
540f9bac91bSBenno Rice 	while (count--)
541f9bac91bSBenno Rice 		__asm __volatile("sthbrx %0, 0, %1" ::
542f9bac91bSBenno Rice 			"r"(val), "r"(d++));
543f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
544f9bac91bSBenno Rice }
545f9bac91bSBenno Rice 
546f9bac91bSBenno Rice static __inline void
547f9bac91bSBenno Rice bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t bsh,
548f9bac91bSBenno Rice     bus_size_t offset, u_int32_t val, size_t count)
549f9bac91bSBenno Rice {
550f9bac91bSBenno Rice 	volatile u_int32_t *d = __BA(tag, bsh, offset);
551f9bac91bSBenno Rice 
552f9bac91bSBenno Rice 	while (count--)
553f9bac91bSBenno Rice 		__asm __volatile("stwbrx %0, 0, %1" ::
554f9bac91bSBenno Rice 			"r"(val), "r"(d++));
555f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
556f9bac91bSBenno Rice }
557f9bac91bSBenno Rice 
558f9bac91bSBenno Rice #if 0
559f9bac91bSBenno Rice #define	bus_space_set_region_8 !!! bus_space_set_region_8 unimplemented !!!
560f9bac91bSBenno Rice #endif
561f9bac91bSBenno Rice 
562f9bac91bSBenno Rice static __inline void
563f9bac91bSBenno Rice bus_space_set_region_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh,
564f9bac91bSBenno Rice     bus_size_t offset, u_int16_t val, size_t count)
565f9bac91bSBenno Rice {
566f9bac91bSBenno Rice 	volatile u_int16_t *d = __BA(tag, bsh, offset);
567f9bac91bSBenno Rice 
568f9bac91bSBenno Rice 	while (count--)
569f9bac91bSBenno Rice 		*d++ = val;
570f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
571f9bac91bSBenno Rice }
572f9bac91bSBenno Rice 
573f9bac91bSBenno Rice static __inline void
574f9bac91bSBenno Rice bus_space_set_region_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh,
575f9bac91bSBenno Rice     bus_size_t offset, u_int32_t val, size_t count)
576f9bac91bSBenno Rice {
577f9bac91bSBenno Rice 	volatile u_int32_t *d = __BA(tag, bsh, offset);
578f9bac91bSBenno Rice 
579f9bac91bSBenno Rice 	while (count--)
580f9bac91bSBenno Rice 		*d++ = val;
581f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
582f9bac91bSBenno Rice }
583f9bac91bSBenno Rice 
584f9bac91bSBenno Rice #if 0
585f9bac91bSBenno Rice #define	bus_space_set_region_stream_8	!!! unimplemented !!!
586f9bac91bSBenno Rice #endif
587f9bac91bSBenno Rice 
588f9bac91bSBenno Rice /*
589f9bac91bSBenno Rice  *	void bus_space_copy_region_N __P((bus_space_tag_t tag,
590f9bac91bSBenno Rice  *	    bus_space_handle_t bsh1, bus_size_t off1,
591f9bac91bSBenno Rice  *	    bus_space_handle_t bsh2, bus_size_t off2,
592f9bac91bSBenno Rice  *	    size_t count));
593f9bac91bSBenno Rice  *
594f9bac91bSBenno Rice  * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
595f9bac91bSBenno Rice  * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
596f9bac91bSBenno Rice  */
597f9bac91bSBenno Rice 
598f9bac91bSBenno Rice 	/* XXX IMPLEMENT bus_space_copy_N() XXX */
599f9bac91bSBenno Rice 
600f9bac91bSBenno Rice /*
601f9bac91bSBenno Rice  * Bus read/write barrier methods.
602f9bac91bSBenno Rice  *
603f9bac91bSBenno Rice  *	void bus_space_barrier __P((bus_space_tag_t tag,
604f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset,
605f9bac91bSBenno Rice  *	    bus_size_t len, int flags));
606f9bac91bSBenno Rice  *
607f9bac91bSBenno Rice  * Note: the macppc does not currently require barriers, but we must
608f9bac91bSBenno Rice  * provide the flags to MI code.
609f9bac91bSBenno Rice  */
610f9bac91bSBenno Rice 
611f9bac91bSBenno Rice #define bus_space_barrier(t, h, o, l, f)	\
612f9bac91bSBenno Rice 	((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f)))
613f9bac91bSBenno Rice #define	BUS_SPACE_BARRIER_READ	0x01		/* force read barrier */
614f9bac91bSBenno Rice #define	BUS_SPACE_BARRIER_WRITE	0x02		/* force write barrier */
615f9bac91bSBenno Rice 
616f9bac91bSBenno Rice #define	BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
617f9bac91bSBenno Rice 
618f9bac91bSBenno Rice /*
619f9bac91bSBenno Rice  * Bus DMA methods.
620f9bac91bSBenno Rice  */
621f9bac91bSBenno Rice 
622f9bac91bSBenno Rice /*
623f9bac91bSBenno Rice  * Flags used in various bus DMA methods.
624f9bac91bSBenno Rice  */
625f9bac91bSBenno Rice #define	BUS_DMA_WAITOK		0x00	/* safe to sleep (pseudo-flag) */
626f9bac91bSBenno Rice #define	BUS_DMA_NOWAIT		0x01	/* not safe to sleep */
627f9bac91bSBenno Rice #define	BUS_DMA_ALLOCNOW	0x02	/* perform resource allocation now */
628f9bac91bSBenno Rice #define	BUS_DMA_COHERENT	0x04	/* hint: map memory DMA coherent */
629f9bac91bSBenno Rice #define	BUS_DMA_BUS1		0x10	/* placeholders for bus functions... */
630f9bac91bSBenno Rice #define	BUS_DMA_BUS2		0x20
631f9bac91bSBenno Rice #define	BUS_DMA_BUS3		0x40
632f9bac91bSBenno Rice #define	BUS_DMA_BUS4		0x80
633f9bac91bSBenno Rice 
634f9bac91bSBenno Rice /* Forwards needed by prototypes below. */
635f9bac91bSBenno Rice struct mbuf;
636f9bac91bSBenno Rice struct uio;
637f9bac91bSBenno Rice 
638f9bac91bSBenno Rice /*
639f9bac91bSBenno Rice  * Operations performed by bus_dmamap_sync().
640f9bac91bSBenno Rice  */
641f9bac91bSBenno Rice #define	BUS_DMASYNC_PREREAD	0x01	/* pre-read synchronization */
642f9bac91bSBenno Rice #define	BUS_DMASYNC_POSTREAD	0x02	/* post-read synchronization */
643f9bac91bSBenno Rice #define	BUS_DMASYNC_PREWRITE	0x04	/* pre-write synchronization */
644f9bac91bSBenno Rice #define	BUS_DMASYNC_POSTWRITE	0x08	/* post-write synchronization */
645f9bac91bSBenno Rice 
646f9bac91bSBenno Rice typedef struct macppc_bus_dma_tag	*bus_dma_tag_t;
647f9bac91bSBenno Rice typedef struct macppc_bus_dmamap	*bus_dmamap_t;
648f9bac91bSBenno Rice 
649f9bac91bSBenno Rice /*
650f9bac91bSBenno Rice  *	bus_dma_segment_t
651f9bac91bSBenno Rice  *
652f9bac91bSBenno Rice  *	Describes a single contiguous DMA transaction.  Values
653f9bac91bSBenno Rice  *	are suitable for programming into DMA registers.
654f9bac91bSBenno Rice  */
655f9bac91bSBenno Rice struct macppc_bus_dma_segment {
656f9bac91bSBenno Rice 	bus_addr_t	ds_addr;	/* DMA address */
657f9bac91bSBenno Rice 	bus_size_t	ds_len;		/* length of transfer */
658f9bac91bSBenno Rice };
659f9bac91bSBenno Rice typedef struct macppc_bus_dma_segment	bus_dma_segment_t;
660f9bac91bSBenno Rice 
661f9bac91bSBenno Rice /*
662f9bac91bSBenno Rice  *	bus_dma_tag_t
663f9bac91bSBenno Rice  *
664f9bac91bSBenno Rice  *	A machine-dependent opaque type describing the implementation of
665f9bac91bSBenno Rice  *	DMA for a given bus.
666f9bac91bSBenno Rice  */
667f9bac91bSBenno Rice 
668f9bac91bSBenno Rice struct macppc_bus_dma_tag {
669f9bac91bSBenno Rice 	/*
670f9bac91bSBenno Rice 	 * The `bounce threshold' is checked while we are loading
671f9bac91bSBenno Rice 	 * the DMA map.  If the physical address of the segment
672f9bac91bSBenno Rice 	 * exceeds the threshold, an error will be returned.  The
673f9bac91bSBenno Rice 	 * caller can then take whatever action is necessary to
674f9bac91bSBenno Rice 	 * bounce the transfer.  If this value is 0, it will be
675f9bac91bSBenno Rice 	 * ignored.
676f9bac91bSBenno Rice 	 */
677f9bac91bSBenno Rice 	bus_addr_t _bounce_thresh;
678f9bac91bSBenno Rice 
679f9bac91bSBenno Rice 	/*
680f9bac91bSBenno Rice 	 * DMA mapping methods.
681f9bac91bSBenno Rice 	 */
682f9bac91bSBenno Rice 	int	(*_dmamap_create) __P((bus_dma_tag_t, bus_size_t, int,
683f9bac91bSBenno Rice 		    bus_size_t, bus_size_t, int, bus_dmamap_t *));
684f9bac91bSBenno Rice 	void	(*_dmamap_destroy) __P((bus_dma_tag_t, bus_dmamap_t));
685f9bac91bSBenno Rice 	int	(*_dmamap_load) __P((bus_dma_tag_t, bus_dmamap_t, void *,
686f9bac91bSBenno Rice 		    bus_size_t, struct proc *, int));
687f9bac91bSBenno Rice 	int	(*_dmamap_load_mbuf) __P((bus_dma_tag_t, bus_dmamap_t,
688f9bac91bSBenno Rice 		    struct mbuf *, int));
689f9bac91bSBenno Rice 	int	(*_dmamap_load_uio) __P((bus_dma_tag_t, bus_dmamap_t,
690f9bac91bSBenno Rice 		    struct uio *, int));
691f9bac91bSBenno Rice 	int	(*_dmamap_load_raw) __P((bus_dma_tag_t, bus_dmamap_t,
692f9bac91bSBenno Rice 		    bus_dma_segment_t *, int, bus_size_t, int));
693f9bac91bSBenno Rice 	void	(*_dmamap_unload) __P((bus_dma_tag_t, bus_dmamap_t));
694f9bac91bSBenno Rice 	void	(*_dmamap_sync) __P((bus_dma_tag_t, bus_dmamap_t,
695f9bac91bSBenno Rice 		    bus_addr_t, bus_size_t, int));
696f9bac91bSBenno Rice 
697f9bac91bSBenno Rice 	/*
698f9bac91bSBenno Rice 	 * DMA memory utility functions.
699f9bac91bSBenno Rice 	 */
700f9bac91bSBenno Rice 	int	(*_dmamem_alloc) __P((bus_dma_tag_t, bus_size_t, bus_size_t,
701f9bac91bSBenno Rice 		    bus_size_t, bus_dma_segment_t *, int, int *, int));
702f9bac91bSBenno Rice 	void	(*_dmamem_free) __P((bus_dma_tag_t,
703f9bac91bSBenno Rice 		    bus_dma_segment_t *, int));
704f9bac91bSBenno Rice 	int	(*_dmamem_map) __P((bus_dma_tag_t, bus_dma_segment_t *,
705f9bac91bSBenno Rice 		    int, size_t, caddr_t *, int));
706f9bac91bSBenno Rice 	void	(*_dmamem_unmap) __P((bus_dma_tag_t, caddr_t, size_t));
707f9bac91bSBenno Rice 	vm_offset_t	(*_dmamem_mmap) __P((bus_dma_tag_t, bus_dma_segment_t *,
708f9bac91bSBenno Rice 		    int, off_t, int, int));
709f9bac91bSBenno Rice };
710f9bac91bSBenno Rice 
711f9bac91bSBenno Rice #define	bus_dmamap_create(t, s, n, m, b, f, p)			\
712f9bac91bSBenno Rice 	(*(t)->_dmamap_create)((t), (s), (n), (m), (b), (f), (p))
713f9bac91bSBenno Rice #define	bus_dmamap_destroy(t, p)				\
714f9bac91bSBenno Rice 	(*(t)->_dmamap_destroy)((t), (p))
715f9bac91bSBenno Rice #define	bus_dmamap_load(t, m, b, s, p, f)			\
716f9bac91bSBenno Rice 	(*(t)->_dmamap_load)((t), (m), (b), (s), (p), (f))
717f9bac91bSBenno Rice #define	bus_dmamap_load_mbuf(t, m, b, f)			\
718f9bac91bSBenno Rice 	(*(t)->_dmamap_load_mbuf)((t), (m), (b), (f))
719f9bac91bSBenno Rice #define	bus_dmamap_load_uio(t, m, u, f)				\
720f9bac91bSBenno Rice 	(*(t)->_dmamap_load_uio)((t), (m), (u), (f))
721f9bac91bSBenno Rice #define	bus_dmamap_load_raw(t, m, sg, n, s, f)			\
722f9bac91bSBenno Rice 	(*(t)->_dmamap_load_raw)((t), (m), (sg), (n), (s), (f))
723f9bac91bSBenno Rice #define	bus_dmamap_unload(t, p)					\
724f9bac91bSBenno Rice 	(*(t)->_dmamap_unload)((t), (p))
725f9bac91bSBenno Rice #define	bus_dmamap_sync(t, p, o, l, ops)			\
726f9bac91bSBenno Rice 	(void)((t)->_dmamap_sync ?				\
727f9bac91bSBenno Rice 	    (*(t)->_dmamap_sync)((t), (p), (o), (l), (ops)) : (void)0)
728f9bac91bSBenno Rice 
729f9bac91bSBenno Rice #define	bus_dmamem_alloc(t, s, a, b, sg, n, r, f)		\
730f9bac91bSBenno Rice 	(*(t)->_dmamem_alloc)((t), (s), (a), (b), (sg), (n), (r), (f))
731f9bac91bSBenno Rice #define	bus_dmamem_free(t, sg, n)				\
732f9bac91bSBenno Rice 	(*(t)->_dmamem_free)((t), (sg), (n))
733f9bac91bSBenno Rice #define	bus_dmamem_map(t, sg, n, s, k, f)			\
734f9bac91bSBenno Rice 	(*(t)->_dmamem_map)((t), (sg), (n), (s), (k), (f))
735f9bac91bSBenno Rice #define	bus_dmamem_unmap(t, k, s)				\
736f9bac91bSBenno Rice 	(*(t)->_dmamem_unmap)((t), (k), (s))
737f9bac91bSBenno Rice #define	bus_dmamem_mmap(t, sg, n, o, p, f)			\
738f9bac91bSBenno Rice 	(*(t)->_dmamem_mmap)((t), (sg), (n), (o), (p), (f))
739f9bac91bSBenno Rice 
740f9bac91bSBenno Rice /*
741f9bac91bSBenno Rice  *	bus_dmamap_t
742f9bac91bSBenno Rice  *
743f9bac91bSBenno Rice  *	Describes a DMA mapping.
744f9bac91bSBenno Rice  */
745f9bac91bSBenno Rice struct macppc_bus_dmamap {
746f9bac91bSBenno Rice 	/*
747f9bac91bSBenno Rice 	 * PRIVATE MEMBERS: not for use my machine-independent code.
748f9bac91bSBenno Rice 	 */
749f9bac91bSBenno Rice 	bus_size_t	 _dm_size;	/* largest DMA transfer mappable */
750f9bac91bSBenno Rice 	int		 _dm_segcnt;	/* number of segs this map can map */
751f9bac91bSBenno Rice 	bus_size_t	 _dm_maxsegsz;	/* largest possible segment */
752f9bac91bSBenno Rice 	bus_size_t	 _dm_boundary;	/* don't cross this */
753f9bac91bSBenno Rice 	bus_addr_t	 _dm_bounce_thresh; /* bounce threshold; see tag */
754f9bac91bSBenno Rice 	int		 _dm_flags;	/* misc. flags */
755f9bac91bSBenno Rice 
756f9bac91bSBenno Rice 	void		*_dm_cookie;	/* cookie for bus-specific functions */
757f9bac91bSBenno Rice 
758f9bac91bSBenno Rice 	/*
759f9bac91bSBenno Rice 	 * PUBLIC MEMBERS: these are used by machine-independent code.
760f9bac91bSBenno Rice 	 */
761f9bac91bSBenno Rice 	bus_size_t	dm_mapsize;	/* size of the mapping */
762f9bac91bSBenno Rice 	int		dm_nsegs;	/* # valid segments in mapping */
763f9bac91bSBenno Rice 	bus_dma_segment_t dm_segs[1];	/* segments; variable length */
764f9bac91bSBenno Rice };
765f9bac91bSBenno Rice 
766f9bac91bSBenno Rice #ifdef _MACPPC_BUS_DMA_PRIVATE
767f9bac91bSBenno Rice int	_bus_dmamap_create __P((bus_dma_tag_t, bus_size_t, int, bus_size_t,
768f9bac91bSBenno Rice 	    bus_size_t, int, bus_dmamap_t *));
769f9bac91bSBenno Rice void	_bus_dmamap_destroy __P((bus_dma_tag_t, bus_dmamap_t));
770f9bac91bSBenno Rice int	_bus_dmamap_load __P((bus_dma_tag_t, bus_dmamap_t, void *,
771f9bac91bSBenno Rice 	    bus_size_t, struct proc *, int));
772f9bac91bSBenno Rice int	_bus_dmamap_load_mbuf __P((bus_dma_tag_t, bus_dmamap_t,
773f9bac91bSBenno Rice 	    struct mbuf *, int));
774f9bac91bSBenno Rice int	_bus_dmamap_load_uio __P((bus_dma_tag_t, bus_dmamap_t,
775f9bac91bSBenno Rice 	    struct uio *, int));
776f9bac91bSBenno Rice int	_bus_dmamap_load_raw __P((bus_dma_tag_t, bus_dmamap_t,
777f9bac91bSBenno Rice 	    bus_dma_segment_t *, int, bus_size_t, int));
778f9bac91bSBenno Rice void	_bus_dmamap_unload __P((bus_dma_tag_t, bus_dmamap_t));
779f9bac91bSBenno Rice void	_bus_dmamap_sync __P((bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
780f9bac91bSBenno Rice 	    bus_size_t, int));
781f9bac91bSBenno Rice 
782f9bac91bSBenno Rice int	_bus_dmamem_alloc __P((bus_dma_tag_t tag, bus_size_t size,
783f9bac91bSBenno Rice 	    bus_size_t alignment, bus_size_t boundary,
784f9bac91bSBenno Rice 	    bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags));
785f9bac91bSBenno Rice void	_bus_dmamem_free __P((bus_dma_tag_t tag, bus_dma_segment_t *segs,
786f9bac91bSBenno Rice 	    int nsegs));
787f9bac91bSBenno Rice int	_bus_dmamem_map __P((bus_dma_tag_t tag, bus_dma_segment_t *segs,
788f9bac91bSBenno Rice 	    int nsegs, size_t size, caddr_t *kvap, int flags));
789f9bac91bSBenno Rice void	_bus_dmamem_unmap __P((bus_dma_tag_t tag, caddr_t kva,
790f9bac91bSBenno Rice 	    size_t size));
791f9bac91bSBenno Rice vm_offset_t	_bus_dmamem_mmap __P((bus_dma_tag_t tag,
792f9bac91bSBenno Rice 	    bus_dma_segment_t *segs,
793f9bac91bSBenno Rice 	    int nsegs, off_t off, int prot, int flags));
794f9bac91bSBenno Rice 
795f9bac91bSBenno Rice int	_bus_dmamem_alloc_range __P((bus_dma_tag_t tag, bus_size_t size,
796f9bac91bSBenno Rice 	    bus_size_t alignment, bus_size_t boundary,
797f9bac91bSBenno Rice 	    bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags,
798f9bac91bSBenno Rice 	    vm_offset_t low, vm_offset_t high));
799f9bac91bSBenno Rice 
800f9bac91bSBenno Rice #endif /* _MACPPC_BUS_DMA_PRIVATE */
801f9bac91bSBenno Rice 
802f9bac91bSBenno Rice #endif /* _MACPPC_BUS_H_ */
803