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