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