1 /*	$NetBSD: bus_funcs.h,v 1.1 2011/07/01 17:10:00 dyoung Exp $	*/
2 /*	$OpenBSD: bus.h,v 1.1 1997/10/13 10:53:42 pefo Exp $	*/
3 
4 /*-
5  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
6  * All rights reserved.
7  *
8  * This code is derived from software contributed to The NetBSD Foundation
9  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
10  * NASA Ames Research Center.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
25  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 /*
35  * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
36  * Copyright (c) 1996 Jason R. Thorpe.  All rights reserved.
37  * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
38  *
39  * Redistribution and use in source and binary forms, with or without
40  * modification, are permitted provided that the following conditions
41  * are met:
42  * 1. Redistributions of source code must retain the above copyright
43  *    notice, this list of conditions and the following disclaimer.
44  * 2. Redistributions in binary form must reproduce the above copyright
45  *    notice, this list of conditions and the following disclaimer in the
46  *    documentation and/or other materials provided with the distribution.
47  * 3. All advertising materials mentioning features or use of this software
48  *    must display the following acknowledgement:
49  *      This product includes software developed by Christopher G. Demetriou
50  *	for the NetBSD Project.
51  * 4. The name of the author may not be used to endorse or promote products
52  *    derived from this software without specific prior written permission
53  *
54  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
55  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
56  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
57  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
58  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
59  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
60  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
61  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
62  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
63  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
64  */
65 
66 /*
67  * Copyright (c) 1997 Per Fogelstrom.  All rights reserved.
68  * Copyright (c) 1996 Niklas Hallqvist.  All rights reserved.
69  *
70  * Redistribution and use in source and binary forms, with or without
71  * modification, are permitted provided that the following conditions
72  * are met:
73  * 1. Redistributions of source code must retain the above copyright
74  *    notice, this list of conditions and the following disclaimer.
75  * 2. Redistributions in binary form must reproduce the above copyright
76  *    notice, this list of conditions and the following disclaimer in the
77  *    documentation and/or other materials provided with the distribution.
78  * 3. All advertising materials mentioning features or use of this software
79  *    must display the following acknowledgement:
80  *      This product includes software developed by Christopher G. Demetriou
81  *	for the NetBSD Project.
82  * 4. The name of the author may not be used to endorse or promote products
83  *    derived from this software without specific prior written permission
84  *
85  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
86  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
87  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
88  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
89  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
90  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
91  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
92  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
93  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
94  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
95  */
96 
97 #ifndef _POWERPC_BUS_FUNCS_H_
98 #define _POWERPC_BUS_FUNCS_H_
99 
100 #ifndef __HAVE_LOCAL_BUS_SPACE
101 
102 #ifdef __STDC__
103 #define CAT(a,b)	a##b
104 #define CAT3(a,b,c)	a##b##c
105 #else
106 #define CAT(a,b)	a/**/b
107 #define CAT3(a,b,c)	a/**/b/**/c
108 #endif
109 
110 int bus_space_init(struct powerpc_bus_space *, const char *, void *, size_t);
111 void bus_space_mallocok(void);
112 
113 /*
114  * Access methods for bus resources
115  */
116 
117 /*
118  *	void *bus_space_vaddr (bus_space_tag_t, bus_space_handle_t);
119  *
120  * Get the kernel virtual address for the mapped bus space.
121  * Only allowed for regions mapped with BUS_SPACE_MAP_LINEAR.
122  *  (XXX not enforced)
123  */
124 #define bus_space_vaddr(t, h) ((void *)(h))
125 
126 /*
127  *	paddr_t bus_space_mmap  (bus_space_tag_t t, bus_addr_t addr,
128  *	    off_t offset, int prot, int flags);
129  *
130  * Mmap a region of bus space.
131  */
132 
133 #define bus_space_mmap(t, b, o, p, f)					\
134     ((*(t)->pbs_mmap)((t), (b), (o), (p), (f)))
135 
136 /*
137  *	int bus_space_map  (bus_space_tag_t t, bus_addr_t addr,
138  *	    bus_size_t size, int flags, bus_space_handle_t *bshp);
139  *
140  * Map a region of bus space.
141  */
142 
143 #define bus_space_map(t, a, s, f, hp)					\
144     ((*(t)->pbs_map)((t), (a), (s), (f), (hp)))
145 
146 /*
147  *	int bus_space_unmap (bus_space_tag_t t,
148  *	    bus_space_handle_t bsh, bus_size_t size);
149  *
150  * Unmap a region of bus space.
151  */
152 
153 #define bus_space_unmap(t, h, s)					\
154     ((void)(*(t)->pbs_unmap)((t), (h), (s)))
155 
156 /*
157  *	int bus_space_subregion (bus_space_tag_t t,
158  *	    bus_space_handle_t bsh, bus_size_t offset, bus_size_t size,
159  *	    bus_space_handle_t *nbshp);
160  *
161  * Get a new handle for a subregion of an already-mapped area of bus space.
162  */
163 
164 #define bus_space_subregion(t, h, o, s, hp)				\
165     ((*(t)->pbs_subregion)((t), (h), (o), (s), (hp)))
166 
167 /*
168  *	int bus_space_alloc (bus_space_tag_t t, bus_addr_t rstart,
169  *	    bus_addr_t rend, bus_size_t size, bus_size_t align,
170  *	    bus_size_t boundary, int flags, bus_addr_t *bpap,
171  *	    bus_space_handle_t *bshp);
172  *
173  * Allocate a region of bus space.
174  */
175 
176 #define bus_space_alloc(t, rs, re, s, a, b, f, ap, hp)			\
177     ((*(t)->pbs_alloc)((t), (rs), (re), (s), (a), (b), (f), (ap), (hp)))
178 
179 /*
180  *	int bus_space_free (bus_space_tag_t t,
181  *	    bus_space_handle_t bsh, bus_size_t size);
182  *
183  * Free a region of bus space.
184  */
185 
186 #define	bus_space_free(t, h, s)						\
187     ((void)(*(t)->pbs_free)((t), (h), (s)))
188 
189 /*
190  *	uintN_t bus_space_read_N (bus_space_tag_t tag,
191  *	    bus_space_handle_t bsh, bus_size_t offset);
192  *
193  * Read a 1, 2, 4, or 8 byte quantity from bus space
194  * described by tag/handle/offset.
195  */
196 
197 #define bus_space_read_1(t, h, o)					\
198 	((*(t)->pbs_scalar.pbss_read_1)((t), (h), (o)))
199 #define bus_space_read_2(t, h, o)					\
200 	((*(t)->pbs_scalar.pbss_read_2)((t), (h), (o)))
201 #define bus_space_read_4(t, h, o)					\
202 	((*(t)->pbs_scalar.pbss_read_4)((t), (h), (o)))
203 #define bus_space_read_8(t, h, o)					\
204 	((*(t)->pbs_scalar.pbss_read_8)((t), (h), (o)))
205 
206 /*
207  *	uintN_t bus_space_read_stream_N (bus_space_tag_t tag,
208  *	    bus_space_handle_t bsh, bus_size_t offset);
209  *
210  * Read a 2, 4, or 8 byte quantity from bus space
211  * described by tag/handle/offset ignoring endianness.
212  */
213 
214 #define bus_space_read_stream_2(t, h, o)				\
215 	((*(t)->pbs_scalar_stream.pbss_read_2)((t), (h), (o)))
216 #define bus_space_read_stream_4(t, h, o)				\
217 	((*(t)->pbs_scalar_stream.pbss_read_4)((t), (h), (o)))
218 #define bus_space_read_stream_8(t, h, o)				\
219 	((*(t)->pbs_scalar_stream.pbss_read_8)((t), (h), (o)))
220 
221 /*
222  *	void bus_space_read_multi_N _P((bus_space_tag_t tag,
223  *	    bus_space_handle_t bsh, bus_size_t offset,
224  *	    uintN_t *addr, size_t count);
225  *
226  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
227  * described by tag/handle/offset and copy into buffer provided.
228  */
229 
230 #define bus_space_read_multi_1(t, h, o, a, c)				\
231 	((*(t)->pbs_multi->pbsg_read_1)((t), (h), (o), (a), (c)))
232 #define bus_space_read_multi_2(t, h, o, a, c)				\
233 	((*(t)->pbs_multi->pbsg_read_2)((t), (h), (o), (a), (c)))
234 #define bus_space_read_multi_4(t, h, o, a, c)				\
235 	((*(t)->pbs_multi->pbsg_read_4)((t), (h), (o), (a), (c)))
236 #define bus_space_read_multi_8(t, h, o, a, c)				\
237 	((*(t)->pbs_multi->pbsg_read_8)((t), (h), (o), (a), (c)))
238 
239 /*
240  *	void bus_space_read_multi_stream_N (bus_space_tag_t tag,
241  *	    bus_space_handle_t bsh, bus_size_t offset,
242  *	    uintN_t *addr, size_t count);
243  *
244  * Read `count' 2, 4, or 8 byte stream quantities from bus space
245  * described by tag/handle/offset and copy into buffer provided.
246  */
247 
248 #define bus_space_read_multi_stream_2(t, h, o, a, c)			\
249 	((*(t)->pbs_multi_stream->pbsg_read_2)((t), (h), (o), (a), (c)))
250 #define bus_space_read_multi_stream_4(t, h, o, a, c)			\
251 	((*(t)->pbs_multi_stream->pbsg_read_4)((t), (h), (o), (a), (c)))
252 #define bus_space_read_multi_stream_8(t, h, o, a, c)			\
253 	((*(t)->pbs_multi_stream->pbsg_read_8)((t), (h), (o), (a), (c)))
254 
255 /*
256  *	void bus_space_write_N (bus_space_tag_t tag,
257  *	    bus_space_handle_t bsh, bus_size_t offset,
258  *	    uintN_t value);
259  *
260  * Write the 1, 2, 4, or 8 byte value `value' to bus space
261  * described by tag/handle/offset.
262  */
263 
264 #define bus_space_write_1(t, h, o, v)					\
265 	((*(t)->pbs_scalar.pbss_write_1)((t), (h), (o), (v)))
266 #define bus_space_write_2(t, h, o, v)					\
267 	((*(t)->pbs_scalar.pbss_write_2)((t), (h), (o), (v)))
268 #define bus_space_write_4(t, h, o, v)					\
269 	((*(t)->pbs_scalar.pbss_write_4)((t), (h), (o), (v)))
270 #define bus_space_write_8(t, h, o, v)					\
271 	((*(t)->pbs_scalar.pbss_write_8)((t), (h), (o), (v)))
272 
273 /*
274  *	void bus_space_write_stream_N (bus_space_tag_t tag,
275  *	    bus_space_handle_t bsh, bus_size_t offset,
276  *	    uintN_t value);
277  *
278  * Write the 2, 4, or 8 byte stream value `value' to bus space
279  * described by tag/handle/offset.
280  */
281 
282 #define bus_space_write_stream_1(t, h, o, v)				\
283 	((*(t)->pbs_scalar_stream.pbss_write_1)((t), (h), (o), (v)))
284 #define bus_space_write_stream_2(t, h, o, v)				\
285 	((*(t)->pbs_scalar_stream.pbss_write_2)((t), (h), (o), (v)))
286 #define bus_space_write_stream_4(t, h, o, v)				\
287 	((*(t)->pbs_scalar_stream.pbss_write_4)((t), (h), (o), (v)))
288 #define bus_space_write_stream_8(t, h, o, v)				\
289 	((*(t)->pbs_scalar_stream.pbss_write_8)((t), (h), (o), (v)))
290 
291 /*
292  *	void bus_space_write_multi_N (bus_space_tag_t tag,
293  *	    bus_space_handle_t bsh, bus_size_t offset,
294  *	    const uintN_t *addr, size_t count);
295  *
296  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
297  * provided to bus space described by tag/handle/offset.
298  */
299 
300 #define bus_space_write_multi_1(t, h, o, a, c)				\
301 	((*(t)->pbs_multi->pbsg_write_1)((t), (h), (o), (a), (c)))
302 #define bus_space_write_multi_2(t, h, o, a, c)				\
303 	((*(t)->pbs_multi->pbsg_write_2)((t), (h), (o), (a), (c)))
304 #define bus_space_write_multi_4(t, h, o, a, c)				\
305 	((*(t)->pbs_multi->pbsg_write_4)((t), (h), (o), (a), (c)))
306 #define bus_space_write_multi_8(t, h, o, a, c)				\
307 	((*(t)->pbs_multi->pbsg_write_8)((t), (h), (o), (a), (c)))
308 
309 /*
310  *	void bus_space_write_multi_stream_N (bus_space_tag_t tag,
311  *	    bus_space_handle_t bsh, bus_size_t offset,
312  *	    const uintN_t *addr, size_t count);
313  *
314  * Write `count' 2, 4, or 8 byte stream quantities from the buffer
315  * provided to bus space described by tag/handle/offset.
316  */
317 
318 #define bus_space_write_multi_stream_1(t, h, o, a, c)			\
319 	((*(t)->pbs_multi_stream->pbsg_write_1)((t), (h), (o), (a), (c)))
320 #define bus_space_write_multi_stream_2(t, h, o, a, c)			\
321 	((*(t)->pbs_multi_stream->pbsg_write_2)((t), (h), (o), (a), (c)))
322 #define bus_space_write_multi_stream_4(t, h, o, a, c)			\
323 	((*(t)->pbs_multi_stream->pbsg_write_4)((t), (h), (o), (a), (c)))
324 #define bus_space_write_multi_stream_8(t, h, o, a, c)			\
325 	((*(t)->pbs_multi_stream->pbsg_write_8)((t), (h), (o), (a), (c)))
326 
327 /*
328  *	void bus_space_read_region_N (bus_space_tag_t tag,
329  *	    bus_space_handle_t bsh, bus_size_t offset,
330  *	    uintN_t *addr, size_t count);
331  *
332  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
333  * described by tag/handle and starting at `offset' and copy into
334  * buffer provided.
335  */
336 #define bus_space_read_region_1(t, h, o, a, c)				\
337 	((*(t)->pbs_region->pbsg_read_1)((t), (h), (o), (a), (c)))
338 #define bus_space_read_region_2(t, h, o, a, c)				\
339 	((*(t)->pbs_region->pbsg_read_2)((t), (h), (o), (a), (c)))
340 #define bus_space_read_region_4(t, h, o, a, c)				\
341 	((*(t)->pbs_region->pbsg_read_4)((t), (h), (o), (a), (c)))
342 #define bus_space_read_region_8(t, h, o, a, c)				\
343 	((*(t)->pbs_region->pbsg_read_8)((t), (h), (o), (a), (c)))
344 
345 /*
346  *	void bus_space_read_region_stream_N (bus_space_tag_t tag,
347  *	    bus_space_handle_t bsh, bus_size_t offset,
348  *	    uintN_t *addr, size_t count);
349  *
350  * Read `count' 2, 4, or 8 byte stream quantities from bus space
351  * described by tag/handle and starting at `offset' and copy into
352  * buffer provided.
353  */
354 #define bus_space_read_region_stream_2(t, h, o, a, c)			\
355 	((*(t)->pbs_region_stream->pbsg_read_2)((t), (h), (o), (a), (c)))
356 #define bus_space_read_region_stream_4(t, h, o, a, c)			\
357 	((*(t)->pbs_region_stream->pbsg_read_4)((t), (h), (o), (a), (c)))
358 #define bus_space_read_region_stream_8(t, h, o, a, c)			\
359 	((*(t)->pbs_region_stream->pbsg_read_8)((t), (h), (o), (a), (c)))
360 
361 /*
362  *	void bus_space_write_region_N (bus_space_tag_t tag,
363  *	    bus_space_handle_t bsh, bus_size_t offset,
364  *	    const uintN_t *addr, size_t count);
365  *
366  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided
367  * to bus space described by tag/handle starting at `offset'.
368  */
369 #define bus_space_write_region_1(t, h, o, a, c)				\
370 	((*(t)->pbs_region->pbsg_write_1)((t), (h), (o), (a), (c)))
371 #define bus_space_write_region_2(t, h, o, a, c)				\
372 	((*(t)->pbs_region->pbsg_write_2)((t), (h), (o), (a), (c)))
373 #define bus_space_write_region_4(t, h, o, a, c)				\
374 	((*(t)->pbs_region->pbsg_write_4)((t), (h), (o), (a), (c)))
375 #define bus_space_write_region_8(t, h, o, a, c)				\
376 	((*(t)->pbs_region->pbsg_write_8)((t), (h), (o), (a), (c)))
377 
378 /*
379  *	void bus_space_write_region_stream_N (bus_space_tag_t tag,
380  *	    bus_space_handle_t bsh, bus_size_t offset,
381  *	    const uintN_t *addr, size_t count);
382  *
383  * Write `count' 2, 4, or 8 byte stream quantities from the buffer provided
384  * to bus space described by tag/handle starting at `offset'.
385  */
386 #define bus_space_write_region_stream_2(t, h, o, a, c)			\
387 	((*(t)->pbs_region_stream->pbsg_write_2)((t), (h), (o), (a), (c)))
388 #define bus_space_write_region_stream_4(t, h, o, a, c)			\
389 	((*(t)->pbs_region_stream->pbsg_write_4)((t), (h), (o), (a), (c)))
390 #define bus_space_write_region_stream_8(t, h, o, a, c)			\
391 	((*(t)->pbs_region_stream->pbsg_write_8)((t), (h), (o), (a), (c)))
392 
393 #if 0
394 /*
395  *	void bus_space_set_multi_N (bus_space_tag_t tag,
396  *	    bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
397  *	    size_t count);
398  *
399  * Write the 1, 2, 4, or 8 byte value `val' to bus space described
400  * by tag/handle/offset `count' times.
401  */
402 #define	bus_space_set_multi_1(t, h, o, v, c)
403 	((*(t)->pbs_set_multi_1)((t), (h), (o), (v), (c)))
404 #define	bus_space_set_multi_2(t, h, o, v, c)
405 	((*(t)->pbs_set_multi_2)((t), (h), (o), (v), (c)))
406 #define	bus_space_set_multi_4(t, h, o, v, c)
407 	((*(t)->pbs_set_multi_4)((t), (h), (o), (v), (c)))
408 #define	bus_space_set_multi_8(t, h, o, v, c)
409 	((*(t)->pbs_set_multi_8)((t), (h), (o), (v), (c)))
410 
411 /*
412  *	void bus_space_set_multi_stream_N (bus_space_tag_t tag,
413  *	    bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
414  *	    size_t count);
415  *
416  * Write the 2, 4, or 8 byte stream value `val' to bus space described
417  * by tag/handle/offset `count' times.
418  */
419 #define	bus_space_set_multi_stream_2(t, h, o, v, c)
420 	((*(t)->pbs_set_multi_stream_2)((t), (h), (o), (v), (c)))
421 #define	bus_space_set_multi_stream_4(t, h, o, v, c)
422 	((*(t)->pbs_set_multi_stream_4)((t), (h), (o), (v), (c)))
423 #define	bus_space_set_multi_stream_8(t, h, o, v, c)
424 	((*(t)->pbs_set_multi_stream_8)((t), (h), (o), (v), (c)))
425 
426 #endif
427 
428 /*
429  *	void bus_space_set_region_N (bus_space_tag_t tag,
430  *	    bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
431  *	    size_t count);
432  *
433  * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
434  * by tag/handle starting at `offset'.
435  */
436 #define bus_space_set_region_1(t, h, o, v, c)				\
437 	((*(t)->pbs_set->pbss_set_1)((t), (h), (o), (v), (c)))
438 #define bus_space_set_region_2(t, h, o, v, c)				\
439 	((*(t)->pbs_set->pbss_set_2)((t), (h), (o), (v), (c)))
440 #define bus_space_set_region_4(t, h, o, v, c)				\
441 	((*(t)->pbs_set->pbss_set_4)((t), (h), (o), (v), (c)))
442 #define bus_space_set_region_8(t, h, o, v, c)				\
443 	((*(t)->pbs_set->pbss_set_8)((t), (h), (o), (v), (c)))
444 
445 /*
446  *	void bus_space_set_region_stream_N (bus_space_tag_t tag,
447  *	    bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
448  *	    size_t count);
449  *
450  * Write `count' 2, 4, or 8 byte stream value `val' to bus space described
451  * by tag/handle starting at `offset'.
452  */
453 #define bus_space_set_region_stream_2(t, h, o, v, c)			\
454 	((*(t)->pbs_set_stream->pbss_set_2)((t), (h), (o), (v), (c)))
455 #define bus_space_set_region_stream_4(t, h, o, v, c)			\
456 	((*(t)->pbs_set_stream->pbss_set_4)((t), (h), (o), (v), (c)))
457 #define bus_space_set_region_stream_8(t, h, o, v, c)			\
458 	((*(t)->pbs_set_stream->pbss_set_8)((t), (h), (o), (v), (c)))
459 
460 
461 /*
462  *	void bus_space_copy_region_N (bus_space_tag_t tag,
463  *	    bus_space_handle_t bsh1, bus_size_t off1,
464  *	    bus_space_handle_t bsh2, bus_size_t off2,
465  *	    size_t count);
466  *
467  * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
468  * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
469  */
470 #define bus_space_copy_region_1(t, h1, o1, h2, o2, c)			\
471 	((*(t)->pbs_copy->pbsc_copy_1)((t), (h1), (o1), (h2), (o2), (c)))
472 #define bus_space_copy_region_2(t, h1, o1, h2, o2, c)			\
473 	((*(t)->pbs_copy->pbsc_copy_2)((t), (h1), (o1), (h2), (o2), (c)))
474 #define bus_space_copy_region_4(t, h1, o1, h2, o2, c)			\
475 	((*(t)->pbs_copy->pbsc_copy_4)((t), (h1), (o1), (h2), (o2), (c)))
476 #define bus_space_copy_region_8(t, h1, o1, h2, o2, c)			\
477 	((*(t)->pbs_copy->pbsc_copy_8)((t), (h1), (o1), (h2), (o2), (c)))
478 
479 /*
480  * Bus read/write barrier methods.
481  *
482  *	void bus_space_barrier (bus_space_tag_t tag,
483  *	    bus_space_handle_t bsh, bus_size_t offset,
484  *	    bus_size_t len, int flags);
485  *
486  */
487 #define	bus_space_barrier(t, h, o, l, f)	\
488 	((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f)))
489 
490 #endif	/* !__HAVE_LOCAL_BUS_SPACE */
491 
492 /*
493  * Bus DMA methods.
494  */
495 
496 /* Forwards needed by prototypes below. */
497 struct proc;
498 struct mbuf;
499 struct uio;
500 
501 #define	bus_dmamap_create(t, s, n, m, b, f, p)			\
502 	(*(t)->_dmamap_create)((t), (s), (n), (m), (b), (f), (p))
503 #define	bus_dmamap_destroy(t, p)				\
504 	(*(t)->_dmamap_destroy)((t), (p))
505 #define	bus_dmamap_load(t, m, b, s, p, f)			\
506 	(*(t)->_dmamap_load)((t), (m), (b), (s), (p), (f))
507 #define	bus_dmamap_load_mbuf(t, m, b, f)			\
508 	(*(t)->_dmamap_load_mbuf)((t), (m), (b), (f))
509 #define	bus_dmamap_load_uio(t, m, u, f)				\
510 	(*(t)->_dmamap_load_uio)((t), (m), (u), (f))
511 #define	bus_dmamap_load_raw(t, m, sg, n, s, f)			\
512 	(*(t)->_dmamap_load_raw)((t), (m), (sg), (n), (s), (f))
513 #define	bus_dmamap_unload(t, p)					\
514 	(*(t)->_dmamap_unload)((t), (p))
515 #define	bus_dmamap_sync(t, p, o, l, ops)			\
516 	(void)((t)->_dmamap_sync ?				\
517 	    (*(t)->_dmamap_sync)((t), (p), (o), (l), (ops)) : (void)0)
518 
519 #define	bus_dmamem_alloc(t, s, a, b, sg, n, r, f)		\
520 	(*(t)->_dmamem_alloc)((t), (s), (a), (b), (sg), (n), (r), (f))
521 #define	bus_dmamem_free(t, sg, n)				\
522 	(*(t)->_dmamem_free)((t), (sg), (n))
523 #define	bus_dmamem_map(t, sg, n, s, k, f)			\
524 	(*(t)->_dmamem_map)((t), (sg), (n), (s), (k), (f))
525 #define	bus_dmamem_unmap(t, k, s)				\
526 	(*(t)->_dmamem_unmap)((t), (k), (s))
527 #define	bus_dmamem_mmap(t, sg, n, o, p, f)			\
528 	(*(t)->_dmamem_mmap)((t), (sg), (n), (o), (p), (f))
529 
530 #define bus_dmatag_subregion(t, mna, mxa, nt, f) EOPNOTSUPP
531 #define bus_dmatag_destroy(t)
532 
533 #ifdef _POWERPC_BUS_DMA_PRIVATE
534 int	_bus_dmamap_create (bus_dma_tag_t, bus_size_t, int, bus_size_t,
535 	    bus_size_t, int, bus_dmamap_t *);
536 void	_bus_dmamap_destroy (bus_dma_tag_t, bus_dmamap_t);
537 int	_bus_dmamap_load (bus_dma_tag_t, bus_dmamap_t, void *,
538 	    bus_size_t, struct proc *, int);
539 int	_bus_dmamap_load_mbuf (bus_dma_tag_t, bus_dmamap_t,
540 	    struct mbuf *, int);
541 int	_bus_dmamap_load_uio (bus_dma_tag_t, bus_dmamap_t,
542 	    struct uio *, int);
543 int	_bus_dmamap_load_raw (bus_dma_tag_t, bus_dmamap_t,
544 	    bus_dma_segment_t *, int, bus_size_t, int);
545 void	_bus_dmamap_unload (bus_dma_tag_t, bus_dmamap_t);
546 void	_bus_dmamap_sync (bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
547 	    bus_size_t, int);
548 
549 int	_bus_dmamem_alloc (bus_dma_tag_t tag, bus_size_t size,
550 	    bus_size_t alignment, bus_size_t boundary,
551 	    bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags);
552 void	_bus_dmamem_free (bus_dma_tag_t tag, bus_dma_segment_t *segs,
553 	    int nsegs);
554 int	_bus_dmamem_map (bus_dma_tag_t tag, bus_dma_segment_t *segs,
555 	    int nsegs, size_t size, void **kvap, int flags);
556 void	_bus_dmamem_unmap (bus_dma_tag_t tag, void *kva,
557 	    size_t size);
558 paddr_t	_bus_dmamem_mmap (bus_dma_tag_t tag, bus_dma_segment_t *segs,
559 	    int nsegs, off_t off, int prot, int flags);
560 
561 int	_bus_dmamem_alloc_range (bus_dma_tag_t tag, bus_size_t size,
562 	    bus_size_t alignment, bus_size_t boundary,
563 	    bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags,
564 	    paddr_t low, paddr_t high);
565 bus_addr_t _bus_dma_phys_to_bus_mem_generic(bus_dma_tag_t, bus_addr_t);
566 bus_addr_t _bus_dma_bus_mem_to_phys_generic(bus_dma_tag_t, bus_addr_t);
567 #endif /* _POWERPC_BUS_DMA_PRIVATE */
568 #endif /* _POWERPC_BUS_FUNCS_H_ */
569