xref: /freebsd/sys/amd64/include/bus.h (revision e1a1bba4faf1a1ea6a2ed7de496b1f339a28d6cf)
1e1a1bba4SJustin T. Gibbs /*	$NetBSD: bus.h,v 1.12 1997/10/01 08:25:15 fvdl Exp $	*/
2e1a1bba4SJustin T. Gibbs 
3e1a1bba4SJustin T. Gibbs /*-
4e1a1bba4SJustin T. Gibbs  * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
5e1a1bba4SJustin T. Gibbs  * All rights reserved.
6e1a1bba4SJustin T. Gibbs  *
7e1a1bba4SJustin T. Gibbs  * This code is derived from software contributed to The NetBSD Foundation
8e1a1bba4SJustin T. Gibbs  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9e1a1bba4SJustin T. Gibbs  * NASA Ames Research Center.
10e1a1bba4SJustin T. Gibbs  *
11e1a1bba4SJustin T. Gibbs  * Redistribution and use in source and binary forms, with or without
12e1a1bba4SJustin T. Gibbs  * modification, are permitted provided that the following conditions
13e1a1bba4SJustin T. Gibbs  * are met:
14e1a1bba4SJustin T. Gibbs  * 1. Redistributions of source code must retain the above copyright
15e1a1bba4SJustin T. Gibbs  *    notice, this list of conditions and the following disclaimer.
16e1a1bba4SJustin T. Gibbs  * 2. Redistributions in binary form must reproduce the above copyright
17e1a1bba4SJustin T. Gibbs  *    notice, this list of conditions and the following disclaimer in the
18e1a1bba4SJustin T. Gibbs  *    documentation and/or other materials provided with the distribution.
19e1a1bba4SJustin T. Gibbs  * 3. All advertising materials mentioning features or use of this software
20e1a1bba4SJustin T. Gibbs  *    must display the following acknowledgement:
21e1a1bba4SJustin T. Gibbs  *	This product includes software developed by the NetBSD
22e1a1bba4SJustin T. Gibbs  *	Foundation, Inc. and its contributors.
23e1a1bba4SJustin T. Gibbs  * 4. Neither the name of The NetBSD Foundation nor the names of its
24e1a1bba4SJustin T. Gibbs  *    contributors may be used to endorse or promote products derived
25e1a1bba4SJustin T. Gibbs  *    from this software without specific prior written permission.
26e1a1bba4SJustin T. Gibbs  *
27e1a1bba4SJustin T. Gibbs  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28e1a1bba4SJustin T. Gibbs  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29e1a1bba4SJustin T. Gibbs  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30e1a1bba4SJustin T. Gibbs  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31e1a1bba4SJustin T. Gibbs  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32e1a1bba4SJustin T. Gibbs  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33e1a1bba4SJustin T. Gibbs  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34e1a1bba4SJustin T. Gibbs  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35e1a1bba4SJustin T. Gibbs  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36e1a1bba4SJustin T. Gibbs  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37e1a1bba4SJustin T. Gibbs  * POSSIBILITY OF SUCH DAMAGE.
38e1a1bba4SJustin T. Gibbs  */
39e1a1bba4SJustin T. Gibbs 
40e1a1bba4SJustin T. Gibbs /*
41e1a1bba4SJustin T. Gibbs  * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
42e1a1bba4SJustin T. Gibbs  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
43e1a1bba4SJustin T. Gibbs  *
44e1a1bba4SJustin T. Gibbs  * Redistribution and use in source and binary forms, with or without
45e1a1bba4SJustin T. Gibbs  * modification, are permitted provided that the following conditions
46e1a1bba4SJustin T. Gibbs  * are met:
47e1a1bba4SJustin T. Gibbs  * 1. Redistributions of source code must retain the above copyright
48e1a1bba4SJustin T. Gibbs  *    notice, this list of conditions and the following disclaimer.
49e1a1bba4SJustin T. Gibbs  * 2. Redistributions in binary form must reproduce the above copyright
50e1a1bba4SJustin T. Gibbs  *    notice, this list of conditions and the following disclaimer in the
51e1a1bba4SJustin T. Gibbs  *    documentation and/or other materials provided with the distribution.
52e1a1bba4SJustin T. Gibbs  * 3. All advertising materials mentioning features or use of this software
53e1a1bba4SJustin T. Gibbs  *    must display the following acknowledgement:
54e1a1bba4SJustin T. Gibbs  *      This product includes software developed by Christopher G. Demetriou
55e1a1bba4SJustin T. Gibbs  *	for the NetBSD Project.
56e1a1bba4SJustin T. Gibbs  * 4. The name of the author may not be used to endorse or promote products
57e1a1bba4SJustin T. Gibbs  *    derived from this software without specific prior written permission
58e1a1bba4SJustin T. Gibbs  *
59e1a1bba4SJustin T. Gibbs  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
60e1a1bba4SJustin T. Gibbs  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
61e1a1bba4SJustin T. Gibbs  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
62e1a1bba4SJustin T. Gibbs  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
63e1a1bba4SJustin T. Gibbs  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
64e1a1bba4SJustin T. Gibbs  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
65e1a1bba4SJustin T. Gibbs  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
66e1a1bba4SJustin T. Gibbs  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
67e1a1bba4SJustin T. Gibbs  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
68e1a1bba4SJustin T. Gibbs  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
69e1a1bba4SJustin T. Gibbs  */
70e1a1bba4SJustin T. Gibbs /* $Id$ */
71e1a1bba4SJustin T. Gibbs 
72e1a1bba4SJustin T. Gibbs #ifndef _I386_BUS_H_
73e1a1bba4SJustin T. Gibbs #define _I386_BUS_H_
74e1a1bba4SJustin T. Gibbs 
75e1a1bba4SJustin T. Gibbs #include <machine/cpufunc.h>
76e1a1bba4SJustin T. Gibbs 
77e1a1bba4SJustin T. Gibbs /*
78e1a1bba4SJustin T. Gibbs  * Values for the i386 bus space tag, not to be used directly by MI code.
79e1a1bba4SJustin T. Gibbs  */
80e1a1bba4SJustin T. Gibbs #define	I386_BUS_SPACE_IO	0	/* space is i/o space */
81e1a1bba4SJustin T. Gibbs #define I386_BUS_SPACE_MEM	1	/* space is mem space */
82e1a1bba4SJustin T. Gibbs 
83e1a1bba4SJustin T. Gibbs /*
84e1a1bba4SJustin T. Gibbs  * Bus address and size types
85e1a1bba4SJustin T. Gibbs  */
86e1a1bba4SJustin T. Gibbs typedef u_long bus_addr_t;
87e1a1bba4SJustin T. Gibbs typedef u_long bus_size_t;
88e1a1bba4SJustin T. Gibbs 
89e1a1bba4SJustin T. Gibbs #define BUS_SPACE_MAXSIZE_24BIT	0xFFFFFF
90e1a1bba4SJustin T. Gibbs #define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF
91e1a1bba4SJustin T. Gibbs #define BUS_SPACE_MAXSIZE	(64 * 1024) /* Maximum supported size */
92e1a1bba4SJustin T. Gibbs #define BUS_SPACE_MAXADDR_24BIT	0xFFFFFF
93e1a1bba4SJustin T. Gibbs #define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
94e1a1bba4SJustin T. Gibbs #define BUS_SPACE_MAXADDR	0xFFFFFFFF
95e1a1bba4SJustin T. Gibbs 
96e1a1bba4SJustin T. Gibbs /*
97e1a1bba4SJustin T. Gibbs  * Access methods for bus resources and address space.
98e1a1bba4SJustin T. Gibbs  */
99e1a1bba4SJustin T. Gibbs typedef	int bus_space_tag_t;
100e1a1bba4SJustin T. Gibbs typedef	u_long bus_space_handle_t;
101e1a1bba4SJustin T. Gibbs 
102e1a1bba4SJustin T. Gibbs /*
103e1a1bba4SJustin T. Gibbs  * Map a region of device bus space into CPU virtual address space.
104e1a1bba4SJustin T. Gibbs  */
105e1a1bba4SJustin T. Gibbs 
106e1a1bba4SJustin T. Gibbs #define	BUS_SPACE_MAP_CACHEABLE		0x01
107e1a1bba4SJustin T. Gibbs #define	BUS_SPACE_MAP_LINEAR		0x02
108e1a1bba4SJustin T. Gibbs 
109e1a1bba4SJustin T. Gibbs int	bus_space_map(bus_space_tag_t t, bus_addr_t addr, bus_size_t size,
110e1a1bba4SJustin T. Gibbs 		      int flags, bus_space_handle_t *bshp);
111e1a1bba4SJustin T. Gibbs 
112e1a1bba4SJustin T. Gibbs /*
113e1a1bba4SJustin T. Gibbs  * Unmap a region of device bus space.
114e1a1bba4SJustin T. Gibbs  */
115e1a1bba4SJustin T. Gibbs 
116e1a1bba4SJustin T. Gibbs void	bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh,
117e1a1bba4SJustin T. Gibbs 			bus_size_t size);
118e1a1bba4SJustin T. Gibbs 
119e1a1bba4SJustin T. Gibbs /*
120e1a1bba4SJustin T. Gibbs  * Get a new handle for a subregion of an already-mapped area of bus space.
121e1a1bba4SJustin T. Gibbs  */
122e1a1bba4SJustin T. Gibbs 
123e1a1bba4SJustin T. Gibbs int	bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh,
124e1a1bba4SJustin T. Gibbs 			    bus_size_t offset, bus_size_t size,
125e1a1bba4SJustin T. Gibbs 			    bus_space_handle_t *nbshp);
126e1a1bba4SJustin T. Gibbs 
127e1a1bba4SJustin T. Gibbs /*
128e1a1bba4SJustin T. Gibbs  * Allocate a region of memory that is accessible to devices in bus space.
129e1a1bba4SJustin T. Gibbs  */
130e1a1bba4SJustin T. Gibbs 
131e1a1bba4SJustin T. Gibbs int	bus_space_alloc(bus_space_tag_t t, bus_addr_t rstart,
132e1a1bba4SJustin T. Gibbs 			bus_addr_t rend, bus_size_t size, bus_size_t align,
133e1a1bba4SJustin T. Gibbs 			bus_size_t boundary, int flags, bus_addr_t *addrp,
134e1a1bba4SJustin T. Gibbs 			bus_space_handle_t *bshp);
135e1a1bba4SJustin T. Gibbs 
136e1a1bba4SJustin T. Gibbs /*
137e1a1bba4SJustin T. Gibbs  * Free a region of bus space accessible memory.
138e1a1bba4SJustin T. Gibbs  */
139e1a1bba4SJustin T. Gibbs 
140e1a1bba4SJustin T. Gibbs void	bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh,
141e1a1bba4SJustin T. Gibbs 		       bus_size_t size);
142e1a1bba4SJustin T. Gibbs 
143e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_) || defined(_I386_BUS_MEMIO_H_)
144e1a1bba4SJustin T. Gibbs 
145e1a1bba4SJustin T. Gibbs /*
146e1a1bba4SJustin T. Gibbs  * Read a 1, 2, 4, or 8 byte quantity from bus space
147e1a1bba4SJustin T. Gibbs  * described by tag/handle/offset.
148e1a1bba4SJustin T. Gibbs  */
149e1a1bba4SJustin T. Gibbs static __inline u_int8_t bus_space_read_1(bus_space_tag_t tag,
150e1a1bba4SJustin T. Gibbs 					  bus_space_handle_t handle,
151e1a1bba4SJustin T. Gibbs 					  bus_size_t offset);
152e1a1bba4SJustin T. Gibbs 
153e1a1bba4SJustin T. Gibbs static __inline u_int16_t bus_space_read_2(bus_space_tag_t tag,
154e1a1bba4SJustin T. Gibbs 					   bus_space_handle_t handle,
155e1a1bba4SJustin T. Gibbs 					   bus_size_t offset);
156e1a1bba4SJustin T. Gibbs 
157e1a1bba4SJustin T. Gibbs static __inline u_int32_t bus_space_read_4(bus_space_tag_t tag,
158e1a1bba4SJustin T. Gibbs 					   bus_space_handle_t handle,
159e1a1bba4SJustin T. Gibbs 					   bus_size_t offset);
160e1a1bba4SJustin T. Gibbs 
161e1a1bba4SJustin T. Gibbs static __inline u_int8_t
162e1a1bba4SJustin T. Gibbs bus_space_read_1(bus_space_tag_t tag, bus_space_handle_t handle,
163e1a1bba4SJustin T. Gibbs 		 bus_size_t offset)
164e1a1bba4SJustin T. Gibbs {
165e1a1bba4SJustin T. Gibbs #if defined (_I386_BUS_PIO_H_)
166e1a1bba4SJustin T. Gibbs #if defined (_I386_BUS_MEMIO_H_)
167e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
168e1a1bba4SJustin T. Gibbs #endif
169e1a1bba4SJustin T. Gibbs 		return (inb(handle + offset));
170e1a1bba4SJustin T. Gibbs #endif
171e1a1bba4SJustin T. Gibbs #if defined (_I386_BUS_MEMIO_H_)
172e1a1bba4SJustin T. Gibbs 	return (*(volatile u_int8_t *)(handle + offset));
173e1a1bba4SJustin T. Gibbs #endif
174e1a1bba4SJustin T. Gibbs }
175e1a1bba4SJustin T. Gibbs 
176e1a1bba4SJustin T. Gibbs static __inline u_int16_t
177e1a1bba4SJustin T. Gibbs bus_space_read_2(bus_space_tag_t tag, bus_space_handle_t handle,
178e1a1bba4SJustin T. Gibbs 		 bus_size_t offset)
179e1a1bba4SJustin T. Gibbs {
180e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
181e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
182e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
183e1a1bba4SJustin T. Gibbs #endif
184e1a1bba4SJustin T. Gibbs 		return (inw(handle + offset));
185e1a1bba4SJustin T. Gibbs #endif
186e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
187e1a1bba4SJustin T. Gibbs 	return (*(volatile u_int16_t *)(handle + offset));
188e1a1bba4SJustin T. Gibbs #endif
189e1a1bba4SJustin T. Gibbs }
190e1a1bba4SJustin T. Gibbs 
191e1a1bba4SJustin T. Gibbs static __inline u_int32_t
192e1a1bba4SJustin T. Gibbs bus_space_read_4(bus_space_tag_t tag, bus_space_handle_t handle,
193e1a1bba4SJustin T. Gibbs 		 bus_size_t offset)
194e1a1bba4SJustin T. Gibbs {
195e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
196e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
197e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
198e1a1bba4SJustin T. Gibbs #endif
199e1a1bba4SJustin T. Gibbs 		return (inl(handle + offset));
200e1a1bba4SJustin T. Gibbs #endif
201e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
202e1a1bba4SJustin T. Gibbs 	return (*(volatile u_int32_t *)(handle + offset));
203e1a1bba4SJustin T. Gibbs #endif
204e1a1bba4SJustin T. Gibbs }
205e1a1bba4SJustin T. Gibbs 
206e1a1bba4SJustin T. Gibbs #if 0	/* Cause a link error for bus_space_read_8 */
207e1a1bba4SJustin T. Gibbs #define	bus_space_read_8(t, h, o)	!!! bus_space_read_8 unimplemented !!!
208e1a1bba4SJustin T. Gibbs #endif
209e1a1bba4SJustin T. Gibbs 
210e1a1bba4SJustin T. Gibbs /*
211e1a1bba4SJustin T. Gibbs  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
212e1a1bba4SJustin T. Gibbs  * described by tag/handle/offset and copy into buffer provided.
213e1a1bba4SJustin T. Gibbs  */
214e1a1bba4SJustin T. Gibbs static __inline void bus_space_read_multi_1(bus_space_tag_t tag,
215e1a1bba4SJustin T. Gibbs 					    bus_space_handle_t bsh,
216e1a1bba4SJustin T. Gibbs 					    bus_size_t offset, u_int8_t *addr,
217e1a1bba4SJustin T. Gibbs 					    size_t count);
218e1a1bba4SJustin T. Gibbs 
219e1a1bba4SJustin T. Gibbs static __inline void bus_space_read_multi_2(bus_space_tag_t tag,
220e1a1bba4SJustin T. Gibbs 					    bus_space_handle_t bsh,
221e1a1bba4SJustin T. Gibbs 					    bus_size_t offset, u_int16_t *addr,
222e1a1bba4SJustin T. Gibbs 					    size_t count);
223e1a1bba4SJustin T. Gibbs 
224e1a1bba4SJustin T. Gibbs static __inline void bus_space_read_multi_4(bus_space_tag_t tag,
225e1a1bba4SJustin T. Gibbs 					    bus_space_handle_t bsh,
226e1a1bba4SJustin T. Gibbs 					    bus_size_t offset, u_int32_t *addr,
227e1a1bba4SJustin T. Gibbs 					    size_t count);
228e1a1bba4SJustin T. Gibbs 
229e1a1bba4SJustin T. Gibbs static __inline void
230e1a1bba4SJustin T. Gibbs bus_space_read_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh,
231e1a1bba4SJustin T. Gibbs 		       bus_size_t offset, u_int8_t *addr, size_t count)
232e1a1bba4SJustin T. Gibbs {
233e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
234e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
235e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
236e1a1bba4SJustin T. Gibbs #endif
237e1a1bba4SJustin T. Gibbs 		insb(bsh + offset, addr, count);
238e1a1bba4SJustin T. Gibbs #endif
239e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
240e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
241e1a1bba4SJustin T. Gibbs 	else
242e1a1bba4SJustin T. Gibbs #endif
243e1a1bba4SJustin T. Gibbs 	{
244e1a1bba4SJustin T. Gibbs 		int __x __asm__("%eax");
245e1a1bba4SJustin T. Gibbs 		__asm __volatile("
246e1a1bba4SJustin T. Gibbs 			cld					;
247e1a1bba4SJustin T. Gibbs 		1:	movb (%1),%%al				;
248e1a1bba4SJustin T. Gibbs 			stosb					;
249e1a1bba4SJustin T. Gibbs 			loop 1b"				:
250e1a1bba4SJustin T. Gibbs 		    "=&a" (__x)					:
251e1a1bba4SJustin T. Gibbs 		    "r" (bsh + offset), "D" (addr), "c" (count)	:
252e1a1bba4SJustin T. Gibbs 		    "%edi", "%ecx", "memory");
253e1a1bba4SJustin T. Gibbs 	}
254e1a1bba4SJustin T. Gibbs #endif
255e1a1bba4SJustin T. Gibbs }
256e1a1bba4SJustin T. Gibbs 
257e1a1bba4SJustin T. Gibbs static __inline void
258e1a1bba4SJustin T. Gibbs bus_space_read_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh,
259e1a1bba4SJustin T. Gibbs 		       bus_size_t offset, u_int16_t *addr, size_t count)
260e1a1bba4SJustin T. Gibbs {
261e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
262e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
263e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
264e1a1bba4SJustin T. Gibbs #endif
265e1a1bba4SJustin T. Gibbs 		insw(bsh + offset, addr, count);
266e1a1bba4SJustin T. Gibbs #endif
267e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
268e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
269e1a1bba4SJustin T. Gibbs 	else
270e1a1bba4SJustin T. Gibbs #endif
271e1a1bba4SJustin T. Gibbs 	{
272e1a1bba4SJustin T. Gibbs 		int __x __asm__("%eax");
273e1a1bba4SJustin T. Gibbs 		__asm __volatile("
274e1a1bba4SJustin T. Gibbs 			cld					;
275e1a1bba4SJustin T. Gibbs 		1:	movw (%1),%%ax				;
276e1a1bba4SJustin T. Gibbs 			stosw					;
277e1a1bba4SJustin T. Gibbs 			loop 1b"				:
278e1a1bba4SJustin T. Gibbs 		    "=&a" (__x)					:
279e1a1bba4SJustin T. Gibbs 		    "r" (bsh + offset), "D" (addr), "c" (count)	:
280e1a1bba4SJustin T. Gibbs 		    "%edi", "%ecx", "memory");
281e1a1bba4SJustin T. Gibbs 	}
282e1a1bba4SJustin T. Gibbs #endif
283e1a1bba4SJustin T. Gibbs }
284e1a1bba4SJustin T. Gibbs 
285e1a1bba4SJustin T. Gibbs static __inline void
286e1a1bba4SJustin T. Gibbs bus_space_read_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh,
287e1a1bba4SJustin T. Gibbs 		       bus_size_t offset, u_int32_t *addr, size_t count)
288e1a1bba4SJustin T. Gibbs {
289e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
290e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
291e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
292e1a1bba4SJustin T. Gibbs #endif
293e1a1bba4SJustin T. Gibbs 		insl(bsh + offset, addr, count);
294e1a1bba4SJustin T. Gibbs #endif
295e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
296e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
297e1a1bba4SJustin T. Gibbs 	else
298e1a1bba4SJustin T. Gibbs #endif
299e1a1bba4SJustin T. Gibbs 	{
300e1a1bba4SJustin T. Gibbs 		int __x __asm__("%eax");
301e1a1bba4SJustin T. Gibbs 		__asm __volatile("
302e1a1bba4SJustin T. Gibbs 			cld					;
303e1a1bba4SJustin T. Gibbs 		1:	movl (%1),%%eax				;
304e1a1bba4SJustin T. Gibbs 			stosl					;
305e1a1bba4SJustin T. Gibbs 			loop 1b"				:
306e1a1bba4SJustin T. Gibbs 		    "=&a" (__x)					:
307e1a1bba4SJustin T. Gibbs 		    "r" (bsh + offset), "D" (addr), "c" (count)	:
308e1a1bba4SJustin T. Gibbs 		    "%edi", "%ecx", "memory");
309e1a1bba4SJustin T. Gibbs 	}
310e1a1bba4SJustin T. Gibbs #endif
311e1a1bba4SJustin T. Gibbs }
312e1a1bba4SJustin T. Gibbs 
313e1a1bba4SJustin T. Gibbs #if 0	/* Cause a link error for bus_space_read_multi_8 */
314e1a1bba4SJustin T. Gibbs #define	bus_space_read_multi_8	!!! bus_space_read_multi_8 unimplemented !!!
315e1a1bba4SJustin T. Gibbs #endif
316e1a1bba4SJustin T. Gibbs 
317e1a1bba4SJustin T. Gibbs /*
318e1a1bba4SJustin T. Gibbs  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
319e1a1bba4SJustin T. Gibbs  * described by tag/handle and starting at `offset' and copy into
320e1a1bba4SJustin T. Gibbs  * buffer provided.
321e1a1bba4SJustin T. Gibbs  */
322e1a1bba4SJustin T. Gibbs static __inline void bus_space_read_region_1(bus_space_tag_t tag,
323e1a1bba4SJustin T. Gibbs 					     bus_space_handle_t bsh,
324e1a1bba4SJustin T. Gibbs 					     bus_size_t offset, u_int8_t *addr,
325e1a1bba4SJustin T. Gibbs 					     size_t count);
326e1a1bba4SJustin T. Gibbs 
327e1a1bba4SJustin T. Gibbs static __inline void bus_space_read_region_2(bus_space_tag_t tag,
328e1a1bba4SJustin T. Gibbs 					     bus_space_handle_t bsh,
329e1a1bba4SJustin T. Gibbs 					     bus_size_t offset, u_int16_t *addr,
330e1a1bba4SJustin T. Gibbs 					     size_t count);
331e1a1bba4SJustin T. Gibbs 
332e1a1bba4SJustin T. Gibbs static __inline void bus_space_read_region_4(bus_space_tag_t tag,
333e1a1bba4SJustin T. Gibbs 					     bus_space_handle_t bsh,
334e1a1bba4SJustin T. Gibbs 					     bus_size_t offset, u_int32_t *addr,
335e1a1bba4SJustin T. Gibbs 					     size_t count);
336e1a1bba4SJustin T. Gibbs 
337e1a1bba4SJustin T. Gibbs 
338e1a1bba4SJustin T. Gibbs static __inline void
339e1a1bba4SJustin T. Gibbs bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t bsh,
340e1a1bba4SJustin T. Gibbs 			bus_size_t offset, u_int8_t *addr, size_t count)
341e1a1bba4SJustin T. Gibbs {
342e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
343e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
344e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
345e1a1bba4SJustin T. Gibbs #endif
346e1a1bba4SJustin T. Gibbs 	{
347e1a1bba4SJustin T. Gibbs 		int __x __asm__("%eax");
348e1a1bba4SJustin T. Gibbs 		__asm __volatile("
349e1a1bba4SJustin T. Gibbs 			cld					;
350e1a1bba4SJustin T. Gibbs 		1:	inb %w1,%%al				;
351e1a1bba4SJustin T. Gibbs 			stosb					;
352e1a1bba4SJustin T. Gibbs 			incl %1					;
353e1a1bba4SJustin T. Gibbs 			loop 1b"				:
354e1a1bba4SJustin T. Gibbs 		    "=&a" (__x)					:
355e1a1bba4SJustin T. Gibbs 		    "d" (bsh + offset), "D" (addr), "c" (count)	:
356e1a1bba4SJustin T. Gibbs 		    "%edx", "%edi", "%ecx", "memory");
357e1a1bba4SJustin T. Gibbs 	}
358e1a1bba4SJustin T. Gibbs #endif
359e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
360e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
361e1a1bba4SJustin T. Gibbs 	else
362e1a1bba4SJustin T. Gibbs #endif
363e1a1bba4SJustin T. Gibbs 	{
364e1a1bba4SJustin T. Gibbs 		__asm __volatile("
365e1a1bba4SJustin T. Gibbs 			cld					;
366e1a1bba4SJustin T. Gibbs 			repne					;
367e1a1bba4SJustin T. Gibbs 			movsb"					:
368e1a1bba4SJustin T. Gibbs 								:
369e1a1bba4SJustin T. Gibbs 		    "S" (bsh + offset), "D" (addr), "c" (count)	:
370e1a1bba4SJustin T. Gibbs 		    "%esi", "%edi", "%ecx", "memory");
371e1a1bba4SJustin T. Gibbs 	}
372e1a1bba4SJustin T. Gibbs #endif
373e1a1bba4SJustin T. Gibbs }
374e1a1bba4SJustin T. Gibbs 
375e1a1bba4SJustin T. Gibbs static __inline void
376e1a1bba4SJustin T. Gibbs bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t bsh,
377e1a1bba4SJustin T. Gibbs 			bus_size_t offset, u_int16_t *addr, size_t count)
378e1a1bba4SJustin T. Gibbs {
379e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
380e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
381e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
382e1a1bba4SJustin T. Gibbs #endif
383e1a1bba4SJustin T. Gibbs 	{
384e1a1bba4SJustin T. Gibbs 		int __x __asm__("%eax");
385e1a1bba4SJustin T. Gibbs 		__asm __volatile("
386e1a1bba4SJustin T. Gibbs 			cld					;
387e1a1bba4SJustin T. Gibbs 		1:	inw %w1,%%ax				;
388e1a1bba4SJustin T. Gibbs 			stosw					;
389e1a1bba4SJustin T. Gibbs 			addl $2,%1				;
390e1a1bba4SJustin T. Gibbs 			loop 1b"				:
391e1a1bba4SJustin T. Gibbs 		    "=&a" (__x)					:
392e1a1bba4SJustin T. Gibbs 		    "d" (bsh + offset), "D" (addr), "c" (count)	:
393e1a1bba4SJustin T. Gibbs 		    "%edx", "%edi", "%ecx", "memory");
394e1a1bba4SJustin T. Gibbs 	}
395e1a1bba4SJustin T. Gibbs #endif
396e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
397e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
398e1a1bba4SJustin T. Gibbs 	else
399e1a1bba4SJustin T. Gibbs #endif
400e1a1bba4SJustin T. Gibbs 	{
401e1a1bba4SJustin T. Gibbs 		__asm __volatile("
402e1a1bba4SJustin T. Gibbs 			cld					;
403e1a1bba4SJustin T. Gibbs 			repne					;
404e1a1bba4SJustin T. Gibbs 			movsw"					:
405e1a1bba4SJustin T. Gibbs 								:
406e1a1bba4SJustin T. Gibbs 		    "S" (bsh + offset), "D" (addr), "c" (count)	:
407e1a1bba4SJustin T. Gibbs 		    "%esi", "%edi", "%ecx", "memory");
408e1a1bba4SJustin T. Gibbs 	}
409e1a1bba4SJustin T. Gibbs #endif
410e1a1bba4SJustin T. Gibbs }
411e1a1bba4SJustin T. Gibbs 
412e1a1bba4SJustin T. Gibbs static __inline void
413e1a1bba4SJustin T. Gibbs bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t bsh,
414e1a1bba4SJustin T. Gibbs 			bus_size_t offset, u_int32_t *addr, size_t count)
415e1a1bba4SJustin T. Gibbs {
416e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
417e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
418e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
419e1a1bba4SJustin T. Gibbs #endif
420e1a1bba4SJustin T. Gibbs 	{
421e1a1bba4SJustin T. Gibbs 		int __x __asm__("%eax");
422e1a1bba4SJustin T. Gibbs 		__asm __volatile("
423e1a1bba4SJustin T. Gibbs 			cld					;
424e1a1bba4SJustin T. Gibbs 		1:	inl %w1,%%eax				;
425e1a1bba4SJustin T. Gibbs 			stosl					;
426e1a1bba4SJustin T. Gibbs 			addl $4,%1				;
427e1a1bba4SJustin T. Gibbs 			loop 1b"				:
428e1a1bba4SJustin T. Gibbs 		    "=&a" (__x)					:
429e1a1bba4SJustin T. Gibbs 		    "d" (bsh + offset), "D" (addr), "c" (count)	:
430e1a1bba4SJustin T. Gibbs 		    "%edx", "%edi", "%ecx", "memory");
431e1a1bba4SJustin T. Gibbs 	}
432e1a1bba4SJustin T. Gibbs #endif
433e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
434e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
435e1a1bba4SJustin T. Gibbs 	else
436e1a1bba4SJustin T. Gibbs #endif
437e1a1bba4SJustin T. Gibbs 	{
438e1a1bba4SJustin T. Gibbs 		__asm __volatile("
439e1a1bba4SJustin T. Gibbs 			cld					;
440e1a1bba4SJustin T. Gibbs 			repne					;
441e1a1bba4SJustin T. Gibbs 			movsl"					:
442e1a1bba4SJustin T. Gibbs 								:
443e1a1bba4SJustin T. Gibbs 		    "S" (bsh + offset), "D" (addr), "c" (count)	:
444e1a1bba4SJustin T. Gibbs 		    "%esi", "%edi", "%ecx", "memory");
445e1a1bba4SJustin T. Gibbs 	}
446e1a1bba4SJustin T. Gibbs #endif
447e1a1bba4SJustin T. Gibbs }
448e1a1bba4SJustin T. Gibbs 
449e1a1bba4SJustin T. Gibbs #if 0	/* Cause a link error for bus_space_read_region_8 */
450e1a1bba4SJustin T. Gibbs #define	bus_space_read_region_8	!!! bus_space_read_region_8 unimplemented !!!
451e1a1bba4SJustin T. Gibbs #endif
452e1a1bba4SJustin T. Gibbs 
453e1a1bba4SJustin T. Gibbs /*
454e1a1bba4SJustin T. Gibbs  * Write the 1, 2, 4, or 8 byte value `value' to bus space
455e1a1bba4SJustin T. Gibbs  * described by tag/handle/offset.
456e1a1bba4SJustin T. Gibbs  */
457e1a1bba4SJustin T. Gibbs 
458e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_1(bus_space_tag_t tag,
459e1a1bba4SJustin T. Gibbs 				       bus_space_handle_t bsh,
460e1a1bba4SJustin T. Gibbs 				       bus_size_t offset, u_int8_t value);
461e1a1bba4SJustin T. Gibbs 
462e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_2(bus_space_tag_t tag,
463e1a1bba4SJustin T. Gibbs 				       bus_space_handle_t bsh,
464e1a1bba4SJustin T. Gibbs 				       bus_size_t offset, u_int16_t value);
465e1a1bba4SJustin T. Gibbs 
466e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_4(bus_space_tag_t tag,
467e1a1bba4SJustin T. Gibbs 				       bus_space_handle_t bsh,
468e1a1bba4SJustin T. Gibbs 				       bus_size_t offset, u_int32_t value);
469e1a1bba4SJustin T. Gibbs 
470e1a1bba4SJustin T. Gibbs static __inline void
471e1a1bba4SJustin T. Gibbs bus_space_write_1(bus_space_tag_t tag, bus_space_handle_t bsh,
472e1a1bba4SJustin T. Gibbs 		       bus_size_t offset, u_int8_t value)
473e1a1bba4SJustin T. Gibbs {
474e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
475e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
476e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
477e1a1bba4SJustin T. Gibbs #endif
478e1a1bba4SJustin T. Gibbs 		outb(bsh + offset, value);
479e1a1bba4SJustin T. Gibbs #endif
480e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
481e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
482e1a1bba4SJustin T. Gibbs 	else
483e1a1bba4SJustin T. Gibbs #endif
484e1a1bba4SJustin T. Gibbs 		*(volatile u_int8_t *)(bsh + offset) = value;
485e1a1bba4SJustin T. Gibbs #endif
486e1a1bba4SJustin T. Gibbs }
487e1a1bba4SJustin T. Gibbs 
488e1a1bba4SJustin T. Gibbs static __inline void
489e1a1bba4SJustin T. Gibbs bus_space_write_2(bus_space_tag_t tag, bus_space_handle_t bsh,
490e1a1bba4SJustin T. Gibbs 		       bus_size_t offset, u_int16_t value)
491e1a1bba4SJustin T. Gibbs {
492e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
493e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
494e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
495e1a1bba4SJustin T. Gibbs #endif
496e1a1bba4SJustin T. Gibbs 		outw(bsh + offset, value);
497e1a1bba4SJustin T. Gibbs #endif
498e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
499e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
500e1a1bba4SJustin T. Gibbs 	else
501e1a1bba4SJustin T. Gibbs #endif
502e1a1bba4SJustin T. Gibbs 		*(volatile u_int16_t *)(bsh + offset) = value;
503e1a1bba4SJustin T. Gibbs #endif
504e1a1bba4SJustin T. Gibbs }
505e1a1bba4SJustin T. Gibbs 
506e1a1bba4SJustin T. Gibbs static __inline void
507e1a1bba4SJustin T. Gibbs bus_space_write_4(bus_space_tag_t tag, bus_space_handle_t bsh,
508e1a1bba4SJustin T. Gibbs 		       bus_size_t offset, u_int32_t value)
509e1a1bba4SJustin T. Gibbs {
510e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
511e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
512e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
513e1a1bba4SJustin T. Gibbs #endif
514e1a1bba4SJustin T. Gibbs 		outl(bsh + offset, value);
515e1a1bba4SJustin T. Gibbs #endif
516e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
517e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
518e1a1bba4SJustin T. Gibbs 	else
519e1a1bba4SJustin T. Gibbs #endif
520e1a1bba4SJustin T. Gibbs 		*(volatile u_int32_t *)(bsh + offset) = value;
521e1a1bba4SJustin T. Gibbs #endif
522e1a1bba4SJustin T. Gibbs }
523e1a1bba4SJustin T. Gibbs 
524e1a1bba4SJustin T. Gibbs #if 0	/* Cause a link error for bus_space_write_8 */
525e1a1bba4SJustin T. Gibbs #define	bus_space_write_8	!!! bus_space_write_8 not implemented !!!
526e1a1bba4SJustin T. Gibbs #endif
527e1a1bba4SJustin T. Gibbs 
528e1a1bba4SJustin T. Gibbs /*
529e1a1bba4SJustin T. Gibbs  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
530e1a1bba4SJustin T. Gibbs  * provided to bus space described by tag/handle/offset.
531e1a1bba4SJustin T. Gibbs  */
532e1a1bba4SJustin T. Gibbs 
533e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_multi_1(bus_space_tag_t tag,
534e1a1bba4SJustin T. Gibbs 					     bus_space_handle_t bsh,
535e1a1bba4SJustin T. Gibbs 					     bus_size_t offset,
536e1a1bba4SJustin T. Gibbs 					     const u_int8_t *addr,
537e1a1bba4SJustin T. Gibbs 					     size_t count);
538e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_multi_2(bus_space_tag_t tag,
539e1a1bba4SJustin T. Gibbs 					     bus_space_handle_t bsh,
540e1a1bba4SJustin T. Gibbs 					     bus_size_t offset,
541e1a1bba4SJustin T. Gibbs 					     const u_int16_t *addr,
542e1a1bba4SJustin T. Gibbs 					     size_t count);
543e1a1bba4SJustin T. Gibbs 
544e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_multi_4(bus_space_tag_t tag,
545e1a1bba4SJustin T. Gibbs 					     bus_space_handle_t bsh,
546e1a1bba4SJustin T. Gibbs 					     bus_size_t offset,
547e1a1bba4SJustin T. Gibbs 					     const u_int32_t *addr,
548e1a1bba4SJustin T. Gibbs 					     size_t count);
549e1a1bba4SJustin T. Gibbs 
550e1a1bba4SJustin T. Gibbs static __inline void
551e1a1bba4SJustin T. Gibbs bus_space_write_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh,
552e1a1bba4SJustin T. Gibbs 			bus_size_t offset, const u_int8_t *addr, size_t count)
553e1a1bba4SJustin T. Gibbs {
554e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
555e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
556e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
557e1a1bba4SJustin T. Gibbs #endif
558e1a1bba4SJustin T. Gibbs 		outsb(bsh + offset, addr, count);
559e1a1bba4SJustin T. Gibbs #endif
560e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
561e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
562e1a1bba4SJustin T. Gibbs 	else
563e1a1bba4SJustin T. Gibbs #endif
564e1a1bba4SJustin T. Gibbs 	{
565e1a1bba4SJustin T. Gibbs 		int __x __asm__("%eax");
566e1a1bba4SJustin T. Gibbs 		__asm __volatile("
567e1a1bba4SJustin T. Gibbs 			cld					;
568e1a1bba4SJustin T. Gibbs 		1:	lodsb					;
569e1a1bba4SJustin T. Gibbs 			movb %%al,(%1)				;
570e1a1bba4SJustin T. Gibbs 			loop 1b"				:
571e1a1bba4SJustin T. Gibbs 		    "=&a" (__x)					:
572e1a1bba4SJustin T. Gibbs 		    "r" (bsh + offset), "S" (addr), "c" (count)	:
573e1a1bba4SJustin T. Gibbs 		    "%esi", "%ecx");
574e1a1bba4SJustin T. Gibbs 	}
575e1a1bba4SJustin T. Gibbs #endif
576e1a1bba4SJustin T. Gibbs }
577e1a1bba4SJustin T. Gibbs 
578e1a1bba4SJustin T. Gibbs static __inline void
579e1a1bba4SJustin T. Gibbs bus_space_write_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh,
580e1a1bba4SJustin T. Gibbs 			bus_size_t offset, const u_int16_t *addr, size_t count)
581e1a1bba4SJustin T. Gibbs {
582e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
583e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
584e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
585e1a1bba4SJustin T. Gibbs #endif
586e1a1bba4SJustin T. Gibbs 		outsw(bsh + offset, addr, count);
587e1a1bba4SJustin T. Gibbs #endif
588e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
589e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
590e1a1bba4SJustin T. Gibbs 	else
591e1a1bba4SJustin T. Gibbs #endif
592e1a1bba4SJustin T. Gibbs 	{
593e1a1bba4SJustin T. Gibbs 		int __x __asm__("%eax");
594e1a1bba4SJustin T. Gibbs 		__asm __volatile("
595e1a1bba4SJustin T. Gibbs 			cld					;
596e1a1bba4SJustin T. Gibbs 		1:	lodsw					;
597e1a1bba4SJustin T. Gibbs 			movw %%ax,(%1)				;
598e1a1bba4SJustin T. Gibbs 			loop 1b"				:
599e1a1bba4SJustin T. Gibbs 		    "=&a" (__x)					:
600e1a1bba4SJustin T. Gibbs 		    "r" (bsh + offset), "S" (addr), "c" (count)	:
601e1a1bba4SJustin T. Gibbs 		    "%esi", "%ecx");
602e1a1bba4SJustin T. Gibbs 	}
603e1a1bba4SJustin T. Gibbs #endif
604e1a1bba4SJustin T. Gibbs }
605e1a1bba4SJustin T. Gibbs 
606e1a1bba4SJustin T. Gibbs static __inline void
607e1a1bba4SJustin T. Gibbs bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh,
608e1a1bba4SJustin T. Gibbs 			bus_size_t offset, const u_int32_t *addr, size_t count)
609e1a1bba4SJustin T. Gibbs {
610e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
611e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
612e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
613e1a1bba4SJustin T. Gibbs #endif
614e1a1bba4SJustin T. Gibbs 		outsl(bsh + offset, addr, count);
615e1a1bba4SJustin T. Gibbs #endif
616e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
617e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
618e1a1bba4SJustin T. Gibbs 	else
619e1a1bba4SJustin T. Gibbs #endif
620e1a1bba4SJustin T. Gibbs 	{
621e1a1bba4SJustin T. Gibbs 		int __x __asm__("%eax");
622e1a1bba4SJustin T. Gibbs 		__asm __volatile("
623e1a1bba4SJustin T. Gibbs 			cld					;
624e1a1bba4SJustin T. Gibbs 		1:	lodsl					;
625e1a1bba4SJustin T. Gibbs 			movl %%eax,(%1)				;
626e1a1bba4SJustin T. Gibbs 			loop 1b"				:
627e1a1bba4SJustin T. Gibbs 		    "=&a" (__x)					:
628e1a1bba4SJustin T. Gibbs 		    "r" (bsh + offset), "S" (addr), "c" (count)	:
629e1a1bba4SJustin T. Gibbs 		    "%esi", "%ecx");
630e1a1bba4SJustin T. Gibbs 	}
631e1a1bba4SJustin T. Gibbs #endif
632e1a1bba4SJustin T. Gibbs }
633e1a1bba4SJustin T. Gibbs 
634e1a1bba4SJustin T. Gibbs #if 0	/* Cause a link error for bus_space_write_multi_8 */
635e1a1bba4SJustin T. Gibbs #define	bus_space_write_multi_8(t, h, o, a, c)				\
636e1a1bba4SJustin T. Gibbs 			!!! bus_space_write_multi_8 unimplemented !!!
637e1a1bba4SJustin T. Gibbs #endif
638e1a1bba4SJustin T. Gibbs 
639e1a1bba4SJustin T. Gibbs /*
640e1a1bba4SJustin T. Gibbs  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided
641e1a1bba4SJustin T. Gibbs  * to bus space described by tag/handle starting at `offset'.
642e1a1bba4SJustin T. Gibbs  */
643e1a1bba4SJustin T. Gibbs 
644e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_region_1(bus_space_tag_t tag,
645e1a1bba4SJustin T. Gibbs 					      bus_space_handle_t bsh,
646e1a1bba4SJustin T. Gibbs 					      bus_size_t offset,
647e1a1bba4SJustin T. Gibbs 					      const u_int8_t *addr,
648e1a1bba4SJustin T. Gibbs 					      size_t count);
649e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_region_2(bus_space_tag_t tag,
650e1a1bba4SJustin T. Gibbs 					      bus_space_handle_t bsh,
651e1a1bba4SJustin T. Gibbs 					      bus_size_t offset,
652e1a1bba4SJustin T. Gibbs 					      const u_int16_t *addr,
653e1a1bba4SJustin T. Gibbs 					      size_t count);
654e1a1bba4SJustin T. Gibbs static __inline void bus_space_write_region_4(bus_space_tag_t tag,
655e1a1bba4SJustin T. Gibbs 					      bus_space_handle_t bsh,
656e1a1bba4SJustin T. Gibbs 					      bus_size_t offset,
657e1a1bba4SJustin T. Gibbs 					      const u_int32_t *addr,
658e1a1bba4SJustin T. Gibbs 					      size_t count);
659e1a1bba4SJustin T. Gibbs 
660e1a1bba4SJustin T. Gibbs static __inline void
661e1a1bba4SJustin T. Gibbs bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t bsh,
662e1a1bba4SJustin T. Gibbs 			 bus_size_t offset, const u_int8_t *addr, size_t count)
663e1a1bba4SJustin T. Gibbs {
664e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
665e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
666e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
667e1a1bba4SJustin T. Gibbs #endif
668e1a1bba4SJustin T. Gibbs 	{
669e1a1bba4SJustin T. Gibbs 		int __x __asm__("%eax");
670e1a1bba4SJustin T. Gibbs 		__asm __volatile("
671e1a1bba4SJustin T. Gibbs 			cld					;
672e1a1bba4SJustin T. Gibbs 		1:	lodsb					;
673e1a1bba4SJustin T. Gibbs 			outb %%al,%w1				;
674e1a1bba4SJustin T. Gibbs 			incl %1					;
675e1a1bba4SJustin T. Gibbs 			loop 1b"				:
676e1a1bba4SJustin T. Gibbs 		    "=&a" (__x)					:
677e1a1bba4SJustin T. Gibbs 		    "d" (bsh + offset), "S" (addr), "c" (count)	:
678e1a1bba4SJustin T. Gibbs 		    "%edx", "%esi", "%ecx", "memory");
679e1a1bba4SJustin T. Gibbs 	}
680e1a1bba4SJustin T. Gibbs #endif
681e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
682e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
683e1a1bba4SJustin T. Gibbs 	else
684e1a1bba4SJustin T. Gibbs #endif
685e1a1bba4SJustin T. Gibbs 	{
686e1a1bba4SJustin T. Gibbs 		__asm __volatile("
687e1a1bba4SJustin T. Gibbs 			cld					;
688e1a1bba4SJustin T. Gibbs 			repne					;
689e1a1bba4SJustin T. Gibbs 			movsb"					:
690e1a1bba4SJustin T. Gibbs 								:
691e1a1bba4SJustin T. Gibbs 		    "D" (bsh + offset), "S" (addr), "c" (count)	:
692e1a1bba4SJustin T. Gibbs 		    "%edi", "%esi", "%ecx", "memory");
693e1a1bba4SJustin T. Gibbs 	}
694e1a1bba4SJustin T. Gibbs #endif
695e1a1bba4SJustin T. Gibbs }
696e1a1bba4SJustin T. Gibbs 
697e1a1bba4SJustin T. Gibbs static __inline void
698e1a1bba4SJustin T. Gibbs bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t bsh,
699e1a1bba4SJustin T. Gibbs 			 bus_size_t offset, const u_int16_t *addr, size_t count)
700e1a1bba4SJustin T. Gibbs {
701e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
702e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
703e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
704e1a1bba4SJustin T. Gibbs #endif
705e1a1bba4SJustin T. Gibbs 	{
706e1a1bba4SJustin T. Gibbs 		int __x __asm__("%eax");
707e1a1bba4SJustin T. Gibbs 		__asm __volatile("
708e1a1bba4SJustin T. Gibbs 			cld					;
709e1a1bba4SJustin T. Gibbs 		1:	lodsw					;
710e1a1bba4SJustin T. Gibbs 			outw %%ax,%w1				;
711e1a1bba4SJustin T. Gibbs 			addl $2,%1				;
712e1a1bba4SJustin T. Gibbs 			loop 1b"				:
713e1a1bba4SJustin T. Gibbs 		    "=&a" (__x)					:
714e1a1bba4SJustin T. Gibbs 		    "d" (bsh + offset), "S" (addr), "c" (count)	:
715e1a1bba4SJustin T. Gibbs 		    "%edx", "%esi", "%ecx", "memory");
716e1a1bba4SJustin T. Gibbs 	}
717e1a1bba4SJustin T. Gibbs #endif
718e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
719e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
720e1a1bba4SJustin T. Gibbs 	else
721e1a1bba4SJustin T. Gibbs #endif
722e1a1bba4SJustin T. Gibbs 	{
723e1a1bba4SJustin T. Gibbs 		__asm __volatile("
724e1a1bba4SJustin T. Gibbs 			cld					;
725e1a1bba4SJustin T. Gibbs 			repne					;
726e1a1bba4SJustin T. Gibbs 			movsw"					:
727e1a1bba4SJustin T. Gibbs 								:
728e1a1bba4SJustin T. Gibbs 		    "D" (bsh + offset), "S" (addr), "c" (count)	:
729e1a1bba4SJustin T. Gibbs 		    "%edi", "%esi", "%ecx", "memory");
730e1a1bba4SJustin T. Gibbs 	}
731e1a1bba4SJustin T. Gibbs #endif
732e1a1bba4SJustin T. Gibbs }
733e1a1bba4SJustin T. Gibbs 
734e1a1bba4SJustin T. Gibbs static __inline void
735e1a1bba4SJustin T. Gibbs bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t bsh,
736e1a1bba4SJustin T. Gibbs 			 bus_size_t offset, const u_int32_t *addr, size_t count)
737e1a1bba4SJustin T. Gibbs {
738e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
739e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
740e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
741e1a1bba4SJustin T. Gibbs #endif
742e1a1bba4SJustin T. Gibbs 	{
743e1a1bba4SJustin T. Gibbs 		int __x __asm__("%eax");
744e1a1bba4SJustin T. Gibbs 		__asm __volatile("
745e1a1bba4SJustin T. Gibbs 			cld					;
746e1a1bba4SJustin T. Gibbs 		1:	lodsl					;
747e1a1bba4SJustin T. Gibbs 			outl %%eax,%w1				;
748e1a1bba4SJustin T. Gibbs 			addl $4,%1				;
749e1a1bba4SJustin T. Gibbs 			loop 1b"				:
750e1a1bba4SJustin T. Gibbs 		    "=&a" (__x)					:
751e1a1bba4SJustin T. Gibbs 		    "d" (bsh + offset), "S" (addr), "c" (count)	:
752e1a1bba4SJustin T. Gibbs 		    "%edx", "%esi", "%ecx", "memory");
753e1a1bba4SJustin T. Gibbs 	}
754e1a1bba4SJustin T. Gibbs #endif
755e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
756e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
757e1a1bba4SJustin T. Gibbs 	else
758e1a1bba4SJustin T. Gibbs #endif
759e1a1bba4SJustin T. Gibbs 	{
760e1a1bba4SJustin T. Gibbs 		__asm __volatile("
761e1a1bba4SJustin T. Gibbs 			cld					;
762e1a1bba4SJustin T. Gibbs 			repne					;
763e1a1bba4SJustin T. Gibbs 			movsl"					:
764e1a1bba4SJustin T. Gibbs 								:
765e1a1bba4SJustin T. Gibbs 		    "D" (bsh + offset), "S" (addr), "c" (count)	:
766e1a1bba4SJustin T. Gibbs 		    "%edi", "%esi", "%ecx", "memory");
767e1a1bba4SJustin T. Gibbs 	}
768e1a1bba4SJustin T. Gibbs #endif
769e1a1bba4SJustin T. Gibbs }
770e1a1bba4SJustin T. Gibbs 
771e1a1bba4SJustin T. Gibbs #if 0	/* Cause a link error for bus_space_write_region_8 */
772e1a1bba4SJustin T. Gibbs #define	bus_space_write_region_8					\
773e1a1bba4SJustin T. Gibbs 			!!! bus_space_write_region_8 unimplemented !!!
774e1a1bba4SJustin T. Gibbs #endif
775e1a1bba4SJustin T. Gibbs 
776e1a1bba4SJustin T. Gibbs /*
777e1a1bba4SJustin T. Gibbs  * Write the 1, 2, 4, or 8 byte value `val' to bus space described
778e1a1bba4SJustin T. Gibbs  * by tag/handle/offset `count' times.
779e1a1bba4SJustin T. Gibbs  */
780e1a1bba4SJustin T. Gibbs 
781e1a1bba4SJustin T. Gibbs static __inline void bus_space_set_multi_1(bus_space_tag_t tag,
782e1a1bba4SJustin T. Gibbs 					   bus_space_handle_t bsh,
783e1a1bba4SJustin T. Gibbs 					   bus_size_t offset,
784e1a1bba4SJustin T. Gibbs 					   u_int8_t value, size_t count);
785e1a1bba4SJustin T. Gibbs static __inline void bus_space_set_multi_2(bus_space_tag_t tag,
786e1a1bba4SJustin T. Gibbs 					   bus_space_handle_t bsh,
787e1a1bba4SJustin T. Gibbs 					   bus_size_t offset,
788e1a1bba4SJustin T. Gibbs 					   u_int16_t value, size_t count);
789e1a1bba4SJustin T. Gibbs static __inline void bus_space_set_multi_4(bus_space_tag_t tag,
790e1a1bba4SJustin T. Gibbs 					   bus_space_handle_t bsh,
791e1a1bba4SJustin T. Gibbs 					   bus_size_t offset,
792e1a1bba4SJustin T. Gibbs 					   u_int32_t value, size_t count);
793e1a1bba4SJustin T. Gibbs 
794e1a1bba4SJustin T. Gibbs static __inline void
795e1a1bba4SJustin T. Gibbs bus_space_set_multi_1(bus_space_tag_t tag, bus_space_handle_t bsh,
796e1a1bba4SJustin T. Gibbs 		      bus_size_t offset, u_int8_t value, size_t count)
797e1a1bba4SJustin T. Gibbs {
798e1a1bba4SJustin T. Gibbs 	bus_addr_t addr = bsh + offset;
799e1a1bba4SJustin T. Gibbs 
800e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
801e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
802e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
803e1a1bba4SJustin T. Gibbs #endif
804e1a1bba4SJustin T. Gibbs 		while (count--)
805e1a1bba4SJustin T. Gibbs 			outb(addr, value);
806e1a1bba4SJustin T. Gibbs #endif
807e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
808e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
809e1a1bba4SJustin T. Gibbs 	else
810e1a1bba4SJustin T. Gibbs #endif
811e1a1bba4SJustin T. Gibbs 		while (count--)
812e1a1bba4SJustin T. Gibbs 			*(volatile u_int8_t *)(addr) = value;
813e1a1bba4SJustin T. Gibbs #endif
814e1a1bba4SJustin T. Gibbs }
815e1a1bba4SJustin T. Gibbs 
816e1a1bba4SJustin T. Gibbs static __inline void
817e1a1bba4SJustin T. Gibbs bus_space_set_multi_2(bus_space_tag_t tag, bus_space_handle_t bsh,
818e1a1bba4SJustin T. Gibbs 		     bus_size_t offset, u_int16_t value, size_t count)
819e1a1bba4SJustin T. Gibbs {
820e1a1bba4SJustin T. Gibbs 	bus_addr_t addr = bsh + offset;
821e1a1bba4SJustin T. Gibbs 
822e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
823e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
824e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
825e1a1bba4SJustin T. Gibbs #endif
826e1a1bba4SJustin T. Gibbs 		while (count--)
827e1a1bba4SJustin T. Gibbs 			outw(addr, value);
828e1a1bba4SJustin T. Gibbs #endif
829e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
830e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
831e1a1bba4SJustin T. Gibbs 	else
832e1a1bba4SJustin T. Gibbs #endif
833e1a1bba4SJustin T. Gibbs 		while (count--)
834e1a1bba4SJustin T. Gibbs 			*(volatile u_int16_t *)(addr) = value;
835e1a1bba4SJustin T. Gibbs #endif
836e1a1bba4SJustin T. Gibbs }
837e1a1bba4SJustin T. Gibbs 
838e1a1bba4SJustin T. Gibbs static __inline void
839e1a1bba4SJustin T. Gibbs bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t bsh,
840e1a1bba4SJustin T. Gibbs 		      bus_size_t offset, u_int32_t value, size_t count)
841e1a1bba4SJustin T. Gibbs {
842e1a1bba4SJustin T. Gibbs 	bus_addr_t addr = bsh + offset;
843e1a1bba4SJustin T. Gibbs 
844e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
845e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
846e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
847e1a1bba4SJustin T. Gibbs #endif
848e1a1bba4SJustin T. Gibbs 		while (count--)
849e1a1bba4SJustin T. Gibbs 			outl(addr, value);
850e1a1bba4SJustin T. Gibbs #endif
851e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
852e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
853e1a1bba4SJustin T. Gibbs 	else
854e1a1bba4SJustin T. Gibbs #endif
855e1a1bba4SJustin T. Gibbs 		while (count--)
856e1a1bba4SJustin T. Gibbs 			*(volatile u_int32_t *)(addr) = value;
857e1a1bba4SJustin T. Gibbs #endif
858e1a1bba4SJustin T. Gibbs }
859e1a1bba4SJustin T. Gibbs 
860e1a1bba4SJustin T. Gibbs #if 0	/* Cause a link error for bus_space_set_multi_8 */
861e1a1bba4SJustin T. Gibbs #define	bus_space_set_multi_8 !!! bus_space_set_multi_8 unimplemented !!!
862e1a1bba4SJustin T. Gibbs #endif
863e1a1bba4SJustin T. Gibbs 
864e1a1bba4SJustin T. Gibbs /*
865e1a1bba4SJustin T. Gibbs  * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
866e1a1bba4SJustin T. Gibbs  * by tag/handle starting at `offset'.
867e1a1bba4SJustin T. Gibbs  */
868e1a1bba4SJustin T. Gibbs 
869e1a1bba4SJustin T. Gibbs static __inline void bus_space_set_region_1(bus_space_tag_t tag,
870e1a1bba4SJustin T. Gibbs 					    bus_space_handle_t bsh,
871e1a1bba4SJustin T. Gibbs 					    bus_size_t offset, u_int8_t value,
872e1a1bba4SJustin T. Gibbs 					    size_t count);
873e1a1bba4SJustin T. Gibbs static __inline void bus_space_set_region_2(bus_space_tag_t tag,
874e1a1bba4SJustin T. Gibbs 					    bus_space_handle_t bsh,
875e1a1bba4SJustin T. Gibbs 					    bus_size_t offset, u_int16_t value,
876e1a1bba4SJustin T. Gibbs 					    size_t count);
877e1a1bba4SJustin T. Gibbs static __inline void bus_space_set_region_4(bus_space_tag_t tag,
878e1a1bba4SJustin T. Gibbs 					    bus_space_handle_t bsh,
879e1a1bba4SJustin T. Gibbs 					    bus_size_t offset, u_int32_t value,
880e1a1bba4SJustin T. Gibbs 					    size_t count);
881e1a1bba4SJustin T. Gibbs 
882e1a1bba4SJustin T. Gibbs static __inline void
883e1a1bba4SJustin T. Gibbs bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t bsh,
884e1a1bba4SJustin T. Gibbs 		       bus_size_t offset, u_int8_t value, size_t count)
885e1a1bba4SJustin T. Gibbs {
886e1a1bba4SJustin T. Gibbs 	bus_addr_t addr = bsh + offset;
887e1a1bba4SJustin T. Gibbs 
888e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
889e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
890e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
891e1a1bba4SJustin T. Gibbs #endif
892e1a1bba4SJustin T. Gibbs 		for (; count != 0; count--, addr++)
893e1a1bba4SJustin T. Gibbs 			outb(addr, value);
894e1a1bba4SJustin T. Gibbs #endif
895e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
896e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
897e1a1bba4SJustin T. Gibbs 	else
898e1a1bba4SJustin T. Gibbs #endif
899e1a1bba4SJustin T. Gibbs 		for (; count != 0; count--, addr++)
900e1a1bba4SJustin T. Gibbs 			*(volatile u_int8_t *)(addr) = value;
901e1a1bba4SJustin T. Gibbs #endif
902e1a1bba4SJustin T. Gibbs }
903e1a1bba4SJustin T. Gibbs 
904e1a1bba4SJustin T. Gibbs static __inline void
905e1a1bba4SJustin T. Gibbs bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t bsh,
906e1a1bba4SJustin T. Gibbs 		       bus_size_t offset, u_int16_t value, size_t count)
907e1a1bba4SJustin T. Gibbs {
908e1a1bba4SJustin T. Gibbs 	bus_addr_t addr = bsh + offset;
909e1a1bba4SJustin T. Gibbs 
910e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
911e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
912e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
913e1a1bba4SJustin T. Gibbs #endif
914e1a1bba4SJustin T. Gibbs 		for (; count != 0; count--, addr += 2)
915e1a1bba4SJustin T. Gibbs 			outw(addr, value);
916e1a1bba4SJustin T. Gibbs #endif
917e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
918e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
919e1a1bba4SJustin T. Gibbs 	else
920e1a1bba4SJustin T. Gibbs #endif
921e1a1bba4SJustin T. Gibbs 		for (; count != 0; count--, addr += 2)
922e1a1bba4SJustin T. Gibbs 			*(volatile u_int16_t *)(addr) = value;
923e1a1bba4SJustin T. Gibbs #endif
924e1a1bba4SJustin T. Gibbs }
925e1a1bba4SJustin T. Gibbs 
926e1a1bba4SJustin T. Gibbs static __inline void
927e1a1bba4SJustin T. Gibbs bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t bsh,
928e1a1bba4SJustin T. Gibbs 		       bus_size_t offset, u_int32_t value, size_t count)
929e1a1bba4SJustin T. Gibbs {
930e1a1bba4SJustin T. Gibbs 	bus_addr_t addr = bsh + offset;
931e1a1bba4SJustin T. Gibbs 
932e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
933e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
934e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
935e1a1bba4SJustin T. Gibbs #endif
936e1a1bba4SJustin T. Gibbs 		for (; count != 0; count--, addr += 4)
937e1a1bba4SJustin T. Gibbs 			outl(addr, value);
938e1a1bba4SJustin T. Gibbs #endif
939e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
940e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
941e1a1bba4SJustin T. Gibbs 	else
942e1a1bba4SJustin T. Gibbs #endif
943e1a1bba4SJustin T. Gibbs 		for (; count != 0; count--, addr += 4)
944e1a1bba4SJustin T. Gibbs 			*(volatile u_int32_t *)(addr) = value;
945e1a1bba4SJustin T. Gibbs #endif
946e1a1bba4SJustin T. Gibbs }
947e1a1bba4SJustin T. Gibbs 
948e1a1bba4SJustin T. Gibbs #if 0	/* Cause a link error for bus_space_set_region_8 */
949e1a1bba4SJustin T. Gibbs #define	bus_space_set_region_8	!!! bus_space_set_region_8 unimplemented !!!
950e1a1bba4SJustin T. Gibbs #endif
951e1a1bba4SJustin T. Gibbs 
952e1a1bba4SJustin T. Gibbs /*
953e1a1bba4SJustin T. Gibbs  * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
954e1a1bba4SJustin T. Gibbs  * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
955e1a1bba4SJustin T. Gibbs  */
956e1a1bba4SJustin T. Gibbs 
957e1a1bba4SJustin T. Gibbs static __inline void bus_space_copy_region_1(bus_space_tag_t tag,
958e1a1bba4SJustin T. Gibbs 					     bus_space_handle_t bsh1,
959e1a1bba4SJustin T. Gibbs 					     bus_size_t off1,
960e1a1bba4SJustin T. Gibbs 					     bus_space_handle_t bsh2,
961e1a1bba4SJustin T. Gibbs 					     bus_size_t off2, size_t count);
962e1a1bba4SJustin T. Gibbs 
963e1a1bba4SJustin T. Gibbs static __inline void bus_space_copy_region_2(bus_space_tag_t tag,
964e1a1bba4SJustin T. Gibbs 					     bus_space_handle_t bsh1,
965e1a1bba4SJustin T. Gibbs 					     bus_size_t off1,
966e1a1bba4SJustin T. Gibbs 					     bus_space_handle_t bsh2,
967e1a1bba4SJustin T. Gibbs 					     bus_size_t off2, size_t count);
968e1a1bba4SJustin T. Gibbs 
969e1a1bba4SJustin T. Gibbs static __inline void bus_space_copy_region_4(bus_space_tag_t tag,
970e1a1bba4SJustin T. Gibbs 					     bus_space_handle_t bsh1,
971e1a1bba4SJustin T. Gibbs 					     bus_size_t off1,
972e1a1bba4SJustin T. Gibbs 					     bus_space_handle_t bsh2,
973e1a1bba4SJustin T. Gibbs 					     bus_size_t off2, size_t count);
974e1a1bba4SJustin T. Gibbs 
975e1a1bba4SJustin T. Gibbs static __inline void
976e1a1bba4SJustin T. Gibbs bus_space_copy_region_1(bus_space_tag_t tag, bus_space_handle_t bsh1,
977e1a1bba4SJustin T. Gibbs 			bus_size_t off1, bus_space_handle_t bsh2,
978e1a1bba4SJustin T. Gibbs 			bus_size_t off2, size_t count)
979e1a1bba4SJustin T. Gibbs {
980e1a1bba4SJustin T. Gibbs 	bus_addr_t addr1 = bsh1 + off1;
981e1a1bba4SJustin T. Gibbs 	bus_addr_t addr2 = bsh2 + off2;
982e1a1bba4SJustin T. Gibbs 
983e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
984e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
985e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
986e1a1bba4SJustin T. Gibbs #endif
987e1a1bba4SJustin T. Gibbs 	{
988e1a1bba4SJustin T. Gibbs 		if (addr1 >= addr2) {
989e1a1bba4SJustin T. Gibbs 			/* src after dest: copy forward */
990e1a1bba4SJustin T. Gibbs 			for (; count != 0; count--, addr1++, addr2++)
991e1a1bba4SJustin T. Gibbs 				outb(addr2, inb(addr1));
992e1a1bba4SJustin T. Gibbs 		} else {
993e1a1bba4SJustin T. Gibbs 			/* dest after src: copy backwards */
994e1a1bba4SJustin T. Gibbs 			for (addr1 += (count - 1), addr2 += (count - 1);
995e1a1bba4SJustin T. Gibbs 			    count != 0; count--, addr1--, addr2--)
996e1a1bba4SJustin T. Gibbs 				outb(addr2, inb(addr1));
997e1a1bba4SJustin T. Gibbs 		}
998e1a1bba4SJustin T. Gibbs 	}
999e1a1bba4SJustin T. Gibbs #endif
1000e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
1001e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
1002e1a1bba4SJustin T. Gibbs 	else
1003e1a1bba4SJustin T. Gibbs #endif
1004e1a1bba4SJustin T. Gibbs 	{
1005e1a1bba4SJustin T. Gibbs 		if (addr1 >= addr2) {
1006e1a1bba4SJustin T. Gibbs 			/* src after dest: copy forward */
1007e1a1bba4SJustin T. Gibbs 			for (; count != 0; count--, addr1++, addr2++)
1008e1a1bba4SJustin T. Gibbs 				*(volatile u_int8_t *)(addr2) =
1009e1a1bba4SJustin T. Gibbs 				    *(volatile u_int8_t *)(addr1);
1010e1a1bba4SJustin T. Gibbs 		} else {
1011e1a1bba4SJustin T. Gibbs 			/* dest after src: copy backwards */
1012e1a1bba4SJustin T. Gibbs 			for (addr1 += (count - 1), addr2 += (count - 1);
1013e1a1bba4SJustin T. Gibbs 			    count != 0; count--, addr1--, addr2--)
1014e1a1bba4SJustin T. Gibbs 				*(volatile u_int8_t *)(addr2) =
1015e1a1bba4SJustin T. Gibbs 				    *(volatile u_int8_t *)(addr1);
1016e1a1bba4SJustin T. Gibbs 		}
1017e1a1bba4SJustin T. Gibbs 	}
1018e1a1bba4SJustin T. Gibbs #endif
1019e1a1bba4SJustin T. Gibbs }
1020e1a1bba4SJustin T. Gibbs 
1021e1a1bba4SJustin T. Gibbs static __inline void
1022e1a1bba4SJustin T. Gibbs bus_space_copy_region_2(bus_space_tag_t tag, bus_space_handle_t bsh1,
1023e1a1bba4SJustin T. Gibbs 			bus_size_t off1, bus_space_handle_t bsh2,
1024e1a1bba4SJustin T. Gibbs 			bus_size_t off2, size_t count)
1025e1a1bba4SJustin T. Gibbs {
1026e1a1bba4SJustin T. Gibbs 	bus_addr_t addr1 = bsh1 + off1;
1027e1a1bba4SJustin T. Gibbs 	bus_addr_t addr2 = bsh2 + off2;
1028e1a1bba4SJustin T. Gibbs 
1029e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
1030e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
1031e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
1032e1a1bba4SJustin T. Gibbs #endif
1033e1a1bba4SJustin T. Gibbs 	{
1034e1a1bba4SJustin T. Gibbs 		if (addr1 >= addr2) {
1035e1a1bba4SJustin T. Gibbs 			/* src after dest: copy forward */
1036e1a1bba4SJustin T. Gibbs 			for (; count != 0; count--, addr1 += 2, addr2 += 2)
1037e1a1bba4SJustin T. Gibbs 				outw(addr2, inw(addr1));
1038e1a1bba4SJustin T. Gibbs 		} else {
1039e1a1bba4SJustin T. Gibbs 			/* dest after src: copy backwards */
1040e1a1bba4SJustin T. Gibbs 			for (addr1 += 2 * (count - 1), addr2 += 2 * (count - 1);
1041e1a1bba4SJustin T. Gibbs 			    count != 0; count--, addr1 -= 2, addr2 -= 2)
1042e1a1bba4SJustin T. Gibbs 				outw(addr2, inw(addr1));
1043e1a1bba4SJustin T. Gibbs 		}
1044e1a1bba4SJustin T. Gibbs 	}
1045e1a1bba4SJustin T. Gibbs #endif
1046e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
1047e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
1048e1a1bba4SJustin T. Gibbs 	else
1049e1a1bba4SJustin T. Gibbs #endif
1050e1a1bba4SJustin T. Gibbs 	{
1051e1a1bba4SJustin T. Gibbs 		if (addr1 >= addr2) {
1052e1a1bba4SJustin T. Gibbs 			/* src after dest: copy forward */
1053e1a1bba4SJustin T. Gibbs 			for (; count != 0; count--, addr1 += 2, addr2 += 2)
1054e1a1bba4SJustin T. Gibbs 				*(volatile u_int16_t *)(addr2) =
1055e1a1bba4SJustin T. Gibbs 				    *(volatile u_int16_t *)(addr1);
1056e1a1bba4SJustin T. Gibbs 		} else {
1057e1a1bba4SJustin T. Gibbs 			/* dest after src: copy backwards */
1058e1a1bba4SJustin T. Gibbs 			for (addr1 += 2 * (count - 1), addr2 += 2 * (count - 1);
1059e1a1bba4SJustin T. Gibbs 			    count != 0; count--, addr1 -= 2, addr2 -= 2)
1060e1a1bba4SJustin T. Gibbs 				*(volatile u_int16_t *)(addr2) =
1061e1a1bba4SJustin T. Gibbs 				    *(volatile u_int16_t *)(addr1);
1062e1a1bba4SJustin T. Gibbs 		}
1063e1a1bba4SJustin T. Gibbs 	}
1064e1a1bba4SJustin T. Gibbs #endif
1065e1a1bba4SJustin T. Gibbs }
1066e1a1bba4SJustin T. Gibbs 
1067e1a1bba4SJustin T. Gibbs static __inline void
1068e1a1bba4SJustin T. Gibbs bus_space_copy_region_4(bus_space_tag_t tag, bus_space_handle_t bsh1,
1069e1a1bba4SJustin T. Gibbs 			bus_size_t off1, bus_space_handle_t bsh2,
1070e1a1bba4SJustin T. Gibbs 			bus_size_t off2, size_t count)
1071e1a1bba4SJustin T. Gibbs {
1072e1a1bba4SJustin T. Gibbs 	bus_addr_t addr1 = bsh1 + off1;
1073e1a1bba4SJustin T. Gibbs 	bus_addr_t addr2 = bsh2 + off2;
1074e1a1bba4SJustin T. Gibbs 
1075e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
1076e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
1077e1a1bba4SJustin T. Gibbs 	if (tag == I386_BUS_SPACE_IO)
1078e1a1bba4SJustin T. Gibbs #endif
1079e1a1bba4SJustin T. Gibbs 	{
1080e1a1bba4SJustin T. Gibbs 		if (addr1 >= addr2) {
1081e1a1bba4SJustin T. Gibbs 			/* src after dest: copy forward */
1082e1a1bba4SJustin T. Gibbs 			for (; count != 0; count--, addr1 += 4, addr2 += 4)
1083e1a1bba4SJustin T. Gibbs 				outl(addr2, inl(addr1));
1084e1a1bba4SJustin T. Gibbs 		} else {
1085e1a1bba4SJustin T. Gibbs 			/* dest after src: copy backwards */
1086e1a1bba4SJustin T. Gibbs 			for (addr1 += 4 * (count - 1), addr2 += 4 * (count - 1);
1087e1a1bba4SJustin T. Gibbs 			    count != 0; count--, addr1 -= 4, addr2 -= 4)
1088e1a1bba4SJustin T. Gibbs 				outl(addr2, inl(addr1));
1089e1a1bba4SJustin T. Gibbs 		}
1090e1a1bba4SJustin T. Gibbs 	}
1091e1a1bba4SJustin T. Gibbs #endif
1092e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_MEMIO_H_)
1093e1a1bba4SJustin T. Gibbs #if defined(_I386_BUS_PIO_H_)
1094e1a1bba4SJustin T. Gibbs 	else
1095e1a1bba4SJustin T. Gibbs #endif
1096e1a1bba4SJustin T. Gibbs 	{
1097e1a1bba4SJustin T. Gibbs 		if (addr1 >= addr2) {
1098e1a1bba4SJustin T. Gibbs 			/* src after dest: copy forward */
1099e1a1bba4SJustin T. Gibbs 			for (; count != 0; count--, addr1 += 4, addr2 += 4)
1100e1a1bba4SJustin T. Gibbs 				*(volatile u_int32_t *)(addr2) =
1101e1a1bba4SJustin T. Gibbs 				    *(volatile u_int32_t *)(addr1);
1102e1a1bba4SJustin T. Gibbs 		} else {
1103e1a1bba4SJustin T. Gibbs 			/* dest after src: copy backwards */
1104e1a1bba4SJustin T. Gibbs 			for (addr1 += 4 * (count - 1), addr2 += 4 * (count - 1);
1105e1a1bba4SJustin T. Gibbs 			    count != 0; count--, addr1 -= 4, addr2 -= 4)
1106e1a1bba4SJustin T. Gibbs 				*(volatile u_int32_t *)(addr2) =
1107e1a1bba4SJustin T. Gibbs 				    *(volatile u_int32_t *)(addr1);
1108e1a1bba4SJustin T. Gibbs 		}
1109e1a1bba4SJustin T. Gibbs 	}
1110e1a1bba4SJustin T. Gibbs #endif
1111e1a1bba4SJustin T. Gibbs }
1112e1a1bba4SJustin T. Gibbs 
1113e1a1bba4SJustin T. Gibbs #endif /* defined(_I386_BUS_PIO_H_) || defined(_I386_MEM_IO_H_) */
1114e1a1bba4SJustin T. Gibbs 
1115e1a1bba4SJustin T. Gibbs #if 0	/* Cause a link error for bus_space_copy_8 */
1116e1a1bba4SJustin T. Gibbs #define	bus_space_copy_region_8	!!! bus_space_copy_region_8 unimplemented !!!
1117e1a1bba4SJustin T. Gibbs #endif
1118e1a1bba4SJustin T. Gibbs 
1119e1a1bba4SJustin T. Gibbs /*
1120e1a1bba4SJustin T. Gibbs  * Bus read/write barrier methods.
1121e1a1bba4SJustin T. Gibbs  *
1122e1a1bba4SJustin T. Gibbs  *	void bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t bsh,
1123e1a1bba4SJustin T. Gibbs  *			       bus_size_t offset, bus_size_t len, int flags);
1124e1a1bba4SJustin T. Gibbs  *
1125e1a1bba4SJustin T. Gibbs  * Note: the i386 does not currently require barriers, but we must
1126e1a1bba4SJustin T. Gibbs  * provide the flags to MI code.
1127e1a1bba4SJustin T. Gibbs  */
1128e1a1bba4SJustin T. Gibbs #define	bus_space_barrier(t, h, o, l, f)	\
1129e1a1bba4SJustin T. Gibbs 	((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f)))
1130e1a1bba4SJustin T. Gibbs #define	BUS_SPACE_BARRIER_READ	0x01		/* force read barrier */
1131e1a1bba4SJustin T. Gibbs #define	BUS_SPACE_BARRIER_WRITE	0x02		/* force write barrier */
1132e1a1bba4SJustin T. Gibbs 
1133e1a1bba4SJustin T. Gibbs /*
1134e1a1bba4SJustin T. Gibbs  * Flags used in various bus DMA methods.
1135e1a1bba4SJustin T. Gibbs  */
1136e1a1bba4SJustin T. Gibbs #define	BUS_DMA_WAITOK		0x00	/* safe to sleep (pseudo-flag) */
1137e1a1bba4SJustin T. Gibbs #define	BUS_DMA_NOWAIT		0x01	/* not safe to sleep */
1138e1a1bba4SJustin T. Gibbs #define	BUS_DMA_ALLOCNOW	0x02	/* perform resource allocation now */
1139e1a1bba4SJustin T. Gibbs #define	BUS_DMAMEM_NOSYNC	0x04	/* map memory to not require sync */
1140e1a1bba4SJustin T. Gibbs #define	BUS_DMA_BUS1		0x10	/* placeholders for bus functions... */
1141e1a1bba4SJustin T. Gibbs #define	BUS_DMA_BUS2		0x20
1142e1a1bba4SJustin T. Gibbs #define	BUS_DMA_BUS3		0x40
1143e1a1bba4SJustin T. Gibbs #define	BUS_DMA_BUS4		0x80
1144e1a1bba4SJustin T. Gibbs 
1145e1a1bba4SJustin T. Gibbs /* Forwards needed by prototypes below. */
1146e1a1bba4SJustin T. Gibbs struct mbuf;
1147e1a1bba4SJustin T. Gibbs struct uio;
1148e1a1bba4SJustin T. Gibbs 
1149e1a1bba4SJustin T. Gibbs /*
1150e1a1bba4SJustin T. Gibbs  *	bus_dmasync_op_t
1151e1a1bba4SJustin T. Gibbs  *
1152e1a1bba4SJustin T. Gibbs  *	Operations performed by bus_dmamap_sync().
1153e1a1bba4SJustin T. Gibbs  */
1154e1a1bba4SJustin T. Gibbs typedef enum {
1155e1a1bba4SJustin T. Gibbs 	BUS_DMASYNC_PREREAD,
1156e1a1bba4SJustin T. Gibbs 	BUS_DMASYNC_POSTREAD,
1157e1a1bba4SJustin T. Gibbs 	BUS_DMASYNC_PREWRITE,
1158e1a1bba4SJustin T. Gibbs 	BUS_DMASYNC_POSTWRITE,
1159e1a1bba4SJustin T. Gibbs } bus_dmasync_op_t;
1160e1a1bba4SJustin T. Gibbs 
1161e1a1bba4SJustin T. Gibbs /*
1162e1a1bba4SJustin T. Gibbs  *	bus_dma_tag_t
1163e1a1bba4SJustin T. Gibbs  *
1164e1a1bba4SJustin T. Gibbs  *	A machine-dependent opaque type describing the characteristics
1165e1a1bba4SJustin T. Gibbs  *	of how to perform DMA mappings.  This structure encapsultes
1166e1a1bba4SJustin T. Gibbs  *	information concerning address and alignment restrictions, number
1167e1a1bba4SJustin T. Gibbs  *	of S/G	segments, amount of data per S/G segment, etc.
1168e1a1bba4SJustin T. Gibbs  */
1169e1a1bba4SJustin T. Gibbs typedef struct bus_dma_tag	*bus_dma_tag_t;
1170e1a1bba4SJustin T. Gibbs 
1171e1a1bba4SJustin T. Gibbs /*
1172e1a1bba4SJustin T. Gibbs  *	bus_dmamap_t
1173e1a1bba4SJustin T. Gibbs  *
1174e1a1bba4SJustin T. Gibbs  *	DMA mapping instance information.
1175e1a1bba4SJustin T. Gibbs  */
1176e1a1bba4SJustin T. Gibbs typedef struct bus_dmamap	*bus_dmamap_t;
1177e1a1bba4SJustin T. Gibbs 
1178e1a1bba4SJustin T. Gibbs /*
1179e1a1bba4SJustin T. Gibbs  *	bus_dma_segment_t
1180e1a1bba4SJustin T. Gibbs  *
1181e1a1bba4SJustin T. Gibbs  *	Describes a single contiguous DMA transaction.  Values
1182e1a1bba4SJustin T. Gibbs  *	are suitable for programming into DMA registers.
1183e1a1bba4SJustin T. Gibbs  */
1184e1a1bba4SJustin T. Gibbs typedef struct bus_dma_segment {
1185e1a1bba4SJustin T. Gibbs 	bus_addr_t	ds_addr;	/* DMA address */
1186e1a1bba4SJustin T. Gibbs 	bus_size_t	ds_len;		/* length of transfer */
1187e1a1bba4SJustin T. Gibbs } bus_dma_segment_t;
1188e1a1bba4SJustin T. Gibbs 
1189e1a1bba4SJustin T. Gibbs /*
1190e1a1bba4SJustin T. Gibbs  * A function that returns 1 if the address cannot be accessed by
1191e1a1bba4SJustin T. Gibbs  * a device and 0 if it can be.
1192e1a1bba4SJustin T. Gibbs  */
1193e1a1bba4SJustin T. Gibbs typedef int bus_dma_filter_t(void *, bus_addr_t);
1194e1a1bba4SJustin T. Gibbs 
1195e1a1bba4SJustin T. Gibbs /*
1196e1a1bba4SJustin T. Gibbs  * Allocate a device specific dma_tag encapsulating the constraints of
1197e1a1bba4SJustin T. Gibbs  * the parent tag in addition to other restrictions specified:
1198e1a1bba4SJustin T. Gibbs  *
1199e1a1bba4SJustin T. Gibbs  *	boundary:	Boundary that segments cannot cross.
1200e1a1bba4SJustin T. Gibbs  *	lowaddr:	Low restricted address that cannot appear in a mapping.
1201e1a1bba4SJustin T. Gibbs  *	highaddr:	High restricted address that cannot appear in a mapping.
1202e1a1bba4SJustin T. Gibbs  *	filtfunc:	An optional function to further test if an address
1203e1a1bba4SJustin T. Gibbs  *			within the range of lowaddr and highaddr cannot appear
1204e1a1bba4SJustin T. Gibbs  *			in a mapping.
1205e1a1bba4SJustin T. Gibbs  *	filtfuncarg:	An argument that will be passed to filtfunc in addition
1206e1a1bba4SJustin T. Gibbs  *			to the address to test.
1207e1a1bba4SJustin T. Gibbs  *	flags:		Bus DMA flags.
1208e1a1bba4SJustin T. Gibbs  *	dmat:		A pointer to set to a valid dma tag should the return
1209e1a1bba4SJustin T. Gibbs  *			value of this function indicate success.
1210e1a1bba4SJustin T. Gibbs  */
1211e1a1bba4SJustin T. Gibbs int bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t boundary,
1212e1a1bba4SJustin T. Gibbs 		       bus_addr_t lowaddr, bus_addr_t highaddr,
1213e1a1bba4SJustin T. Gibbs 		       bus_dma_filter_t *filtfunc, void *filtfuncarg,
1214e1a1bba4SJustin T. Gibbs 		       bus_size_t maxsize, int nsegments, bus_size_t maxsegsz,
1215e1a1bba4SJustin T. Gibbs 		       int flags, bus_dma_tag_t *dmat);
1216e1a1bba4SJustin T. Gibbs 
1217e1a1bba4SJustin T. Gibbs int bus_dma_tag_destroy(bus_dma_tag_t dmat);
1218e1a1bba4SJustin T. Gibbs 
1219e1a1bba4SJustin T. Gibbs /*
1220e1a1bba4SJustin T. Gibbs  * Allocate a handle for mapping from kva/uva/physical
1221e1a1bba4SJustin T. Gibbs  * address space into bus device space.
1222e1a1bba4SJustin T. Gibbs  *
1223e1a1bba4SJustin T. Gibbs  *	maxsize:	Maximum mapping size supported by this handle.
1224e1a1bba4SJustin T. Gibbs  *	nsegments:	Number of discontinuities allowed in the map.
1225e1a1bba4SJustin T. Gibbs  *	maxsegsz:	Maximum size of a segment in the map.
1226e1a1bba4SJustin T. Gibbs  */
1227e1a1bba4SJustin T. Gibbs int bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp);
1228e1a1bba4SJustin T. Gibbs 
1229e1a1bba4SJustin T. Gibbs /*
1230e1a1bba4SJustin T. Gibbs  * Destroy  a handle for mapping from kva/uva/physical
1231e1a1bba4SJustin T. Gibbs  * address space into bus device space.
1232e1a1bba4SJustin T. Gibbs  */
1233e1a1bba4SJustin T. Gibbs int bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map);
1234e1a1bba4SJustin T. Gibbs 
1235e1a1bba4SJustin T. Gibbs /*
1236e1a1bba4SJustin T. Gibbs  * A function that processes a successfully loaded dma map or an error
1237e1a1bba4SJustin T. Gibbs  * from a delayed load map.
1238e1a1bba4SJustin T. Gibbs  */
1239e1a1bba4SJustin T. Gibbs typedef void bus_dmamap_callback_t(void *, bus_dma_segment_t *, int, int);
1240e1a1bba4SJustin T. Gibbs 
1241e1a1bba4SJustin T. Gibbs /*
1242e1a1bba4SJustin T. Gibbs  * Map the buffer buf into bus space using the dmamap map.
1243e1a1bba4SJustin T. Gibbs  */
1244e1a1bba4SJustin T. Gibbs int bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
1245e1a1bba4SJustin T. Gibbs 		    bus_size_t buflen, bus_dmamap_callback_t *callback,
1246e1a1bba4SJustin T. Gibbs 		    void *callback_arg, int flags);
1247e1a1bba4SJustin T. Gibbs 
1248e1a1bba4SJustin T. Gibbs /*
1249e1a1bba4SJustin T. Gibbs  * Perform a syncronization operation on the given map.
1250e1a1bba4SJustin T. Gibbs  */
1251e1a1bba4SJustin T. Gibbs void _bus_dmamap_sync(bus_dma_tag_t, bus_dmamap_t, bus_dmasync_op_t);
1252e1a1bba4SJustin T. Gibbs #define bus_dmamap_sync(dmat, dmamap, op) 		\
1253e1a1bba4SJustin T. Gibbs 	if ((dmamap) != NULL)				\
1254e1a1bba4SJustin T. Gibbs 		_bus_dmamap_sync(dmat, dmamap, op)
1255e1a1bba4SJustin T. Gibbs 
1256e1a1bba4SJustin T. Gibbs /*
1257e1a1bba4SJustin T. Gibbs  * Release the mapping held by map.
1258e1a1bba4SJustin T. Gibbs  */
1259e1a1bba4SJustin T. Gibbs void _bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map);
1260e1a1bba4SJustin T. Gibbs #define bus_dmamap_unload(dmat, dmamap) 		\
1261e1a1bba4SJustin T. Gibbs 	if ((dmamap) != NULL)				\
1262e1a1bba4SJustin T. Gibbs 		_bus_dmamap_unload(dmat, dmamap)
1263e1a1bba4SJustin T. Gibbs 
1264e1a1bba4SJustin T. Gibbs #endif /* _I386_BUS_H_ */
1265