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