xref: /freebsd/sys/powerpc/include/bus.h (revision 5974e5c71cb4a1d9b23559c1f17f291e911dfb6a)
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 
3860727d8bSWarner Losh /*-
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 
7725b60a3bSBenno Rice #define BUS_SPACE_MAXSIZE_24BIT 0xFFFFFF
7825b60a3bSBenno Rice #define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF
79f6c912ddSMaxime Henrion #define BUS_SPACE_MAXSIZE       0xFFFFFFFF
8025b60a3bSBenno Rice #define BUS_SPACE_MAXADDR_24BIT 0xFFFFFF
8125b60a3bSBenno Rice #define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
8225b60a3bSBenno Rice #define BUS_SPACE_MAXADDR       0xFFFFFFFF
8325b60a3bSBenno Rice 
8425b60a3bSBenno Rice #define BUS_SPACE_UNRESTRICTED  (~0)
8525b60a3bSBenno Rice 
86f9bac91bSBenno Rice /*
87f9bac91bSBenno Rice  * Values for the macppc bus space tag, not to be used directly by MI code.
88f9bac91bSBenno Rice  */
89f9bac91bSBenno Rice 
90a5550be8SPeter Grehan #define	__BUS_SPACE_HAS_STREAM_METHODS 1
91f9bac91bSBenno Rice 
9225b60a3bSBenno Rice /*
93f9bac91bSBenno Rice  * Bus address and size types
94f9bac91bSBenno Rice  */
95f9bac91bSBenno Rice typedef u_int32_t bus_addr_t;
96f9bac91bSBenno Rice typedef u_int32_t bus_size_t;
97f9bac91bSBenno Rice 
98f9bac91bSBenno Rice /*
991e1e0032SPeter Grehan  * Define the PPC tag values
1001e1e0032SPeter Grehan  */
1011e1e0032SPeter Grehan #define PPC_BUS_SPACE_MEM	1	/* space is mem space */
1021e1e0032SPeter Grehan #define PPC_BUS_SPACE_IO	2	/* space is io space */
1031e1e0032SPeter Grehan 
1041e1e0032SPeter Grehan /*
105f9bac91bSBenno Rice  * Access methods for bus resources and address space.
106f9bac91bSBenno Rice  */
107f9bac91bSBenno Rice typedef u_int32_t bus_space_tag_t;
108f9bac91bSBenno Rice typedef u_int32_t bus_space_handle_t;
109f9bac91bSBenno Rice 
11025b60a3bSBenno Rice static __inline void *
1111e1e0032SPeter Grehan __ppc_ba(bus_space_tag_t tag __unused, bus_space_handle_t handle,
1121e1e0032SPeter Grehan     bus_size_t offset)
11325b60a3bSBenno Rice {
1141e1e0032SPeter Grehan 	return ((void *)(handle + offset));
11525b60a3bSBenno Rice }
11625b60a3bSBenno Rice 
117f9bac91bSBenno Rice /*
118812344bcSAlfred Perlstein  *	int bus_space_map(bus_space_tag_t t, bus_addr_t addr,
119f9bac91bSBenno Rice  *	    bus_size_t size, int flags, bus_space_handle_t *bshp));
120f9bac91bSBenno Rice  *
121f9bac91bSBenno Rice  * Map a region of bus space.
122f9bac91bSBenno Rice  */
12325b60a3bSBenno Rice #if 0
12425b60a3bSBenno Rice bus_space_map(t, addr, size, flags, bshp) ! not implemented !
12525b60a3bSBenno Rice #endif
126f9bac91bSBenno Rice 
127f9bac91bSBenno Rice /*
128812344bcSAlfred Perlstein  *	int bus_space_unmap(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 
1341e1e0032SPeter Grehan static __inline void
1351e1e0032SPeter Grehan bus_space_unmap(bus_space_tag_t t __unused, bus_space_handle_t bsh __unused,
1361e1e0032SPeter Grehan                 bus_size_t size __unused)
1371e1e0032SPeter Grehan {
1381e1e0032SPeter Grehan }
139f9bac91bSBenno Rice 
140f9bac91bSBenno Rice /*
141812344bcSAlfred Perlstein  *	int bus_space_subregion(bus_space_tag_t t,
142f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset, bus_size_t size,
143f9bac91bSBenno Rice  *	    bus_space_handle_t *nbshp));
144f9bac91bSBenno Rice  *
145f9bac91bSBenno Rice  * Get a new handle for a subregion of an already-mapped area of bus space.
146f9bac91bSBenno Rice  */
147f9bac91bSBenno Rice 
1481e1e0032SPeter Grehan static __inline int
1491e1e0032SPeter Grehan bus_space_subregion(bus_space_tag_t t __unused, bus_space_handle_t bsh,
1501e1e0032SPeter Grehan     bus_size_t offset, bus_size_t size __unused, bus_space_handle_t *nbshp)
1511e1e0032SPeter Grehan {
1521e1e0032SPeter Grehan 	*nbshp = bsh + offset;
1531e1e0032SPeter Grehan 	return (0);
1541e1e0032SPeter Grehan }
1551e1e0032SPeter Grehan 
156f9bac91bSBenno Rice /*
157812344bcSAlfred Perlstein  *	int bus_space_alloc(bus_space_tag_t t, bus_addr_t rstart,
158f9bac91bSBenno Rice  *	    bus_addr_t rend, bus_size_t size, bus_size_t align,
159f9bac91bSBenno Rice  *	    bus_size_t boundary, int flags, bus_addr_t *addrp,
160f9bac91bSBenno Rice  *	    bus_space_handle_t *bshp));
161f9bac91bSBenno Rice  *
162f9bac91bSBenno Rice  * Allocate a region of bus space.
163f9bac91bSBenno Rice  */
164f9bac91bSBenno Rice 
165f9bac91bSBenno Rice #if 0
166f9bac91bSBenno Rice #define	bus_space_alloc(t, rs, re, s, a, b, f, ap, hp)	!!! unimplemented !!!
167f9bac91bSBenno Rice #endif
168f9bac91bSBenno Rice 
169f9bac91bSBenno Rice /*
170812344bcSAlfred Perlstein  *	int bus_space_free(bus_space_tag_t t,
171f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t size));
172f9bac91bSBenno Rice  *
173f9bac91bSBenno Rice  * Free a region of bus space.
174f9bac91bSBenno Rice  */
175f9bac91bSBenno Rice #if 0
176f9bac91bSBenno Rice #define	bus_space_free(t, h, s)		!!! unimplemented !!!
177f9bac91bSBenno Rice #endif
178f9bac91bSBenno Rice 
179f9bac91bSBenno Rice /*
180812344bcSAlfred Perlstein  *	u_intN_t bus_space_read_N(bus_space_tag_t tag,
181f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset));
182f9bac91bSBenno Rice  *
183f9bac91bSBenno Rice  * Read a 1, 2, 4, or 8 byte quantity from bus space
184f9bac91bSBenno Rice  * described by tag/handle/offset.
185f9bac91bSBenno Rice  */
186f9bac91bSBenno Rice 
1871e1e0032SPeter Grehan static __inline u_int8_t
1881e1e0032SPeter Grehan bus_space_read_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
1891e1e0032SPeter Grehan {
1901e1e0032SPeter Grehan 	return (in8(__ppc_ba(t, h, o)));
1911e1e0032SPeter Grehan }
1921e1e0032SPeter Grehan 
1931e1e0032SPeter Grehan static __inline u_int16_t
1941e1e0032SPeter Grehan bus_space_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
1951e1e0032SPeter Grehan {
1961e1e0032SPeter Grehan 	return (in16rb(__ppc_ba(t, h, o)));
1971e1e0032SPeter Grehan }
1981e1e0032SPeter Grehan 
1991e1e0032SPeter Grehan static __inline u_int32_t
2001e1e0032SPeter Grehan bus_space_read_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
2011e1e0032SPeter Grehan {
2021e1e0032SPeter Grehan 	return (in32rb(__ppc_ba(t, h, o)));
2031e1e0032SPeter Grehan }
2041e1e0032SPeter Grehan 
205f9bac91bSBenno Rice #if 0	/* Cause a link error for bus_space_read_8 */
206f9bac91bSBenno Rice #define	bus_space_read_8(t, h, o)	!!! unimplemented !!!
207f9bac91bSBenno Rice #endif
208f9bac91bSBenno Rice 
2091e1e0032SPeter Grehan static __inline u_int8_t
2101e1e0032SPeter Grehan bus_space_read_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
2111e1e0032SPeter Grehan {
2121e1e0032SPeter Grehan 	return (in8(__ppc_ba(t, h, o)));
2131e1e0032SPeter Grehan }
2141e1e0032SPeter Grehan 
2151e1e0032SPeter Grehan static __inline u_int16_t
2161e1e0032SPeter Grehan bus_space_read_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
2171e1e0032SPeter Grehan {
2181e1e0032SPeter Grehan 	return (in16(__ppc_ba(t, h, o)));
2191e1e0032SPeter Grehan }
2201e1e0032SPeter Grehan 
2211e1e0032SPeter Grehan static __inline u_int32_t
2221e1e0032SPeter Grehan bus_space_read_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
2231e1e0032SPeter Grehan {
2241e1e0032SPeter Grehan 	return (in32(__ppc_ba(t, h, o)));
2251e1e0032SPeter Grehan }
2261e1e0032SPeter Grehan 
227f9bac91bSBenno Rice #if 0	/* Cause a link error for bus_space_read_stream_8 */
228a5550be8SPeter Grehan #define	bus_space_read_stream_8(t, h, o)	!!! unimplemented !!!
229f9bac91bSBenno Rice #endif
230f9bac91bSBenno Rice 
231f9bac91bSBenno Rice /*
232812344bcSAlfred Perlstein  *	void bus_space_read_multi_N(bus_space_tag_t tag,
233f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset,
234f9bac91bSBenno Rice  *	    u_intN_t *addr, size_t count));
235f9bac91bSBenno Rice  *
236f9bac91bSBenno Rice  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
237f9bac91bSBenno Rice  * described by tag/handle/offset and copy into buffer provided.
238f9bac91bSBenno Rice  */
239f9bac91bSBenno Rice 
2401e1e0032SPeter Grehan static __inline void
2411e1e0032SPeter Grehan bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
2421e1e0032SPeter Grehan     u_int8_t *a, size_t c)
2431e1e0032SPeter Grehan {
2441e1e0032SPeter Grehan 	ins8(__ppc_ba(t, h, o), a, c);
2451e1e0032SPeter Grehan }
246f9bac91bSBenno Rice 
2471e1e0032SPeter Grehan static __inline void
2481e1e0032SPeter Grehan bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
2491e1e0032SPeter Grehan     u_int16_t *a, size_t c)
2501e1e0032SPeter Grehan {
2511e1e0032SPeter Grehan 	ins16rb(__ppc_ba(t, h, o), a, c);
2521e1e0032SPeter Grehan }
253f9bac91bSBenno Rice 
2541e1e0032SPeter Grehan static __inline void
2551e1e0032SPeter Grehan bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
2561e1e0032SPeter Grehan     u_int32_t *a, size_t c)
2571e1e0032SPeter Grehan {
2581e1e0032SPeter Grehan 	ins32rb(__ppc_ba(t, h, o), a, c);
2591e1e0032SPeter Grehan }
260f9bac91bSBenno Rice 
261f9bac91bSBenno Rice #if 0	/* Cause a link error for bus_space_read_multi_8 */
262f9bac91bSBenno Rice #define	bus_space_read_multi_8		!!! unimplemented !!!
263f9bac91bSBenno Rice #endif
264f9bac91bSBenno Rice 
2651e1e0032SPeter Grehan static __inline void
2661e1e0032SPeter Grehan bus_space_read_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h,
2671e1e0032SPeter Grehan     bus_size_t o, u_int8_t *a, size_t c)
2681e1e0032SPeter Grehan {
2691e1e0032SPeter Grehan 	ins8(__ppc_ba(t, h, o), a, c);
2701e1e0032SPeter Grehan }
271f9bac91bSBenno Rice 
2721e1e0032SPeter Grehan static __inline void
2731e1e0032SPeter Grehan bus_space_read_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h,
2741e1e0032SPeter Grehan     bus_size_t o, u_int16_t *a, size_t c)
2751e1e0032SPeter Grehan {
2761e1e0032SPeter Grehan 	ins16(__ppc_ba(t, h, o), a, c);
2771e1e0032SPeter Grehan }
278f9bac91bSBenno Rice 
2791e1e0032SPeter Grehan static __inline void
2801e1e0032SPeter Grehan bus_space_read_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h,
2811e1e0032SPeter Grehan     bus_size_t o, u_int32_t *a, size_t c)
2821e1e0032SPeter Grehan {
2831e1e0032SPeter Grehan 	ins32(__ppc_ba(t, h, o), a, c);
2841e1e0032SPeter Grehan }
285f9bac91bSBenno Rice 
286f9bac91bSBenno Rice #if 0	/* Cause a link error for bus_space_read_multi_stream_8 */
287f9bac91bSBenno Rice #define	bus_space_read_multi_stream_8	!!! unimplemented !!!
288f9bac91bSBenno Rice #endif
289f9bac91bSBenno Rice 
290f9bac91bSBenno Rice /*
291812344bcSAlfred Perlstein  *	void bus_space_read_region_N(bus_space_tag_t tag,
292f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset,
293f9bac91bSBenno Rice  *	    u_intN_t *addr, size_t count));
294f9bac91bSBenno Rice  *
295f9bac91bSBenno Rice  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
296f9bac91bSBenno Rice  * described by tag/handle and starting at `offset' and copy into
297f9bac91bSBenno Rice  * buffer provided.
298f9bac91bSBenno Rice  */
299f9bac91bSBenno Rice 
300f9bac91bSBenno Rice static __inline void
301f9bac91bSBenno Rice bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t bsh,
302f9bac91bSBenno Rice     bus_size_t offset, u_int8_t *addr, size_t count)
303f9bac91bSBenno Rice {
30425b60a3bSBenno Rice 	volatile u_int8_t *s = __ppc_ba(tag, bsh, offset);
305f9bac91bSBenno Rice 
306f9bac91bSBenno Rice 	while (count--)
307f9bac91bSBenno Rice 		*addr++ = *s++;
308f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
309f9bac91bSBenno Rice }
310f9bac91bSBenno Rice 
311f9bac91bSBenno Rice static __inline void
312f9bac91bSBenno Rice bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t bsh,
313f9bac91bSBenno Rice     bus_size_t offset, u_int16_t *addr, size_t count)
314f9bac91bSBenno Rice {
31525b60a3bSBenno Rice 	volatile u_int16_t *s = __ppc_ba(tag, bsh, offset);
316f9bac91bSBenno Rice 
317f9bac91bSBenno Rice 	while (count--)
318f9bac91bSBenno Rice 		__asm __volatile("lhbrx %0, 0, %1" :
319f9bac91bSBenno Rice 			"=r"(*addr++) : "r"(s++));
320f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
321f9bac91bSBenno Rice }
322f9bac91bSBenno Rice 
323f9bac91bSBenno Rice static __inline void
324f9bac91bSBenno Rice bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t bsh,
325f9bac91bSBenno Rice     bus_size_t offset, u_int32_t *addr, size_t count)
326f9bac91bSBenno Rice {
32725b60a3bSBenno Rice 	volatile u_int32_t *s = __ppc_ba(tag, bsh, offset);
328f9bac91bSBenno Rice 
329f9bac91bSBenno Rice 	while (count--)
330f9bac91bSBenno Rice 		__asm __volatile("lwbrx %0, 0, %1" :
331f9bac91bSBenno Rice 			"=r"(*addr++) : "r"(s++));
332f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
333f9bac91bSBenno Rice }
334f9bac91bSBenno Rice 
335f9bac91bSBenno Rice #if 0	/* Cause a link error for bus_space_read_region_8 */
336f9bac91bSBenno Rice #define	bus_space_read_region_8		!!! unimplemented !!!
337f9bac91bSBenno Rice #endif
338f9bac91bSBenno Rice 
339f9bac91bSBenno Rice static __inline void
340f9bac91bSBenno Rice bus_space_read_region_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh,
341f9bac91bSBenno Rice     bus_size_t offset, u_int16_t *addr, size_t count)
342f9bac91bSBenno Rice {
34325b60a3bSBenno Rice 	volatile u_int16_t *s = __ppc_ba(tag, bsh, offset);
344f9bac91bSBenno Rice 
345f9bac91bSBenno Rice 	while (count--)
346f9bac91bSBenno Rice 		*addr++ = *s++;
347f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
348f9bac91bSBenno Rice }
349f9bac91bSBenno Rice 
350f9bac91bSBenno Rice static __inline void
351f9bac91bSBenno Rice bus_space_read_region_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh,
352f9bac91bSBenno Rice     bus_size_t offset, u_int32_t *addr, size_t count)
353f9bac91bSBenno Rice {
35425b60a3bSBenno Rice 	volatile u_int32_t *s = __ppc_ba(tag, bsh, offset);
355f9bac91bSBenno Rice 
356f9bac91bSBenno Rice 	while (count--)
357f9bac91bSBenno Rice 		*addr++ = *s++;
358f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
359f9bac91bSBenno Rice }
360f9bac91bSBenno Rice 
361f9bac91bSBenno Rice #if 0	/* Cause a link error */
362f9bac91bSBenno Rice #define	bus_space_read_region_stream_8		!!! unimplemented !!!
363f9bac91bSBenno Rice #endif
364f9bac91bSBenno Rice 
365f9bac91bSBenno Rice /*
366812344bcSAlfred Perlstein  *	void bus_space_write_N(bus_space_tag_t tag,
367f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset,
368f9bac91bSBenno Rice  *	    u_intN_t value));
369f9bac91bSBenno Rice  *
370f9bac91bSBenno Rice  * Write the 1, 2, 4, or 8 byte value `value' to bus space
371f9bac91bSBenno Rice  * described by tag/handle/offset.
372f9bac91bSBenno Rice  */
373f9bac91bSBenno Rice 
3741e1e0032SPeter Grehan static __inline void
3751e1e0032SPeter Grehan bus_space_write_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
3761e1e0032SPeter Grehan     uint8_t v)
3771e1e0032SPeter Grehan {
3781e1e0032SPeter Grehan 	out8(__ppc_ba(t, h, o), v);
3791e1e0032SPeter Grehan }
380f9bac91bSBenno Rice 
3811e1e0032SPeter Grehan static __inline void
3821e1e0032SPeter Grehan bus_space_write_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
3831e1e0032SPeter Grehan     uint16_t v)
3841e1e0032SPeter Grehan {
3851e1e0032SPeter Grehan 	out16rb(__ppc_ba(t, h, o), v);
3861e1e0032SPeter Grehan }
3871e1e0032SPeter Grehan 
3881e1e0032SPeter Grehan static __inline void
3891e1e0032SPeter Grehan bus_space_write_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
3901e1e0032SPeter Grehan     uint32_t v)
3911e1e0032SPeter Grehan {
3921e1e0032SPeter Grehan 	out32rb(__ppc_ba(t, h, o), v);
3931e1e0032SPeter Grehan }
394f9bac91bSBenno Rice 
395f9bac91bSBenno Rice #if 0	/* Cause a link error for bus_space_write_8 */
396f9bac91bSBenno Rice #define bus_space_write_8		!!! unimplemented !!!
397f9bac91bSBenno Rice #endif
398f9bac91bSBenno Rice 
3991e1e0032SPeter Grehan static __inline void
4001e1e0032SPeter Grehan bus_space_write_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
4011e1e0032SPeter Grehan     uint8_t v)
4021e1e0032SPeter Grehan {
4031e1e0032SPeter Grehan 	out8(__ppc_ba(t, h, o), v);
4041e1e0032SPeter Grehan }
4051e1e0032SPeter Grehan 
4061e1e0032SPeter Grehan static __inline void
4071e1e0032SPeter Grehan bus_space_write_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
4081e1e0032SPeter Grehan     uint16_t v)
4091e1e0032SPeter Grehan {
4101e1e0032SPeter Grehan 	out16(__ppc_ba(t, h, o), v);
4111e1e0032SPeter Grehan }
4121e1e0032SPeter Grehan 
4131e1e0032SPeter Grehan static __inline void
4141e1e0032SPeter Grehan bus_space_write_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
4151e1e0032SPeter Grehan     uint32_t v)
4161e1e0032SPeter Grehan {
4171e1e0032SPeter Grehan 	out32(__ppc_ba(t, h, o), v);
4181e1e0032SPeter Grehan }
4191e1e0032SPeter Grehan 
4201e1e0032SPeter Grehan #if 0	/* Cause a link error for bus_space_write_stream_8 */
4211e1e0032SPeter Grehan #define bus_space_write_stream_8       	!!! unimplemented !!!
4221e1e0032SPeter Grehan #endif
4231e1e0032SPeter Grehan 
4241e1e0032SPeter Grehan 
425f9bac91bSBenno Rice /*
426812344bcSAlfred Perlstein  *	void bus_space_write_multi_N(bus_space_tag_t tag,
427f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset,
428f9bac91bSBenno Rice  *	    const u_intN_t *addr, size_t count));
429f9bac91bSBenno Rice  *
430f9bac91bSBenno Rice  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
431f9bac91bSBenno Rice  * provided to bus space described by tag/handle/offset.
432f9bac91bSBenno Rice  */
433f9bac91bSBenno Rice 
4341e1e0032SPeter Grehan static __inline void
4351e1e0032SPeter Grehan bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
4361e1e0032SPeter Grehan     uint8_t *a, size_t c)
4371e1e0032SPeter Grehan {
4381e1e0032SPeter Grehan 	outsb(__ppc_ba(t, h, o), a, c);
4391e1e0032SPeter Grehan }
440f9bac91bSBenno Rice 
4411e1e0032SPeter Grehan static __inline void
4421e1e0032SPeter Grehan bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
4431e1e0032SPeter Grehan     uint16_t *a, size_t c)
4441e1e0032SPeter Grehan {
4451e1e0032SPeter Grehan 	outsw(__ppc_ba(t, h, o), a, c);
4461e1e0032SPeter Grehan }
447f9bac91bSBenno Rice 
4481e1e0032SPeter Grehan static __inline void
4491e1e0032SPeter Grehan bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
4501e1e0032SPeter Grehan     uint32_t *a, size_t c)
4511e1e0032SPeter Grehan {
4521e1e0032SPeter Grehan 	outsl(__ppc_ba(t, h, o), a, c);
4531e1e0032SPeter Grehan }
454f9bac91bSBenno Rice 
455f9bac91bSBenno Rice #if 0
456f9bac91bSBenno Rice #define bus_space_write_multi_8		!!! unimplemented !!!
457f9bac91bSBenno Rice #endif
458f9bac91bSBenno Rice 
4591e1e0032SPeter Grehan static __inline void
4601e1e0032SPeter Grehan bus_space_write_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h,
4611e1e0032SPeter Grehan     bus_size_t o, const u_int8_t *a, size_t c)
4621e1e0032SPeter Grehan {
4631e1e0032SPeter Grehan 	outsb(__ppc_ba(t, h, o), a, c);
4641e1e0032SPeter Grehan }
465f9bac91bSBenno Rice 
4661e1e0032SPeter Grehan static __inline void
4671e1e0032SPeter Grehan bus_space_write_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h,
4681e1e0032SPeter Grehan     bus_size_t o, const u_int16_t *a, size_t c)
4691e1e0032SPeter Grehan {
4701e1e0032SPeter Grehan 	outsw(__ppc_ba(t, h, o), a, c);
4711e1e0032SPeter Grehan }
4721e1e0032SPeter Grehan 
4731e1e0032SPeter Grehan static __inline void
4741e1e0032SPeter Grehan bus_space_write_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h,
4751e1e0032SPeter Grehan     bus_size_t o, const u_int32_t *a, size_t c)
4761e1e0032SPeter Grehan {
4771e1e0032SPeter Grehan 	outsl(__ppc_ba(t, h, o), a, c);
4781e1e0032SPeter Grehan }
479f9bac91bSBenno Rice 
480f9bac91bSBenno Rice #if 0
481f9bac91bSBenno Rice #define bus_space_write_multi_stream_8	!!! unimplemented !!!
482f9bac91bSBenno Rice #endif
483f9bac91bSBenno Rice 
484f9bac91bSBenno Rice /*
485812344bcSAlfred Perlstein  *	void bus_space_write_region_N(bus_space_tag_t tag,
486f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset,
487f9bac91bSBenno Rice  *	    const u_intN_t *addr, size_t count));
488f9bac91bSBenno Rice  *
489f9bac91bSBenno Rice  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided
490f9bac91bSBenno Rice  * to bus space described by tag/handle starting at `offset'.
491f9bac91bSBenno Rice  */
492f9bac91bSBenno Rice 
493f9bac91bSBenno Rice static __inline void
494f9bac91bSBenno Rice bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t bsh,
495f9bac91bSBenno Rice     bus_size_t offset, const u_int8_t *addr, size_t count)
496f9bac91bSBenno Rice {
49725b60a3bSBenno Rice 	volatile u_int8_t *d = __ppc_ba(tag, bsh, offset);
498f9bac91bSBenno Rice 
499f9bac91bSBenno Rice 	while (count--)
500f9bac91bSBenno Rice 		*d++ = *addr++;
501f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
502f9bac91bSBenno Rice }
503f9bac91bSBenno Rice 
504f9bac91bSBenno Rice static __inline void
505f9bac91bSBenno Rice bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t bsh,
506f9bac91bSBenno Rice     bus_size_t offset, const u_int16_t *addr, size_t count)
507f9bac91bSBenno Rice {
50825b60a3bSBenno Rice 	volatile u_int16_t *d = __ppc_ba(tag, bsh, offset);
509f9bac91bSBenno Rice 
510f9bac91bSBenno Rice 	while (count--)
511f9bac91bSBenno Rice 		__asm __volatile("sthbrx %0, 0, %1" ::
512f9bac91bSBenno Rice 			"r"(*addr++), "r"(d++));
513f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
514f9bac91bSBenno Rice }
515f9bac91bSBenno Rice 
516f9bac91bSBenno Rice static __inline void
517f9bac91bSBenno Rice bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t bsh,
518f9bac91bSBenno Rice     bus_size_t offset, const u_int32_t *addr, size_t count)
519f9bac91bSBenno Rice {
52025b60a3bSBenno Rice 	volatile u_int32_t *d = __ppc_ba(tag, bsh, offset);
521f9bac91bSBenno Rice 
522f9bac91bSBenno Rice 	while (count--)
523f9bac91bSBenno Rice 		__asm __volatile("stwbrx %0, 0, %1" ::
524f9bac91bSBenno Rice 			"r"(*addr++), "r"(d++));
525f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
526f9bac91bSBenno Rice }
527f9bac91bSBenno Rice 
528f9bac91bSBenno Rice #if 0
529f9bac91bSBenno Rice #define	bus_space_write_region_8 !!! bus_space_write_region_8 unimplemented !!!
530f9bac91bSBenno Rice #endif
531f9bac91bSBenno Rice 
532f9bac91bSBenno Rice static __inline void
533f9bac91bSBenno Rice bus_space_write_region_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh,
534f9bac91bSBenno Rice     bus_size_t offset, const u_int16_t *addr, size_t count)
535f9bac91bSBenno Rice {
53625b60a3bSBenno Rice 	volatile u_int16_t *d = __ppc_ba(tag, bsh, offset);
537f9bac91bSBenno Rice 
538f9bac91bSBenno Rice 	while (count--)
539f9bac91bSBenno Rice 		*d++ = *addr++;
540f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
541f9bac91bSBenno Rice }
542f9bac91bSBenno Rice 
543f9bac91bSBenno Rice static __inline void
544f9bac91bSBenno Rice bus_space_write_region_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh,
545f9bac91bSBenno Rice     bus_size_t offset, const u_int32_t *addr, size_t count)
546f9bac91bSBenno Rice {
54725b60a3bSBenno Rice 	volatile u_int32_t *d = __ppc_ba(tag, bsh, offset);
548f9bac91bSBenno Rice 
549f9bac91bSBenno Rice 	while (count--)
550f9bac91bSBenno Rice 		*d++ = *addr++;
551f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
552f9bac91bSBenno Rice }
553f9bac91bSBenno Rice 
554f9bac91bSBenno Rice #if 0
555f9bac91bSBenno Rice #define	bus_space_write_region_stream_8	!!! unimplemented !!!
556f9bac91bSBenno Rice #endif
557f9bac91bSBenno Rice 
558f9bac91bSBenno Rice /*
559812344bcSAlfred Perlstein  *	void bus_space_set_multi_N(bus_space_tag_t tag,
560f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
561f9bac91bSBenno Rice  *	    size_t count));
562f9bac91bSBenno Rice  *
563f9bac91bSBenno Rice  * Write the 1, 2, 4, or 8 byte value `val' to bus space described
564f9bac91bSBenno Rice  * by tag/handle/offset `count' times.
565f9bac91bSBenno Rice  */
566f9bac91bSBenno Rice 
567f9bac91bSBenno Rice static __inline void
568f9bac91bSBenno Rice bus_space_set_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh,
569f9bac91bSBenno Rice     bus_size_t offset, u_int8_t val, size_t count)
570f9bac91bSBenno Rice {
57125b60a3bSBenno Rice 	volatile u_int8_t *d = __ppc_ba(tag, bsh, offset);
572f9bac91bSBenno Rice 
573f9bac91bSBenno Rice 	while (count--)
574f9bac91bSBenno Rice 		*d = val;
575f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
576f9bac91bSBenno Rice }
577f9bac91bSBenno Rice 
578f9bac91bSBenno Rice static __inline void
579f9bac91bSBenno Rice bus_space_set_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh,
580f9bac91bSBenno Rice     bus_size_t offset, u_int16_t val, size_t count)
581f9bac91bSBenno Rice {
58225b60a3bSBenno Rice 	volatile u_int16_t *d = __ppc_ba(tag, bsh, offset);
583f9bac91bSBenno Rice 
584f9bac91bSBenno Rice 	while (count--)
585f9bac91bSBenno Rice 		__asm __volatile("sthbrx %0, 0, %1" ::
586f9bac91bSBenno Rice 			"r"(val), "r"(d));
587f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
588f9bac91bSBenno Rice }
589f9bac91bSBenno Rice 
590f9bac91bSBenno Rice static __inline void
591f9bac91bSBenno Rice bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh,
592f9bac91bSBenno Rice     bus_size_t offset, u_int32_t val, size_t count)
593f9bac91bSBenno Rice {
59425b60a3bSBenno Rice 	volatile u_int32_t *d = __ppc_ba(tag, bsh, offset);
595f9bac91bSBenno Rice 
596f9bac91bSBenno Rice 	while (count--)
597f9bac91bSBenno Rice 		__asm __volatile("stwbrx %0, 0, %1" ::
598f9bac91bSBenno Rice 			"r"(val), "r"(d));
599f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
600f9bac91bSBenno Rice }
601f9bac91bSBenno Rice 
602f9bac91bSBenno Rice #if 0
603f9bac91bSBenno Rice #define	bus_space_set_multi_8 !!! bus_space_set_multi_8 unimplemented !!!
604f9bac91bSBenno Rice #endif
605f9bac91bSBenno Rice 
606f9bac91bSBenno Rice static __inline void
607f9bac91bSBenno Rice bus_space_set_multi_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh,
608f9bac91bSBenno Rice     bus_size_t offset, u_int16_t val, size_t count)
609f9bac91bSBenno Rice {
61025b60a3bSBenno Rice 	volatile u_int16_t *d = __ppc_ba(tag, bsh, offset);
611f9bac91bSBenno Rice 
612f9bac91bSBenno Rice 	while (count--)
613f9bac91bSBenno Rice 		*d = val;
614f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
615f9bac91bSBenno Rice }
616f9bac91bSBenno Rice 
617f9bac91bSBenno Rice static __inline void
618f9bac91bSBenno Rice bus_space_set_multi_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh,
619f9bac91bSBenno Rice     bus_size_t offset, u_int32_t val, size_t count)
620f9bac91bSBenno Rice {
62125b60a3bSBenno Rice 	volatile u_int32_t *d = __ppc_ba(tag, bsh, offset);
622f9bac91bSBenno Rice 
623f9bac91bSBenno Rice 	while (count--)
624f9bac91bSBenno Rice 		*d = val;
625f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
626f9bac91bSBenno Rice }
627f9bac91bSBenno Rice 
628f9bac91bSBenno Rice #if 0
629f9bac91bSBenno Rice #define	bus_space_set_multi_stream_8	!!! unimplemented !!!
630f9bac91bSBenno Rice #endif
631f9bac91bSBenno Rice 
632f9bac91bSBenno Rice /*
633812344bcSAlfred Perlstein  *	void bus_space_set_region_N(bus_space_tag_t tag,
634f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
635f9bac91bSBenno Rice  *	    size_t count));
636f9bac91bSBenno Rice  *
637f9bac91bSBenno Rice  * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
638f9bac91bSBenno Rice  * by tag/handle starting at `offset'.
639f9bac91bSBenno Rice  */
640f9bac91bSBenno Rice 
641f9bac91bSBenno Rice static __inline void
642f9bac91bSBenno Rice bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t bsh,
643f9bac91bSBenno Rice     bus_size_t offset, u_int8_t val, size_t count)
644f9bac91bSBenno Rice {
64525b60a3bSBenno Rice 	volatile u_int8_t *d = __ppc_ba(tag, bsh, offset);
646f9bac91bSBenno Rice 
647f9bac91bSBenno Rice 	while (count--)
648f9bac91bSBenno Rice 		*d++ = val;
649f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
650f9bac91bSBenno Rice }
651f9bac91bSBenno Rice 
652f9bac91bSBenno Rice static __inline void
653f9bac91bSBenno Rice bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t bsh,
654f9bac91bSBenno Rice     bus_size_t offset, u_int16_t val, size_t count)
655f9bac91bSBenno Rice {
65625b60a3bSBenno Rice 	volatile u_int16_t *d = __ppc_ba(tag, bsh, offset);
657f9bac91bSBenno Rice 
658f9bac91bSBenno Rice 	while (count--)
659f9bac91bSBenno Rice 		__asm __volatile("sthbrx %0, 0, %1" ::
660f9bac91bSBenno Rice 			"r"(val), "r"(d++));
661f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
662f9bac91bSBenno Rice }
663f9bac91bSBenno Rice 
664f9bac91bSBenno Rice static __inline void
665f9bac91bSBenno Rice bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t bsh,
666f9bac91bSBenno Rice     bus_size_t offset, u_int32_t val, size_t count)
667f9bac91bSBenno Rice {
66825b60a3bSBenno Rice 	volatile u_int32_t *d = __ppc_ba(tag, bsh, offset);
669f9bac91bSBenno Rice 
670f9bac91bSBenno Rice 	while (count--)
671f9bac91bSBenno Rice 		__asm __volatile("stwbrx %0, 0, %1" ::
672f9bac91bSBenno Rice 			"r"(val), "r"(d++));
673f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
674f9bac91bSBenno Rice }
675f9bac91bSBenno Rice 
676f9bac91bSBenno Rice #if 0
677f9bac91bSBenno Rice #define	bus_space_set_region_8 !!! bus_space_set_region_8 unimplemented !!!
678f9bac91bSBenno Rice #endif
679f9bac91bSBenno Rice 
680f9bac91bSBenno Rice static __inline void
681f9bac91bSBenno Rice bus_space_set_region_stream_2(bus_space_tag_t tag, bus_space_handle_t bsh,
682f9bac91bSBenno Rice     bus_size_t offset, u_int16_t val, size_t count)
683f9bac91bSBenno Rice {
68425b60a3bSBenno Rice 	volatile u_int16_t *d = __ppc_ba(tag, bsh, offset);
685f9bac91bSBenno Rice 
686f9bac91bSBenno Rice 	while (count--)
687f9bac91bSBenno Rice 		*d++ = val;
688f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
689f9bac91bSBenno Rice }
690f9bac91bSBenno Rice 
691f9bac91bSBenno Rice static __inline void
692f9bac91bSBenno Rice bus_space_set_region_stream_4(bus_space_tag_t tag, bus_space_handle_t bsh,
693f9bac91bSBenno Rice     bus_size_t offset, u_int32_t val, size_t count)
694f9bac91bSBenno Rice {
69525b60a3bSBenno Rice 	volatile u_int32_t *d = __ppc_ba(tag, bsh, offset);
696f9bac91bSBenno Rice 
697f9bac91bSBenno Rice 	while (count--)
698f9bac91bSBenno Rice 		*d++ = val;
699f9bac91bSBenno Rice 	__asm __volatile("eieio; sync");
700f9bac91bSBenno Rice }
701f9bac91bSBenno Rice 
702f9bac91bSBenno Rice #if 0
703f9bac91bSBenno Rice #define	bus_space_set_region_stream_8	!!! unimplemented !!!
704f9bac91bSBenno Rice #endif
705f9bac91bSBenno Rice 
706f9bac91bSBenno Rice /*
707812344bcSAlfred Perlstein  *	void bus_space_copy_region_N(bus_space_tag_t tag,
708f9bac91bSBenno Rice  *	    bus_space_handle_t bsh1, bus_size_t off1,
709f9bac91bSBenno Rice  *	    bus_space_handle_t bsh2, bus_size_t off2,
710f9bac91bSBenno Rice  *	    size_t count));
711f9bac91bSBenno Rice  *
712f9bac91bSBenno Rice  * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
713f9bac91bSBenno Rice  * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
714f9bac91bSBenno Rice  */
715f9bac91bSBenno Rice 
716f9bac91bSBenno Rice 	/* XXX IMPLEMENT bus_space_copy_N() XXX */
717f9bac91bSBenno Rice 
718f9bac91bSBenno Rice /*
719f9bac91bSBenno Rice  * Bus read/write barrier methods.
720f9bac91bSBenno Rice  *
721812344bcSAlfred Perlstein  *	void bus_space_barrier(bus_space_tag_t tag,
722f9bac91bSBenno Rice  *	    bus_space_handle_t bsh, bus_size_t offset,
723f9bac91bSBenno Rice  *	    bus_size_t len, int flags));
724f9bac91bSBenno Rice  *
725f9bac91bSBenno Rice  * Note: the macppc does not currently require barriers, but we must
726f9bac91bSBenno Rice  * provide the flags to MI code.
727f9bac91bSBenno Rice  */
728f9bac91bSBenno Rice 
729f9bac91bSBenno Rice #define	BUS_SPACE_BARRIER_READ	0x01		/* force read barrier */
730f9bac91bSBenno Rice #define	BUS_SPACE_BARRIER_WRITE	0x02		/* force write barrier */
731f9bac91bSBenno Rice 
732911e488aSPeter Grehan static __inline void
733911e488aSPeter Grehan bus_space_barrier(bus_space_tag_t tag __unused,
734911e488aSPeter Grehan     bus_space_handle_t bsh __unused, bus_size_t offset __unused,
735911e488aSPeter Grehan     bus_size_t len __unused, int flags __unused)
736911e488aSPeter Grehan {
737911e488aSPeter Grehan 	__asm __volatile("" : : : "memory");
738911e488aSPeter Grehan }
739911e488aSPeter Grehan 
740911e488aSPeter Grehan 
741f9bac91bSBenno Rice #define	BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
742f9bac91bSBenno Rice 
7435974e5c7SScott Long #include <machine/bus_dma.h>
744f9bac91bSBenno Rice 
745f9bac91bSBenno Rice #endif /* _MACPPC_BUS_H_ */
746