Annotation of sys/arch/aviion/include/bus.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: bus.h,v 1.1.1.1 2006/05/09 18:18:49 miod Exp $ */
2: /*
3: * Copyright (c) 2004, Miodrag Vallat.
4: *
5: * Redistribution and use in source and binary forms, with or without
6: * modification, are permitted provided that the following conditions
7: * are met:
8: * 1. Redistributions of source code must retain the above copyright
9: * notice, this list of conditions and the following disclaimer.
10: * 2. Redistributions in binary form must reproduce the above copyright
11: * notice, this list of conditions and the following disclaimer in the
12: * documentation and/or other materials provided with the distribution.
13: *
14: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17: * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
18: * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19: * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
20: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
22: * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
23: * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24: * POSSIBILITY OF SUCH DAMAGE.
25: */
26:
27: /*
28: * Simple aviion bus_space implementation.
29: *
30: * Currently, we only need specific handling for 32 bit read/writes in D16
31: * space, and this choice is made at compile time. As a result, all the
32: * implementation can go through macros or inline functions, except for
33: * the management functions.
34: */
35:
36: #ifndef _AVIION_BUS_H_
37: #define _AVIION_BUS_H_
38:
39: #include <machine/asm_macro.h>
40:
41: typedef u_int32_t bus_addr_t;
42: typedef u_int32_t bus_size_t;
43:
44: typedef u_int32_t bus_space_handle_t;
45:
46: struct aviion_bus_space_tag {
47: int (*bs_map)(bus_addr_t, bus_size_t, int, bus_space_handle_t *);
48: void (*bs_unmap)(bus_space_handle_t, bus_size_t);
49: int (*bs_subregion)(bus_space_handle_t, bus_size_t, bus_size_t,
50: bus_space_handle_t *);
51: void * (*bs_vaddr)(bus_space_handle_t);
52: /* alloc, free not implemented yet */
53: };
54:
55: typedef const struct aviion_bus_space_tag *bus_space_tag_t;
56:
57: #define BUS_SPACE_BARRIER_READ 0
58: #define BUS_SPACE_BARRIER_WRITE 1
59:
60: #define BUS_SPACE_MAP_CACHEABLE 0x01
61: #define BUS_SPACE_MAP_LINEAR 0x02
62:
63: /*
64: * General bus_space function set
65: */
66:
67: #define bus_space_map(t,a,s,f,r) ((t)->bs_map(a,s,f,r))
68: #define bus_space_unmap(t,h,s) ((t)->bs_unmap(h,s))
69: #define bus_space_subregion(t,h,o,s,r) ((t)->bs_subregion(h,o,s,r))
70: #define bus_space_vaddr(t,h) ((t)->bs_vaddr(h))
71:
72: static void bus_space_barrier(bus_space_tag_t, bus_space_handle_t,
73: bus_addr_t, bus_size_t, int);
74:
75: static __inline__ void
76: bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t handle,
77: bus_addr_t offset, bus_size_t size, int flags)
78: {
79: flush_pipeline(); /* overkill? */
80: }
81:
82: /*
83: * Read/Write/Region functions for D8 and D16 access.
84: * Most of these are straightforward and assume that everything is properly
85: * aligned.
86: */
87:
88: #define bus_space_read_1(tag, handle, offset) \
89: ((void)(tag), *(volatile u_int8_t *)((handle) + (offset)))
90: #define bus_space_read_2(tag, handle, offset) \
91: ((void)(tag), *(volatile u_int16_t *)((handle) + (offset)))
92:
93: static void bus_space_read_multi_1(bus_space_tag_t, bus_space_handle_t,
94: bus_addr_t, u_int8_t *, size_t);
95:
96: static __inline__ void
97: bus_space_read_multi_1(bus_space_tag_t tag, bus_space_handle_t handle,
98: bus_addr_t offset, u_int8_t *dest, size_t count)
99: {
100: offset += handle;
101: while ((int)--count >= 0)
102: *dest++ = bus_space_read_1(tag, 0, offset);
103: }
104:
105: static void bus_space_read_multi_2(bus_space_tag_t, bus_space_handle_t,
106: bus_addr_t, u_int16_t *, size_t);
107:
108: static __inline__ void
109: bus_space_read_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
110: bus_addr_t offset, u_int16_t *dest, size_t count)
111: {
112: offset += handle;
113: while ((int)--count >= 0)
114: *dest++ = bus_space_read_2(tag, 0, offset);
115: }
116:
117: static void bus_space_read_raw_multi_2(bus_space_tag_t, bus_space_handle_t,
118: bus_addr_t, u_int8_t *, size_t);
119:
120: static __inline__ void
121: bus_space_read_raw_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
122: bus_addr_t offset, u_int8_t *dest, size_t size)
123: {
124: offset += handle;
125: size >>= 1;
126: while ((int)--size >= 0) {
127: *(u_int16_t *)dest =
128: bus_space_read_2(tag, 0, offset);
129: dest += 2;
130: }
131: }
132:
133: static void bus_space_read_region_1(bus_space_tag_t, bus_space_handle_t,
134: bus_addr_t, u_int8_t *, size_t);
135:
136: static __inline__ void
137: bus_space_read_region_1(bus_space_tag_t tag, bus_space_handle_t handle,
138: bus_addr_t offset, u_int8_t *dest, size_t count)
139: {
140: offset += handle;
141: while ((int)--count >= 0)
142: *dest++ = bus_space_read_1(tag, 0, offset++);
143: }
144:
145: static void bus_space_read_region_2(bus_space_tag_t, bus_space_handle_t,
146: bus_addr_t, u_int16_t *, size_t);
147:
148: static __inline__ void
149: bus_space_read_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
150: bus_addr_t offset, u_int16_t *dest, size_t count)
151: {
152: offset += handle;
153: while ((int)--count >= 0) {
154: *dest++ = bus_space_read_2(tag, 0, offset);
155: offset += 2;
156: }
157: }
158:
159: static void bus_space_read_raw_region_2(bus_space_tag_t, bus_space_handle_t,
160: bus_addr_t, u_int8_t *, size_t);
161:
162: static __inline__ void
163: bus_space_read_raw_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
164: bus_addr_t offset, u_int8_t *dest, size_t size)
165: {
166: size >>= 1;
167: offset += handle;
168: while ((int)--size >= 0) {
169: *(u_int16_t *)dest = bus_space_read_2(tag, 0, offset);
170: offset += 2;
171: dest += 2;
172: }
173: }
174:
175: #define bus_space_write_1(tag, handle, offset, value) \
176: ((void)(tag), *(volatile u_int8_t *)((handle) + (offset)) = (value))
177: #define bus_space_write_2(tag, handle, offset, value) \
178: ((void)(tag), *(volatile u_int16_t *)((handle) + (offset)) = (value))
179:
180: static void bus_space_write_multi_1(bus_space_tag_t, bus_space_handle_t,
181: bus_addr_t, u_int8_t *, size_t);
182:
183: static __inline__ void
184: bus_space_write_multi_1(bus_space_tag_t tag, bus_space_handle_t handle,
185: bus_addr_t offset, u_int8_t *dest, size_t count)
186: {
187: offset += handle;
188: while ((int)--count >= 0)
189: bus_space_write_1(tag, 0, offset, *dest++);
190: }
191:
192: static void bus_space_write_multi_2(bus_space_tag_t, bus_space_handle_t,
193: bus_addr_t, u_int16_t *, size_t);
194:
195: static __inline__ void
196: bus_space_write_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
197: bus_addr_t offset, u_int16_t *dest, size_t count)
198: {
199: offset += handle;
200: while ((int)--count >= 0)
201: bus_space_write_2(tag, 0, offset, *dest++);
202: }
203:
204: static void bus_space_write_raw_multi_2(bus_space_tag_t, bus_space_handle_t,
205: bus_addr_t, u_int8_t *, size_t);
206:
207: static __inline__ void
208: bus_space_write_raw_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
209: bus_addr_t offset, u_int8_t *dest, size_t size)
210: {
211: offset += handle;
212: size >>= 1;
213: while ((int)--size >= 0) {
214: bus_space_write_2(tag, 0, offset, *(u_int16_t *)dest);
215: dest += 2;
216: }
217: }
218:
219: static void bus_space_set_multi_1(bus_space_tag_t, bus_space_handle_t,
220: bus_addr_t, u_int8_t, size_t);
221:
222: static __inline__ void
223: bus_space_set_multi_1(bus_space_tag_t tag, bus_space_handle_t handle,
224: bus_addr_t offset, u_int8_t value, size_t count)
225: {
226: offset += handle;
227: while ((int)--count >= 0)
228: bus_space_write_1(tag, 0, offset, value);
229: }
230:
231: static void bus_space_set_multi_2(bus_space_tag_t, bus_space_handle_t,
232: bus_addr_t, u_int16_t, size_t);
233:
234: static __inline__ void
235: bus_space_set_multi_2(bus_space_tag_t tag, bus_space_handle_t handle,
236: bus_addr_t offset, u_int16_t value, size_t count)
237: {
238: offset += handle;
239: while ((int)--count >= 0)
240: bus_space_write_2(tag, 0, offset, value);
241: }
242:
243: static void bus_space_write_region_1(bus_space_tag_t, bus_space_handle_t,
244: bus_addr_t, u_int8_t *, size_t);
245:
246: static __inline__ void
247: bus_space_write_region_1(bus_space_tag_t tag, bus_space_handle_t handle,
248: bus_addr_t offset, u_int8_t *dest, size_t count)
249: {
250: offset += handle;
251: while ((int)--count >= 0)
252: bus_space_write_1(tag, 0, offset++, *dest++);
253: }
254:
255: static void bus_space_write_region_2(bus_space_tag_t, bus_space_handle_t,
256: bus_addr_t, u_int16_t *, size_t);
257:
258: static __inline__ void
259: bus_space_write_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
260: bus_addr_t offset, u_int16_t *dest, size_t count)
261: {
262: offset += handle;
263: while ((int)--count >= 0) {
264: bus_space_write_2(tag, 0, offset, *dest++);
265: offset += 2;
266: }
267: }
268:
269: static void bus_space_write_raw_region_2(bus_space_tag_t, bus_space_handle_t,
270: bus_addr_t, u_int8_t *, size_t);
271:
272: static __inline__ void
273: bus_space_write_raw_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
274: bus_addr_t offset, u_int8_t *dest, size_t size)
275: {
276: offset += handle;
277: size >>= 1;
278: while ((int)--size >= 0) {
279: bus_space_write_2(tag, 0, offset, *(u_int16_t *)dest);
280: offset += 2;
281: dest += 2;
282: }
283: }
284:
285: static void bus_space_set_region_1(bus_space_tag_t, bus_space_handle_t,
286: bus_addr_t, u_int8_t, size_t);
287:
288: static __inline__ void
289: bus_space_set_region_1(bus_space_tag_t tag, bus_space_handle_t handle,
290: bus_addr_t offset, u_int8_t value, size_t count)
291: {
292: offset += handle;
293: while ((int)--count >= 0)
294: bus_space_write_1(tag, 0, offset++, value);
295: }
296:
297: static void bus_space_set_region_2(bus_space_tag_t, bus_space_handle_t,
298: bus_addr_t, u_int16_t, size_t);
299:
300: static __inline__ void
301: bus_space_set_region_2(bus_space_tag_t tag, bus_space_handle_t handle,
302: bus_addr_t offset, u_int16_t value, size_t count)
303: {
304: offset += handle;
305: while ((int)--count >= 0) {
306: bus_space_write_2(tag, 0, offset, value);
307: offset += 2;
308: }
309: }
310:
311: static void bus_space_copy_1(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
312: bus_space_handle_t, bus_addr_t, bus_size_t);
313:
314: static __inline__ void
315: bus_space_copy_1(bus_space_tag_t tag, bus_space_handle_t h1, bus_addr_t o1,
316: bus_space_handle_t h2, bus_addr_t o2, bus_size_t count)
317: {
318: o1 += h1;
319: o2 += h2;
320: while ((int)--count >= 0) {
321: *((volatile u_int8_t *)o1)++ = *((volatile u_int8_t *)o2)++;
322: }
323: }
324:
325: static void bus_space_copy_2(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
326: bus_space_handle_t, bus_addr_t, bus_size_t);
327:
328: static __inline__ void
329: bus_space_copy_2(bus_space_tag_t tag, bus_space_handle_t h1, bus_addr_t o1,
330: bus_space_handle_t h2, bus_addr_t o2, bus_size_t count)
331: {
332: o1 += h1;
333: o2 += h2;
334: while ((int)--count >= 0) {
335: *(volatile u_int16_t *)o1 = *(volatile u_int16_t *)o2;
336: o1 += 2;
337: o2 += 2;
338: }
339: }
340:
341: /*
342: * Unrestricted D32 access
343: */
344:
345: #ifndef __BUS_SPACE_RESTRICT_D16__
346:
347: #define bus_space_read_4(tag, handle, offset) \
348: ((void)(tag), *(volatile u_int32_t *)((handle) + (offset)))
349:
350: static void bus_space_read_multi_4(bus_space_tag_t, bus_space_handle_t,
351: bus_addr_t, u_int32_t *, size_t);
352:
353: static __inline__ void
354: bus_space_read_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
355: bus_addr_t offset, u_int32_t *dest, size_t count)
356: {
357: offset += handle;
358: while ((int)--count >= 0)
359: *dest++ = bus_space_read_4(tag, 0, offset);
360: }
361:
362: static void bus_space_read_raw_multi_4(bus_space_tag_t, bus_space_handle_t,
363: bus_addr_t, u_int8_t *, size_t);
364:
365: static __inline__ void
366: bus_space_read_raw_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
367: bus_addr_t offset, u_int8_t *dest, size_t size)
368: {
369: offset += handle;
370: size >>= 2;
371: while ((int)--size >= 0) {
372: *(u_int32_t *)dest =
373: bus_space_read_4(tag, 0, offset);
374: dest += 4;
375: }
376: }
377:
378: static void bus_space_read_region_4(bus_space_tag_t, bus_space_handle_t,
379: bus_addr_t, u_int32_t *, size_t);
380:
381: static __inline__ void
382: bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
383: bus_addr_t offset, u_int32_t *dest, size_t count)
384: {
385: offset += handle;
386: while ((int)--count >= 0) {
387: *dest++ = bus_space_read_4(tag, 0, offset);
388: offset += 4;
389: }
390: }
391:
392: static void bus_space_read_raw_region_4(bus_space_tag_t, bus_space_handle_t,
393: bus_addr_t, u_int8_t *, size_t);
394:
395: static __inline__ void
396: bus_space_read_raw_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
397: bus_addr_t offset, u_int8_t *dest, size_t size)
398: {
399: size >>= 2;
400: offset += handle;
401: while ((int)--size >= 0) {
402: *(u_int32_t *)dest = bus_space_read_4(tag, 0, offset);
403: offset += 4;
404: dest += 4;
405: }
406: }
407:
408: #define bus_space_write_4(tag, handle, offset, value) \
409: ((void)(tag), *(volatile u_int32_t *)((handle) + (offset)) = (value))
410:
411: static void bus_space_write_multi_4(bus_space_tag_t, bus_space_handle_t,
412: bus_addr_t, u_int32_t *, size_t);
413:
414: static __inline__ void
415: bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
416: bus_addr_t offset, u_int32_t *dest, size_t count)
417: {
418: offset += handle;
419: while ((int)--count >= 0)
420: bus_space_write_4(tag, 0, offset, *dest++);
421: }
422:
423: static void bus_space_write_raw_multi_4(bus_space_tag_t, bus_space_handle_t,
424: bus_addr_t, u_int8_t *, size_t);
425:
426: static __inline__ void
427: bus_space_write_raw_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
428: bus_addr_t offset, u_int8_t *dest, size_t size)
429: {
430: offset += handle;
431: size >>= 2;
432: while ((int)--size >= 0) {
433: bus_space_write_4(tag, 0, offset, *(u_int32_t *)dest);
434: dest += 4;
435: }
436: }
437:
438: static void bus_space_set_multi_4(bus_space_tag_t, bus_space_handle_t,
439: bus_addr_t, u_int32_t, size_t);
440:
441: static __inline__ void
442: bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
443: bus_addr_t offset, u_int32_t value, size_t count)
444: {
445: offset += handle;
446: while ((int)--count >= 0)
447: bus_space_write_4(tag, 0, offset, value);
448: }
449:
450: static void bus_space_write_region_4(bus_space_tag_t, bus_space_handle_t,
451: bus_addr_t, u_int32_t *, size_t);
452:
453: static __inline__ void
454: bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
455: bus_addr_t offset, u_int32_t *dest, size_t count)
456: {
457: offset += handle;
458: while ((int)--count >= 0) {
459: bus_space_write_4(tag, 0, offset, *dest++);
460: offset += 4;
461: }
462: }
463:
464: static void bus_space_write_raw_region_4(bus_space_tag_t, bus_space_handle_t,
465: bus_addr_t, u_int8_t *, size_t);
466:
467: static __inline__ void
468: bus_space_write_raw_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
469: bus_addr_t offset, u_int8_t *dest, size_t size)
470: {
471: offset += handle;
472: size >>= 2;
473: while ((int)--size >= 0) {
474: bus_space_write_4(tag, 0, offset, *(u_int32_t *)dest);
475: offset += 4;
476: dest += 4;
477: }
478: }
479:
480: static void bus_space_set_region_4(bus_space_tag_t, bus_space_handle_t,
481: bus_addr_t, u_int32_t, size_t);
482:
483: static __inline__ void
484: bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
485: bus_addr_t offset, u_int32_t value, size_t count)
486: {
487: offset += handle;
488: while ((int)--count >= 0) {
489: bus_space_write_4(tag, 0, offset, value);
490: offset += 4;
491: }
492: }
493:
494: static void bus_space_copy_4(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
495: bus_space_handle_t, bus_addr_t, bus_size_t);
496:
497: static __inline__ void
498: bus_space_copy_4(bus_space_tag_t tag, bus_space_handle_t h1, bus_addr_t o1,
499: bus_space_handle_t h2, bus_addr_t o2, bus_size_t count)
500: {
501: o1 += h1;
502: o2 += h2;
503: while ((int)--count >= 0) {
504: *(volatile u_int32_t *)o1 = *(volatile u_int32_t *)o2;
505: o1 += 4;
506: o2 += 4;
507: }
508: }
509:
510: #else /* __BUS_SPACE_RESTRICT_D16__ */
511:
512: /*
513: * Restricted D32 access - done through two adjacent D16 access.
514: *
515: * The speed of the basic read and write routines is critical.
516: * This implementation uses a temporary variable on stack, and does
517: * two 16 bit load&store sequences. Since the stack is in Dcache, this
518: * is faster and spills fewer register than a register-only sequence
519: * (which would need to ld.h into two distinct registers, then extu
520: * the second one into itself, and or both in the result register).
521: */
522:
523: static u_int32_t d16_read_4(vaddr_t);
524: static void d16_write_4(vaddr_t, u_int32_t);
525:
526: static __inline__ u_int32_t
527: d16_read_4(vaddr_t va)
528: {
529: u_int32_t tmp;
530:
531: *(u_int16_t *)&tmp = *(volatile u_int16_t *)va;
532: *(u_int16_t *)((vaddr_t)&tmp + 2) = *(volatile u_int16_t *)(va + 2);
533:
534: return tmp;
535: }
536:
537: static __inline__ void
538: d16_write_4(vaddr_t va, u_int32_t value)
539: {
540: u_int32_t tmp = value;
541:
542: *(volatile u_int16_t *)va = *(u_int16_t *)&tmp;
543: *(volatile u_int16_t *)(va + 2) = *(u_int16_t *)((vaddr_t)&tmp + 2);
544: }
545:
546: #define bus_space_read_4(tag, handle, offset) \
547: ((void)(tag), d16_read_4((handle) + (offset)))
548:
549: static void bus_space_read_multi_4(bus_space_tag_t, bus_space_handle_t,
550: bus_addr_t, u_int32_t *, size_t);
551:
552: static __inline__ void
553: bus_space_read_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
554: bus_addr_t offset, u_int32_t *dest, size_t count)
555: {
556: offset += handle;
557: while ((int)--count >= 0)
558: *dest++ = bus_space_read_4(tag, 0, offset);
559: }
560:
561: static void bus_space_read_raw_multi_4(bus_space_tag_t, bus_space_handle_t,
562: bus_addr_t, u_int8_t *, size_t);
563:
564: static __inline__ void
565: bus_space_read_raw_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
566: bus_addr_t offset, u_int8_t *dest, size_t size)
567: {
568: offset += handle;
569: size >>= 1;
570: while ((int)--size >= 0) {
571: *(u_int16_t *)dest = bus_space_read_2(tag, 0, offset);
572: dest += 2;
573: }
574: }
575:
576: static void bus_space_read_region_4(bus_space_tag_t, bus_space_handle_t,
577: bus_addr_t, u_int32_t *, size_t);
578:
579: static __inline__ void
580: bus_space_read_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
581: bus_addr_t offset, u_int32_t *__dest, size_t count)
582: {
583: u_int16_t *dest = (u_int16_t *)__dest;
584:
585: offset += handle;
586: count <<= 1;
587: while ((int)--count >= 0) {
588: *dest++ = bus_space_read_2(tag, 0, offset);
589: offset += 2;
590: }
591: }
592:
593: static void bus_space_read_raw_region_4(bus_space_tag_t, bus_space_handle_t,
594: bus_addr_t, u_int8_t *, size_t);
595:
596: static __inline__ void
597: bus_space_read_raw_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
598: bus_addr_t offset, u_int8_t *dest, size_t size)
599: {
600: size >>= 1;
601: offset += handle;
602: while ((int)--size >= 0) {
603: *(u_int16_t *)dest = bus_space_read_2(tag, 0, offset);
604: offset += 2;
605: dest += 2;
606: }
607: }
608:
609: #define bus_space_write_4(tag, handle, offset, value) \
610: ((void)(tag), d16_write_4((handle) + (offset), (value)))
611:
612: static void bus_space_write_multi_4(bus_space_tag_t, bus_space_handle_t,
613: bus_addr_t, u_int32_t *, size_t);
614:
615: static __inline__ void
616: bus_space_write_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
617: bus_addr_t offset, u_int32_t *dest, size_t count)
618: {
619: offset += handle;
620: while ((int)--count >= 0)
621: bus_space_write_4(tag, 0, offset, *dest++);
622: }
623:
624: static void bus_space_write_raw_multi_4(bus_space_tag_t, bus_space_handle_t,
625: bus_addr_t, u_int8_t *, size_t);
626:
627: static __inline__ void
628: bus_space_write_raw_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
629: bus_addr_t offset, u_int8_t *dest, size_t size)
630: {
631: offset += handle;
632: size >>= 1;
633: while ((int)--size >= 0) {
634: bus_space_write_2(tag, 0, offset, *(u_int16_t *)dest);
635: dest += 2;
636: }
637: }
638:
639: static void bus_space_set_multi_4(bus_space_tag_t, bus_space_handle_t,
640: bus_addr_t, u_int32_t, size_t);
641:
642: static __inline__ void
643: bus_space_set_multi_4(bus_space_tag_t tag, bus_space_handle_t handle,
644: bus_addr_t offset, u_int32_t value, size_t count)
645: {
646: offset += handle;
647: while ((int)--count >= 0)
648: bus_space_write_4(tag, 0, offset, value);
649: }
650:
651: static void bus_space_write_region_4(bus_space_tag_t, bus_space_handle_t,
652: bus_addr_t, u_int32_t *, size_t);
653:
654: static __inline__ void
655: bus_space_write_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
656: bus_addr_t offset, u_int32_t *__dest, size_t count)
657: {
658: u_int16_t *dest = (u_int16_t *)__dest;
659:
660: offset += handle;
661: count <<= 1;
662: while ((int)--count >= 0) {
663: bus_space_write_2(tag, 0, offset, *dest++);
664: offset += 2;
665: }
666: }
667:
668: static void bus_space_write_raw_region_4(bus_space_tag_t, bus_space_handle_t,
669: bus_addr_t, u_int8_t *, size_t);
670:
671: static __inline__ void
672: bus_space_write_raw_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
673: bus_addr_t offset, u_int8_t *dest, size_t size)
674: {
675: offset += handle;
676: size >>= 1;
677: while ((int)--size >= 0) {
678: bus_space_write_2(tag, 0, offset, *(u_int16_t *)dest);
679: offset += 2;
680: dest += 2;
681: }
682: }
683:
684: static void bus_space_set_region_4(bus_space_tag_t, bus_space_handle_t,
685: bus_addr_t, u_int32_t, size_t);
686:
687: static __inline__ void
688: bus_space_set_region_4(bus_space_tag_t tag, bus_space_handle_t handle,
689: bus_addr_t offset, u_int32_t value, size_t count)
690: {
691: offset += handle;
692: while ((int)--count >= 0) {
693: bus_space_write_4(tag, 0, offset, value);
694: offset += 4;
695: }
696: }
697:
698: static void bus_space_copy_4(bus_space_tag_t, bus_space_handle_t, bus_addr_t,
699: bus_space_handle_t, bus_addr_t, bus_size_t);
700:
701: static __inline__ void
702: bus_space_copy_4(bus_space_tag_t tag, bus_space_handle_t h1, bus_addr_t o1,
703: bus_space_handle_t h2, bus_addr_t o2, bus_size_t count)
704: {
705: o1 += h1;
706: o2 += h2;
707: count <<= 1;
708: while ((int)--count >= 0) {
709: *(volatile u_int16_t *)o1 = *(volatile u_int16_t *)o2;
710: o1 += 2;
711: o2 += 2;
712: }
713: }
714:
715: /*
716: * Extra D16 access functions (see vme.c)
717: */
718:
719: void d16_bcopy(const void *, void *, size_t);
720: void d16_bzero(void *, size_t);
721:
722: #endif /* __BUS_SPACE_RESTRICT_D16__ */
723:
724: #endif /* _AVIION_BUS_H_ */
CVSweb