xref: /netbsd-src/sys/arch/aarch64/include/bus_funcs.h (revision 6cd39ddb8550f6fa1bff3fed32053d7f19fd0453)
1 /* $NetBSD: bus_funcs.h,v 1.1 2014/08/10 05:47:38 matt 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 _AARCH64_BUS_FUNCS_H_
98 #define _AARCH64_BUS_FUNCS_H_
99 
100 #ifdef __aarch64__
101 
102 #define CAT(a,b)	a##b
103 #define CAT3(a,b,c)	a##b##c
104 
105 int bus_space_init(struct aarch64_bus_space *, const char *, void *, size_t);
106 void bus_space_mallocok(void);
107 
108 /*
109  * Access methods for bus resources
110  */
111 
112 /*
113  *	void *bus_space_vaddr (bus_space_tag_t, bus_space_handle_t);
114  *
115  * Get the kernel virtual address for the mapped bus space.
116  * Only allowed for regions mapped with BUS_SPACE_MAP_LINEAR.
117  *  (XXX not enforced)
118  */
119 #define bus_space_vaddr(t, h) ((void *)(h))
120 
121 /*
122  *	paddr_t bus_space_mmap  (bus_space_tag_t t, bus_addr_t addr,
123  *	    off_t offset, int prot, int flags);
124  *
125  * Mmap a region of bus space.
126  */
127 
128 #define bus_space_mmap(t, b, o, p, f)					\
129     ((*(t)->pbs_mmap)((t), (b), (o), (p), (f)))
130 
131 /*
132  *	int bus_space_map  (bus_space_tag_t t, bus_addr_t addr,
133  *	    bus_size_t size, int flags, bus_space_handle_t *bshp);
134  *
135  * Map a region of bus space.
136  */
137 
138 #define bus_space_map(t, a, s, f, hp)					\
139     ((*(t)->pbs_map)((t), (a), (s), (f), (hp)))
140 
141 /*
142  *	int bus_space_unmap (bus_space_tag_t t,
143  *	    bus_space_handle_t bsh, bus_size_t size);
144  *
145  * Unmap a region of bus space.
146  */
147 
148 #define bus_space_unmap(t, h, s)					\
149     ((void)(*(t)->pbs_unmap)((t), (h), (s)))
150 
151 /*
152  *	int bus_space_subregion (bus_space_tag_t t,
153  *	    bus_space_handle_t bsh, bus_size_t offset, bus_size_t size,
154  *	    bus_space_handle_t *nbshp);
155  *
156  * Get a new handle for a subregion of an already-mapped area of bus space.
157  */
158 
159 #define bus_space_subregion(t, h, o, s, hp)				\
160     ((*(t)->pbs_subregion)((t), (h), (o), (s), (hp)))
161 
162 /*
163  *	int bus_space_alloc (bus_space_tag_t t, bus_addr_t rstart,
164  *	    bus_addr_t rend, bus_size_t size, bus_size_t align,
165  *	    bus_size_t boundary, int flags, bus_addr_t *bpap,
166  *	    bus_space_handle_t *bshp);
167  *
168  * Allocate a region of bus space.
169  */
170 
171 #define bus_space_alloc(t, rs, re, s, a, b, f, ap, hp)			\
172     ((*(t)->pbs_alloc)((t), (rs), (re), (s), (a), (b), (f), (ap), (hp)))
173 
174 /*
175  *	int bus_space_free (bus_space_tag_t t,
176  *	    bus_space_handle_t bsh, bus_size_t size);
177  *
178  * Free a region of bus space.
179  */
180 
181 #define	bus_space_free(t, h, s)						\
182     ((void)(*(t)->pbs_free)((t), (h), (s)))
183 
184 /*
185  *	uintN_t bus_space_read_N (bus_space_tag_t tag,
186  *	    bus_space_handle_t bsh, bus_size_t offset);
187  *
188  * Read a 1, 2, 4, or 8 byte quantity from bus space
189  * described by tag/handle/offset.
190  */
191 
192 #define bus_space_read_1(t, h, o)					\
193 	((*(t)->pbs_scalar.pbss_read_1)((t), (h), (o)))
194 #define bus_space_read_2(t, h, o)					\
195 	((*(t)->pbs_scalar.pbss_read_2)((t), (h), (o)))
196 #define bus_space_read_4(t, h, o)					\
197 	((*(t)->pbs_scalar.pbss_read_4)((t), (h), (o)))
198 #define bus_space_read_8(t, h, o)					\
199 	((*(t)->pbs_scalar.pbss_read_8)((t), (h), (o)))
200 
201 /*
202  *	uintN_t bus_space_read_stream_N (bus_space_tag_t tag,
203  *	    bus_space_handle_t bsh, bus_size_t offset);
204  *
205  * Read a 2, 4, or 8 byte quantity from bus space
206  * described by tag/handle/offset ignoring endianness.
207  */
208 
209 #define bus_space_read_stream_2(t, h, o)				\
210 	((*(t)->pbs_scalar_stream.pbss_read_2)((t), (h), (o)))
211 #define bus_space_read_stream_4(t, h, o)				\
212 	((*(t)->pbs_scalar_stream.pbss_read_4)((t), (h), (o)))
213 #define bus_space_read_stream_8(t, h, o)				\
214 	((*(t)->pbs_scalar_stream.pbss_read_8)((t), (h), (o)))
215 
216 /*
217  *	void bus_space_read_multi_N _P((bus_space_tag_t tag,
218  *	    bus_space_handle_t bsh, bus_size_t offset,
219  *	    uintN_t *addr, size_t count);
220  *
221  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
222  * described by tag/handle/offset and copy into buffer provided.
223  */
224 
225 #define bus_space_read_multi_1(t, h, o, a, c)				\
226 	((*(t)->pbs_multi->pbsg_read_1)((t), (h), (o), (a), (c)))
227 #define bus_space_read_multi_2(t, h, o, a, c)				\
228 	((*(t)->pbs_multi->pbsg_read_2)((t), (h), (o), (a), (c)))
229 #define bus_space_read_multi_4(t, h, o, a, c)				\
230 	((*(t)->pbs_multi->pbsg_read_4)((t), (h), (o), (a), (c)))
231 #define bus_space_read_multi_8(t, h, o, a, c)				\
232 	((*(t)->pbs_multi->pbsg_read_8)((t), (h), (o), (a), (c)))
233 
234 /*
235  *	void bus_space_read_multi_stream_N (bus_space_tag_t tag,
236  *	    bus_space_handle_t bsh, bus_size_t offset,
237  *	    uintN_t *addr, size_t count);
238  *
239  * Read `count' 2, 4, or 8 byte stream quantities from bus space
240  * described by tag/handle/offset and copy into buffer provided.
241  */
242 
243 #define bus_space_read_multi_stream_2(t, h, o, a, c)			\
244 	((*(t)->pbs_multi_stream->pbsg_read_2)((t), (h), (o), (a), (c)))
245 #define bus_space_read_multi_stream_4(t, h, o, a, c)			\
246 	((*(t)->pbs_multi_stream->pbsg_read_4)((t), (h), (o), (a), (c)))
247 #define bus_space_read_multi_stream_8(t, h, o, a, c)			\
248 	((*(t)->pbs_multi_stream->pbsg_read_8)((t), (h), (o), (a), (c)))
249 
250 /*
251  *	void bus_space_write_N (bus_space_tag_t tag,
252  *	    bus_space_handle_t bsh, bus_size_t offset,
253  *	    uintN_t value);
254  *
255  * Write the 1, 2, 4, or 8 byte value `value' to bus space
256  * described by tag/handle/offset.
257  */
258 
259 #define bus_space_write_1(t, h, o, v)					\
260 	((*(t)->pbs_scalar.pbss_write_1)((t), (h), (o), (v)))
261 #define bus_space_write_2(t, h, o, v)					\
262 	((*(t)->pbs_scalar.pbss_write_2)((t), (h), (o), (v)))
263 #define bus_space_write_4(t, h, o, v)					\
264 	((*(t)->pbs_scalar.pbss_write_4)((t), (h), (o), (v)))
265 #define bus_space_write_8(t, h, o, v)					\
266 	((*(t)->pbs_scalar.pbss_write_8)((t), (h), (o), (v)))
267 
268 /*
269  *	void bus_space_write_stream_N (bus_space_tag_t tag,
270  *	    bus_space_handle_t bsh, bus_size_t offset,
271  *	    uintN_t value);
272  *
273  * Write the 2, 4, or 8 byte stream value `value' to bus space
274  * described by tag/handle/offset.
275  */
276 
277 #define bus_space_write_stream_1(t, h, o, v)				\
278 	((*(t)->pbs_scalar_stream.pbss_write_1)((t), (h), (o), (v)))
279 #define bus_space_write_stream_2(t, h, o, v)				\
280 	((*(t)->pbs_scalar_stream.pbss_write_2)((t), (h), (o), (v)))
281 #define bus_space_write_stream_4(t, h, o, v)				\
282 	((*(t)->pbs_scalar_stream.pbss_write_4)((t), (h), (o), (v)))
283 #define bus_space_write_stream_8(t, h, o, v)				\
284 	((*(t)->pbs_scalar_stream.pbss_write_8)((t), (h), (o), (v)))
285 
286 /*
287  *	void bus_space_write_multi_N (bus_space_tag_t tag,
288  *	    bus_space_handle_t bsh, bus_size_t offset,
289  *	    const uintN_t *addr, size_t count);
290  *
291  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
292  * provided to bus space described by tag/handle/offset.
293  */
294 
295 #define bus_space_write_multi_1(t, h, o, a, c)				\
296 	((*(t)->pbs_multi->pbsg_write_1)((t), (h), (o), (a), (c)))
297 #define bus_space_write_multi_2(t, h, o, a, c)				\
298 	((*(t)->pbs_multi->pbsg_write_2)((t), (h), (o), (a), (c)))
299 #define bus_space_write_multi_4(t, h, o, a, c)				\
300 	((*(t)->pbs_multi->pbsg_write_4)((t), (h), (o), (a), (c)))
301 #define bus_space_write_multi_8(t, h, o, a, c)				\
302 	((*(t)->pbs_multi->pbsg_write_8)((t), (h), (o), (a), (c)))
303 
304 /*
305  *	void bus_space_write_multi_stream_N (bus_space_tag_t tag,
306  *	    bus_space_handle_t bsh, bus_size_t offset,
307  *	    const uintN_t *addr, size_t count);
308  *
309  * Write `count' 2, 4, or 8 byte stream quantities from the buffer
310  * provided to bus space described by tag/handle/offset.
311  */
312 
313 #define bus_space_write_multi_stream_1(t, h, o, a, c)			\
314 	((*(t)->pbs_multi_stream->pbsg_write_1)((t), (h), (o), (a), (c)))
315 #define bus_space_write_multi_stream_2(t, h, o, a, c)			\
316 	((*(t)->pbs_multi_stream->pbsg_write_2)((t), (h), (o), (a), (c)))
317 #define bus_space_write_multi_stream_4(t, h, o, a, c)			\
318 	((*(t)->pbs_multi_stream->pbsg_write_4)((t), (h), (o), (a), (c)))
319 #define bus_space_write_multi_stream_8(t, h, o, a, c)			\
320 	((*(t)->pbs_multi_stream->pbsg_write_8)((t), (h), (o), (a), (c)))
321 
322 /*
323  *	void bus_space_read_region_N (bus_space_tag_t tag,
324  *	    bus_space_handle_t bsh, bus_size_t offset,
325  *	    uintN_t *addr, size_t count);
326  *
327  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
328  * described by tag/handle and starting at `offset' and copy into
329  * buffer provided.
330  */
331 #define bus_space_read_region_1(t, h, o, a, c)				\
332 	((*(t)->pbs_region->pbsg_read_1)((t), (h), (o), (a), (c)))
333 #define bus_space_read_region_2(t, h, o, a, c)				\
334 	((*(t)->pbs_region->pbsg_read_2)((t), (h), (o), (a), (c)))
335 #define bus_space_read_region_4(t, h, o, a, c)				\
336 	((*(t)->pbs_region->pbsg_read_4)((t), (h), (o), (a), (c)))
337 #define bus_space_read_region_8(t, h, o, a, c)				\
338 	((*(t)->pbs_region->pbsg_read_8)((t), (h), (o), (a), (c)))
339 
340 /*
341  *	void bus_space_read_region_stream_N (bus_space_tag_t tag,
342  *	    bus_space_handle_t bsh, bus_size_t offset,
343  *	    uintN_t *addr, size_t count);
344  *
345  * Read `count' 2, 4, or 8 byte stream quantities from bus space
346  * described by tag/handle and starting at `offset' and copy into
347  * buffer provided.
348  */
349 #define bus_space_read_region_stream_2(t, h, o, a, c)			\
350 	((*(t)->pbs_region_stream->pbsg_read_2)((t), (h), (o), (a), (c)))
351 #define bus_space_read_region_stream_4(t, h, o, a, c)			\
352 	((*(t)->pbs_region_stream->pbsg_read_4)((t), (h), (o), (a), (c)))
353 #define bus_space_read_region_stream_8(t, h, o, a, c)			\
354 	((*(t)->pbs_region_stream->pbsg_read_8)((t), (h), (o), (a), (c)))
355 
356 /*
357  *	void bus_space_write_region_N (bus_space_tag_t tag,
358  *	    bus_space_handle_t bsh, bus_size_t offset,
359  *	    const uintN_t *addr, size_t count);
360  *
361  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided
362  * to bus space described by tag/handle starting at `offset'.
363  */
364 #define bus_space_write_region_1(t, h, o, a, c)				\
365 	((*(t)->pbs_region->pbsg_write_1)((t), (h), (o), (a), (c)))
366 #define bus_space_write_region_2(t, h, o, a, c)				\
367 	((*(t)->pbs_region->pbsg_write_2)((t), (h), (o), (a), (c)))
368 #define bus_space_write_region_4(t, h, o, a, c)				\
369 	((*(t)->pbs_region->pbsg_write_4)((t), (h), (o), (a), (c)))
370 #define bus_space_write_region_8(t, h, o, a, c)				\
371 	((*(t)->pbs_region->pbsg_write_8)((t), (h), (o), (a), (c)))
372 
373 /*
374  *	void bus_space_write_region_stream_N (bus_space_tag_t tag,
375  *	    bus_space_handle_t bsh, bus_size_t offset,
376  *	    const uintN_t *addr, size_t count);
377  *
378  * Write `count' 2, 4, or 8 byte stream quantities from the buffer provided
379  * to bus space described by tag/handle starting at `offset'.
380  */
381 #define bus_space_write_region_stream_2(t, h, o, a, c)			\
382 	((*(t)->pbs_region_stream->pbsg_write_2)((t), (h), (o), (a), (c)))
383 #define bus_space_write_region_stream_4(t, h, o, a, c)			\
384 	((*(t)->pbs_region_stream->pbsg_write_4)((t), (h), (o), (a), (c)))
385 #define bus_space_write_region_stream_8(t, h, o, a, c)			\
386 	((*(t)->pbs_region_stream->pbsg_write_8)((t), (h), (o), (a), (c)))
387 
388 #if 0
389 /*
390  *	void bus_space_set_multi_N (bus_space_tag_t tag,
391  *	    bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
392  *	    size_t count);
393  *
394  * Write the 1, 2, 4, or 8 byte value `val' to bus space described
395  * by tag/handle/offset `count' times.
396  */
397 #define	bus_space_set_multi_1(t, h, o, v, c)
398 	((*(t)->pbs_set_multi_1)((t), (h), (o), (v), (c)))
399 #define	bus_space_set_multi_2(t, h, o, v, c)
400 	((*(t)->pbs_set_multi_2)((t), (h), (o), (v), (c)))
401 #define	bus_space_set_multi_4(t, h, o, v, c)
402 	((*(t)->pbs_set_multi_4)((t), (h), (o), (v), (c)))
403 #define	bus_space_set_multi_8(t, h, o, v, c)
404 	((*(t)->pbs_set_multi_8)((t), (h), (o), (v), (c)))
405 
406 /*
407  *	void bus_space_set_multi_stream_N (bus_space_tag_t tag,
408  *	    bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
409  *	    size_t count);
410  *
411  * Write the 2, 4, or 8 byte stream value `val' to bus space described
412  * by tag/handle/offset `count' times.
413  */
414 #define	bus_space_set_multi_stream_2(t, h, o, v, c)
415 	((*(t)->pbs_set_multi_stream_2)((t), (h), (o), (v), (c)))
416 #define	bus_space_set_multi_stream_4(t, h, o, v, c)
417 	((*(t)->pbs_set_multi_stream_4)((t), (h), (o), (v), (c)))
418 #define	bus_space_set_multi_stream_8(t, h, o, v, c)
419 	((*(t)->pbs_set_multi_stream_8)((t), (h), (o), (v), (c)))
420 
421 #endif
422 
423 /*
424  *	void bus_space_set_region_N (bus_space_tag_t tag,
425  *	    bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
426  *	    size_t count);
427  *
428  * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
429  * by tag/handle starting at `offset'.
430  */
431 #define bus_space_set_region_1(t, h, o, v, c)				\
432 	((*(t)->pbs_set->pbss_set_1)((t), (h), (o), (v), (c)))
433 #define bus_space_set_region_2(t, h, o, v, c)				\
434 	((*(t)->pbs_set->pbss_set_2)((t), (h), (o), (v), (c)))
435 #define bus_space_set_region_4(t, h, o, v, c)				\
436 	((*(t)->pbs_set->pbss_set_4)((t), (h), (o), (v), (c)))
437 #define bus_space_set_region_8(t, h, o, v, c)				\
438 	((*(t)->pbs_set->pbss_set_8)((t), (h), (o), (v), (c)))
439 
440 /*
441  *	void bus_space_set_region_stream_N (bus_space_tag_t tag,
442  *	    bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
443  *	    size_t count);
444  *
445  * Write `count' 2, 4, or 8 byte stream value `val' to bus space described
446  * by tag/handle starting at `offset'.
447  */
448 #define bus_space_set_region_stream_2(t, h, o, v, c)			\
449 	((*(t)->pbs_set_stream->pbss_set_2)((t), (h), (o), (v), (c)))
450 #define bus_space_set_region_stream_4(t, h, o, v, c)			\
451 	((*(t)->pbs_set_stream->pbss_set_4)((t), (h), (o), (v), (c)))
452 #define bus_space_set_region_stream_8(t, h, o, v, c)			\
453 	((*(t)->pbs_set_stream->pbss_set_8)((t), (h), (o), (v), (c)))
454 
455 
456 /*
457  *	void bus_space_copy_region_N (bus_space_tag_t tag,
458  *	    bus_space_handle_t bsh1, bus_size_t off1,
459  *	    bus_space_handle_t bsh2, bus_size_t off2,
460  *	    size_t count);
461  *
462  * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
463  * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
464  */
465 #define bus_space_copy_region_1(t, h1, o1, h2, o2, c)			\
466 	((*(t)->pbs_copy->pbsc_copy_1)((t), (h1), (o1), (h2), (o2), (c)))
467 #define bus_space_copy_region_2(t, h1, o1, h2, o2, c)			\
468 	((*(t)->pbs_copy->pbsc_copy_2)((t), (h1), (o1), (h2), (o2), (c)))
469 #define bus_space_copy_region_4(t, h1, o1, h2, o2, c)			\
470 	((*(t)->pbs_copy->pbsc_copy_4)((t), (h1), (o1), (h2), (o2), (c)))
471 #define bus_space_copy_region_8(t, h1, o1, h2, o2, c)			\
472 	((*(t)->pbs_copy->pbsc_copy_8)((t), (h1), (o1), (h2), (o2), (c)))
473 
474 /*
475  * Bus read/write barrier methods.
476  *
477  *	void bus_space_barrier (bus_space_tag_t tag,
478  *	    bus_space_handle_t bsh, bus_size_t offset,
479  *	    bus_size_t len, int flags);
480  *
481  */
482 #define	bus_space_barrier(t, h, o, l, f)	\
483 	((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f)))
484 
485 /*
486  * Bus DMA methods.
487  */
488 
489 /* Forwards needed by prototypes below. */
490 struct proc;
491 struct mbuf;
492 struct uio;
493 
494 #define	bus_dmamap_create(t, s, n, m, b, f, p)			\
495 	(*(t)->_dmamap_create)((t), (s), (n), (m), (b), (f), (p))
496 #define	bus_dmamap_destroy(t, p)				\
497 	(*(t)->_dmamap_destroy)((t), (p))
498 #define	bus_dmamap_load(t, m, b, s, p, f)			\
499 	(*(t)->_dmamap_load)((t), (m), (b), (s), (p), (f))
500 #define	bus_dmamap_load_mbuf(t, m, b, f)			\
501 	(*(t)->_dmamap_load_mbuf)((t), (m), (b), (f))
502 #define	bus_dmamap_load_uio(t, m, u, f)				\
503 	(*(t)->_dmamap_load_uio)((t), (m), (u), (f))
504 #define	bus_dmamap_load_raw(t, m, sg, n, s, f)			\
505 	(*(t)->_dmamap_load_raw)((t), (m), (sg), (n), (s), (f))
506 #define	bus_dmamap_unload(t, p)					\
507 	(*(t)->_dmamap_unload)((t), (p))
508 #define	bus_dmamap_sync(t, p, o, l, ops)			\
509 	(void)((t)->_dmamap_sync ?				\
510 	    (*(t)->_dmamap_sync)((t), (p), (o), (l), (ops)) : (void)0)
511 
512 #define	bus_dmamem_alloc(t, s, a, b, sg, n, r, f)		\
513 	(*(t)->_dmamem_alloc)((t), (s), (a), (b), (sg), (n), (r), (f))
514 #define	bus_dmamem_free(t, sg, n)				\
515 	(*(t)->_dmamem_free)((t), (sg), (n))
516 #define	bus_dmamem_map(t, sg, n, s, k, f)			\
517 	(*(t)->_dmamem_map)((t), (sg), (n), (s), (k), (f))
518 #define	bus_dmamem_unmap(t, k, s)				\
519 	(*(t)->_dmamem_unmap)((t), (k), (s))
520 #define	bus_dmamem_mmap(t, sg, n, o, p, f)			\
521 	(*(t)->_dmamem_mmap)((t), (sg), (n), (o), (p), (f))
522 
523 #define bus_dmatag_subregion(t, mna, mxa, nt, f) EOPNOTSUPP
524 #define bus_dmatag_destroy(t)
525 
526 #ifdef _AARCH64_BUS_DMA_PRIVATE
527 int	_bus_dmamap_create (bus_dma_tag_t, bus_size_t, int, bus_size_t,
528 	    bus_size_t, int, bus_dmamap_t *);
529 void	_bus_dmamap_destroy (bus_dma_tag_t, bus_dmamap_t);
530 int	_bus_dmamap_load (bus_dma_tag_t, bus_dmamap_t, void *,
531 	    bus_size_t, struct proc *, int);
532 int	_bus_dmamap_load_mbuf (bus_dma_tag_t, bus_dmamap_t,
533 	    struct mbuf *, int);
534 int	_bus_dmamap_load_uio (bus_dma_tag_t, bus_dmamap_t,
535 	    struct uio *, int);
536 int	_bus_dmamap_load_raw (bus_dma_tag_t, bus_dmamap_t,
537 	    bus_dma_segment_t *, int, bus_size_t, int);
538 void	_bus_dmamap_unload (bus_dma_tag_t, bus_dmamap_t);
539 void	_bus_dmamap_sync (bus_dma_tag_t, bus_dmamap_t, bus_addr_t,
540 	    bus_size_t, int);
541 
542 int	_bus_dmamem_alloc (bus_dma_tag_t tag, bus_size_t size,
543 	    bus_size_t alignment, bus_size_t boundary,
544 	    bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags);
545 void	_bus_dmamem_free (bus_dma_tag_t tag, bus_dma_segment_t *segs,
546 	    int nsegs);
547 int	_bus_dmamem_map (bus_dma_tag_t tag, bus_dma_segment_t *segs,
548 	    int nsegs, size_t size, void **kvap, int flags);
549 void	_bus_dmamem_unmap (bus_dma_tag_t tag, void *kva,
550 	    size_t size);
551 paddr_t	_bus_dmamem_mmap (bus_dma_tag_t tag, bus_dma_segment_t *segs,
552 	    int nsegs, off_t off, int prot, int flags);
553 
554 int	_bus_dmamem_alloc_range (bus_dma_tag_t tag, bus_size_t size,
555 	    bus_size_t alignment, bus_size_t boundary,
556 	    bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags,
557 	    paddr_t low, paddr_t high);
558 
559 #endif /* _AARCH64_BUS_DMA_PRIVATE */
560 
561 #elif defined(__arm__)
562 
563 #include <arm/bus_funcs.h>
564 
565 #endif /* __aarch64__/__arm__ */
566 
567 #endif /* _AARCH64_BUS_FUNCS_H_ */
568