bus.h revision 210334
1/*-
2 * Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc.
3 * All rights reserved.
4 *
5 * This code is derived from software contributed to The NetBSD Foundation
6 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
7 * NASA Ames Research Center.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 *    must display the following acknowledgement:
19 *	This product includes software developed by the NetBSD
20 *	Foundation, Inc. and its contributors.
21 * 4. Neither the name of The NetBSD Foundation nor the names of its
22 *    contributors may be used to endorse or promote products derived
23 *    from this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
26 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 */
37/*
38 * Copyright (c) 1997-1999 Eduardo E. Horvath. All rights reserved.
39 * Copyright (c) 1996 Charles M. Hannum.  All rights reserved.
40 * Copyright (c) 1996 Christopher G. Demetriou.  All rights reserved.
41 *
42 * Redistribution and use in source and binary forms, with or without
43 * modification, are permitted provided that the following conditions
44 * are met:
45 * 1. Redistributions of source code must retain the above copyright
46 *    notice, this list of conditions and the following disclaimer.
47 * 2. Redistributions in binary form must reproduce the above copyright
48 *    notice, this list of conditions and the following disclaimer in the
49 *    documentation and/or other materials provided with the distribution.
50 * 3. All advertising materials mentioning features or use of this software
51 *    must display the following acknowledgement:
52 *      This product includes software developed by Christopher G. Demetriou
53 *	for the NetBSD Project.
54 * 4. The name of the author may not be used to endorse or promote products
55 *    derived from this software without specific prior written permission
56 *
57 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
58 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
59 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
60 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
61 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
62 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
63 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
64 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
65 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
66 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
67 *
68 * 	from: NetBSD: bus.h,v 1.28 2001/07/19 15:32:19 thorpej Exp
69 *	and
70 *	from: FreeBSD: src/sys/alpha/include/bus.h,v 1.9 2001/01/09
71 *
72 * $FreeBSD: head/sys/sparc64/include/bus.h 210334 2010-07-21 10:05:07Z attilio $
73 */
74
75#ifndef	_MACHINE_BUS_H_
76#define	_MACHINE_BUS_H_
77
78#ifdef BUS_SPACE_DEBUG
79#include <sys/ktr.h>
80#endif
81
82#include <machine/_bus.h>
83#include <machine/cpufunc.h>
84
85/*
86 * Nexus and SBus spaces are non-cached and big endian
87 * (except for RAM and PROM)
88 *
89 * PCI spaces are non-cached and little endian
90 */
91#define	NEXUS_BUS_SPACE		0
92#define	SBUS_BUS_SPACE		1
93#define	PCI_CONFIG_BUS_SPACE	2
94#define	PCI_IO_BUS_SPACE	3
95#define	PCI_MEMORY_BUS_SPACE	4
96#define	LAST_BUS_SPACE		5
97
98extern const int bus_type_asi[];
99extern const int bus_stream_asi[];
100
101#define	__BUS_SPACE_HAS_STREAM_METHODS	1
102
103#define	BUS_SPACE_MAXSIZE_24BIT	0xFFFFFF
104#define	BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF
105#define	BUS_SPACE_MAXSIZE	0xFFFFFFFFFFFFFFFF
106#define	BUS_SPACE_MAXADDR_24BIT	0xFFFFFF
107#define	BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
108#define	BUS_SPACE_MAXADDR	0xFFFFFFFF
109
110#define	BUS_SPACE_UNRESTRICTED	(~0)
111
112struct bus_space_tag {
113	void		*bst_cookie;
114	bus_space_tag_t	bst_parent;
115	int		bst_type;
116
117	void		(*bst_bus_barrier)(bus_space_tag_t, bus_space_handle_t,
118			    bus_size_t, bus_size_t, int);
119};
120
121/*
122 * Bus space function prototypes.
123 */
124static void bus_space_barrier(bus_space_tag_t, bus_space_handle_t, bus_size_t,
125    bus_size_t, int);
126static int bus_space_subregion(bus_space_tag_t, bus_space_handle_t,
127    bus_size_t, bus_size_t, bus_space_handle_t *);
128
129/*
130 * Map a region of device bus space into CPU virtual address space.
131 */
132
133static __inline int bus_space_map(bus_space_tag_t t, bus_addr_t addr,
134    bus_size_t size, int flags, bus_space_handle_t *bshp);
135
136static __inline int
137bus_space_map(bus_space_tag_t t __unused, bus_addr_t addr,
138    bus_size_t size __unused, int flags __unused, bus_space_handle_t *bshp)
139{
140
141	*bshp = addr;
142	return (0);
143}
144
145/*
146 * Unmap a region of device bus space.
147 */
148static __inline void bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh,
149    bus_size_t size);
150
151static __inline void
152bus_space_unmap(bus_space_tag_t t __unused, bus_space_handle_t bsh __unused,
153    bus_size_t size __unused)
154{
155
156}
157
158/* This macro finds the first "upstream" implementation of method `f' */
159#define	_BS_CALL(t,f)							\
160	while (t->f == NULL)						\
161		t = t->bst_parent;					\
162	return (*(t)->f)
163
164static __inline void
165bus_space_barrier(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
166    bus_size_t s, int f)
167{
168
169	_BS_CALL(t, bst_bus_barrier)(t, h, o, s, f);
170}
171
172static __inline int
173bus_space_subregion(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
174    bus_size_t s, bus_space_handle_t *hp)
175{
176
177	*hp = h + o;
178	return (0);
179}
180
181/* flags for bus space map functions */
182#define	BUS_SPACE_MAP_CACHEABLE		0x0001
183#define	BUS_SPACE_MAP_LINEAR		0x0002
184#define	BUS_SPACE_MAP_READONLY		0x0004
185#define	BUS_SPACE_MAP_PREFETCHABLE	0x0008
186/* placeholders for bus functions... */
187#define	BUS_SPACE_MAP_BUS1		0x0100
188#define	BUS_SPACE_MAP_BUS2		0x0200
189#define	BUS_SPACE_MAP_BUS3		0x0400
190#define	BUS_SPACE_MAP_BUS4		0x0800
191
192/* flags for bus_space_barrier() */
193#define	BUS_SPACE_BARRIER_READ		0x01	/* force read barrier */
194#define	BUS_SPACE_BARRIER_WRITE		0x02	/* force write barrier */
195
196#ifdef BUS_SPACE_DEBUG
197#define	KTR_BUS				KTR_SPARE2
198#define	__BUS_DEBUG_ACCESS(h, o, desc, sz) do {				\
199	CTR4(KTR_BUS, "bus space: %s %d: handle %#lx, offset %#lx",	\
200	    (desc), (sz), (h), (o));					\
201} while (0)
202#else
203#define	__BUS_DEBUG_ACCESS(h, o, desc, sz)
204#endif
205
206static __inline uint8_t
207bus_space_read_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
208{
209
210	__BUS_DEBUG_ACCESS(h, o, "read", 1);
211	return (lduba_nc((caddr_t)(h + o), bus_type_asi[t->bst_type]));
212}
213
214static __inline uint16_t
215bus_space_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
216{
217
218	__BUS_DEBUG_ACCESS(h, o, "read", 2);
219	return (lduha_nc((caddr_t)(h + o), bus_type_asi[t->bst_type]));
220}
221
222static __inline uint32_t
223bus_space_read_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
224{
225
226	__BUS_DEBUG_ACCESS(h, o, "read", 4);
227	return (lduwa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type]));
228}
229
230static __inline uint64_t
231bus_space_read_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
232{
233
234	__BUS_DEBUG_ACCESS(h, o, "read", 8);
235	return (ldxa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type]));
236}
237
238static __inline void
239bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
240    uint8_t *a, size_t c)
241{
242
243	while (c-- > 0)
244		*a++ = bus_space_read_1(t, h, o);
245}
246
247static __inline void
248bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
249    uint16_t *a, size_t c)
250{
251
252	while (c-- > 0)
253		*a++ = bus_space_read_2(t, h, o);
254}
255
256static __inline void
257bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
258    uint32_t *a, size_t c)
259{
260
261	while (c-- > 0)
262		*a++ = bus_space_read_4(t, h, o);
263}
264
265static __inline void
266bus_space_read_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
267    uint64_t *a, size_t c)
268{
269
270	while (c-- > 0)
271		*a++ = bus_space_read_8(t, h, o);
272}
273
274static __inline void
275bus_space_write_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
276    uint8_t v)
277{
278
279	__BUS_DEBUG_ACCESS(h, o, "write", 1);
280	stba_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v);
281}
282
283static __inline void
284bus_space_write_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
285    uint16_t v)
286{
287
288	__BUS_DEBUG_ACCESS(h, o, "write", 2);
289	stha_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v);
290}
291
292static __inline void
293bus_space_write_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
294    uint32_t v)
295{
296
297	__BUS_DEBUG_ACCESS(h, o, "write", 4);
298	stwa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v);
299}
300
301static __inline void
302bus_space_write_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
303    uint64_t v)
304{
305
306	__BUS_DEBUG_ACCESS(h, o, "write", 8);
307	stxa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v);
308}
309
310static __inline void
311bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
312    const uint8_t *a, size_t c)
313{
314
315	while (c-- > 0)
316		bus_space_write_1(t, h, o, *a++);
317}
318
319static __inline void
320bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
321    const uint16_t *a, size_t c)
322{
323
324	while (c-- > 0)
325		bus_space_write_2(t, h, o, *a++);
326}
327
328static __inline void
329bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
330    const uint32_t *a, size_t c)
331{
332
333	while (c-- > 0)
334		bus_space_write_4(t, h, o, *a++);
335}
336
337static __inline void
338bus_space_write_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
339    const uint64_t *a, size_t c)
340{
341
342	while (c-- > 0)
343		bus_space_write_8(t, h, o, *a++);
344}
345
346static __inline void
347bus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
348    uint8_t v, size_t c)
349{
350
351	while (c-- > 0)
352		bus_space_write_1(t, h, o, v);
353}
354
355static __inline void
356bus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
357    uint16_t v, size_t c)
358{
359
360	while (c-- > 0)
361		bus_space_write_2(t, h, o, v);
362}
363
364static __inline void
365bus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
366    uint32_t v, size_t c)
367{
368
369	while (c-- > 0)
370		bus_space_write_4(t, h, o, v);
371}
372
373static __inline void
374bus_space_set_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
375    uint64_t v, size_t c)
376{
377
378	while (c-- > 0)
379		bus_space_write_8(t, h, o, v);
380}
381
382static __inline void
383bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
384    uint8_t *a, bus_size_t c)
385{
386
387	for (; c; a++, c--, o++)
388		*a = bus_space_read_1(t, h, o);
389}
390
391static __inline void
392bus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
393    uint16_t *a, bus_size_t c)
394{
395
396	for (; c; a++, c--, o += 2)
397		*a = bus_space_read_2(t, h, o);
398}
399
400static __inline void
401bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
402    uint32_t *a, bus_size_t c)
403{
404
405	for (; c; a++, c--, o += 4)
406		*a = bus_space_read_4(t, h, o);
407}
408
409static __inline void
410bus_space_read_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
411    uint64_t *a, bus_size_t c)
412{
413
414	for (; c; a++, c--, o += 8)
415		*a = bus_space_read_8(t, h, o);
416}
417
418static __inline void
419bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
420    const uint8_t *a, bus_size_t c)
421{
422
423	for (; c; a++, c--, o++)
424		bus_space_write_1(t, h, o, *a);
425}
426
427static __inline void
428bus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
429    const uint16_t *a, bus_size_t c)
430{
431
432	for (; c; a++, c--, o += 2)
433		bus_space_write_2(t, h, o, *a);
434}
435
436static __inline void
437bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
438    const uint32_t *a, bus_size_t c)
439{
440
441	for (; c; a++, c--, o += 4)
442		bus_space_write_4(t, h, o, *a);
443}
444
445static __inline void
446bus_space_write_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
447    const uint64_t *a, bus_size_t c)
448{
449
450	for (; c; a++, c--, o += 8)
451		bus_space_write_8(t, h, o, *a);
452}
453
454static __inline void
455bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
456    const uint8_t v, bus_size_t c)
457{
458
459	for (; c; c--, o++)
460		bus_space_write_1(t, h, o, v);
461}
462
463static __inline void
464bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
465    const uint16_t v, bus_size_t c)
466{
467
468	for (; c; c--, o += 2)
469		bus_space_write_2(t, h, o, v);
470}
471
472static __inline void
473bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
474    const uint32_t v, bus_size_t c)
475{
476
477	for (; c; c--, o += 4)
478		bus_space_write_4(t, h, o, v);
479}
480
481static __inline void
482bus_space_set_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
483    const uint64_t v, bus_size_t c)
484{
485
486	for (; c; c--, o += 8)
487		bus_space_write_8(t, h, o, v);
488}
489
490static __inline void
491bus_space_copy_region_1(bus_space_tag_t t, bus_space_handle_t h1,
492    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
493{
494
495	for (; c; c--, o1++, o2++)
496	    bus_space_write_1(t, h1, o1, bus_space_read_1(t, h2, o2));
497}
498
499static __inline void
500bus_space_copy_region_2(bus_space_tag_t t, bus_space_handle_t h1,
501    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
502{
503
504	for (; c; c--, o1 += 2, o2 += 2)
505	    bus_space_write_2(t, h1, o1, bus_space_read_2(t, h2, o2));
506}
507
508static __inline void
509bus_space_copy_region_4(bus_space_tag_t t, bus_space_handle_t h1,
510    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
511{
512
513	for (; c; c--, o1 += 4, o2 += 4)
514	    bus_space_write_4(t, h1, o1, bus_space_read_4(t, h2, o2));
515}
516
517static __inline void
518bus_space_copy_region_8(bus_space_tag_t t, bus_space_handle_t h1,
519    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
520{
521
522	for (; c; c--, o1 += 8, o2 += 8)
523	    bus_space_write_8(t, h1, o1, bus_space_read_8(t, h2, o2));
524}
525
526static __inline uint8_t
527bus_space_read_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
528{
529
530	__BUS_DEBUG_ACCESS(h, o, "read stream", 1);
531	return (lduba_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type]));
532}
533
534static __inline uint16_t
535bus_space_read_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
536{
537
538	__BUS_DEBUG_ACCESS(h, o, "read stream", 2);
539	return (lduha_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type]));
540}
541
542static __inline uint32_t
543bus_space_read_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
544{
545
546	__BUS_DEBUG_ACCESS(h, o, "read stream", 4);
547	return (lduwa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type]));
548}
549
550static __inline uint64_t
551bus_space_read_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
552{
553
554	__BUS_DEBUG_ACCESS(h, o, "read stream", 8);
555	return (ldxa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type]));
556}
557
558static __inline void
559bus_space_read_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h,
560    bus_size_t o, uint8_t *a, size_t c)
561{
562
563	while (c-- > 0)
564		*a++ = bus_space_read_stream_1(t, h, o);
565}
566
567static __inline void
568bus_space_read_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h,
569    bus_size_t o, uint16_t *a, size_t c)
570{
571
572	while (c-- > 0)
573		*a++ = bus_space_read_stream_2(t, h, o);
574}
575
576static __inline void
577bus_space_read_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h,
578    bus_size_t o, uint32_t *a, size_t c)
579{
580
581	while (c-- > 0)
582		*a++ = bus_space_read_stream_4(t, h, o);
583}
584
585static __inline void
586bus_space_read_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h,
587    bus_size_t o, uint64_t *a, size_t c)
588{
589
590	while (c-- > 0)
591		*a++ = bus_space_read_stream_8(t, h, o);
592}
593
594static __inline void
595bus_space_write_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
596    uint8_t v)
597{
598
599	__BUS_DEBUG_ACCESS(h, o, "write stream", 1);
600	stba_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v);
601}
602
603static __inline void
604bus_space_write_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
605    uint16_t v)
606{
607
608	__BUS_DEBUG_ACCESS(h, o, "write stream", 2);
609	stha_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v);
610}
611
612static __inline void
613bus_space_write_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
614    uint32_t v)
615{
616
617	__BUS_DEBUG_ACCESS(h, o, "write stream", 4);
618	stwa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v);
619}
620
621static __inline void
622bus_space_write_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
623    uint64_t v)
624{
625
626	__BUS_DEBUG_ACCESS(h, o, "write stream", 8);
627	stxa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v);
628}
629
630static __inline void
631bus_space_write_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h,
632    bus_size_t o, const uint8_t *a, size_t c)
633{
634
635	while (c-- > 0)
636		bus_space_write_stream_1(t, h, o, *a++);
637}
638
639static __inline void
640bus_space_write_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h,
641    bus_size_t o, const uint16_t *a, size_t c)
642{
643
644	while (c-- > 0)
645		bus_space_write_stream_2(t, h, o, *a++);
646}
647
648static __inline void
649bus_space_write_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h,
650    bus_size_t o, const uint32_t *a, size_t c)
651{
652
653	while (c-- > 0)
654		bus_space_write_stream_4(t, h, o, *a++);
655}
656
657static __inline void
658bus_space_write_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h,
659    bus_size_t o, const uint64_t *a, size_t c)
660{
661
662	while (c-- > 0)
663		bus_space_write_stream_8(t, h, o, *a++);
664}
665
666static __inline void
667bus_space_set_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h,
668    bus_size_t o, uint8_t v, size_t c)
669{
670
671	while (c-- > 0)
672		bus_space_write_stream_1(t, h, o, v);
673}
674
675static __inline void
676bus_space_set_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h,
677    bus_size_t o, uint16_t v, size_t c)
678{
679
680	while (c-- > 0)
681		bus_space_write_stream_2(t, h, o, v);
682}
683
684static __inline void
685bus_space_set_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h,
686    bus_size_t o, uint32_t v, size_t c)
687{
688
689	while (c-- > 0)
690		bus_space_write_stream_4(t, h, o, v);
691}
692
693static __inline void
694bus_space_set_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h,
695    bus_size_t o, uint64_t v, size_t c)
696{
697
698	while (c-- > 0)
699		bus_space_write_stream_8(t, h, o, v);
700}
701
702static __inline void
703bus_space_read_region_stream_1(bus_space_tag_t t, bus_space_handle_t h,
704    bus_size_t o, uint8_t *a, bus_size_t c)
705{
706
707	for (; c; a++, c--, o++)
708		*a = bus_space_read_stream_1(t, h, o);
709}
710
711static __inline void
712bus_space_read_region_stream_2(bus_space_tag_t t, bus_space_handle_t h,
713    bus_size_t o, uint16_t *a, bus_size_t c)
714{
715
716	for (; c; a++, c--, o += 2)
717		*a = bus_space_read_stream_2(t, h, o);
718}
719
720static __inline void
721bus_space_read_region_stream_4(bus_space_tag_t t, bus_space_handle_t h,
722    bus_size_t o, uint32_t *a, bus_size_t c)
723{
724
725	for (; c; a++, c--, o += 4)
726		*a = bus_space_read_stream_4(t, h, o);
727}
728
729static __inline void
730bus_space_read_region_stream_8(bus_space_tag_t t, bus_space_handle_t h,
731    bus_size_t o, uint64_t *a, bus_size_t c)
732{
733
734	for (; c; a++, c--, o += 8)
735		*a = bus_space_read_stream_8(t, h, o);
736}
737
738static __inline void
739bus_space_write_region_stream_1(bus_space_tag_t t, bus_space_handle_t h,
740    bus_size_t o, const uint8_t *a, bus_size_t c)
741{
742
743	for (; c; a++, c--, o++)
744		bus_space_write_stream_1(t, h, o, *a);
745}
746
747static __inline void
748bus_space_write_region_stream_2(bus_space_tag_t t, bus_space_handle_t h,
749    bus_size_t o, const uint16_t *a, bus_size_t c)
750{
751
752	for (; c; a++, c--, o += 2)
753		bus_space_write_stream_2(t, h, o, *a);
754}
755
756static __inline void
757bus_space_write_region_stream_4(bus_space_tag_t t, bus_space_handle_t h,
758    bus_size_t o, const uint32_t *a, bus_size_t c)
759{
760
761	for (; c; a++, c--, o += 4)
762		bus_space_write_stream_4(t, h, o, *a);
763}
764
765static __inline void
766bus_space_write_region_stream_8(bus_space_tag_t t, bus_space_handle_t h,
767    bus_size_t o, const uint64_t *a, bus_size_t c)
768{
769
770	for (; c; a++, c--, o += 8)
771		bus_space_write_stream_8(t, h, o, *a);
772}
773
774static __inline void
775bus_space_set_region_stream_1(bus_space_tag_t t, bus_space_handle_t h,
776    bus_size_t o, const uint8_t v, bus_size_t c)
777{
778
779	for (; c; c--, o++)
780		bus_space_write_stream_1(t, h, o, v);
781}
782
783static __inline void
784bus_space_set_region_stream_2(bus_space_tag_t t, bus_space_handle_t h,
785    bus_size_t o, const uint16_t v, bus_size_t c)
786{
787
788	for (; c; c--, o += 2)
789		bus_space_write_stream_2(t, h, o, v);
790}
791
792static __inline void
793bus_space_set_region_stream_4(bus_space_tag_t t, bus_space_handle_t h,
794    bus_size_t o, const uint32_t v, bus_size_t c)
795{
796
797	for (; c; c--, o += 4)
798		bus_space_write_stream_4(t, h, o, v);
799}
800
801static __inline void
802bus_space_set_region_stream_8(bus_space_tag_t t, bus_space_handle_t h,
803    bus_size_t o, const uint64_t v, bus_size_t c)
804{
805
806	for (; c; c--, o += 8)
807		bus_space_write_stream_8(t, h, o, v);
808}
809
810static __inline void
811bus_space_copy_region_stream_1(bus_space_tag_t t, bus_space_handle_t h1,
812    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
813{
814
815	for (; c; c--, o1++, o2++)
816	    bus_space_write_stream_1(t, h1, o1, bus_space_read_stream_1(t, h2,
817		o2));
818}
819
820static __inline void
821bus_space_copy_region_stream_2(bus_space_tag_t t, bus_space_handle_t h1,
822    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
823{
824
825	for (; c; c--, o1 += 2, o2 += 2)
826	    bus_space_write_stream_2(t, h1, o1, bus_space_read_stream_2(t, h2,
827		o2));
828}
829
830static __inline void
831bus_space_copy_region_stream_4(bus_space_tag_t t, bus_space_handle_t h1,
832    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
833{
834
835	for (; c; c--, o1 += 4, o2 += 4)
836	    bus_space_write_stream_4(t, h1, o1, bus_space_read_stream_4(t, h2,
837		o2));
838}
839
840static __inline void
841bus_space_copy_region_stream_8(bus_space_tag_t t, bus_space_handle_t h1,
842    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
843{
844
845	for (; c; c--, o1 += 8, o2 += 8)
846	    bus_space_write_stream_8(t, h1, o1, bus_space_read_8(t, h2, o2));
847}
848
849static __inline int
850bus_space_peek_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
851	uint8_t *a)
852{
853
854	__BUS_DEBUG_ACCESS(h, o, "peek", 1);
855	return (fasword8(bus_type_asi[t->bst_type], (caddr_t)(h + o), a));
856}
857
858static __inline int
859bus_space_peek_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
860	uint16_t *a)
861{
862
863	__BUS_DEBUG_ACCESS(h, o, "peek", 2);
864	return (fasword16(bus_type_asi[t->bst_type], (caddr_t)(h + o), a));
865}
866
867static __inline int
868bus_space_peek_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
869	uint32_t *a)
870{
871
872	__BUS_DEBUG_ACCESS(h, o, "peek", 4);
873	return (fasword32(bus_type_asi[t->bst_type], (caddr_t)(h + o), a));
874}
875
876#include <machine/bus_dma.h>
877
878#endif /* !_MACHINE_BUS_H_ */
879