xref: /netbsd/sys/arch/hpcmips/include/bus.h (revision bf9ec67e)
1 /*	$NetBSD: bus.h,v 1.15 2002/04/14 07:59:59 takemura Exp $	*/
2 
3 /*-
4  * Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9  * NASA Ames Research Center.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. All advertising materials mentioning features or use of this software
20  *    must display the following acknowledgement:
21  *	This product includes software developed by the NetBSD
22  *	Foundation, Inc. and its contributors.
23  * 4. Neither the name of The NetBSD Foundation nor the names of its
24  *    contributors may be used to endorse or promote products derived
25  *    from this software without specific prior written permission.
26  *
27  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37  * POSSIBILITY OF SUCH DAMAGE.
38  */
39 
40 /*
41  * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
42  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
43  *
44  * Redistribution and use in source and binary forms, with or without
45  * modification, are permitted provided that the following conditions
46  * are met:
47  * 1. Redistributions of source code must retain the above copyright
48  *    notice, this list of conditions and the following disclaimer.
49  * 2. Redistributions in binary form must reproduce the above copyright
50  *    notice, this list of conditions and the following disclaimer in the
51  *    documentation and/or other materials provided with the distribution.
52  * 3. All advertising materials mentioning features or use of this software
53  *    must display the following acknowledgement:
54  *      This product includes software developed by Christopher G. Demetriou
55  *	for the NetBSD Project.
56  * 4. The name of the author may not be used to endorse or promote products
57  *    derived from this software without specific prior written permission
58  *
59  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
60  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
61  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
62  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
63  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
64  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
65  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
66  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
67  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
68  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
69  */
70 
71 /*
72  * derived from arch/arm/include/bus.h Rev. 1.3
73  */
74 
75 #ifndef _SYS_BUS_H_
76 #define _SYS_BUS_H_
77 
78 #include <machine/bus_types.h>
79 
80 #ifndef BUS_SPACE_MD_CALLS
81 
82 #define	BUS_SPACE_MAP_CACHEABLE		0x01
83 #define	BUS_SPACE_MAP_LINEAR		0x02
84 #define	BUS_SPACE_MAP_PREFETCHABLE     	0x04
85 
86 #define	BUS_SPACE_BARRIER_READ	0x01
87 #define	BUS_SPACE_BARRIER_WRITE	0x02
88 
89 #ifndef BUS_SPACE_MD_TYPES
90 typedef struct bus_space_tag *bus_space_tag_t;
91 #endif
92 
93 /*
94  * bus space operaion table
95  */
96 struct bus_space_ops {
97 	/* mapping/unmapping */
98 	int	  (*bs_map)(bus_space_tag_t, bus_addr_t, bus_size_t,
99 		      int, bus_space_handle_t *);
100 	void	  (*bs_unmap)(bus_space_tag_t, bus_space_handle_t, bus_size_t);
101 	int	  (*bs_subregion)(bus_space_tag_t, bus_space_handle_t,
102 		      bus_size_t, bus_size_t, bus_space_handle_t *);
103 
104 	/* allocation/deallocation */
105 	int	  (*bs_alloc)(bus_space_tag_t, bus_addr_t,
106 		      bus_addr_t, bus_size_t, bus_size_t, bus_size_t,
107 		      int, bus_addr_t *, bus_space_handle_t *);
108 	void	  (*bs_free)(bus_space_tag_t, bus_space_handle_t, bus_size_t);
109 
110 	/* get kernel virtual address */
111 	void *	  (*bs_vaddr)(bus_space_tag_t, bus_space_handle_t);
112 
113 	/* mmap bus space for user */
114 	paddr_t	  (*bs_mmap)(bus_space_tag_t, bus_addr_t, off_t, int, int);
115 
116 	/* barrier */
117 	void	  (*bs_barrier)(bus_space_tag_t, bus_space_handle_t,
118 		      bus_size_t, bus_size_t, int);
119 
120 	/* probe */
121 	int	  (*bs_peek)(bus_space_tag_t, bus_space_handle_t,
122 		      bus_size_t, size_t, void *);
123 	int	  (*bs_poke)(bus_space_tag_t, bus_space_handle_t,
124 		      bus_size_t, size_t, u_int32_t);
125 
126 	/* read (single) */
127 	u_int8_t  (*bs_r_1)(bus_space_tag_t, bus_space_handle_t, bus_size_t);
128 	u_int16_t (*bs_r_2)(bus_space_tag_t, bus_space_handle_t, bus_size_t);
129 	u_int32_t (*bs_r_4)(bus_space_tag_t, bus_space_handle_t, bus_size_t);
130 	u_int64_t (*bs_r_8)(bus_space_tag_t, bus_space_handle_t, bus_size_t);
131 
132 	/* read multiple */
133 	void	  (*bs_rm_1)(bus_space_tag_t, bus_space_handle_t,
134 		      bus_size_t, u_int8_t *, bus_size_t);
135 	void	  (*bs_rm_2)(bus_space_tag_t, bus_space_handle_t,
136 		      bus_size_t, u_int16_t *, bus_size_t);
137 	void	  (*bs_rm_4)(bus_space_tag_t, bus_space_handle_t,
138 		      bus_size_t, u_int32_t *, bus_size_t);
139 	void	  (*bs_rm_8)(bus_space_tag_t, bus_space_handle_t,
140 		      bus_size_t, u_int64_t *, bus_size_t);
141 
142 	/* read region */
143 	void	  (*bs_rr_1)(bus_space_tag_t, bus_space_handle_t,
144 		      bus_size_t, u_int8_t *, bus_size_t);
145 	void	  (*bs_rr_2)(bus_space_tag_t, bus_space_handle_t,
146 		      bus_size_t, u_int16_t *, bus_size_t);
147 	void	  (*bs_rr_4)(bus_space_tag_t, bus_space_handle_t,
148 		      bus_size_t, u_int32_t *, bus_size_t);
149 	void	  (*bs_rr_8)(bus_space_tag_t, bus_space_handle_t,
150 		      bus_size_t, u_int64_t *, bus_size_t);
151 
152 	/* write (single) */
153 	void	  (*bs_w_1)(bus_space_tag_t, bus_space_handle_t,
154 		      bus_size_t, u_int8_t);
155 	void	  (*bs_w_2)(bus_space_tag_t, bus_space_handle_t,
156 		      bus_size_t, u_int16_t);
157 	void	  (*bs_w_4)(bus_space_tag_t, bus_space_handle_t,
158 		      bus_size_t, u_int32_t);
159 	void	  (*bs_w_8)(bus_space_tag_t, bus_space_handle_t,
160 		      bus_size_t, u_int64_t);
161 
162 	/* write multiple */
163 	void	  (*bs_wm_1)(bus_space_tag_t, bus_space_handle_t,
164 		      bus_size_t, const u_int8_t *, bus_size_t);
165 	void	  (*bs_wm_2)(bus_space_tag_t, bus_space_handle_t,
166 		      bus_size_t, const u_int16_t *, bus_size_t);
167 	void	  (*bs_wm_4)(bus_space_tag_t, bus_space_handle_t,
168 		      bus_size_t, const u_int32_t *, bus_size_t);
169 	void	  (*bs_wm_8)(bus_space_tag_t, bus_space_handle_t,
170 		      bus_size_t, const u_int64_t *, bus_size_t);
171 
172 	/* write region */
173 	void	  (*bs_wr_1)(bus_space_tag_t, bus_space_handle_t,
174 		      bus_size_t, const u_int8_t *, bus_size_t);
175 	void	  (*bs_wr_2)(bus_space_tag_t, bus_space_handle_t,
176 		      bus_size_t, const u_int16_t *, bus_size_t);
177 	void	  (*bs_wr_4)(bus_space_tag_t, bus_space_handle_t,
178 		      bus_size_t, const u_int32_t *, bus_size_t);
179 	void	  (*bs_wr_8)(bus_space_tag_t, bus_space_handle_t,
180 		      bus_size_t, const u_int64_t *, bus_size_t);
181 
182 #ifdef BUS_SPACE_HAS_REAL_STREAM_METHODS
183 	/* read (single) stream */
184 	u_int8_t  (*bs_rs_1)(bus_space_tag_t, bus_space_handle_t, bus_size_t);
185 	u_int16_t (*bs_rs_2)(bus_space_tag_t, bus_space_handle_t, bus_size_t);
186 	u_int32_t (*bs_rs_4)(bus_space_tag_t, bus_space_handle_t, bus_size_t);
187 	u_int64_t (*bs_rs_8)(bus_space_tag_t, bus_space_handle_t, bus_size_t);
188 
189 	/* read multiple stream */
190 	void	  (*bs_rms_1)(bus_space_tag_t, bus_space_handle_t,
191 		      bus_size_t, u_int8_t *, bus_size_t);
192 	void	  (*bs_rms_2)(bus_space_tag_t, bus_space_handle_t,
193 		      bus_size_t, u_int16_t *, bus_size_t);
194 	void	  (*bs_rms_4)(bus_space_tag_t, bus_space_handle_t,
195 		      bus_size_t, u_int32_t *, bus_size_t);
196 	void	  (*bs_rms_8)(bus_space_tag_t, bus_space_handle_t,
197 		      bus_size_t, u_int64_t *, bus_size_t);
198 
199 	/* read region stream */
200 	void	  (*bs_rrs_1)(bus_space_tag_t, bus_space_handle_t,
201 		      bus_size_t, u_int8_t *, bus_size_t);
202 	void	  (*bs_rrs_2)(bus_space_tag_t, bus_space_handle_t,
203 		      bus_size_t, u_int16_t *, bus_size_t);
204 	void	  (*bs_rrs_4)(bus_space_tag_t, bus_space_handle_t,
205 		      bus_size_t, u_int32_t *, bus_size_t);
206 	void	  (*bs_rrs_8)(bus_space_tag_t, bus_space_handle_t,
207 		      bus_size_t, u_int64_t *, bus_size_t);
208 
209 	/* write (single) stream */
210 	void	  (*bs_ws_1)(bus_space_tag_t, bus_space_handle_t,
211 		      bus_size_t, u_int8_t);
212 	void	  (*bs_ws_2)(bus_space_tag_t, bus_space_handle_t,
213 		      bus_size_t, u_int16_t);
214 	void	  (*bs_ws_4)(bus_space_tag_t, bus_space_handle_t,
215 		      bus_size_t, u_int32_t);
216 	void	  (*bs_ws_8)(bus_space_tag_t, bus_space_handle_t,
217 		      bus_size_t, u_int64_t);
218 
219 	/* write multiple stream */
220 	void	  (*bs_wms_1)(bus_space_tag_t, bus_space_handle_t,
221 		      bus_size_t, const u_int8_t *, bus_size_t);
222 	void	  (*bs_wms_2)(bus_space_tag_t, bus_space_handle_t,
223 		      bus_size_t, const u_int16_t *, bus_size_t);
224 	void	  (*bs_wms_4)(bus_space_tag_t, bus_space_handle_t,
225 		      bus_size_t, const u_int32_t *, bus_size_t);
226 	void	  (*bs_wms_8)(bus_space_tag_t, bus_space_handle_t,
227 		      bus_size_t, const u_int64_t *, bus_size_t);
228 
229 	/* write region stream */
230 	void	  (*bs_wrs_1)(bus_space_tag_t, bus_space_handle_t,
231 		      bus_size_t, const u_int8_t *, bus_size_t);
232 	void	  (*bs_wrs_2)(bus_space_tag_t, bus_space_handle_t,
233 		      bus_size_t, const u_int16_t *, bus_size_t);
234 	void	  (*bs_wrs_4)(bus_space_tag_t, bus_space_handle_t,
235 		      bus_size_t, const u_int32_t *, bus_size_t);
236 	void	  (*bs_wrs_8)(bus_space_tag_t, bus_space_handle_t,
237 		      bus_size_t, const u_int64_t *, bus_size_t);
238 #endif /* BUS_SPACE_HAS_REAL_STREAM_METHODS */
239 
240 	/* set multiple */
241 	void	  (*bs_sm_1)(bus_space_tag_t, bus_space_handle_t,
242 		      bus_size_t, u_int8_t, bus_size_t);
243 	void	  (*bs_sm_2)(bus_space_tag_t, bus_space_handle_t,
244 		      bus_size_t, u_int16_t, bus_size_t);
245 	void	  (*bs_sm_4)(bus_space_tag_t, bus_space_handle_t,
246 		      bus_size_t, u_int32_t, bus_size_t);
247 	void	  (*bs_sm_8)(bus_space_tag_t, bus_space_handle_t,
248 		      bus_size_t, u_int64_t, bus_size_t);
249 
250 	/* set region */
251 	void	  (*bs_sr_1)(bus_space_tag_t, bus_space_handle_t,
252 		      bus_size_t, u_int8_t, bus_size_t);
253 	void	  (*bs_sr_2)(bus_space_tag_t, bus_space_handle_t,
254 		      bus_size_t, u_int16_t, bus_size_t);
255 	void	  (*bs_sr_4)(bus_space_tag_t, bus_space_handle_t,
256 		      bus_size_t, u_int32_t, bus_size_t);
257 	void	  (*bs_sr_8)(bus_space_tag_t, bus_space_handle_t,
258 		      bus_size_t, u_int64_t, bus_size_t);
259 
260 	/* copy */
261 	void	  (*bs_c_1)(bus_space_tag_t, bus_space_handle_t, bus_size_t,
262 		      bus_space_handle_t, bus_size_t, bus_size_t);
263 	void	  (*bs_c_2)(bus_space_tag_t, bus_space_handle_t, bus_size_t,
264 		      bus_space_handle_t, bus_size_t, bus_size_t);
265 	void	  (*bs_c_4)(bus_space_tag_t, bus_space_handle_t, bus_size_t,
266 		      bus_space_handle_t, bus_size_t, bus_size_t);
267 	void	  (*bs_c_8)(bus_space_tag_t, bus_space_handle_t, bus_size_t,
268 		      bus_space_handle_t, bus_size_t, bus_size_t);
269 };
270 
271 
272 /*
273  * Utility macros; INTERNAL USE ONLY.
274  */
275 #define	__bs_c(a,b)		__CONCAT(a,b)
276 #define	__bs_opname(op,s)	__bs_c(__bs_c(__bs_c(bs_,op),_),s)
277 #define	__bs_popname(pfx,op,s)	__bs_c(pfx,__bs_c(_,__bs_opname(op,s)))
278 #define	__bs_ops(t)		(((bus_space_tag_t)(t))->bs_ops)
279 
280 #define	__bs_rs(sz, t, h, o)						\
281 	(*__bs_ops(t).__bs_opname(r,sz))(t, h, o)
282 #define	__bs_ws(sz, t, h, o, v)						\
283 	(*__bs_ops(t).__bs_opname(w,sz))(t, h, o, v)
284 #ifdef BUS_SPACE_HAS_REAL_STREAM_METHODS
285 #define	__bs_rss(sz, t, h, o)						\
286 	(*__bs_ops(t).__bs_opname(rs,sz))(t, h, o)
287 #define	__bs_wss(sz, t, h, o, v)					\
288 	(*__bs_ops(t).__bs_opname(ws,sz))(t, h, o, v)
289 #endif /* BUS_SPACE_HAS_REAL_STREAM_METHODS */
290 #define	__bs_nonsingle(type, sz, t, h, o, a, c)				\
291 	(*__bs_ops(t).__bs_opname(type,sz))(t, h, o, a, c)
292 #define	__bs_set(type, sz, t, h, o, v, c)				\
293 	(*__bs_ops(t).__bs_opname(type,sz))(t, h, o, v, c)
294 #define	__bs_copy(sz, t, h1, o1, h2, o2, cnt)				\
295 	(*__bs_ops(t).__bs_opname(c,sz))(t, h1, o1, h2, o2, cnt)
296 
297 
298 /*
299  * Mapping and unmapping operations.
300  */
301 #define	bus_space_map(t, a, s, c, hp)					\
302 	(*__bs_ops(t).bs_map)(t, (a), (s), (c), (hp))
303 #define	bus_space_unmap(t, h, s)					\
304 	(*__bs_ops(t).bs_unmap)(t, (h), (s))
305 #define	bus_space_subregion(t, h, o, s, hp)				\
306 	(*__bs_ops(t).bs_subregion)(t, (h), (o), (s), (hp))
307 
308 
309 /*
310  * Allocation and deallocation operations.
311  */
312 #define	bus_space_alloc(t, rs, re, s, a, b, c, ap, hp)			\
313 	(*__bs_ops(t).bs_alloc)(t, (rs), (re), (s), (a), (b), (c), (ap), (hp))
314 #define	bus_space_free(t, h, s)						\
315 	(*__bs_ops(t).bs_free)(t, (h), (s))
316 
317 
318 /*
319  * Get kernel virtual address for ranges mapped BUS_SPACE_MAP_LINEAR.
320  */
321 #define	bus_space_vaddr(t, h)						\
322 	(*__bs_ops(t).bs_vaddr)(t, (h))
323 
324 
325 /*
326  * MMap bus space for a user application.
327  */
328 #define bus_space_mmap(t, a, o, p, f)					\
329 	(*__bs_ops(t).bs_mmap)(t, (a), (o), (p), (f))
330 
331 
332 /*
333  * Bus barrier operations.
334  */
335 #define	bus_space_barrier(t, h, o, l, f)				\
336 	(*__bs_ops(t).bs_barrier)(t, (h), (o), (l), (f))
337 
338 
339 /*
340  * Bus probe operations.
341  */
342 #define	bus_space_peek(t, h, o, s, p)					\
343 	(*__bs_ops(t).bs_peek)(t, (h), (o), (s), (p))
344 #define	bus_space_poke(t, h, o, s, v)					\
345 	(*__bs_ops(t).bs_poke)(t, (h), (o), (s), (v))
346 
347 
348 /*
349  * Bus read (single) operations.
350  */
351 #define	bus_space_read_1(t, h, o)	__bs_rs(1,(t),(h),(o))
352 #define	bus_space_read_2(t, h, o)	__bs_rs(2,(t),(h),(o))
353 #define	bus_space_read_4(t, h, o)	__bs_rs(4,(t),(h),(o))
354 #define	bus_space_read_8(t, h, o)	__bs_rs(8,(t),(h),(o))
355 
356 
357 /*
358  * Bus read multiple operations.
359  */
360 #define	bus_space_read_multi_1(t, h, o, a, c)				\
361 	__bs_nonsingle(rm,1,(t),(h),(o),(a),(c))
362 #define	bus_space_read_multi_2(t, h, o, a, c)				\
363 	__bs_nonsingle(rm,2,(t),(h),(o),(a),(c))
364 #define	bus_space_read_multi_4(t, h, o, a, c)				\
365 	__bs_nonsingle(rm,4,(t),(h),(o),(a),(c))
366 #define	bus_space_read_multi_8(t, h, o, a, c)				\
367 	__bs_nonsingle(rm,8,(t),(h),(o),(a),(c))
368 
369 
370 /*
371  * Bus read region operations.
372  */
373 #define	bus_space_read_region_1(t, h, o, a, c)				\
374 	__bs_nonsingle(rr,1,(t),(h),(o),(a),(c))
375 #define	bus_space_read_region_2(t, h, o, a, c)				\
376 	__bs_nonsingle(rr,2,(t),(h),(o),(a),(c))
377 #define	bus_space_read_region_4(t, h, o, a, c)				\
378 	__bs_nonsingle(rr,4,(t),(h),(o),(a),(c))
379 #define	bus_space_read_region_8(t, h, o, a, c)				\
380 	__bs_nonsingle(rr,8,(t),(h),(o),(a),(c))
381 
382 
383 /*
384  * Bus write (single) operations.
385  */
386 #define	bus_space_write_1(t, h, o, v)	__bs_ws(1,(t),(h),(o),(v))
387 #define	bus_space_write_2(t, h, o, v)	__bs_ws(2,(t),(h),(o),(v))
388 #define	bus_space_write_4(t, h, o, v)	__bs_ws(4,(t),(h),(o),(v))
389 #define	bus_space_write_8(t, h, o, v)	__bs_ws(8,(t),(h),(o),(v))
390 
391 
392 /*
393  * Bus write multiple operations.
394  */
395 #define	bus_space_write_multi_1(t, h, o, a, c)				\
396 	__bs_nonsingle(wm,1,(t),(h),(o),(a),(c))
397 #define	bus_space_write_multi_2(t, h, o, a, c)				\
398 	__bs_nonsingle(wm,2,(t),(h),(o),(a),(c))
399 #define	bus_space_write_multi_4(t, h, o, a, c)				\
400 	__bs_nonsingle(wm,4,(t),(h),(o),(a),(c))
401 #define	bus_space_write_multi_8(t, h, o, a, c)				\
402 	__bs_nonsingle(wm,8,(t),(h),(o),(a),(c))
403 
404 
405 /*
406  * Bus write region operations.
407  */
408 #define	bus_space_write_region_1(t, h, o, a, c)				\
409 	__bs_nonsingle(wr,1,(t),(h),(o),(a),(c))
410 #define	bus_space_write_region_2(t, h, o, a, c)				\
411 	__bs_nonsingle(wr,2,(t),(h),(o),(a),(c))
412 #define	bus_space_write_region_4(t, h, o, a, c)				\
413 	__bs_nonsingle(wr,4,(t),(h),(o),(a),(c))
414 #define	bus_space_write_region_8(t, h, o, a, c)				\
415 	__bs_nonsingle(wr,8,(t),(h),(o),(a),(c))
416 
417 
418 #ifdef BUS_SPACE_HAS_REAL_STREAM_METHODS
419 /*
420  * Bus read (single) stream operations.
421  */
422 #define	bus_space_read_stream_1(t, h, o)	__bs_rss(1,(t),(h),(o))
423 #define	bus_space_read_stream_2(t, h, o)	__bs_rss(2,(t),(h),(o))
424 #define	bus_space_read_stream_4(t, h, o)	__bs_rss(4,(t),(h),(o))
425 #define	bus_space_read_stream_8(t, h, o)	__bs_rss(8,(t),(h),(o))
426 
427 
428 /*
429  * Bus read multiple operations.
430  */
431 #define	bus_space_read_multi_stream_1(t, h, o, a, c)			\
432 	__bs_nonsingle(rms,1,(t),(h),(o),(a),(c))
433 #define	bus_space_read_multi_stream_2(t, h, o, a, c)			\
434 	__bs_nonsingle(rms,2,(t),(h),(o),(a),(c))
435 #define	bus_space_read_multi_stream_4(t, h, o, a, c)			\
436 	__bs_nonsingle(rms,4,(t),(h),(o),(a),(c))
437 #define	bus_space_read_multi_stream_8(t, h, o, a, c)			\
438 	__bs_nonsingle(rms,8,(t),(h),(o),(a),(c))
439 
440 
441 /*
442  * Bus read region operations.
443  */
444 #define	bus_space_read_region_stream_1(t, h, o, a, c)			\
445 	__bs_nonsingle(rrs,1,(t),(h),(o),(a),(c))
446 #define	bus_space_read_region_stream_2(t, h, o, a, c)			\
447 	__bs_nonsingle(rrs,2,(t),(h),(o),(a),(c))
448 #define	bus_space_read_region_stream_4(t, h, o, a, c)			\
449 	__bs_nonsingle(rrs,4,(t),(h),(o),(a),(c))
450 #define	bus_space_read_region_stream_8(t, h, o, a, c)			\
451 	__bs_nonsingle(rrs,8,(t),(h),(o),(a),(c))
452 
453 
454 /*
455  * Bus write (single) operations.
456  */
457 #define	bus_space_write_stream_1(t, h, o, v)	__bs_wss(1,(t),(h),(o),(v))
458 #define	bus_space_write_stream_2(t, h, o, v)	__bs_wss(2,(t),(h),(o),(v))
459 #define	bus_space_write_stream_4(t, h, o, v)	__bs_wss(4,(t),(h),(o),(v))
460 #define	bus_space_write_stream_8(t, h, o, v)	__bs_wss(8,(t),(h),(o),(v))
461 
462 
463 /*
464  * Bus write multiple operations.
465  */
466 #define	bus_space_write_multi_stream_1(t, h, o, a, c)			\
467 	__bs_nonsingle(wms,1,(t),(h),(o),(a),(c))
468 #define	bus_space_write_multi_stream_2(t, h, o, a, c)			\
469 	__bs_nonsingle(wms,2,(t),(h),(o),(a),(c))
470 #define	bus_space_write_multi_stream_4(t, h, o, a, c)			\
471 	__bs_nonsingle(wms,4,(t),(h),(o),(a),(c))
472 #define	bus_space_write_multi_stream_8(t, h, o, a, c)			\
473 	__bs_nonsingle(wms,8,(t),(h),(o),(a),(c))
474 
475 
476 /*
477  * Bus write region operations.
478  */
479 #define	bus_space_write_region_stream_1(t, h, o, a, c)			\
480 	__bs_nonsingle(wrs,1,(t),(h),(o),(a),(c))
481 #define	bus_space_write_region_stream_2(t, h, o, a, c)			\
482 	__bs_nonsingle(wrs,2,(t),(h),(o),(a),(c))
483 #define	bus_space_write_region_stream_4(t, h, o, a, c)			\
484 	__bs_nonsingle(wrs,4,(t),(h),(o),(a),(c))
485 #define	bus_space_write_region_stream_8(t, h, o, a, c)			\
486 	__bs_nonsingle(wrs,8,(t),(h),(o),(a),(c))
487 #else
488 #ifdef __BUS_SPACE_HAS_STREAM_METHODS
489 #define bus_space_read_stream_1 bus_space_read_1
490 #define bus_space_read_stream_2 bus_space_read_2
491 #define bus_space_read_stream_4 bus_space_read_4
492 #define	bus_space_read_stream_8 bus_space_read_8
493 #define bus_space_read_multi_stream_1 bus_space_read_multi_1
494 #define bus_space_read_multi_stream_2 bus_space_read_multi_2
495 #define bus_space_read_multi_stream_4 bus_space_read_multi_4
496 #define	bus_space_read_multi_stream_8 bus_space_read_multi_8
497 #define bus_space_read_region_stream_1 bus_space_read_region_1
498 #define bus_space_read_region_stream_2 bus_space_read_region_2
499 #define bus_space_read_region_stream_4 bus_space_read_region_4
500 #define	bus_space_read_region_stream_8 bus_space_read_region_8
501 #define bus_space_write_stream_1 bus_space_write_1
502 #define bus_space_write_stream_2 bus_space_write_2
503 #define bus_space_write_stream_4 bus_space_write_4
504 #define	bus_space_write_stream_8 bus_space_write_8
505 #define bus_space_write_multi_stream_1 bus_space_write_multi_1
506 #define bus_space_write_multi_stream_2 bus_space_write_multi_2
507 #define bus_space_write_multi_stream_4 bus_space_write_multi_4
508 #define	bus_space_write_multi_stream_8 bus_space_write_multi_8
509 #define bus_space_write_region_stream_1 bus_space_write_region_1
510 #define bus_space_write_region_stream_2 bus_space_write_region_2
511 #define bus_space_write_region_stream_4 bus_space_write_region_4
512 #define	bus_space_write_region_stream_8	bus_space_write_region_8
513 #endif /* __BUS_SPACE_HAS_STREAM_METHODS */
514 #endif /* BUS_SPACE_HAS_REAL_STREAM_METHODS */
515 
516 
517 /*
518  * Set multiple operations.
519  */
520 #define	bus_space_set_multi_1(t, h, o, v, c)				\
521 	__bs_set(sm,1,(t),(h),(o),(v),(c))
522 #define	bus_space_set_multi_2(t, h, o, v, c)				\
523 	__bs_set(sm,2,(t),(h),(o),(v),(c))
524 #define	bus_space_set_multi_4(t, h, o, v, c)				\
525 	__bs_set(sm,4,(t),(h),(o),(v),(c))
526 #define	bus_space_set_multi_8(t, h, o, v, c)				\
527 	__bs_set(sm,8,(t),(h),(o),(v),(c))
528 
529 
530 /*
531  * Set region operations.
532  */
533 #define	bus_space_set_region_1(t, h, o, v, c)				\
534 	__bs_set(sr,1,(t),(h),(o),(v),(c))
535 #define	bus_space_set_region_2(t, h, o, v, c)				\
536 	__bs_set(sr,2,(t),(h),(o),(v),(c))
537 #define	bus_space_set_region_4(t, h, o, v, c)				\
538 	__bs_set(sr,4,(t),(h),(o),(v),(c))
539 #define	bus_space_set_region_8(t, h, o, v, c)				\
540 	__bs_set(sr,8,(t),(h),(o),(v),(c))
541 
542 
543 /*
544  * Copy operations.
545  */
546 #define	bus_space_copy_region_1(t, h1, o1, h2, o2, c)			\
547 	__bs_copy(1, t, h1, o1, h2, o2, c)
548 #define	bus_space_copy_region_2(t, h1, o1, h2, o2, c)			\
549 	__bs_copy(2, t, h1, o1, h2, o2, c)
550 #define	bus_space_copy_region_4(t, h1, o1, h2, o2, c)			\
551 	__bs_copy(4, t, h1, o1, h2, o2, c)
552 #define	bus_space_copy_region_8(t, h1, o1, h2, o2, c)			\
553 	__bs_copy(8, t, h1, o1, h2, o2, c)
554 
555 
556 /*
557  * Macros to provide prototypes for all the functions used in the
558  * bus_space structure
559  */
560 #define bs_map_proto(f)							\
561 int	__bs_c(f,_bs_map)(bus_space_tag_t t, bus_addr_t addr,		\
562 	    bus_size_t size, int cacheable, bus_space_handle_t *bshp)
563 
564 #define bs_unmap_proto(f)						\
565 void	__bs_c(f,_bs_unmap)(bus_space_tag_t t, bus_space_handle_t bsh,	\
566 	    bus_size_t size)
567 
568 #define bs_subregion_proto(f)						\
569 int	__bs_c(f,_bs_subregion)(bus_space_tag_t t,			\
570 	    bus_space_handle_t bsh, bus_size_t offset,			\
571 	    bus_size_t size, bus_space_handle_t *nbshp)
572 
573 #define bs_alloc_proto(f)						\
574 int	__bs_c(f,_bs_alloc)(bus_space_tag_t t, bus_addr_t rstart,	\
575 	    bus_addr_t rend, bus_size_t size, bus_size_t align,		\
576 	    bus_size_t boundary, int cacheable, bus_addr_t *addrp,	\
577 	    bus_space_handle_t *bshp)
578 
579 #define bs_free_proto(f)						\
580 void	__bs_c(f,_bs_free)(bus_space_tag_t t, bus_space_handle_t bsh,	\
581 	    bus_size_t size)
582 
583 #define bs_vaddr_proto(f)						\
584 void *	__bs_c(f,_bs_vaddr)(bus_space_tag_t t, bus_space_handle_t bsh)
585 
586 #define bs_mmap_proto(f)						\
587 paddr_t	__bs_c(f,_bs_mmap)(bus_space_tag_t t, bus_addr_t addr,		\
588 	    off_t offset, int prot, int flags)
589 
590 #define bs_barrier_proto(f)						\
591 void	__bs_c(f,_bs_barrier)(bus_space_tag_t t, bus_space_handle_t bsh,\
592 	    bus_size_t offset, bus_size_t len, int flags)
593 
594 #define bs_peek_proto(f)						\
595 int	__bs_c(f,_bs_peek)(bus_space_tag_t t, bus_space_handle_t bsh,	\
596 	    bus_size_t offset, size_t len, void *ptr)
597 #define bs_poke_proto(f)						\
598 int	__bs_c(f,_bs_poke)(bus_space_tag_t t, bus_space_handle_t bsh,	\
599 	    bus_size_t offset, size_t len, u_int32_t val)
600 
601 #define	bs_r_1_proto(f)							\
602 u_int8_t	__bs_c(f,_bs_r_1)(bus_space_tag_t t,			\
603 		    bus_space_handle_t bsh, bus_size_t offset)
604 #define	bs_r_2_proto(f)							\
605 u_int16_t	__bs_c(f,_bs_r_2)(bus_space_tag_t t,			\
606 		    bus_space_handle_t bsh, bus_size_t offset)
607 #define	bs_r_4_proto(f)							\
608 u_int32_t	__bs_c(f,_bs_r_4)(bus_space_tag_t t,			\
609 		    bus_space_handle_t bsh, bus_size_t offset)
610 #define	bs_r_8_proto(f)							\
611 u_int64_t	__bs_c(f,_bs_r_8)(bus_space_tag_t t,			\
612 		    bus_space_handle_t bsh, bus_size_t offset)
613 
614 #define	bs_rm_1_proto(f)						\
615 void	__bs_c(f,_bs_rm_1)(bus_space_tag_t t, bus_space_handle_t bsh,	\
616 	    bus_size_t offset, u_int8_t *addr,	bus_size_t count)
617 #define	bs_rm_2_proto(f)						\
618 void	__bs_c(f,_bs_rm_2)(bus_space_tag_t t, bus_space_handle_t bsh,	\
619 	    bus_size_t offset, u_int16_t *addr,	bus_size_t count)
620 #define	bs_rm_4_proto(f)						\
621 void	__bs_c(f,_bs_rm_4)(bus_space_tag_t t, bus_space_handle_t bsh,	\
622 	    bus_size_t offset, u_int32_t *addr,	bus_size_t count)
623 #define	bs_rm_8_proto(f)						\
624 void	__bs_c(f,_bs_rm_8)(bus_space_tag_t t, bus_space_handle_t bsh,	\
625 	    bus_size_t offset, u_int64_t *addr,	bus_size_t count)
626 
627 #define	bs_rr_1_proto(f)						\
628 void	__bs_c(f,_bs_rr_1)(bus_space_tag_t t, bus_space_handle_t bsh,	\
629 	   bus_size_t offset, u_int8_t *addr, bus_size_t count)
630 #define	bs_rr_2_proto(f)						\
631 void	__bs_c(f,_bs_rr_2)(bus_space_tag_t t, bus_space_handle_t bsh,	\
632 	   bus_size_t offset, u_int16_t *addr, bus_size_t count)
633 #define	bs_rr_4_proto(f)						\
634 void	__bs_c(f,_bs_rr_4)(bus_space_tag_t t, bus_space_handle_t bsh,	\
635 	   bus_size_t offset, u_int32_t *addr, bus_size_t count)
636 #define	bs_rr_8_proto(f)						\
637 void	__bs_c(f,_bs_rr_8)(bus_space_tag_t t, bus_space_handle_t bsh,	\
638 	   bus_size_t offset, u_int64_t *addr, bus_size_t count)
639 
640 #define	bs_w_1_proto(f)							\
641 void	__bs_c(f,_bs_w_1)(bus_space_tag_t t, bus_space_handle_t bsh,	\
642 	    bus_size_t offset, u_int8_t value)
643 #define	bs_w_2_proto(f)							\
644 void	__bs_c(f,_bs_w_2)(bus_space_tag_t t, bus_space_handle_t bsh,	\
645 	    bus_size_t offset, u_int16_t value)
646 #define	bs_w_4_proto(f)							\
647 void	__bs_c(f,_bs_w_4)(bus_space_tag_t t, bus_space_handle_t bsh,	\
648 	    bus_size_t offset, u_int32_t value)
649 #define	bs_w_8_proto(f)							\
650 void	__bs_c(f,_bs_w_8)(bus_space_tag_t t, bus_space_handle_t bsh,	\
651 	    bus_size_t offset, u_int64_t value)
652 
653 #define	bs_wm_1_proto(f)						\
654 void	__bs_c(f,_bs_wm_1)(bus_space_tag_t t, bus_space_handle_t bsh,	\
655 	   bus_size_t offset, const u_int8_t *addr, bus_size_t count)
656 #define	bs_wm_2_proto(f)						\
657 void	__bs_c(f,_bs_wm_2)(bus_space_tag_t t, bus_space_handle_t bsh,	\
658 	   bus_size_t offset, const u_int16_t *addr, bus_size_t count)
659 #define	bs_wm_4_proto(f)						\
660 void	__bs_c(f,_bs_wm_4)(bus_space_tag_t t, bus_space_handle_t bsh,	\
661 	   bus_size_t offset, const u_int32_t *addr, bus_size_t count)
662 #define	bs_wm_8_proto(f)						\
663 void	__bs_c(f,_bs_wm_8)(bus_space_tag_t t, bus_space_handle_t bsh,	\
664 	   bus_size_t offset, const u_int64_t *addr, bus_size_t count)
665 
666 #define	bs_wr_1_proto(f)						\
667 void	__bs_c(f,_bs_wr_1)(bus_space_tag_t t, bus_space_handle_t bsh,	\
668 	    bus_size_t offset, const u_int8_t *addr, bus_size_t count)
669 #define	bs_wr_2_proto(f)						\
670 void	__bs_c(f,_bs_wr_2)(bus_space_tag_t t, bus_space_handle_t bsh,	\
671 	    bus_size_t offset, const u_int16_t *addr, bus_size_t count)
672 #define	bs_wr_4_proto(f)						\
673 void	__bs_c(f,_bs_wr_4)(bus_space_tag_t t, bus_space_handle_t bsh,	\
674 	    bus_size_t offset, const u_int32_t *addr, bus_size_t count)
675 #define	bs_wr_8_proto(f)						\
676 void	__bs_c(f,_bs_wr_8)(bus_space_tag_t t, bus_space_handle_t bsh,	\
677 	    bus_size_t offset, const u_int64_t *addr, bus_size_t count)
678 
679 #ifdef BUS_SPACE_HAS_REAL_STREAM_METHODS
680 #define	bs_rs_1_proto(f)						\
681 u_int8_t	__bs_c(f,_bs_rs_1)(bus_space_tag_t t,			\
682 		    bus_space_handle_t bsh, bus_size_t offset)
683 #define	bs_rs_2_proto(f)						\
684 u_int16_t	__bs_c(f,_bs_rs_2)(bus_space_tag_t t,			\
685 		    bus_space_handle_t bsh, bus_size_t offset)
686 #define	bs_rs_4_proto(f)						\
687 u_int32_t	__bs_c(f,_bs_rs_4)(bus_space_tag_t t,			\
688 		    bus_space_handle_t bsh, bus_size_t offset)
689 #define	bs_rs_8_proto(f)						\
690 u_int64_t	__bs_c(f,_bs_rs_8)(bus_space_tag_t t,			\
691 		    bus_space_handle_t bsh, bus_size_t offset)
692 
693 #define	bs_rms_1_proto(f)						\
694 void	__bs_c(f,_bs_rms_1)(bus_space_tag_t t, bus_space_handle_t bsh,	\
695 	    bus_size_t offset, u_int8_t *addr,	bus_size_t count)
696 #define	bs_rms_2_proto(f)						\
697 void	__bs_c(f,_bs_rms_1)(bus_space_tag_t t, bus_space_handle_t bsh,	\
698 	    bus_size_t offset, u_int16_t *addr,	bus_size_t count)
699 #define	bs_rms_4_proto(f)						\
700 void	__bs_c(f,_bs_rms_4)(bus_space_tag_t t, bus_space_handle_t bsh,	\
701 	    bus_size_t offset, u_int32_t *addr,	bus_size_t count)
702 #define	bs_rms_8_proto(f)						\
703 void	__bs_c(f,_bs_rms_8)(bus_space_tag_t t, bus_space_handle_t bsh,	\
704 	    bus_size_t offset, u_int64_t *addr,	bus_size_t count)
705 
706 #define	bs_rrs_1_proto(f)						\
707 void	__bs_c(f,_bs_rrs_1)(bus_space_tag_t t, bus_space_handle_t bsh,	\
708 	   bus_size_t offset, u_int8_t *addr, bus_size_t count)
709 #define	bs_rrs_2_proto(f)						\
710 void	__bs_c(f,_bs_rrs_2)(bus_space_tag_t t, bus_space_handle_t bsh,	\
711 	   bus_size_t offset, u_int16_t *addr, bus_size_t count)
712 #define	bs_rrs_4_proto(f)						\
713 void	__bs_c(f,_bs_rrs_4)(bus_space_tag_t t, bus_space_handle_t bsh,	\
714 	   bus_size_t offset, u_int32_t *addr, bus_size_t count)
715 #define	bs_rrs_8_proto(f)						\
716 void	__bs_c(f,_bs_rrs_8)(bus_space_tag_t t, bus_space_handle_t bsh,	\
717 	   bus_size_t offset, u_int64_t *addr, bus_size_t count)
718 
719 #define	bs_ws_1_proto(f)						\
720 void	__bs_c(f,_bs_ws_1)(bus_space_tag_t t, bus_space_handle_t bsh,	\
721 	    bus_size_t offset, u_int8_t value)
722 #define	bs_ws_2_proto(f)						\
723 void	__bs_c(f,_bs_ws_2)(bus_space_tag_t t, bus_space_handle_t bsh,	\
724 	    bus_size_t offset, u_int16_t value)
725 #define	bs_ws_4_proto(f)						\
726 void	__bs_c(f,_bs_ws_4)(bus_space_tag_t t, bus_space_handle_t bsh,	\
727 	    bus_size_t offset, u_int32_t value)
728 #define	bs_ws_8_proto(f)						\
729 void	__bs_c(f,_bs_ws_8)(bus_space_tag_t t, bus_space_handle_t bsh,	\
730 	    bus_size_t offset, u_int64_t value)
731 
732 #define	bs_wms_1_proto(f)						\
733 void	__bs_c(f,_bs_wms_1)(bus_space_tag_t t, bus_space_handle_t bsh,	\
734 	   bus_size_t offset, const u_int8_t *addr, bus_size_t count)
735 #define	bs_wms_2_proto(f)						\
736 void	__bs_c(f,_bs_wms_2)(bus_space_tag_t t, bus_space_handle_t bsh,	\
737 	   bus_size_t offset, const u_int16_t *addr, bus_size_t count)
738 #define	bs_wms_4_proto(f)						\
739 void	__bs_c(f,_bs_wms_4)(bus_space_tag_t t, bus_space_handle_t bsh,	\
740 	   bus_size_t offset, const u_int32_t *addr, bus_size_t count)
741 #define	bs_wms_8_proto(f)						\
742 void	__bs_c(f,_bs_wms_8)(bus_space_tag_t t, bus_space_handle_t bsh,	\
743 	   bus_size_t offset, const u_int64_t *addr, bus_size_t count)
744 
745 #define	bs_wrs_1_proto(f)						\
746 void	__bs_c(f,_bs_wrs_1)(bus_space_tag_t t, bus_space_handle_t bsh,	\
747 	    bus_size_t offset, const u_int8_t *addr, bus_size_t count)
748 #define	bs_wrs_2_proto(f)						\
749 void	__bs_c(f,_bs_wrs_2)(bus_space_tag_t t, bus_space_handle_t bsh,	\
750 	    bus_size_t offset, const u_int16_t *addr, bus_size_t count)
751 #define	bs_wrs_4_proto(f)						\
752 void	__bs_c(f,_bs_wrs_4)(bus_space_tag_t t, bus_space_handle_t bsh,	\
753 	    bus_size_t offset, const u_int32_t *addr, bus_size_t count)
754 #define	bs_wrs_8_proto(f)						\
755 void	__bs_c(f,_bs_wrs_8)(bus_space_tag_t t, bus_space_handle_t bsh,	\
756 	    bus_size_t offset, const u_int64_t *addr, bus_size_t count)
757 #else /* BUS_SPACE_HAS_REAL_STREAM_METHODS */
758 #define	bs_rs_1_proto(f)
759 #define	bs_rs_2_proto(f)
760 #define	bs_rs_4_proto(f)
761 #define	bs_rs_8_proto(f)
762 #define	bs_rms_1_proto(f)
763 #define	bs_rms_2_proto(f)
764 #define	bs_rms_4_proto(f)
765 #define	bs_rms_8_proto(f)
766 #define	bs_rrs_1_proto(f)
767 #define	bs_rrs_2_proto(f)
768 #define	bs_rrs_4_proto(f)
769 #define	bs_rrs_8_proto(f)
770 #define	bs_ws_1_proto(f)
771 #define	bs_ws_2_proto(f)
772 #define	bs_ws_4_proto(f)
773 #define	bs_ws_8_proto(f)
774 #define	bs_wms_1_proto(f)
775 #define	bs_wms_2_proto(f)
776 #define	bs_wms_4_proto(f)
777 #define	bs_wms_8_proto(f)
778 #define	bs_wrs_1_proto(f)
779 #define	bs_wrs_2_proto(f)
780 #define	bs_wrs_4_proto(f)
781 #define	bs_wrs_8_proto(f)
782 #endif /* ! BUS_SPACE_HAS_REAL_STREAM_METHODS */
783 
784 #define	bs_sm_1_proto(f)						\
785 void	__bs_c(f,_bs_sm_1)(bus_space_tag_t t, bus_space_handle_t bsh,	\
786 	    bus_size_t offset, u_int8_t value, bus_size_t count)
787 #define	bs_sm_2_proto(f)						\
788 void	__bs_c(f,_bs_sm_2)(bus_space_tag_t t, bus_space_handle_t bsh,	\
789 	    bus_size_t offset, u_int16_t value, bus_size_t count)
790 #define	bs_sm_4_proto(f)						\
791 void	__bs_c(f,_bs_sm_4)(bus_space_tag_t t, bus_space_handle_t bsh,	\
792 	    bus_size_t offset, u_int32_t value, bus_size_t count)
793 #define	bs_sm_8_proto(f)						\
794 void	__bs_c(f,_bs_sm_8)(bus_space_tag_t t, bus_space_handle_t bsh,	\
795 	    bus_size_t offset, u_int64_t value, bus_size_t count)
796 
797 #define	bs_sr_1_proto(f)						\
798 void	__bs_c(f,_bs_sr_1)(bus_space_tag_t t, bus_space_handle_t bsh,	\
799 	    bus_size_t offset, u_int8_t value, bus_size_t count)
800 #define	bs_sr_2_proto(f)						\
801 void	__bs_c(f,_bs_sr_2)(bus_space_tag_t t, bus_space_handle_t bsh,	\
802 	    bus_size_t offset, u_int16_t value, bus_size_t count)
803 #define	bs_sr_4_proto(f)						\
804 void	__bs_c(f,_bs_sr_4)(bus_space_tag_t t, bus_space_handle_t bsh,	\
805 	    bus_size_t offset, u_int32_t value, bus_size_t count)
806 #define	bs_sr_8_proto(f)						\
807 void	__bs_c(f,_bs_sr_8)(bus_space_tag_t t, bus_space_handle_t bsh,	\
808 	    bus_size_t offset, u_int64_t value, bus_size_t count)
809 
810 #define	bs_c_1_proto(f)							\
811 void	__bs_c(f,_bs_c_1)(bus_space_tag_t t, bus_space_handle_t bsh1,	\
812 	    bus_size_t offset1, bus_space_handle_t bsh2,		\
813 	    bus_size_t offset2, bus_size_t count)
814 #define	bs_c_2_proto(f)							\
815 void	__bs_c(f,_bs_c_2)(bus_space_tag_t t, bus_space_handle_t bsh1,	\
816 	    bus_size_t offset1, bus_space_handle_t bsh2,		\
817 	    bus_size_t offset2, bus_size_t count)
818 #define	bs_c_4_proto(f)							\
819 void	__bs_c(f,_bs_c_4)(bus_space_tag_t t, bus_space_handle_t bsh1,	\
820 	    bus_size_t offset1, bus_space_handle_t bsh2,		\
821 	    bus_size_t offset2, bus_size_t count)
822 #define	bs_c_8_proto(f)							\
823 void	__bs_c(f,_bs_c_8)(bus_space_tag_t t, bus_space_handle_t bsh1,	\
824 	    bus_size_t offset1, bus_space_handle_t bsh2,		\
825 	    bus_size_t offset2, bus_size_t count)
826 
827 
828 #define bus_space_protos(f)	\
829 bs_map_proto(f);		\
830 bs_unmap_proto(f);		\
831 bs_subregion_proto(f);		\
832 bs_alloc_proto(f);		\
833 bs_free_proto(f);		\
834 bs_vaddr_proto(f);		\
835 bs_mmap_proto(f);		\
836 bs_barrier_proto(f);		\
837 bs_peek_proto(f);		\
838 bs_poke_proto(f);		\
839 bs_r_1_proto(f);		\
840 bs_r_2_proto(f);		\
841 bs_r_4_proto(f);		\
842 bs_r_8_proto(f);		\
843 bs_rm_1_proto(f);		\
844 bs_rm_2_proto(f);		\
845 bs_rm_4_proto(f);		\
846 bs_rm_8_proto(f);		\
847 bs_rr_1_proto(f);		\
848 bs_rr_2_proto(f);		\
849 bs_rr_4_proto(f);		\
850 bs_rr_8_proto(f);		\
851 bs_w_1_proto(f);		\
852 bs_w_2_proto(f);		\
853 bs_w_4_proto(f);		\
854 bs_w_8_proto(f);		\
855 bs_wm_1_proto(f);		\
856 bs_wm_2_proto(f);		\
857 bs_wm_4_proto(f);		\
858 bs_wm_8_proto(f);		\
859 bs_wr_1_proto(f);		\
860 bs_wr_2_proto(f);		\
861 bs_wr_4_proto(f);		\
862 bs_wr_8_proto(f);		\
863 bs_rs_1_proto(f);		\
864 bs_rs_2_proto(f);		\
865 bs_rs_4_proto(f);		\
866 bs_rs_8_proto(f);		\
867 bs_rms_1_proto(f);		\
868 bs_rms_2_proto(f);		\
869 bs_rms_4_proto(f);		\
870 bs_rms_8_proto(f);		\
871 bs_rrs_1_proto(f);		\
872 bs_rrs_2_proto(f);		\
873 bs_rrs_4_proto(f);		\
874 bs_rrs_8_proto(f);		\
875 bs_ws_1_proto(f);		\
876 bs_ws_2_proto(f);		\
877 bs_ws_4_proto(f);		\
878 bs_ws_8_proto(f);		\
879 bs_wms_1_proto(f);		\
880 bs_wms_2_proto(f);		\
881 bs_wms_4_proto(f);		\
882 bs_wms_8_proto(f);		\
883 bs_wrs_1_proto(f);		\
884 bs_wrs_2_proto(f);		\
885 bs_wrs_4_proto(f);		\
886 bs_wrs_8_proto(f);		\
887 bs_sm_1_proto(f);		\
888 bs_sm_2_proto(f);		\
889 bs_sm_4_proto(f);		\
890 bs_sm_8_proto(f);		\
891 bs_sr_1_proto(f);		\
892 bs_sr_2_proto(f);		\
893 bs_sr_4_proto(f);		\
894 bs_sr_8_proto(f);		\
895 bs_c_1_proto(f);		\
896 bs_c_2_proto(f);		\
897 bs_c_4_proto(f);		\
898 bs_c_8_proto(f);
899 
900 #endif /* ! BUS_SPACE_MD_CALLS */
901 
902 #ifndef BUS_SPACE_MD_TYPES
903 #ifdef BUS_SPACE_MD_CALLS
904 typedef struct bus_space *bus_space_tag_t;
905 #endif /* BUS_SPACE_MD_CALLS */
906 
907 /*
908  *	bus_space_tag_t
909  *
910  *	bus space tag structure
911  */
912 struct bus_space_tag {
913 	bus_space_tag_t bs_base;
914 	struct bus_space_ops bs_ops;
915 };
916 #endif /* ! BUS_SPACE_MD_TYPES */
917 
918 #ifndef BUS_DMA_MD_CALLS
919 
920 /*
921  * Flags used in various bus DMA methods.
922  */
923 #define	BUS_DMA_WAITOK		0x000	/* safe to sleep (pseudo-flag) */
924 #define	BUS_DMA_NOWAIT		0x001	/* not safe to sleep */
925 #define	BUS_DMA_ALLOCNOW	0x002	/* perform resource allocation now */
926 #define	BUS_DMA_COHERENT	0x004	/* hint: map memory DMA coherent */
927 #define	BUS_DMA_STREAMING	0x008	/* hint: sequential, unidirectional */
928 #define	BUS_DMA_BUS1		0x010	/* placeholders for bus functions... */
929 #define	BUS_DMA_BUS2		0x020
930 #define	BUS_DMA_BUS3		0x040
931 #define	BUS_DMA_BUS4		0x080
932 #define	BUS_DMA_READ		0x100	/* mapping is device -> memory only */
933 #define	BUS_DMA_WRITE		0x200	/* mapping is memory -> device only */
934 
935 /*
936  * Operations performed by bus_dmamap_sync().
937  */
938 #define	BUS_DMASYNC_PREREAD	0x01	/* pre-read synchronization */
939 #define	BUS_DMASYNC_POSTREAD	0x02	/* post-read synchronization */
940 #define	BUS_DMASYNC_PREWRITE	0x04	/* pre-write synchronization */
941 #define	BUS_DMASYNC_POSTWRITE	0x08	/* post-write synchronization */
942 
943 /* Forwards needed by prototypes below. */
944 struct mbuf;
945 struct uio;
946 
947 #ifndef BUS_DMA_MD_TYPES
948 typedef struct bus_dma_tag	*bus_dma_tag_t;
949 typedef struct bus_dma_segment	bus_dma_segment_t;
950 typedef struct bus_dmamap	*bus_dmamap_t;
951 #endif /* ! BUS_DMA_MD_TYPES */
952 
953 /*
954  * bus DMA operaion table
955  */
956 struct bus_dma_ops {
957 	/*
958 	 * DMA mapping methods.
959 	 */
960 	int	(*bd_map_create)(bus_dma_tag_t, bus_size_t, int,
961 		    bus_size_t, bus_size_t, int, bus_dmamap_t *);
962 	void	(*bd_map_destroy)(bus_dma_tag_t, bus_dmamap_t);
963 	int	(*bd_map_load)(bus_dma_tag_t, bus_dmamap_t, void *,
964 		    bus_size_t, struct proc *, int);
965 	int	(*bd_map_load_mbuf)(bus_dma_tag_t, bus_dmamap_t,
966 		    struct mbuf *, int);
967 	int	(*bd_map_load_uio)(bus_dma_tag_t, bus_dmamap_t,
968 		    struct uio *, int);
969 	int	(*bd_map_load_raw)(bus_dma_tag_t, bus_dmamap_t,
970 		    bus_dma_segment_t *, int, bus_size_t, int);
971 	void	(*bd_map_unload)(bus_dma_tag_t, bus_dmamap_t);
972 	void	(*bd_map_sync)(bus_dma_tag_t, bus_dmamap_t,
973 		    bus_addr_t, bus_size_t, int);
974 
975 	/*
976 	 * DMA memory utility functions.
977 	 */
978 	int	(*bd_mem_alloc)(bus_dma_tag_t, bus_size_t, bus_size_t,
979 		    bus_size_t, bus_dma_segment_t *, int, int *, int);
980 	void	(*bd_mem_free)(bus_dma_tag_t,
981 		    bus_dma_segment_t *, int);
982 	int	(*bd_mem_map)(bus_dma_tag_t, bus_dma_segment_t *,
983 		    int, size_t, caddr_t *, int);
984 	void	(*bd_mem_unmap)(bus_dma_tag_t, caddr_t, size_t);
985 	paddr_t	(*bd_mem_mmap)(bus_dma_tag_t, bus_dma_segment_t *,
986 		    int, off_t, int, int);
987 };
988 
989 
990 /*
991  * bus DMA methods
992  */
993 #define	__bd_ops(t)	(((bus_dma_tag_t)(t))->bd_ops)
994 #define	bus_dmamap_create(t, s, n, m, b, f, p)				\
995 	(*__bd_ops(t).bd_map_create)((t), (s), (n), (m), (b), (f), (p))
996 #define	bus_dmamap_destroy(t, p)					\
997 	(*__bd_ops(t).bd_map_destroy)((t), (p))
998 #define	bus_dmamap_load(t, m, b, s, p, f)				\
999 	(*__bd_ops(t).bd_map_load)((t), (m), (b), (s), (p), (f))
1000 #define	bus_dmamap_load_mbuf(t, m, b, f)				\
1001 	(*__bd_ops(t).bd_map_load_mbuf)((t), (m), (b), (f))
1002 #define	bus_dmamap_load_uio(t, m, u, f)					\
1003 	(*__bd_ops(t).bd_map_load_uio)((t), (m), (u), (f))
1004 #define	bus_dmamap_load_raw(t, m, sg, n, s, f)				\
1005 	(*__bd_ops(t).bd_map_load_raw)((t), (m), (sg), (n), (s), (f))
1006 #define	bus_dmamap_unload(t, p)						\
1007 	(*__bd_ops(t).bd_map_unload)((t), (p))
1008 #define	bus_dmamap_sync(t, p, o, l, ops)				\
1009 	(void)(__bd_ops(t).bd_map_sync ?				\
1010 	    (*__bd_ops(t).bd_map_sync)((t), (p), (o), (l), (ops)) : (void)0)
1011 
1012 #define	bus_dmamem_alloc(t, s, a, b, sg, n, r, f)			\
1013 	(*__bd_ops(t).bd_mem_alloc)((t), (s), (a), (b), (sg), (n), (r), (f))
1014 #define	bus_dmamem_free(t, sg, n)					\
1015 	(*__bd_ops(t).bd_mem_free)((t), (sg), (n))
1016 #define	bus_dmamem_map(t, sg, n, s, k, f)				\
1017 	(*__bd_ops(t).bd_mem_map)((t), (sg), (n), (s), (k), (f))
1018 #define	bus_dmamem_unmap(t, k, s)					\
1019 	(*__bd_ops(t).bd_mem_unmap)((t), (k), (s))
1020 #define	bus_dmamem_mmap(t, sg, n, o, p, f)				\
1021 	(*__bd_ops(t).bd_mem_mmap)((t), (sg), (n), (o), (p), (f))
1022 
1023 
1024 /*
1025  * Macros to provide prototypes for all the functions used in the
1026  * bus_dma structure
1027  */
1028 #define bus_dma_protos(f)						\
1029 int	__bs_c(f,_bd_map_create)(bus_dma_tag_t, bus_size_t, int,	\
1030 	    bus_size_t, bus_size_t, int, bus_dmamap_t *);		\
1031 void	__bs_c(f,_bd_map_destroy)(bus_dma_tag_t, bus_dmamap_t);		\
1032 int	__bs_c(f,_bd_map_load)(bus_dma_tag_t, bus_dmamap_t, void *,	\
1033 	    bus_size_t, struct proc *, int);				\
1034 int	__bs_c(f,_bd_map_load_mbuf)(bus_dma_tag_t, bus_dmamap_t,	\
1035 	    struct mbuf *, int);					\
1036 int	__bs_c(f,_bd_map_load_uio)(bus_dma_tag_t, bus_dmamap_t,		\
1037 	    struct uio *, int);						\
1038 int	__bs_c(f,_bd_map_load_raw)(bus_dma_tag_t, bus_dmamap_t,		\
1039 	    bus_dma_segment_t *, int, bus_size_t, int);			\
1040 void	__bs_c(f,_bd_map_unload)(bus_dma_tag_t, bus_dmamap_t);		\
1041 void	__bs_c(f,_bd_map_sync)(bus_dma_tag_t, bus_dmamap_t,		\
1042 	    bus_addr_t, bus_size_t, int);				\
1043 int	__bs_c(f,_bd_mem_alloc)(bus_dma_tag_t, bus_size_t, bus_size_t,	\
1044 	    bus_size_t, bus_dma_segment_t *, int, int *, int);		\
1045 void	__bs_c(f,_bd_mem_free)(bus_dma_tag_t, bus_dma_segment_t *, int);\
1046 int	__bs_c(f,_bd_mem_map)(bus_dma_tag_t, bus_dma_segment_t *,	\
1047 	    int, size_t, caddr_t *, int);				\
1048 void	__bs_c(f,_bd_mem_unmap)(bus_dma_tag_t, caddr_t, size_t);	\
1049 paddr_t	__bs_c(f,_bd_mem_mmap)(bus_dma_tag_t, bus_dma_segment_t *,	\
1050 	    int, off_t, int, int);
1051 
1052 #endif /* ! BUS_DMA_MD_CALLS */
1053 
1054 #ifndef BUS_DMA_MD_TYPES
1055 #ifdef BUS_DMA_MD_CALLS
1056 typedef struct bus_dma_tag	*bus_dma_tag_t;
1057 typedef struct bus_dma_segment	bus_dma_segment_t;
1058 typedef struct bus_dmamap	*bus_dmamap_t;
1059 #endif /* ! BUS_DMA_MD_CALLS */
1060 
1061 /*
1062  *	bus_dma_tag
1063  *
1064  *	Describes a implementation of DMA for a given bus.
1065  */
1066 struct bus_dma_tag {
1067 	bus_dma_tag_t bd_base;
1068 	struct bus_dma_ops bd_ops;
1069 };
1070 
1071 /*
1072  *	bus_dma_segment
1073  *
1074  *	Describes a single contiguous DMA transaction.
1075  */
1076 struct bus_dma_segment {
1077 	bus_addr_t	ds_addr;	/* DMA address */
1078 	bus_size_t	ds_len;		/* length of transfer */
1079 };
1080 
1081 /*
1082  *	bus_dmamap
1083  *
1084  *	Describes a DMA mapping.
1085  */
1086 struct bus_dmamap {
1087 	bus_size_t	dm_mapsize;	/* size of the mapping */
1088 	int		dm_nsegs;	/* # valid segments in mapping */
1089 	bus_dma_segment_t *dm_segs;	/* segments; variable length */
1090 };
1091 
1092 #endif /* ! BUS_DMA_MD_TYPES */
1093 
1094 #include <machine/bus_machdep.h>
1095 
1096 #endif /* _SYS_BUS_H_ */
1097