xref: /netbsd-src/sys/arch/news68k/include/bus.h (revision fbae48b901b55c2671f81f494926889226fd3ffe)
1*fbae48b9Sperry /*	$NetBSD: bus.h,v 1.7 2006/02/16 20:17:14 perry Exp $	*/
23f123214Stsutsui 
33f123214Stsutsui /*-
43f123214Stsutsui  * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
53f123214Stsutsui  * All rights reserved.
63f123214Stsutsui  *
73f123214Stsutsui  * This code is derived from software contributed to The NetBSD Foundation
83f123214Stsutsui  * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
93f123214Stsutsui  * NASA Ames Research Center.
103f123214Stsutsui  *
113f123214Stsutsui  * Redistribution and use in source and binary forms, with or without
123f123214Stsutsui  * modification, are permitted provided that the following conditions
133f123214Stsutsui  * are met:
143f123214Stsutsui  * 1. Redistributions of source code must retain the above copyright
153f123214Stsutsui  *    notice, this list of conditions and the following disclaimer.
163f123214Stsutsui  * 2. Redistributions in binary form must reproduce the above copyright
173f123214Stsutsui  *    notice, this list of conditions and the following disclaimer in the
183f123214Stsutsui  *    documentation and/or other materials provided with the distribution.
193f123214Stsutsui  * 3. All advertising materials mentioning features or use of this software
203f123214Stsutsui  *    must display the following acknowledgement:
213f123214Stsutsui  *	This product includes software developed by the NetBSD
223f123214Stsutsui  *	Foundation, Inc. and its contributors.
233f123214Stsutsui  * 4. Neither the name of The NetBSD Foundation nor the names of its
243f123214Stsutsui  *    contributors may be used to endorse or promote products derived
253f123214Stsutsui  *    from this software without specific prior written permission.
263f123214Stsutsui  *
273f123214Stsutsui  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
283f123214Stsutsui  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
293f123214Stsutsui  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
303f123214Stsutsui  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
313f123214Stsutsui  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
323f123214Stsutsui  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
333f123214Stsutsui  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
343f123214Stsutsui  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
353f123214Stsutsui  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
363f123214Stsutsui  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
373f123214Stsutsui  * POSSIBILITY OF SUCH DAMAGE.
383f123214Stsutsui  */
393f123214Stsutsui 
403f123214Stsutsui /*
413f123214Stsutsui  * Copyright (C) 1997 Scott Reynolds.  All rights reserved.
423f123214Stsutsui  *
433f123214Stsutsui  * Redistribution and use in source and binary forms, with or without
443f123214Stsutsui  * modification, are permitted provided that the following conditions
453f123214Stsutsui  * are met:
463f123214Stsutsui  * 1. Redistributions of source code must retain the above copyright
473f123214Stsutsui  *    notice, this list of conditions and the following disclaimer.
483f123214Stsutsui  * 2. Redistributions in binary form must reproduce the above copyright
493f123214Stsutsui  *    notice, this list of conditions and the following disclaimer in the
503f123214Stsutsui  *    documentation and/or other materials provided with the distribution.
513f123214Stsutsui  * 3. The name of the author may not be used to endorse or promote products
523f123214Stsutsui  *    derived from this software without specific prior written permission
533f123214Stsutsui  *
543f123214Stsutsui  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
553f123214Stsutsui  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
563f123214Stsutsui  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
573f123214Stsutsui  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
583f123214Stsutsui  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
593f123214Stsutsui  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
603f123214Stsutsui  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
613f123214Stsutsui  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
623f123214Stsutsui  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
633f123214Stsutsui  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
643f123214Stsutsui  */
653f123214Stsutsui 
663f123214Stsutsui /* bus_space(9) functions for news68k. Just taken from hp300. */
673f123214Stsutsui 
683f123214Stsutsui #ifndef _NEWS68K_BUS_H_
693f123214Stsutsui #define _NEWS68K_BUS_H_
703f123214Stsutsui 
713f123214Stsutsui /*
723f123214Stsutsui  * Values for the news68k bus space tag, not to be used directly by MI code.
733f123214Stsutsui  */
743f123214Stsutsui #define	NEWS68K_BUS_SPACE_INTIO	0	/* space is intio space */
753f123214Stsutsui #define	NEWS68K_BUS_SPACE_EIO	1	/* space is eio space */
763f123214Stsutsui 
773f123214Stsutsui /*
783f123214Stsutsui  * Bus address and size types
793f123214Stsutsui  */
803f123214Stsutsui typedef u_long bus_addr_t;
813f123214Stsutsui typedef u_long bus_size_t;
823f123214Stsutsui 
833f123214Stsutsui /*
843f123214Stsutsui  * Access methods for bus resources and address space.
853f123214Stsutsui  */
863f123214Stsutsui typedef int	bus_space_tag_t;
873f123214Stsutsui typedef u_long	bus_space_handle_t;
883f123214Stsutsui 
893f123214Stsutsui /*
902cac3aaeStsutsui  *	int bus_space_map(bus_space_tag_t t, bus_addr_t addr,
912cac3aaeStsutsui  *	    bus_size_t size, int flags, bus_space_handle_t *bshp);
923f123214Stsutsui  *
933f123214Stsutsui  * Map a region of bus space.
943f123214Stsutsui  */
953f123214Stsutsui 
963f123214Stsutsui #define	BUS_SPACE_MAP_CACHEABLE		0x01
973f123214Stsutsui #define	BUS_SPACE_MAP_LINEAR		0x02
983f123214Stsutsui #define	BUS_SPACE_MAP_PREFETCHABLE	0x04
993f123214Stsutsui 
1002cac3aaeStsutsui int	bus_space_map(bus_space_tag_t, bus_addr_t, bus_size_t,
1012cac3aaeStsutsui 	    int, bus_space_handle_t *);
1023f123214Stsutsui 
1033f123214Stsutsui /*
1042cac3aaeStsutsui  *	void bus_space_unmap(bus_space_tag_t t,
1052cac3aaeStsutsui  *	    bus_space_handle_t bsh, bus_size_t size);
1063f123214Stsutsui  *
1073f123214Stsutsui  * Unmap a region of bus space.
1083f123214Stsutsui  */
1093f123214Stsutsui 
1102cac3aaeStsutsui void	bus_space_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t);
1113f123214Stsutsui 
1123f123214Stsutsui /*
1132cac3aaeStsutsui  *	int bus_space_subregion(bus_space_tag_t t,
1143f123214Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset, bus_size_t size,
1152cac3aaeStsutsui  *	    bus_space_handle_t *nbshp);
1163f123214Stsutsui  *
1173f123214Stsutsui  * Get a new handle for a subregion of an already-mapped area of bus space.
1183f123214Stsutsui  */
1193f123214Stsutsui 
1202cac3aaeStsutsui int	bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh,
1212cac3aaeStsutsui 	    bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp);
1223f123214Stsutsui 
1233f123214Stsutsui /*
1242cac3aaeStsutsui  *	int bus_space_alloc(bus_space_tag_t t, bus_addr_t, rstart,
1253f123214Stsutsui  *	    bus_addr_t rend, bus_size_t size, bus_size_t align,
1263f123214Stsutsui  *	    bus_size_t boundary, int flags, bus_addr_t *addrp,
1272cac3aaeStsutsui  *	    bus_space_handle_t *bshp);
1283f123214Stsutsui  *
1293f123214Stsutsui  * Allocate a region of bus space.
1303f123214Stsutsui  */
1313f123214Stsutsui 
1322cac3aaeStsutsui int	bus_space_alloc(bus_space_tag_t t, bus_addr_t rstart,
1333f123214Stsutsui 	    bus_addr_t rend, bus_size_t size, bus_size_t align,
1343f123214Stsutsui 	    bus_size_t boundary, int cacheable, bus_addr_t *addrp,
1352cac3aaeStsutsui 	    bus_space_handle_t *bshp);
1363f123214Stsutsui 
1373f123214Stsutsui /*
1382cac3aaeStsutsui  *	int bus_space_free(bus_space_tag_t t,
1392cac3aaeStsutsui  *	    bus_space_handle_t bsh, bus_size_t size);
1403f123214Stsutsui  *
1413f123214Stsutsui  * Free a region of bus space.
1423f123214Stsutsui  */
1433f123214Stsutsui 
1442cac3aaeStsutsui void	bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh,
1452cac3aaeStsutsui 	    bus_size_t size);
1463f123214Stsutsui 
1473f123214Stsutsui /*
1482cac3aaeStsutsui  *	int news68k_bus_space_probe(bus_space_tag_t t,
1492cac3aaeStsutsui  *	    bus_space_handle_t bsh, bus_size_t offset, int sz);
1503f123214Stsutsui  *
1513f123214Stsutsui  * Probe the bus at t/bsh/offset, using sz as the size of the load.
1523f123214Stsutsui  *
1533f123214Stsutsui  * This is a machine-dependent extension, and is not to be used by
1543f123214Stsutsui  * machine-independent code.
1553f123214Stsutsui  */
1563f123214Stsutsui 
1572cac3aaeStsutsui int	news68k_bus_space_probe(bus_space_tag_t t,
1582cac3aaeStsutsui 	    bus_space_handle_t bsh, bus_size_t offset, int sz);
1593f123214Stsutsui 
1603f123214Stsutsui /*
1613725e983Stsutsui  *	uintN_t bus_space_read_N(bus_space_tag_t tag,
1622cac3aaeStsutsui  *	    bus_space_handle_t bsh, bus_size_t offset);
1633f123214Stsutsui  *
1643f123214Stsutsui  * Read a 1, 2, 4, or 8 byte quantity from bus space
1653f123214Stsutsui  * described by tag/handle/offset.
1663f123214Stsutsui  */
1673f123214Stsutsui 
1683f123214Stsutsui #define	bus_space_read_1(t, h, o)					\
1693725e983Stsutsui     ((void) t, (*(volatile uint8_t *)((h) + (o))))
1703f123214Stsutsui 
1713f123214Stsutsui #define	bus_space_read_2(t, h, o)					\
1723725e983Stsutsui     ((void) t, (*(volatile uint16_t *)((h) + (o))))
1733f123214Stsutsui 
1743f123214Stsutsui #define	bus_space_read_4(t, h, o)					\
1753725e983Stsutsui     ((void) t, (*(volatile uint32_t *)((h) + (o))))
1763f123214Stsutsui 
1773f123214Stsutsui #if 0	/* Cause a link error for bus_space_read_8 */
1783f123214Stsutsui #define	bus_space_read_8(t, h, o)	!!! bus_space_read_8 unimplemented !!!
1793f123214Stsutsui #endif
1803f123214Stsutsui 
1813f123214Stsutsui /*
1822cac3aaeStsutsui  *	void bus_space_read_multi_N(bus_space_tag_t tag,
1833f123214Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset,
1843725e983Stsutsui  *	    uintN_t *addr, size_t count);
1853f123214Stsutsui  *
1863f123214Stsutsui  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
1873f123214Stsutsui  * described by tag/handle/offset and copy into buffer provided.
1883f123214Stsutsui  */
1893f123214Stsutsui 
1903f123214Stsutsui #define	bus_space_read_multi_1(t, h, o, a, c) do {			\
1913f123214Stsutsui 	(void) t;							\
1925f1c88d7Sperry 	__asm volatile ("						\
1933f123214Stsutsui 		movl	%0,%%a0					;	\
1943f123214Stsutsui 		movl	%1,%%a1					;	\
1953f123214Stsutsui 		movl	%2,%%d0					;	\
1963f123214Stsutsui 	1:	movb	%%a0@,%%a1@+				;	\
1973f123214Stsutsui 		subql	#1,%%d0					;	\
1983f123214Stsutsui 		jne	1b"					:	\
1993f123214Stsutsui 								:	\
2003f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
2013f123214Stsutsui 		    "%a0","%a1","%d0");					\
2023f123214Stsutsui } while (0)
2033f123214Stsutsui 
2043f123214Stsutsui #define	bus_space_read_multi_2(t, h, o, a, c) do {			\
2053f123214Stsutsui 	(void) t;							\
2065f1c88d7Sperry 	__asm volatile ("						\
2073f123214Stsutsui 		movl	%0,%%a0					;	\
2083f123214Stsutsui 		movl	%1,%%a1					;	\
2093f123214Stsutsui 		movl	%2,%%d0					;	\
2103f123214Stsutsui 	1:	movw	%%a0@,%%a1@+				;	\
2113f123214Stsutsui 		subql	#1,%%d0					;	\
2123f123214Stsutsui 		jne	1b"					:	\
2133f123214Stsutsui 								:	\
2143f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
2153f123214Stsutsui 		    "%a0","%a1","%d0");					\
2163f123214Stsutsui } while (0)
2173f123214Stsutsui 
2183f123214Stsutsui #define	bus_space_read_multi_4(t, h, o, a, c) do {			\
2193f123214Stsutsui 	(void) t;							\
2205f1c88d7Sperry 	__asm volatile ("						\
2213f123214Stsutsui 		movl	%0,%%a0					;	\
2223f123214Stsutsui 		movl	%1,%%a1					;	\
2233f123214Stsutsui 		movl	%2,%%d0					;	\
2243f123214Stsutsui 	1:	movl	%%a0@,%%a1@+				;	\
2253f123214Stsutsui 		subql	#1,%%d0					;	\
2263f123214Stsutsui 		jne	1b"					:	\
2273f123214Stsutsui 								:	\
2283f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
2293f123214Stsutsui 		    "%a0","%a1","%d0");					\
2303f123214Stsutsui } while (0)
2313f123214Stsutsui 
2323f123214Stsutsui #if 0	/* Cause a link error for bus_space_read_multi_8 */
2333f123214Stsutsui #define	bus_space_read_multi_8	!!! bus_space_read_multi_8 unimplemented !!!
2343f123214Stsutsui #endif
2353f123214Stsutsui 
2363f123214Stsutsui /*
2372cac3aaeStsutsui  *	void bus_space_read_region_N(bus_space_tag_t tag,
2383f123214Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset,
2393725e983Stsutsui  *	    uintN_t *addr, size_t count);
2403f123214Stsutsui  *
2413f123214Stsutsui  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
2423f123214Stsutsui  * described by tag/handle and starting at `offset' and copy into
2433f123214Stsutsui  * buffer provided.
2443f123214Stsutsui  */
2453f123214Stsutsui 
2463f123214Stsutsui #define	bus_space_read_region_1(t, h, o, a, c) do {			\
2473f123214Stsutsui 	(void) t;							\
2485f1c88d7Sperry 	__asm volatile ("						\
2493f123214Stsutsui 		movl	%0,%%a0					;	\
2503f123214Stsutsui 		movl	%1,%%a1					;	\
2513f123214Stsutsui 		movl	%2,%%d0					;	\
2523f123214Stsutsui 	1:	movb	%%a0@+,%%a1@+				;	\
2533f123214Stsutsui 		subql	#1,%%d0					;	\
2543f123214Stsutsui 		jne	1b"					:	\
2553f123214Stsutsui 								:	\
2563f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
2573f123214Stsutsui 		    "%a0","%a1","%d0");					\
2583f123214Stsutsui } while (0)
2593f123214Stsutsui 
2603f123214Stsutsui #define	bus_space_read_region_2(t, h, o, a, c) do {			\
2613f123214Stsutsui 	(void) t;							\
2625f1c88d7Sperry 	__asm volatile ("						\
2633f123214Stsutsui 		movl	%0,%%a0					;	\
2643f123214Stsutsui 		movl	%1,%%a1					;	\
2653f123214Stsutsui 		movl	%2,%%d0					;	\
2663f123214Stsutsui 	1:	movw	%%a0@+,%%a1@+				;	\
2673f123214Stsutsui 		subql	#1,%%d0					;	\
2683f123214Stsutsui 		jne	1b"					:	\
2693f123214Stsutsui 								:	\
2703f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
2713f123214Stsutsui 		    "%a0","%a1","%d0");					\
2723f123214Stsutsui } while (0)
2733f123214Stsutsui 
2743f123214Stsutsui #define	bus_space_read_region_4(t, h, o, a, c) do {			\
2753f123214Stsutsui 	(void) t;							\
2765f1c88d7Sperry 	__asm volatile ("						\
2773f123214Stsutsui 		movl	%0,%%a0					;	\
2783f123214Stsutsui 		movl	%1,%%a1					;	\
2793f123214Stsutsui 		movl	%2,%%d0					;	\
2803f123214Stsutsui 	1:	movl	%%a0@+,%%a1@+				;	\
2813f123214Stsutsui 		subql	#1,%%d0					;	\
2823f123214Stsutsui 		jne	1b"					:	\
2833f123214Stsutsui 								:	\
2843f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
2853f123214Stsutsui 		    "%a0","%a1","%d0");					\
2863f123214Stsutsui } while (0)
2873f123214Stsutsui 
2883f123214Stsutsui #if 0	/* Cause a link error for bus_space_read_region_8 */
2893f123214Stsutsui #define	bus_space_read_region_8	!!! bus_space_read_region_8 unimplemented !!!
2903f123214Stsutsui #endif
2913f123214Stsutsui 
2923f123214Stsutsui /*
2932cac3aaeStsutsui  *	void bus_space_write_N(bus_space_tag_t tag,
2943f123214Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset,
2953725e983Stsutsui  *	    uintN_t value);
2963f123214Stsutsui  *
2973f123214Stsutsui  * Write the 1, 2, 4, or 8 byte value `value' to bus space
2983f123214Stsutsui  * described by tag/handle/offset.
2993f123214Stsutsui  */
3003f123214Stsutsui 
3013f123214Stsutsui #define	bus_space_write_1(t, h, o, v)					\
3023725e983Stsutsui     ((void) t, ((void)(*(volatile uint8_t *)((h) + (o)) = (v))))
3033f123214Stsutsui 
3043f123214Stsutsui #define	bus_space_write_2(t, h, o, v)					\
3053725e983Stsutsui     ((void) t, ((void)(*(volatile uint16_t *)((h) + (o)) = (v))))
3063f123214Stsutsui 
3073f123214Stsutsui #define	bus_space_write_4(t, h, o, v)					\
3083725e983Stsutsui     ((void) t, ((void)(*(volatile uint32_t *)((h) + (o)) = (v))))
3093f123214Stsutsui 
3103f123214Stsutsui #if 0	/* Cause a link error for bus_space_write_8 */
3113f123214Stsutsui #define	bus_space_write_8	!!! bus_space_write_8 not implemented !!!
3123f123214Stsutsui #endif
3133f123214Stsutsui 
3143f123214Stsutsui /*
3152cac3aaeStsutsui  *	void bus_space_write_multi_N(bus_space_tag_t tag,
3163f123214Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset,
3173725e983Stsutsui  *	    const uintN_t *addr, size_t count);
3183f123214Stsutsui  *
3193f123214Stsutsui  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
3203f123214Stsutsui  * provided to bus space described by tag/handle/offset.
3213f123214Stsutsui  */
3223f123214Stsutsui 
3233f123214Stsutsui #define	bus_space_write_multi_1(t, h, o, a, c) do {			\
3243f123214Stsutsui 	(void) t;							\
3255f1c88d7Sperry 	__asm volatile ("						\
3263f123214Stsutsui 		movl	%0,%%a0					;	\
3273f123214Stsutsui 		movl	%1,%%a1					;	\
3283f123214Stsutsui 		movl	%2,%%d0					;	\
3293f123214Stsutsui 	1:	movb	%%a1@+,%%a0@				;	\
3303f123214Stsutsui 		subql	#1,%%d0					;	\
3313f123214Stsutsui 		jne	1b"					:	\
3323f123214Stsutsui 								:	\
3333f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
3343f123214Stsutsui 		    "%a0","%a1","%d0");					\
3353f123214Stsutsui } while (0)
3363f123214Stsutsui 
3373f123214Stsutsui #define	bus_space_write_multi_2(t, h, o, a, c) do {			\
3383f123214Stsutsui 	(void) t;							\
3395f1c88d7Sperry 	__asm volatile ("						\
3403f123214Stsutsui 		movl	%0,%%a0					;	\
3413f123214Stsutsui 		movl	%1,%%a1					;	\
3423f123214Stsutsui 		movl	%2,%%d0					;	\
3433f123214Stsutsui 	1:	movw	%%a1@+,%%a0@				;	\
3443f123214Stsutsui 		subql	#1,%%d0					;	\
3453f123214Stsutsui 		jne	1b"					:	\
3463f123214Stsutsui 								:	\
3473f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
3483f123214Stsutsui 		    "%a0","%a1","%d0");					\
3493f123214Stsutsui } while (0)
3503f123214Stsutsui 
3513f123214Stsutsui #define	bus_space_write_multi_4(t, h, o, a, c) do {			\
3523f123214Stsutsui 	(void) t;							\
3535f1c88d7Sperry 	__asm volatile ("						\
3543f123214Stsutsui 		movl	%0,%%a0					;	\
3553f123214Stsutsui 		movl	%1,%%a1					;	\
3563f123214Stsutsui 		movl	%2,%%d0					;	\
3573f123214Stsutsui 	1:	movl	%%a1@+,%%a0@				;	\
3583f123214Stsutsui 		subql	#1,%%d0					;	\
3593f123214Stsutsui 		jne	1b"					:	\
3603f123214Stsutsui 								:	\
3613f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
3623f123214Stsutsui 		    "%a0","%a1","%d0");					\
3633f123214Stsutsui } while (0)
3643f123214Stsutsui 
3653f123214Stsutsui #if 0	/* Cause a link error for bus_space_write_8 */
3663f123214Stsutsui #define	bus_space_write_multi_8(t, h, o, a, c)				\
3673f123214Stsutsui 			!!! bus_space_write_multi_8 unimplimented !!!
3683f123214Stsutsui #endif
3693f123214Stsutsui 
3703f123214Stsutsui /*
3712cac3aaeStsutsui  *	void bus_space_write_region_N(bus_space_tag_t tag,
3723f123214Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset,
3733725e983Stsutsui  *	    const uintN_t *addr, size_t count);
3743f123214Stsutsui  *
3753f123214Stsutsui  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided
3763f123214Stsutsui  * to bus space described by tag/handle starting at `offset'.
3773f123214Stsutsui  */
3783f123214Stsutsui 
3793f123214Stsutsui #define	bus_space_write_region_1(t, h, o, a, c) do {			\
3803f123214Stsutsui 	(void) t;							\
3815f1c88d7Sperry 	__asm volatile ("						\
3823f123214Stsutsui 		movl	%0,%%a0					;	\
3833f123214Stsutsui 		movl	%1,%%a1					;	\
3843f123214Stsutsui 		movl	%2,%%d0					;	\
3853f123214Stsutsui 	1:	movb	%%a1@+,%%a0@+				;	\
3863f123214Stsutsui 		subql	#1,%%d0					;	\
3873f123214Stsutsui 		jne	1b"					:	\
3883f123214Stsutsui 								:	\
3893f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
3903f123214Stsutsui 		    "%a0","%a1","%d0");					\
3913f123214Stsutsui } while (0)
3923f123214Stsutsui 
3933f123214Stsutsui #define	bus_space_write_region_2(t, h, o, a, c) do {			\
3943f123214Stsutsui 	(void) t;							\
3955f1c88d7Sperry 	__asm volatile ("						\
3963f123214Stsutsui 		movl	%0,%%a0					;	\
3973f123214Stsutsui 		movl	%1,%%a1					;	\
3983f123214Stsutsui 		movl	%2,%%d0					;	\
3993f123214Stsutsui 	1:	movw	%%a1@+,%%a0@+				;	\
4003f123214Stsutsui 		subql	#1,%%d0					;	\
4013f123214Stsutsui 		jne	1b"					:	\
4023f123214Stsutsui 								:	\
4033f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
4043f123214Stsutsui 		    "%a0","%a1","%d0");					\
4053f123214Stsutsui } while (0)
4063f123214Stsutsui 
4073f123214Stsutsui #define	bus_space_write_region_4(t, h, o, a, c) do {			\
4083f123214Stsutsui 	(void) t;							\
4095f1c88d7Sperry 	__asm volatile ("						\
4103f123214Stsutsui 		movl	%0,%%a0					;	\
4113f123214Stsutsui 		movl	%1,%%a1					;	\
4123f123214Stsutsui 		movl	%2,%%d0					;	\
4133f123214Stsutsui 	1:	movl	%%a1@+,%%a0@+				;	\
4143f123214Stsutsui 		subql	#1,%%d0					;	\
4153f123214Stsutsui 		jne	1b"					:	\
4163f123214Stsutsui 								:	\
4173f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
4183f123214Stsutsui 		    "%a0","%a1","%d0");					\
4193f123214Stsutsui } while (0)
4203f123214Stsutsui 
4213f123214Stsutsui #if 0	/* Cause a link error for bus_space_write_region_8 */
4223f123214Stsutsui #define	bus_space_write_region_8					\
4233f123214Stsutsui 			!!! bus_space_write_region_8 unimplemented !!!
4243f123214Stsutsui #endif
4253f123214Stsutsui 
4263f123214Stsutsui /*
4272cac3aaeStsutsui  *	void bus_space_set_multi_N(bus_space_tag_t tag,
4283725e983Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
4292cac3aaeStsutsui  *	    size_t count);
4303f123214Stsutsui  *
4313f123214Stsutsui  * Write the 1, 2, 4, or 8 byte value `val' to bus space described
4323f123214Stsutsui  * by tag/handle/offset `count' times.
4333f123214Stsutsui  */
4343f123214Stsutsui 
4353f123214Stsutsui #define	bus_space_set_multi_1(t, h, o, val, c) do {			\
4363f123214Stsutsui 	(void) t;							\
4375f1c88d7Sperry 	__asm volatile ("						\
4383f123214Stsutsui 		movl	%0,%%a0					;	\
4393f123214Stsutsui 		movl	%1,%%d1					;	\
4403f123214Stsutsui 		movl	%2,%%d0					;	\
4413f123214Stsutsui 	1:	movb	%%d1,%%a0@				;	\
4423f123214Stsutsui 		subql	#1,%%d0					;	\
4433f123214Stsutsui 		jne	1b"					:	\
4443f123214Stsutsui 								:	\
4453f123214Stsutsui 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
4463f123214Stsutsui 		    "%a0","%d0","%d1");					\
4473f123214Stsutsui } while (0)
4483f123214Stsutsui 
4493f123214Stsutsui #define	bus_space_set_multi_2(t, h, o, val, c) do {			\
4503f123214Stsutsui 	(void) t;							\
4515f1c88d7Sperry 	__asm volatile ("						\
4523f123214Stsutsui 		movl	%0,%%a0					;	\
4533f123214Stsutsui 		movl	%1,%%d1					;	\
4543f123214Stsutsui 		movl	%2,%%d0					;	\
4553f123214Stsutsui 	1:	movw	%%d1,%%a0@				;	\
4563f123214Stsutsui 		subql	#1,%%d0					;	\
4573f123214Stsutsui 		jne	1b"					:	\
4583f123214Stsutsui 								:	\
4593f123214Stsutsui 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
4603f123214Stsutsui 		    "%a0","%d0","%d1");					\
4613f123214Stsutsui } while (0)
4623f123214Stsutsui 
4633f123214Stsutsui #define	bus_space_set_multi_4(t, h, o, val, c) do {			\
4643f123214Stsutsui 	(void) t;							\
4655f1c88d7Sperry 	__asm volatile ("						\
4663f123214Stsutsui 		movl	%0,%%a0					;	\
4673f123214Stsutsui 		movl	%1,%%d1					;	\
4683f123214Stsutsui 		movl	%2,%%d0					;	\
4693f123214Stsutsui 	1:	movl	%%d1,%%a0@				;	\
4703f123214Stsutsui 		subql	#1,%%d0					;	\
4713f123214Stsutsui 		jne	1b"					:	\
4723f123214Stsutsui 								:	\
4733f123214Stsutsui 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
4743f123214Stsutsui 		    "%a0","%d0","%d1");					\
4753f123214Stsutsui } while (0)
4763f123214Stsutsui 
4773f123214Stsutsui #if 0	/* Cause a link error for bus_space_set_multi_8 */
4783f123214Stsutsui #define	bus_space_set_multi_8						\
4793f123214Stsutsui 			!!! bus_space_set_multi_8 unimplemented !!!
4803f123214Stsutsui #endif
4813f123214Stsutsui 
4823f123214Stsutsui /*
4832cac3aaeStsutsui  *	void bus_space_set_region_N(bus_space_tag_t tag,
4843725e983Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
4852cac3aaeStsutsui  *	    size_t count);
4863f123214Stsutsui  *
4873f123214Stsutsui  * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
4883f123214Stsutsui  * by tag/handle starting at `offset'.
4893f123214Stsutsui  */
4903f123214Stsutsui 
4913f123214Stsutsui #define	bus_space_set_region_1(t, h, o, val, c) do {			\
4923f123214Stsutsui 	(void) t;							\
4935f1c88d7Sperry 	__asm volatile ("						\
4943f123214Stsutsui 		movl	%0,%%a0					;	\
4953f123214Stsutsui 		movl	%1,%%d1					;	\
4963f123214Stsutsui 		movl	%2,%%d0					;	\
4973f123214Stsutsui 	1:	movb	%%d1,%%a0@+				;	\
4983f123214Stsutsui 		subql	#1,%%d0					;	\
4993f123214Stsutsui 		jne	1b"					:	\
5003f123214Stsutsui 								:	\
5013f123214Stsutsui 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
5023f123214Stsutsui 		    "%a0","%d0","%d1");					\
5033f123214Stsutsui } while (0)
5043f123214Stsutsui 
5053f123214Stsutsui #define	bus_space_set_region_2(t, h, o, val, c) do {			\
5063f123214Stsutsui 	(void) t;							\
5075f1c88d7Sperry 	__asm volatile ("						\
5083f123214Stsutsui 		movl	%0,%%a0					;	\
5093f123214Stsutsui 		movl	%1,%%d1					;	\
5103f123214Stsutsui 		movl	%2,%%d0					;	\
5113f123214Stsutsui 	1:	movw	%%d1,%%a0@+				;	\
5123f123214Stsutsui 		subql	#1,%%d0					;	\
5133f123214Stsutsui 		jne	1b"					:	\
5143f123214Stsutsui 								:	\
5153f123214Stsutsui 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
5163f123214Stsutsui 		    "%a0","%d0","%d1");					\
5173f123214Stsutsui } while (0)
5183f123214Stsutsui 
5193f123214Stsutsui #define	bus_space_set_region_4(t, h, o, val, c) do {			\
5203f123214Stsutsui 	(void) t;							\
5215f1c88d7Sperry 	__asm volatile ("						\
5223f123214Stsutsui 		movl	%0,%%a0					;	\
5233f123214Stsutsui 		movl	%1,%%d1					;	\
5243f123214Stsutsui 		movl	%2,%%d0					;	\
5253f123214Stsutsui 	1:	movl	%%d1,%%a0@+				;	\
5263f123214Stsutsui 		subql	#1,%%d0					;	\
5273f123214Stsutsui 		jne	1b"					:	\
5283f123214Stsutsui 								:	\
5293f123214Stsutsui 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
5303f123214Stsutsui 		    "%a0","%d0","%d1");					\
5313f123214Stsutsui } while (0)
5323f123214Stsutsui 
5333f123214Stsutsui #if 0	/* Cause a link error for bus_space_set_region_8 */
5343f123214Stsutsui #define	bus_space_set_region_8						\
5353f123214Stsutsui 			!!! bus_space_set_region_8 unimplemented !!!
5363f123214Stsutsui #endif
5373f123214Stsutsui 
5383f123214Stsutsui /*
5392cac3aaeStsutsui  *	void bus_space_copy_region_N(bus_space_tag_t tag,
5403f123214Stsutsui  *	    bus_space_handle_t bsh1, bus_size_t off1,
5413f123214Stsutsui  *	    bus_space_handle_t bsh2, bus_size_t off2,
5422cac3aaeStsutsui  *	    bus_size_t count);
5433f123214Stsutsui  *
5443f123214Stsutsui  * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
5453f123214Stsutsui  * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
5463f123214Stsutsui  */
5473f123214Stsutsui 
5483f123214Stsutsui #define	__NEWS68K_copy_region_N(BYTES)					\
549*fbae48b9Sperry static __inline void __CONCAT(bus_space_copy_region_,BYTES)		\
5502cac3aaeStsutsui 	(bus_space_tag_t,						\
5513f123214Stsutsui 	 bus_space_handle_t bsh1, bus_size_t off1,			\
5523f123214Stsutsui 	 bus_space_handle_t bsh2, bus_size_t off2,			\
5532cac3aaeStsutsui 	 bus_size_t count);						\
5543f123214Stsutsui 									\
555*fbae48b9Sperry static __inline void							\
55652b46dcfStsutsui __CONCAT(bus_space_copy_region_,BYTES)(bus_space_tag_t t,		\
55752b46dcfStsutsui     bus_space_handle_t h1, bus_space_handle_t h2,			\
55852b46dcfStsutsui     bus_size_t o1, bus_size_t o2, bus_size_t c)				\
5593f123214Stsutsui {									\
5603f123214Stsutsui 	bus_size_t o;							\
5613f123214Stsutsui 									\
5623f123214Stsutsui 	if ((h1 + o1) >= (h2 + o2)) {					\
5633f123214Stsutsui 		/* src after dest: copy forward */			\
5643f123214Stsutsui 		for (o = 0; c != 0; c--, o += BYTES)			\
5653f123214Stsutsui 			__CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o,	\
5663f123214Stsutsui 			    __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \
5673f123214Stsutsui 	} else {							\
5683f123214Stsutsui 		/* dest after src: copy backwards */			\
5693f123214Stsutsui 		for (o = (c - 1) * BYTES; c != 0; c--, o -= BYTES)	\
5703f123214Stsutsui 			__CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o,	\
5713f123214Stsutsui 			    __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \
5723f123214Stsutsui 	}								\
5733f123214Stsutsui }
5743f123214Stsutsui __NEWS68K_copy_region_N(1)
5753f123214Stsutsui __NEWS68K_copy_region_N(2)
5763f123214Stsutsui __NEWS68K_copy_region_N(4)
5773f123214Stsutsui #if 0	/* Cause a link error for bus_space_copy_region_8 */
5783f123214Stsutsui #define	bus_space_copy_region_8						\
5793f123214Stsutsui 			!!! bus_space_copy_region_8 unimplemented !!!
5803f123214Stsutsui #endif
5813f123214Stsutsui 
5823f123214Stsutsui #undef __NEWS68K_copy_region_N
5833f123214Stsutsui 
5843f123214Stsutsui /*
5853f123214Stsutsui  * Bus read/write barrier methods.
5863f123214Stsutsui  *
5872cac3aaeStsutsui  *	void bus_space_barrier(bus_space_tag_t tag,
5883f123214Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset,
5892cac3aaeStsutsui  *	    bus_size_t len, int flags);
5903f123214Stsutsui  *
5913f123214Stsutsui  * Note: the 680x0 does not currently require barriers, but we must
5923f123214Stsutsui  * provide the flags to MI code.
5933f123214Stsutsui  */
5943f123214Stsutsui #define	bus_space_barrier(t, h, o, l, f)	\
5953f123214Stsutsui 	((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f)))
5963f123214Stsutsui #define	BUS_SPACE_BARRIER_READ	0x01		/* force read barrier */
5973f123214Stsutsui #define	BUS_SPACE_BARRIER_WRITE	0x02		/* force write barrier */
5983f123214Stsutsui 
5993f123214Stsutsui #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
6003f123214Stsutsui 
6013f123214Stsutsui #endif /* _NEWS68K_BUS_H_ */
602