xref: /netbsd/sys/arch/next68k/include/bus_space.h (revision c4a72b64)
1 /*	$NetBSD: bus_space.h,v 1.9 2002/09/11 01:46:33 mycroft Exp $	*/
2 
3 /*-
4  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9  * NASA Ames Research Center.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. All advertising materials mentioning features or use of this software
20  *    must display the following acknowledgement:
21  *	This product includes software developed by the NetBSD
22  *	Foundation, Inc. and its contributors.
23  * 4. Neither the name of The NetBSD Foundation nor the names of its
24  *    contributors may be used to endorse or promote products derived
25  *    from this software without specific prior written permission.
26  *
27  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37  * POSSIBILITY OF SUCH DAMAGE.
38  */
39 
40 /*
41  * Copyright (C) 1997 Scott Reynolds.  All rights reserved.
42  *
43  * Redistribution and use in source and binary forms, with or without
44  * modification, are permitted provided that the following conditions
45  * are met:
46  * 1. Redistributions of source code must retain the above copyright
47  *    notice, this list of conditions and the following disclaimer.
48  * 2. Redistributions in binary form must reproduce the above copyright
49  *    notice, this list of conditions and the following disclaimer in the
50  *    documentation and/or other materials provided with the distribution.
51  * 3. The name of the author may not be used to endorse or promote products
52  *    derived from this software without specific prior written permission
53  *
54  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
55  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
56  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
57  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
58  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
59  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
60  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
61  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
62  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
63  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
64  */
65 
66 #ifndef _NEXT68K_BUS_SPACE_H_
67 #define	_NEXT68K_BUS_SPACE_H_
68 /*
69  * Addresses (in bus space).
70  */
71 typedef u_long bus_addr_t;
72 typedef u_long bus_size_t;
73 
74 /*
75  * Access methods for bus resources and address space.
76  */
77 typedef volatile char *  bus_space_tag_t;
78 typedef u_long	bus_space_handle_t;
79 
80 /*
81  * Value for the next68k bus space tag, not to be used directly by MI code.
82  */
83 #define NEXT68K_INTIO_BUS_SPACE	intiobase
84 
85 /*
86  * Values for the next68k video bus space tags, not to be used directly
87  * by MI code.
88  */
89 #define NEXT68K_MONO_VIDEO_BUS_SPACE	monobase
90 #define NEXT68K_COLOR_VIDEO_BUS_SPACE	colorbase
91 
92 /*
93  * Mapping and unmapping operations.
94  */
95 #define	bus_space_map(t, a, s, f, hp)					\
96     ((((a)>=INTIOBASE)&&((a)+(s)<INTIOTOP)) ?				\
97      ((*(hp)=(bus_space_handle_t)((t)+((a)-INTIOBASE))),0) :            \
98      ((((a)>=MONOBASE)&&((a)+(s)<MONOTOP)) ?                          \
99       ((*(hp)=(bus_space_handle_t)((t)+((a)-MONOBASE))),0) :           \
100       ((((a)>=COLORBASE)&&((a)+(s)<COLORTOP)) ?                         \
101        ((*(hp)=(bus_space_handle_t)((t)+((a)-COLORBASE))),0) : (-1))))
102 
103 #define	bus_space_unmap(t, h, s)
104 
105 #define	bus_space_subregion(t, h, o, s, hp)				\
106      (*(hp)=(h)+(o))
107 
108 #define	BUS_SPACE_MAP_CACHEABLE		0x01
109 #define	BUS_SPACE_MAP_LINEAR		0x02
110 
111 /*
112  * Allocation and deallocation operations.
113  */
114 #define	bus_space_alloc(t, rs, re, s, a, b, f, ap, hp)  		\
115      (-1)
116 
117 #define	bus_space_free(t, h, s)
118 
119 /*
120  *	paddr_t bus_space_mmap __P((bus_space_tag_t t, bus_addr_t base,
121  *	    off_t offset, int prot, int flags));
122  *
123  * Mmap an area of bus space.
124  */
125 
126 #define bus_space_mmap(t, a, s, prot, flags)				\
127 	((((a)>=INTIOBASE)&&((a)+(s)<INTIOTOP)) ?			\
128 		m68k_btop((t)+((a)-INTIOBASE)) :			\
129 	 ((((a)>=MONOBASE)&&((a)+(s)<MONOTOP)) ?			\
130 		m68k_btop((t)+((a)-MONOBASE)) :				\
131 	  ((((a)>=COLORBASE)&&((a)+(s)<COLORTOP)) ?			\
132 		m68k_btop((t)+((a)-COLORBASE)) : (-1))))
133 
134 /*
135  *	u_intN_t bus_space_read_N __P((bus_space_tag_t tag,
136  *	    bus_space_handle_t bsh, bus_size_t offset));
137  *
138  * Read a 1, 2, 4, or 8 byte quantity from bus space
139  * described by tag/handle/offset.
140  */
141 
142 #define	bus_space_read_1(t, h, o)					\
143     ((void) t, (*(volatile u_int8_t *)((h) + (o))))
144 
145 #define	bus_space_read_2(t, h, o)					\
146     ((void) t, (*(volatile u_int16_t *)((h) + (o))))
147 
148 #define	bus_space_read_4(t, h, o)					\
149     ((void) t, (*(volatile u_int32_t *)((h) + (o))))
150 
151 #if 0	/* Cause a link error for bus_space_read_8 */
152 #define	bus_space_read_8(t, h, o)	!!! bus_space_read_8 unimplemented !!!
153 #endif
154 
155 /*
156  *	void bus_space_read_multi_N __P((bus_space_tag_t tag,
157  *	    bus_space_handle_t bsh, bus_size_t offset,
158  *	    u_intN_t *addr, size_t count));
159  *
160  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
161  * described by tag/handle/offset and copy into buffer provided.
162  */
163 
164 #define	bus_space_read_multi_1(t, h, o, a, c) do {			\
165 	(void) t;							\
166 	__asm __volatile ("						\
167 		movl	%0,%%a0					;	\
168 		movl	%1,%%a1					;	\
169 		movl	%2,%%d0					;	\
170 	1:	movb	%%a0@,%%a1@+				;	\
171 		subql	#1,%%d0					;	\
172 		jne	1b"					:	\
173 								:	\
174 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
175 		    "a0","a1","d0");					\
176 } while (0);
177 
178 #define	bus_space_read_multi_2(t, h, o, a, c) do {			\
179 	(void) t;							\
180 	__asm __volatile ("						\
181 		movl	%0,%%a0					;	\
182 		movl	%1,%%a1					;	\
183 		movl	%2,%%d0					;	\
184 	1:	movw	%%a0@,%%a1@+				;	\
185 		subql	#1,%%d0					;	\
186 		jne	1b"					:	\
187 								:	\
188 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
189 		    "a0","a1","d0");					\
190 } while (0);
191 
192 #define	bus_space_read_multi_4(t, h, o, a, c) do {			\
193 	(void) t;							\
194 	__asm __volatile ("						\
195 		movl	%0,%%a0					;	\
196 		movl	%1,%%a1					;	\
197 		movl	%2,%%d0					;	\
198 	1:	movl	%%a0@,%%a1@+				;	\
199 		subql	#1,%%d0					;	\
200 		jne	1b"					:	\
201 								:	\
202 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
203 		    "a0","a1","d0");					\
204 } while (0);
205 
206 #if 0	/* Cause a link error for bus_space_read_multi_8 */
207 #define	bus_space_read_multi_8	!!! bus_space_read_multi_8 unimplemented !!!
208 #endif
209 
210 /*
211  *	void bus_space_read_region_N __P((bus_space_tag_t tag,
212  *	    bus_space_handle_t bsh, bus_size_t offset,
213  *	    u_intN_t *addr, size_t count));
214  *
215  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
216  * described by tag/handle and starting at `offset' and copy into
217  * buffer provided.
218  */
219 
220 #define	bus_space_read_region_1(t, h, o, a, c) do {			\
221 	(void) t;							\
222 	__asm __volatile ("						\
223 		movl	%0,%%a0					;	\
224 		movl	%1,%%a1					;	\
225 		movl	%2,%%d0					;	\
226 	1:	movb	%%a0@+,%%a1@+				;	\
227 		subql	#1,%%d0					;	\
228 		jne	1b"					:	\
229 								:	\
230 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
231 		    "a0","a1","d0");					\
232 } while (0);
233 
234 #define	bus_space_read_region_2(t, h, o, a, c) do {			\
235 	(void) t;							\
236 	__asm __volatile ("						\
237 		movl	%0,%%a0					;	\
238 		movl	%1,%%a1					;	\
239 		movl	%2,%%d0					;	\
240 	1:	movw	%%a0@+,%%a1@+				;	\
241 		subql	#1,%%d0					;	\
242 		jne	1b"					:	\
243 								:	\
244 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
245 		    "a0","a1","d0");					\
246 } while (0);
247 
248 #define	bus_space_read_region_4(t, h, o, a, c) do {			\
249 	(void) t;							\
250 	__asm __volatile ("						\
251 		movl	%0,%%a0					;	\
252 		movl	%1,%%a1					;	\
253 		movl	%2,%%d0					;	\
254 	1:	movl	%%a0@+,%%a1@+				;	\
255 		subql	#1,%%d0					;	\
256 		jne	1b"					:	\
257 								:	\
258 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
259 		    "a0","a1","d0");					\
260 } while (0);
261 
262 #if 0	/* Cause a link error for bus_space_read_region_8 */
263 #define	bus_space_read_region_8	!!! bus_space_read_region_8 unimplemented !!!
264 #endif
265 
266 /*
267  *	void bus_space_write_N __P((bus_space_tag_t tag,
268  *	    bus_space_handle_t bsh, bus_size_t offset,
269  *	    u_intN_t value));
270  *
271  * Write the 1, 2, 4, or 8 byte value `value' to bus space
272  * described by tag/handle/offset.
273  */
274 
275 #define	bus_space_write_1(t, h, o, v)					\
276     ((void) t, ((void)(*(volatile u_int8_t *)((h) + (o)) = (v))))
277 
278 #define	bus_space_write_2(t, h, o, v)					\
279     ((void) t, ((void)(*(volatile u_int16_t *)((h) + (o)) = (v))))
280 
281 #define	bus_space_write_4(t, h, o, v)					\
282     ((void) t, ((void)(*(volatile u_int32_t *)((h) + (o)) = (v))))
283 
284 #if 0	/* Cause a link error for bus_space_write_8 */
285 #define	bus_space_write_8	!!! bus_space_write_8 not implemented !!!
286 #endif
287 
288 /*
289  *	void bus_space_write_multi_N __P((bus_space_tag_t tag,
290  *	    bus_space_handle_t bsh, bus_size_t offset,
291  *	    const u_intN_t *addr, size_t count));
292  *
293  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
294  * provided to bus space described by tag/handle/offset.
295  */
296 
297 #define	bus_space_write_multi_1(t, h, o, a, c) do {			\
298 	(void) t;							\
299 	__asm __volatile ("						\
300 		movl	%0,%%a0					;	\
301 		movl	%1,%%a1					;	\
302 		movl	%2,%%d0					;	\
303 	1:	movb	%%a1@+,%%a0@				;	\
304 		subql	#1,%%d0					;	\
305 		jne	1b"					:	\
306 								:	\
307 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
308 		    "a0","a1","d0");					\
309 } while (0);
310 
311 #define	bus_space_write_multi_2(t, h, o, a, c) do {			\
312 	(void) t;							\
313 	__asm __volatile ("						\
314 		movl	%0,%%a0					;	\
315 		movl	%1,%%a1					;	\
316 		movl	%2,%%d0					;	\
317 	1:	movw	%%a1@+,%%a0@				;	\
318 		subql	#1,%%d0					;	\
319 		jne	1b"					:	\
320 								:	\
321 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
322 		    "a0","a1","d0");					\
323 } while (0);
324 
325 #define	bus_space_write_multi_4(t, h, o, a, c) do {			\
326 	(void) t;							\
327 	__asm __volatile ("						\
328 		movl	%0,%%a0					;	\
329 		movl	%1,%%a1					;	\
330 		movl	%2,%%d0					;	\
331 	1:	movl	%%a1@+,%%a0@				;	\
332 		subql	#1,%%d0					;	\
333 		jne	1b"					:	\
334 								:	\
335 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
336 		    "a0","a1","d0");					\
337 } while (0);
338 
339 #if 0	/* Cause a link error for bus_space_write_8 */
340 #define	bus_space_write_multi_8(t, h, o, a, c)				\
341 			!!! bus_space_write_multi_8 unimplimented !!!
342 #endif
343 
344 /*
345  *	void bus_space_write_region_N __P((bus_space_tag_t tag,
346  *	    bus_space_handle_t bsh, bus_size_t offset,
347  *	    const u_intN_t *addr, size_t count));
348  *
349  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided
350  * to bus space described by tag/handle starting at `offset'.
351  */
352 
353 #define	bus_space_write_region_1(t, h, o, a, c) do {			\
354 	(void) t;							\
355 	__asm __volatile ("						\
356 		movl	%0,%%a0					;	\
357 		movl	%1,%%a1					;	\
358 		movl	%2,%%d0					;	\
359 	1:	movb	%%a1@+,%%a0@+				;	\
360 		subql	#1,%%d0					;	\
361 		jne	1b"					:	\
362 								:	\
363 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
364 		    "a0","a1","d0");					\
365 } while (0);
366 
367 #define	bus_space_write_region_2(t, h, o, a, c) do {			\
368 	(void) t;							\
369 	__asm __volatile ("						\
370 		movl	%0,%%a0					;	\
371 		movl	%1,%%a1					;	\
372 		movl	%2,%%d0					;	\
373 	1:	movw	%%a1@+,%%a0@+				;	\
374 		subql	#1,%%d0					;	\
375 		jne	1b"					:	\
376 								:	\
377 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
378 		    "a0","a1","d0");					\
379 } while (0);
380 
381 #define	bus_space_write_region_4(t, h, o, a, c) do {			\
382 	(void) t;							\
383 	__asm __volatile ("						\
384 		movl	%0,%%a0					;	\
385 		movl	%1,%%a1					;	\
386 		movl	%2,%%d0					;	\
387 	1:	movl	%%a1@+,%%a0@+				;	\
388 		subql	#1,%%d0					;	\
389 		jne	1b"					:	\
390 								:	\
391 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
392 		    "a0","a1","d0");					\
393 } while (0);
394 
395 #if 0	/* Cause a link error for bus_space_write_region_8 */
396 #define	bus_space_write_region_8					\
397 			!!! bus_space_write_region_8 unimplemented !!!
398 #endif
399 
400 /*
401  *	void bus_space_set_multi_N __P((bus_space_tag_t tag,
402  *	    bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
403  *	    size_t count));
404  *
405  * Write the 1, 2, 4, or 8 byte value `val' to bus space described
406  * by tag/handle/offset `count' times.
407  */
408 
409 #define	bus_space_set_multi_1(t, h, o, val, c) do {			\
410 	(void) t;							\
411 	__asm __volatile ("						\
412 		movl	%0,%%a0					;	\
413 		movl	%1,%%d1					;	\
414 		movl	%2,%%d0					;	\
415 	1:	movb	%%d1,%%a0@				;	\
416 		subql	#1,%%d0					;	\
417 		jne	1b"					:	\
418 								:	\
419 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
420 		    "a0","d0","d1");					\
421 } while (0);
422 
423 #define	bus_space_set_multi_2(t, h, o, val, c) do {			\
424 	(void) t;							\
425 	__asm __volatile ("						\
426 		movl	%0,%%a0					;	\
427 		movl	%1,%%d1					;	\
428 		movl	%2,%%d0					;	\
429 	1:	movw	%%d1,%%a0@				;	\
430 		subql	#1,%%d0					;	\
431 		jne	1b"					:	\
432 								:	\
433 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
434 		    "a0","d0","d1");					\
435 } while (0);
436 
437 #define	bus_space_set_multi_4(t, h, o, val, c) do {			\
438 	(void) t;							\
439 	__asm __volatile ("						\
440 		movl	%0,%%a0					;	\
441 		movl	%1,%%d1					;	\
442 		movl	%2,%%d0					;	\
443 	1:	movl	%%d1,%%a0@				;	\
444 		subql	#1,%%d0					;	\
445 		jne	1b"					:	\
446 								:	\
447 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
448 		    "a0","d0","d1");					\
449 } while (0);
450 
451 #if 0	/* Cause a link error for bus_space_set_multi_8 */
452 #define	bus_space_set_multi_8						\
453 			!!! bus_space_set_multi_8 unimplemented !!!
454 #endif
455 
456 /*
457  *	void bus_space_set_region_N __P((bus_space_tag_t tag,
458  *	    bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
459  *	    size_t count));
460  *
461  * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
462  * by tag/handle starting at `offset'.
463  */
464 
465 #define	bus_space_set_region_1(t, h, o, val, c) do {			\
466 	(void) t;							\
467 	__asm __volatile ("						\
468 		movl	%0,%%a0					;	\
469 		movl	%1,%%d1					;	\
470 		movl	%2,%%d0					;	\
471 	1:	movb	%%d1,%%a0@+				;	\
472 		subql	#1,%%d0					;	\
473 		jne	1b"					:	\
474 								:	\
475 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
476 		    "a0","d0","d1");					\
477 } while (0);
478 
479 #define	bus_space_set_region_2(t, h, o, val, c) do {			\
480 	(void) t;							\
481 	__asm __volatile ("						\
482 		movl	%0,%%a0					;	\
483 		movl	%1,%%d1					;	\
484 		movl	%2,%%d0					;	\
485 	1:	movw	%%d1,%%a0@+				;	\
486 		subql	#1,%%d0					;	\
487 		jne	1b"					:	\
488 								:	\
489 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
490 		    "a0","d0","d1");					\
491 } while (0);
492 
493 #define	bus_space_set_region_4(t, h, o, val, c) do {			\
494 	(void) t;							\
495 	__asm __volatile ("						\
496 		movl	%0,%%a0					;	\
497 		movl	%1,%%d1					;	\
498 		movl	%2,%%d0					;	\
499 	1:	movl	%%d1,%%a0@+				;	\
500 		subql	#1,%%d0					;	\
501 		jne	1b"					:	\
502 								:	\
503 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
504 		    "a0","d0","d1");					\
505 } while (0);
506 
507 #if 0	/* Cause a link error for bus_space_set_region_8 */
508 #define	bus_space_set_region_8						\
509 			!!! bus_space_set_region_8 unimplemented !!!
510 #endif
511 
512 /*
513  *	void bus_space_copy_N __P((bus_space_tag_t tag,
514  *	    bus_space_handle_t bsh1, bus_size_t off1,
515  *	    bus_space_handle_t bsh2, bus_size_t off2,
516  *	    size_t count));
517  *
518  * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
519  * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
520  */
521 
522 #define	__NEXT68K_copy_region_N(BYTES)					\
523 static __inline void __CONCAT(bus_space_copy_region_,BYTES)		\
524 	__P((bus_space_tag_t,						\
525 	    bus_space_handle_t bsh1, bus_size_t off1,			\
526 	    bus_space_handle_t bsh2, bus_size_t off2,			\
527 	    bus_size_t count));						\
528 									\
529 static __inline void							\
530 __CONCAT(bus_space_copy_region_,BYTES)(t, h1, o1, h2, o2, c)		\
531 	bus_space_tag_t t;						\
532 	bus_space_handle_t h1, h2;					\
533 	bus_size_t o1, o2, c;						\
534 {									\
535 	bus_size_t o;							\
536 									\
537 	if ((h1 + o1) >= (h2 + o2)) {					\
538 		/* src after dest: copy forward */			\
539 		for (o = 0; c != 0; c--, o += BYTES)			\
540 			__CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o,	\
541 			    __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \
542 	} else {							\
543 		/* dest after src: copy backwards */			\
544 		for (o = (c - 1) * BYTES; c != 0; c--, o -= BYTES)	\
545 			__CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o,	\
546 			    __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \
547 	}								\
548 }
549 __NEXT68K_copy_region_N(1)
550 __NEXT68K_copy_region_N(2)
551 __NEXT68K_copy_region_N(4)
552 #if 0	/* Cause a link error for bus_space_copy_8 */
553 #define	bus_space_copy_8						\
554 			!!! bus_space_copy_8 unimplemented !!!
555 #endif
556 
557 #undef __NEXT68K_copy_region_N
558 
559 /*
560  * Bus read/write barrier methods.
561  *
562  *	void bus_space_barrier __P((bus_space_tag_t tag,
563  *	    bus_space_handle_t bsh, bus_size_t offset,
564  *	    bus_size_t len, int flags));
565  *
566  * Note: the 680x0 does not currently require barriers, but we must
567  * provide the flags to MI code.
568  */
569 #define	bus_space_barrier(t, h, o, l, f)	\
570 	((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f)))
571 #define	BUS_SPACE_BARRIER_READ	0x01		/* force read barrier */
572 #define	BUS_SPACE_BARRIER_WRITE	0x02		/* force write barrier */
573 
574 #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
575 
576 #endif /* _NEXT68K_BUS_SPACE_H_ */
577