bus.h revision 166092
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 166092 2007-01-18 13:52:44Z marius $
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#include <machine/upa.h>
85
86/*
87 * UPA and SBUS spaces are non-cached and big endian
88 * (except for RAM and PROM)
89 *
90 * PCI spaces are non-cached and little endian
91 */
92#define	UPA_BUS_SPACE		0
93#define	SBUS_BUS_SPACE		1
94#define	PCI_CONFIG_BUS_SPACE	2
95#define	PCI_IO_BUS_SPACE	3
96#define	PCI_MEMORY_BUS_SPACE	4
97#define	LAST_BUS_SPACE		5
98
99extern int bus_type_asi[];
100extern int bus_stream_asi[];
101
102#define __BUS_SPACE_HAS_STREAM_METHODS	1
103
104#define BUS_SPACE_MAXSIZE_24BIT	0xFFFFFF
105#define BUS_SPACE_MAXSIZE_32BIT 0xFFFFFFFF
106#define BUS_SPACE_MAXSIZE	0xFFFFFFFFFFFFFFFF
107#define BUS_SPACE_MAXADDR_24BIT	0xFFFFFF
108#define BUS_SPACE_MAXADDR_32BIT 0xFFFFFFFF
109#define BUS_SPACE_MAXADDR	0xFFFFFFFF
110
111#define BUS_SPACE_UNRESTRICTED	(~0)
112
113struct bus_space_tag {
114	void		*bst_cookie;
115	bus_space_tag_t	bst_parent;
116	int		bst_type;
117
118	void		(*bst_bus_barrier)(bus_space_tag_t, bus_space_handle_t,
119	    bus_size_t, bus_size_t, int);
120};
121
122/*
123 * Bus space function prototypes.
124 */
125static void bus_space_barrier(bus_space_tag_t, bus_space_handle_t, bus_size_t,
126    bus_size_t, int);
127static int bus_space_subregion(bus_space_tag_t, bus_space_handle_t,
128    bus_size_t, bus_size_t, bus_space_handle_t *);
129
130/*
131 * Map a region of device bus space into CPU virtual address space.
132 */
133
134static __inline int bus_space_map(bus_space_tag_t t, bus_addr_t addr,
135				  bus_size_t size, int flags,
136				  bus_space_handle_t *bshp);
137
138static __inline int
139bus_space_map(bus_space_tag_t t __unused, bus_addr_t addr,
140	      bus_size_t size __unused, int flags __unused,
141	      bus_space_handle_t *bshp)
142{
143
144	*bshp = addr;
145	return (0);
146}
147
148/*
149 * Unmap a region of device bus space.
150 */
151static __inline void bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh,
152				     bus_size_t size);
153
154static __inline void
155bus_space_unmap(bus_space_tag_t t __unused, bus_space_handle_t bsh __unused,
156		bus_size_t size __unused)
157{
158}
159
160/* This macro finds the first "upstream" implementation of method `f' */
161#define _BS_CALL(t,f)							\
162	while (t->f == NULL)						\
163		t = t->bst_parent;						\
164	return (*(t)->f)
165
166static __inline void
167bus_space_barrier(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
168    bus_size_t s, int f)
169{
170	_BS_CALL(t, bst_bus_barrier)(t, h, o, s, f);
171}
172
173static __inline int
174bus_space_subregion(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
175    bus_size_t s, bus_space_handle_t *hp)
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_CT2
198#define	BUS_HANDLE_MIN			UPA_MEMSTART
199#define	__BUS_DEBUG_ACCESS(h, o, desc, sz) do {				\
200	CTR4(KTR_BUS, "bus space: %s %d: handle %#lx, offset %#lx",	\
201	    (desc), (sz), (h), (o));					\
202	if ((h) + (o) < BUS_HANDLE_MIN)					\
203		panic("bus space access at %#lx out of range",		\
204		    (h) + (o));						\
205} while (0)
206#else
207#define	__BUS_DEBUG_ACCESS(h, o, desc, sz)
208#endif
209
210static __inline uint8_t
211bus_space_read_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
212{
213
214	__BUS_DEBUG_ACCESS(h, o, "read", 1);
215	return (lduba_nc((caddr_t)(h + o), bus_type_asi[t->bst_type]));
216}
217
218static __inline uint16_t
219bus_space_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
220{
221
222	__BUS_DEBUG_ACCESS(h, o, "read", 2);
223	return (lduha_nc((caddr_t)(h + o), bus_type_asi[t->bst_type]));
224}
225
226static __inline uint32_t
227bus_space_read_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
228{
229
230	__BUS_DEBUG_ACCESS(h, o, "read", 4);
231	return (lduwa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type]));
232}
233
234static __inline uint64_t
235bus_space_read_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
236{
237
238	__BUS_DEBUG_ACCESS(h, o, "read", 8);
239	return (ldxa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type]));
240}
241
242static __inline void
243bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
244    uint8_t *a, size_t c)
245{
246
247	while (c-- > 0)
248		*a++ = bus_space_read_1(t, h, o);
249}
250
251static __inline void
252bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
253    uint16_t *a, size_t c)
254{
255
256	while (c-- > 0)
257		*a++ = bus_space_read_2(t, h, o);
258}
259
260static __inline void
261bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
262    uint32_t *a, size_t c)
263{
264
265	while (c-- > 0)
266		*a++ = bus_space_read_4(t, h, o);
267}
268
269static __inline void
270bus_space_read_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
271    uint64_t *a, size_t c)
272{
273
274	while (c-- > 0)
275		*a++ = bus_space_read_8(t, h, o);
276}
277
278static __inline void
279bus_space_write_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
280    uint8_t v)
281{
282
283	__BUS_DEBUG_ACCESS(h, o, "write", 1);
284	stba_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v);
285}
286
287static __inline void
288bus_space_write_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
289    uint16_t v)
290{
291
292	__BUS_DEBUG_ACCESS(h, o, "write", 2);
293	stha_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v);
294}
295
296static __inline void
297bus_space_write_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
298    uint32_t v)
299{
300
301	__BUS_DEBUG_ACCESS(h, o, "write", 4);
302	stwa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v);
303}
304
305static __inline void
306bus_space_write_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
307    uint64_t v)
308{
309
310	__BUS_DEBUG_ACCESS(h, o, "write", 8);
311	stxa_nc((caddr_t)(h + o), bus_type_asi[t->bst_type], v);
312}
313
314static __inline void
315bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
316    const uint8_t *a, size_t c)
317{
318
319	while (c-- > 0)
320		bus_space_write_1(t, h, o, *a++);
321}
322
323static __inline void
324bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
325    const uint16_t *a, size_t c)
326{
327
328	while (c-- > 0)
329		bus_space_write_2(t, h, o, *a++);
330}
331
332static __inline void
333bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
334    const uint32_t *a, size_t c)
335{
336
337	while (c-- > 0)
338		bus_space_write_4(t, h, o, *a++);
339}
340
341static __inline void
342bus_space_write_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
343    const uint64_t *a, size_t c)
344{
345
346	while (c-- > 0)
347		bus_space_write_8(t, h, o, *a++);
348}
349
350static __inline void
351bus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
352    uint8_t v, size_t c)
353{
354
355	while (c-- > 0)
356		bus_space_write_1(t, h, o, v);
357}
358
359static __inline void
360bus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
361    uint16_t v, size_t c)
362{
363
364	while (c-- > 0)
365		bus_space_write_2(t, h, o, v);
366}
367
368static __inline void
369bus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
370    uint32_t v, size_t c)
371{
372
373	while (c-- > 0)
374		bus_space_write_4(t, h, o, v);
375}
376
377static __inline void
378bus_space_set_multi_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
379    uint64_t v, size_t c)
380{
381
382	while (c-- > 0)
383		bus_space_write_8(t, h, o, v);
384}
385
386static __inline void
387bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
388    u_int8_t *a, bus_size_t c)
389{
390	for (; c; a++, c--, o++)
391		*a = bus_space_read_1(t, h, o);
392}
393
394static __inline void
395bus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
396    u_int16_t *a, bus_size_t c)
397{
398	for (; c; a++, c--, o+=2)
399		*a = bus_space_read_2(t, h, o);
400}
401
402static __inline void
403bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
404    u_int32_t *a, bus_size_t c)
405{
406	for (; c; a++, c--, o+=4)
407		*a = bus_space_read_4(t, h, o);
408}
409
410static __inline void
411bus_space_read_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
412    u_int64_t *a, bus_size_t c)
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 u_int8_t *a, bus_size_t c)
421{
422	for (; c; a++, c--, o++)
423		bus_space_write_1(t, h, o, *a);
424}
425
426static __inline void
427bus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
428    const u_int16_t *a, bus_size_t c)
429{
430	for (; c; a++, c--, o+=2)
431		bus_space_write_2(t, h, o, *a);
432}
433
434static __inline void
435bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
436    const u_int32_t *a, bus_size_t c)
437{
438	for (; c; a++, c--, o+=4)
439		bus_space_write_4(t, h, o, *a);
440}
441
442static __inline void
443bus_space_write_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
444    const u_int64_t *a, bus_size_t c)
445{
446	for (; c; a++, c--, o+=8)
447		bus_space_write_8(t, h, o, *a);
448}
449
450static __inline void
451bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
452    const u_int8_t v, bus_size_t c)
453{
454	for (; c; c--, o++)
455		bus_space_write_1(t, h, o, v);
456}
457
458static __inline void
459bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
460    const u_int16_t v, bus_size_t c)
461{
462	for (; c; c--, o+=2)
463		bus_space_write_2(t, h, o, v);
464}
465
466static __inline void
467bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
468    const u_int32_t v, bus_size_t c)
469{
470	for (; c; c--, o+=4)
471		bus_space_write_4(t, h, o, v);
472}
473
474static __inline void
475bus_space_set_region_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
476    const u_int64_t v, bus_size_t c)
477{
478	for (; c; c--, o+=8)
479		bus_space_write_8(t, h, o, v);
480}
481
482static __inline void
483bus_space_copy_region_1(bus_space_tag_t t, bus_space_handle_t h1,
484    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
485{
486	for (; c; c--, o1++, o2++)
487	    bus_space_write_1(t, h1, o1, bus_space_read_1(t, h2, o2));
488}
489
490static __inline void
491bus_space_copy_region_2(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	for (; c; c--, o1+=2, o2+=2)
495	    bus_space_write_2(t, h1, o1, bus_space_read_2(t, h2, o2));
496}
497
498static __inline void
499bus_space_copy_region_4(bus_space_tag_t t, bus_space_handle_t h1,
500    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
501{
502	for (; c; c--, o1+=4, o2+=4)
503	    bus_space_write_4(t, h1, o1, bus_space_read_4(t, h2, o2));
504}
505
506static __inline void
507bus_space_copy_region_8(bus_space_tag_t t, bus_space_handle_t h1,
508    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
509{
510	for (; c; c--, o1+=8, o2+=8)
511	    bus_space_write_8(t, h1, o1, bus_space_read_8(t, h2, o2));
512}
513
514static __inline uint8_t
515bus_space_read_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
516{
517
518	__BUS_DEBUG_ACCESS(h, o, "read stream", 1);
519	return (lduba_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type]));
520}
521
522static __inline uint16_t
523bus_space_read_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
524{
525
526	__BUS_DEBUG_ACCESS(h, o, "read stream", 2);
527	return (lduha_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type]));
528}
529
530static __inline uint32_t
531bus_space_read_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
532{
533
534	__BUS_DEBUG_ACCESS(h, o, "read stream", 4);
535	return (lduwa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type]));
536}
537
538static __inline uint64_t
539bus_space_read_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
540{
541
542	__BUS_DEBUG_ACCESS(h, o, "read stream", 8);
543	return (ldxa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type]));
544}
545
546static __inline void
547bus_space_read_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h,
548    bus_size_t o, uint8_t *a, size_t c)
549{
550
551	while (c-- > 0)
552		*a++ = bus_space_read_stream_1(t, h, o);
553}
554
555static __inline void
556bus_space_read_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h,
557    bus_size_t o, uint16_t *a, size_t c)
558{
559
560	while (c-- > 0)
561		*a++ = bus_space_read_stream_2(t, h, o);
562}
563
564static __inline void
565bus_space_read_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h,
566    bus_size_t o, uint32_t *a, size_t c)
567{
568
569	while (c-- > 0)
570		*a++ = bus_space_read_stream_4(t, h, o);
571}
572
573static __inline void
574bus_space_read_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h,
575    bus_size_t o, uint64_t *a, size_t c)
576{
577
578	while (c-- > 0)
579		*a++ = bus_space_read_stream_8(t, h, o);
580}
581
582static __inline void
583bus_space_write_stream_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
584    uint8_t v)
585{
586
587	__BUS_DEBUG_ACCESS(h, o, "write stream", 1);
588	stba_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v);
589}
590
591static __inline void
592bus_space_write_stream_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
593    uint16_t v)
594{
595
596	__BUS_DEBUG_ACCESS(h, o, "write stream", 2);
597	stha_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v);
598}
599
600static __inline void
601bus_space_write_stream_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
602    uint32_t v)
603{
604
605	__BUS_DEBUG_ACCESS(h, o, "write stream", 4);
606	stwa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v);
607}
608
609static __inline void
610bus_space_write_stream_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
611    uint64_t v)
612{
613
614	__BUS_DEBUG_ACCESS(h, o, "write stream", 8);
615	stxa_nc((caddr_t)(h + o), bus_stream_asi[t->bst_type], v);
616}
617
618static __inline void
619bus_space_write_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h,
620    bus_size_t o, const uint8_t *a, size_t c)
621{
622
623	while (c-- > 0)
624		bus_space_write_stream_1(t, h, o, *a++);
625}
626
627static __inline void
628bus_space_write_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h,
629    bus_size_t o, const uint16_t *a, size_t c)
630{
631
632	while (c-- > 0)
633		bus_space_write_stream_2(t, h, o, *a++);
634}
635
636static __inline void
637bus_space_write_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h,
638    bus_size_t o, const uint32_t *a, size_t c)
639{
640
641	while (c-- > 0)
642		bus_space_write_stream_4(t, h, o, *a++);
643}
644
645static __inline void
646bus_space_write_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h,
647    bus_size_t o, const uint64_t *a, size_t c)
648{
649
650	while (c-- > 0)
651		bus_space_write_stream_8(t, h, o, *a++);
652}
653
654static __inline void
655bus_space_set_multi_stream_1(bus_space_tag_t t, bus_space_handle_t h,
656    bus_size_t o, uint8_t v, size_t c)
657{
658
659	while (c-- > 0)
660		bus_space_write_stream_1(t, h, o, v);
661}
662
663static __inline void
664bus_space_set_multi_stream_2(bus_space_tag_t t, bus_space_handle_t h,
665    bus_size_t o, uint16_t v, size_t c)
666{
667
668	while (c-- > 0)
669		bus_space_write_stream_2(t, h, o, v);
670}
671
672static __inline void
673bus_space_set_multi_stream_4(bus_space_tag_t t, bus_space_handle_t h,
674    bus_size_t o, uint32_t v, size_t c)
675{
676
677	while (c-- > 0)
678		bus_space_write_stream_4(t, h, o, v);
679}
680
681static __inline void
682bus_space_set_multi_stream_8(bus_space_tag_t t, bus_space_handle_t h,
683    bus_size_t o, uint64_t v, size_t c)
684{
685
686	while (c-- > 0)
687		bus_space_write_stream_8(t, h, o, v);
688}
689
690static __inline void
691bus_space_read_region_stream_1(bus_space_tag_t t, bus_space_handle_t h,
692    bus_size_t o, u_int8_t *a, bus_size_t c)
693{
694	for (; c; a++, c--, o++)
695		*a = bus_space_read_stream_1(t, h, o);
696}
697
698static __inline void
699bus_space_read_region_stream_2(bus_space_tag_t t, bus_space_handle_t h,
700    bus_size_t o, u_int16_t *a, bus_size_t c)
701{
702	for (; c; a++, c--, o+=2)
703		*a = bus_space_read_stream_2(t, h, o);
704}
705
706static __inline void
707bus_space_read_region_stream_4(bus_space_tag_t t, bus_space_handle_t h,
708    bus_size_t o, u_int32_t *a, bus_size_t c)
709{
710	for (; c; a++, c--, o+=4)
711		*a = bus_space_read_stream_4(t, h, o);
712}
713
714static __inline void
715bus_space_read_region_stream_8(bus_space_tag_t t, bus_space_handle_t h,
716    bus_size_t o, u_int64_t *a, bus_size_t c)
717{
718	for (; c; a++, c--, o+=8)
719		*a = bus_space_read_stream_8(t, h, o);
720}
721
722static __inline void
723bus_space_write_region_stream_1(bus_space_tag_t t, bus_space_handle_t h,
724    bus_size_t o, const u_int8_t *a, bus_size_t c)
725{
726	for (; c; a++, c--, o++)
727		bus_space_write_stream_1(t, h, o, *a);
728}
729
730static __inline void
731bus_space_write_region_stream_2(bus_space_tag_t t, bus_space_handle_t h,
732    bus_size_t o, const u_int16_t *a, bus_size_t c)
733{
734	for (; c; a++, c--, o+=2)
735		bus_space_write_stream_2(t, h, o, *a);
736}
737
738static __inline void
739bus_space_write_region_stream_4(bus_space_tag_t t, bus_space_handle_t h,
740    bus_size_t o, const u_int32_t *a, bus_size_t c)
741{
742	for (; c; a++, c--, o+=4)
743		bus_space_write_stream_4(t, h, o, *a);
744}
745
746static __inline void
747bus_space_write_region_stream_8(bus_space_tag_t t, bus_space_handle_t h,
748    bus_size_t o, const u_int64_t *a, bus_size_t c)
749{
750	for (; c; a++, c--, o+=8)
751		bus_space_write_stream_8(t, h, o, *a);
752}
753
754static __inline void
755bus_space_set_region_stream_1(bus_space_tag_t t, bus_space_handle_t h,
756    bus_size_t o, const u_int8_t v, bus_size_t c)
757{
758	for (; c; c--, o++)
759		bus_space_write_stream_1(t, h, o, v);
760}
761
762static __inline void
763bus_space_set_region_stream_2(bus_space_tag_t t, bus_space_handle_t h,
764    bus_size_t o, const u_int16_t v, bus_size_t c)
765{
766	for (; c; c--, o+=2)
767		bus_space_write_stream_2(t, h, o, v);
768}
769
770static __inline void
771bus_space_set_region_stream_4(bus_space_tag_t t, bus_space_handle_t h,
772    bus_size_t o, const u_int32_t v, bus_size_t c)
773{
774	for (; c; c--, o+=4)
775		bus_space_write_stream_4(t, h, o, v);
776}
777
778static __inline void
779bus_space_set_region_stream_8(bus_space_tag_t t, bus_space_handle_t h,
780    bus_size_t o, const u_int64_t v, bus_size_t c)
781{
782	for (; c; c--, o+=8)
783		bus_space_write_stream_8(t, h, o, v);
784}
785
786static __inline void
787bus_space_copy_region_stream_1(bus_space_tag_t t, bus_space_handle_t h1,
788    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
789{
790	for (; c; c--, o1++, o2++)
791	    bus_space_write_stream_1(t, h1, o1, bus_space_read_stream_1(t, h2,
792		o2));
793}
794
795static __inline void
796bus_space_copy_region_stream_2(bus_space_tag_t t, bus_space_handle_t h1,
797    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
798{
799	for (; c; c--, o1+=2, o2+=2)
800	    bus_space_write_stream_2(t, h1, o1, bus_space_read_stream_2(t, h2,
801		o2));
802}
803
804static __inline void
805bus_space_copy_region_stream_4(bus_space_tag_t t, bus_space_handle_t h1,
806    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
807{
808	for (; c; c--, o1+=4, o2+=4)
809	    bus_space_write_stream_4(t, h1, o1, bus_space_read_stream_4(t, h2,
810		o2));
811}
812
813static __inline void
814bus_space_copy_region_stream_8(bus_space_tag_t t, bus_space_handle_t h1,
815    bus_size_t o1, bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
816{
817	for (; c; c--, o1+=8, o2+=8)
818	    bus_space_write_stream_8(t, h1, o1, bus_space_read_8(t, h2, o2));
819}
820
821static __inline int
822bus_space_peek_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
823	u_int8_t *a)
824{
825
826	__BUS_DEBUG_ACCESS(h, o, "peek", 1);
827	return (fasword8(bus_type_asi[t->bst_type], (caddr_t)(h + o), a));
828}
829
830static __inline int
831bus_space_peek_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
832	u_int16_t *a)
833{
834
835	__BUS_DEBUG_ACCESS(h, o, "peek", 2);
836	return (fasword16(bus_type_asi[t->bst_type], (caddr_t)(h + o), a));
837}
838
839static __inline int
840bus_space_peek_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
841	u_int32_t *a)
842{
843
844	__BUS_DEBUG_ACCESS(h, o, "peek", 4);
845	return (fasword32(bus_type_asi[t->bst_type], (caddr_t)(h + o), a));
846}
847
848#include <machine/bus_dma.h>
849
850#endif /* !_MACHINE_BUS_H_ */
851