xref: /netbsd-src/sys/arch/news68k/include/bus.h (revision fbe896c51aefe535d3d4853b599b43e0da4e78a6)
1*fbe896c5Stsutsui /*	$NetBSD: bus.h,v 1.13 2023/01/27 19:50:02 tsutsui 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  *
203f123214Stsutsui  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
213f123214Stsutsui  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
223f123214Stsutsui  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
233f123214Stsutsui  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
243f123214Stsutsui  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
253f123214Stsutsui  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
263f123214Stsutsui  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
273f123214Stsutsui  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
283f123214Stsutsui  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
293f123214Stsutsui  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
303f123214Stsutsui  * POSSIBILITY OF SUCH DAMAGE.
313f123214Stsutsui  */
323f123214Stsutsui 
333f123214Stsutsui /*
343f123214Stsutsui  * Copyright (C) 1997 Scott Reynolds.  All rights reserved.
353f123214Stsutsui  *
363f123214Stsutsui  * Redistribution and use in source and binary forms, with or without
373f123214Stsutsui  * modification, are permitted provided that the following conditions
383f123214Stsutsui  * are met:
393f123214Stsutsui  * 1. Redistributions of source code must retain the above copyright
403f123214Stsutsui  *    notice, this list of conditions and the following disclaimer.
413f123214Stsutsui  * 2. Redistributions in binary form must reproduce the above copyright
423f123214Stsutsui  *    notice, this list of conditions and the following disclaimer in the
433f123214Stsutsui  *    documentation and/or other materials provided with the distribution.
443f123214Stsutsui  * 3. The name of the author may not be used to endorse or promote products
453f123214Stsutsui  *    derived from this software without specific prior written permission
463f123214Stsutsui  *
473f123214Stsutsui  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
483f123214Stsutsui  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
493f123214Stsutsui  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
503f123214Stsutsui  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
513f123214Stsutsui  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
523f123214Stsutsui  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
533f123214Stsutsui  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
543f123214Stsutsui  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
553f123214Stsutsui  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
563f123214Stsutsui  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
573f123214Stsutsui  */
583f123214Stsutsui 
593f123214Stsutsui /* bus_space(9) functions for news68k. Just taken from hp300. */
603f123214Stsutsui 
613f123214Stsutsui #ifndef _NEWS68K_BUS_H_
623f123214Stsutsui #define _NEWS68K_BUS_H_
633f123214Stsutsui 
643f123214Stsutsui /*
653f123214Stsutsui  * Values for the news68k bus space tag, not to be used directly by MI code.
663f123214Stsutsui  */
673f123214Stsutsui #define	NEWS68K_BUS_SPACE_INTIO	0	/* space is intio space */
683f123214Stsutsui #define	NEWS68K_BUS_SPACE_EIO	1	/* space is eio space */
693f123214Stsutsui 
703f123214Stsutsui /*
713f123214Stsutsui  * Bus address and size types
723f123214Stsutsui  */
733f123214Stsutsui typedef u_long bus_addr_t;
743f123214Stsutsui typedef u_long bus_size_t;
753f123214Stsutsui 
76bf158e33Sskrll #define PRIxBUSADDR	"lx"
77bf158e33Sskrll #define PRIxBUSSIZE	"lx"
78bf158e33Sskrll #define PRIuBUSSIZE	"lu"
79bf158e33Sskrll 
803f123214Stsutsui /*
813f123214Stsutsui  * Access methods for bus resources and address space.
823f123214Stsutsui  */
833f123214Stsutsui typedef int	bus_space_tag_t;
843f123214Stsutsui typedef u_long	bus_space_handle_t;
853f123214Stsutsui 
86bf158e33Sskrll #define PRIxBSH		"lx"
87bf158e33Sskrll 
883f123214Stsutsui /*
892cac3aaeStsutsui  *	int bus_space_map(bus_space_tag_t t, bus_addr_t addr,
902cac3aaeStsutsui  *	    bus_size_t size, int flags, bus_space_handle_t *bshp);
913f123214Stsutsui  *
923f123214Stsutsui  * Map a region of bus space.
933f123214Stsutsui  */
943f123214Stsutsui 
953f123214Stsutsui #define	BUS_SPACE_MAP_CACHEABLE		0x01
963f123214Stsutsui #define	BUS_SPACE_MAP_LINEAR		0x02
973f123214Stsutsui #define	BUS_SPACE_MAP_PREFETCHABLE	0x04
983f123214Stsutsui 
992cac3aaeStsutsui int	bus_space_map(bus_space_tag_t, bus_addr_t, bus_size_t,
1002cac3aaeStsutsui 	    int, bus_space_handle_t *);
1013f123214Stsutsui 
1023f123214Stsutsui /*
1032cac3aaeStsutsui  *	void bus_space_unmap(bus_space_tag_t t,
1042cac3aaeStsutsui  *	    bus_space_handle_t bsh, bus_size_t size);
1053f123214Stsutsui  *
1063f123214Stsutsui  * Unmap a region of bus space.
1073f123214Stsutsui  */
1083f123214Stsutsui 
1092cac3aaeStsutsui void	bus_space_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t);
1103f123214Stsutsui 
1113f123214Stsutsui /*
1122cac3aaeStsutsui  *	int bus_space_subregion(bus_space_tag_t t,
1133f123214Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset, bus_size_t size,
1142cac3aaeStsutsui  *	    bus_space_handle_t *nbshp);
1153f123214Stsutsui  *
1163f123214Stsutsui  * Get a new handle for a subregion of an already-mapped area of bus space.
1173f123214Stsutsui  */
1183f123214Stsutsui 
1192cac3aaeStsutsui int	bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh,
1202cac3aaeStsutsui 	    bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp);
1213f123214Stsutsui 
1223f123214Stsutsui /*
1232cac3aaeStsutsui  *	int bus_space_alloc(bus_space_tag_t t, bus_addr_t, rstart,
1243f123214Stsutsui  *	    bus_addr_t rend, bus_size_t size, bus_size_t align,
1253f123214Stsutsui  *	    bus_size_t boundary, int flags, bus_addr_t *addrp,
1262cac3aaeStsutsui  *	    bus_space_handle_t *bshp);
1273f123214Stsutsui  *
1283f123214Stsutsui  * Allocate a region of bus space.
1293f123214Stsutsui  */
1303f123214Stsutsui 
1312cac3aaeStsutsui int	bus_space_alloc(bus_space_tag_t t, bus_addr_t rstart,
1323f123214Stsutsui 	    bus_addr_t rend, bus_size_t size, bus_size_t align,
1333f123214Stsutsui 	    bus_size_t boundary, int cacheable, bus_addr_t *addrp,
1342cac3aaeStsutsui 	    bus_space_handle_t *bshp);
1353f123214Stsutsui 
1363f123214Stsutsui /*
1372cac3aaeStsutsui  *	int bus_space_free(bus_space_tag_t t,
1382cac3aaeStsutsui  *	    bus_space_handle_t bsh, bus_size_t size);
1393f123214Stsutsui  *
1403f123214Stsutsui  * Free a region of bus space.
1413f123214Stsutsui  */
1423f123214Stsutsui 
1432cac3aaeStsutsui void	bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh,
1442cac3aaeStsutsui 	    bus_size_t size);
1453f123214Stsutsui 
1463f123214Stsutsui /*
1472cac3aaeStsutsui  *	int news68k_bus_space_probe(bus_space_tag_t t,
1482cac3aaeStsutsui  *	    bus_space_handle_t bsh, bus_size_t offset, int sz);
1493f123214Stsutsui  *
1503f123214Stsutsui  * Probe the bus at t/bsh/offset, using sz as the size of the load.
1513f123214Stsutsui  *
1523f123214Stsutsui  * This is a machine-dependent extension, and is not to be used by
1533f123214Stsutsui  * machine-independent code.
1543f123214Stsutsui  */
1553f123214Stsutsui 
1562cac3aaeStsutsui int	news68k_bus_space_probe(bus_space_tag_t t,
1572cac3aaeStsutsui 	    bus_space_handle_t bsh, bus_size_t offset, int sz);
1583f123214Stsutsui 
1593f123214Stsutsui /*
1603725e983Stsutsui  *	uintN_t bus_space_read_N(bus_space_tag_t tag,
1612cac3aaeStsutsui  *	    bus_space_handle_t bsh, bus_size_t offset);
1623f123214Stsutsui  *
1633f123214Stsutsui  * Read a 1, 2, 4, or 8 byte quantity from bus space
1643f123214Stsutsui  * described by tag/handle/offset.
1653f123214Stsutsui  */
1663f123214Stsutsui 
1673f123214Stsutsui #define	bus_space_read_1(t, h, o)					\
1683725e983Stsutsui     ((void) t, (*(volatile uint8_t *)((h) + (o))))
1693f123214Stsutsui 
1703f123214Stsutsui #define	bus_space_read_2(t, h, o)					\
1713725e983Stsutsui     ((void) t, (*(volatile uint16_t *)((h) + (o))))
1723f123214Stsutsui 
1733f123214Stsutsui #define	bus_space_read_4(t, h, o)					\
1743725e983Stsutsui     ((void) t, (*(volatile uint32_t *)((h) + (o))))
1753f123214Stsutsui 
1763f123214Stsutsui /*
1772cac3aaeStsutsui  *	void bus_space_read_multi_N(bus_space_tag_t tag,
1783f123214Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset,
1793725e983Stsutsui  *	    uintN_t *addr, size_t count);
1803f123214Stsutsui  *
1813f123214Stsutsui  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
1823f123214Stsutsui  * described by tag/handle/offset and copy into buffer provided.
1833f123214Stsutsui  */
1843f123214Stsutsui 
1853f123214Stsutsui #define	bus_space_read_multi_1(t, h, o, a, c) do {			\
1863f123214Stsutsui 	(void) t;							\
1875f1c88d7Sperry 	__asm volatile ("						\
1883f123214Stsutsui 		movl	%0,%%a0					;	\
1893f123214Stsutsui 		movl	%1,%%a1					;	\
1903f123214Stsutsui 		movl	%2,%%d0					;	\
1913f123214Stsutsui 	1:	movb	%%a0@,%%a1@+				;	\
1923f123214Stsutsui 		subql	#1,%%d0					;	\
1933f123214Stsutsui 		jne	1b"					:	\
1943f123214Stsutsui 								:	\
1953f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
196*fbe896c5Stsutsui 		    "a0","a1","d0","memory");				\
1973f123214Stsutsui } while (0)
1983f123214Stsutsui 
1993f123214Stsutsui #define	bus_space_read_multi_2(t, h, o, a, c) do {			\
2003f123214Stsutsui 	(void) t;							\
2015f1c88d7Sperry 	__asm volatile ("						\
2023f123214Stsutsui 		movl	%0,%%a0					;	\
2033f123214Stsutsui 		movl	%1,%%a1					;	\
2043f123214Stsutsui 		movl	%2,%%d0					;	\
2053f123214Stsutsui 	1:	movw	%%a0@,%%a1@+				;	\
2063f123214Stsutsui 		subql	#1,%%d0					;	\
2073f123214Stsutsui 		jne	1b"					:	\
2083f123214Stsutsui 								:	\
2093f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
210*fbe896c5Stsutsui 		    "a0","a1","d0","memory");				\
2113f123214Stsutsui } while (0)
2123f123214Stsutsui 
2133f123214Stsutsui #define	bus_space_read_multi_4(t, h, o, a, c) do {			\
2143f123214Stsutsui 	(void) t;							\
2155f1c88d7Sperry 	__asm volatile ("						\
2163f123214Stsutsui 		movl	%0,%%a0					;	\
2173f123214Stsutsui 		movl	%1,%%a1					;	\
2183f123214Stsutsui 		movl	%2,%%d0					;	\
2193f123214Stsutsui 	1:	movl	%%a0@,%%a1@+				;	\
2203f123214Stsutsui 		subql	#1,%%d0					;	\
2213f123214Stsutsui 		jne	1b"					:	\
2223f123214Stsutsui 								:	\
2233f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
224*fbe896c5Stsutsui 		    "a0","a1","d0","memory");				\
2253f123214Stsutsui } while (0)
2263f123214Stsutsui 
2273f123214Stsutsui /*
2282cac3aaeStsutsui  *	void bus_space_read_region_N(bus_space_tag_t tag,
2293f123214Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset,
2303725e983Stsutsui  *	    uintN_t *addr, size_t count);
2313f123214Stsutsui  *
2323f123214Stsutsui  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
2333f123214Stsutsui  * described by tag/handle and starting at `offset' and copy into
2343f123214Stsutsui  * buffer provided.
2353f123214Stsutsui  */
2363f123214Stsutsui 
2373f123214Stsutsui #define	bus_space_read_region_1(t, h, o, a, c) do {			\
2383f123214Stsutsui 	(void) t;							\
2395f1c88d7Sperry 	__asm volatile ("						\
2403f123214Stsutsui 		movl	%0,%%a0					;	\
2413f123214Stsutsui 		movl	%1,%%a1					;	\
2423f123214Stsutsui 		movl	%2,%%d0					;	\
2433f123214Stsutsui 	1:	movb	%%a0@+,%%a1@+				;	\
2443f123214Stsutsui 		subql	#1,%%d0					;	\
2453f123214Stsutsui 		jne	1b"					:	\
2463f123214Stsutsui 								:	\
2473f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
248*fbe896c5Stsutsui 		    "a0","a1","d0","memory");				\
2493f123214Stsutsui } while (0)
2503f123214Stsutsui 
2513f123214Stsutsui #define	bus_space_read_region_2(t, h, o, a, c) do {			\
2523f123214Stsutsui 	(void) t;							\
2535f1c88d7Sperry 	__asm volatile ("						\
2543f123214Stsutsui 		movl	%0,%%a0					;	\
2553f123214Stsutsui 		movl	%1,%%a1					;	\
2563f123214Stsutsui 		movl	%2,%%d0					;	\
2573f123214Stsutsui 	1:	movw	%%a0@+,%%a1@+				;	\
2583f123214Stsutsui 		subql	#1,%%d0					;	\
2593f123214Stsutsui 		jne	1b"					:	\
2603f123214Stsutsui 								:	\
2613f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
262*fbe896c5Stsutsui 		    "a0","a1","d0","memory");				\
2633f123214Stsutsui } while (0)
2643f123214Stsutsui 
2653f123214Stsutsui #define	bus_space_read_region_4(t, h, o, a, c) do {			\
2663f123214Stsutsui 	(void) t;							\
2675f1c88d7Sperry 	__asm volatile ("						\
2683f123214Stsutsui 		movl	%0,%%a0					;	\
2693f123214Stsutsui 		movl	%1,%%a1					;	\
2703f123214Stsutsui 		movl	%2,%%d0					;	\
2713f123214Stsutsui 	1:	movl	%%a0@+,%%a1@+				;	\
2723f123214Stsutsui 		subql	#1,%%d0					;	\
2733f123214Stsutsui 		jne	1b"					:	\
2743f123214Stsutsui 								:	\
2753f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
276*fbe896c5Stsutsui 		    "a0","a1","d0","memory");				\
2773f123214Stsutsui } while (0)
2783f123214Stsutsui 
2793f123214Stsutsui /*
2802cac3aaeStsutsui  *	void bus_space_write_N(bus_space_tag_t tag,
2813f123214Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset,
2823725e983Stsutsui  *	    uintN_t value);
2833f123214Stsutsui  *
2843f123214Stsutsui  * Write the 1, 2, 4, or 8 byte value `value' to bus space
2853f123214Stsutsui  * described by tag/handle/offset.
2863f123214Stsutsui  */
2873f123214Stsutsui 
2883f123214Stsutsui #define	bus_space_write_1(t, h, o, v)					\
2893725e983Stsutsui     ((void) t, ((void)(*(volatile uint8_t *)((h) + (o)) = (v))))
2903f123214Stsutsui 
2913f123214Stsutsui #define	bus_space_write_2(t, h, o, v)					\
2923725e983Stsutsui     ((void) t, ((void)(*(volatile uint16_t *)((h) + (o)) = (v))))
2933f123214Stsutsui 
2943f123214Stsutsui #define	bus_space_write_4(t, h, o, v)					\
2953725e983Stsutsui     ((void) t, ((void)(*(volatile uint32_t *)((h) + (o)) = (v))))
2963f123214Stsutsui 
2973f123214Stsutsui /*
2982cac3aaeStsutsui  *	void bus_space_write_multi_N(bus_space_tag_t tag,
2993f123214Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset,
3003725e983Stsutsui  *	    const uintN_t *addr, size_t count);
3013f123214Stsutsui  *
3023f123214Stsutsui  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
3033f123214Stsutsui  * provided to bus space described by tag/handle/offset.
3043f123214Stsutsui  */
3053f123214Stsutsui 
3063f123214Stsutsui #define	bus_space_write_multi_1(t, h, o, a, c) do {			\
3073f123214Stsutsui 	(void) t;							\
3085f1c88d7Sperry 	__asm volatile ("						\
3093f123214Stsutsui 		movl	%0,%%a0					;	\
3103f123214Stsutsui 		movl	%1,%%a1					;	\
3113f123214Stsutsui 		movl	%2,%%d0					;	\
3123f123214Stsutsui 	1:	movb	%%a1@+,%%a0@				;	\
3133f123214Stsutsui 		subql	#1,%%d0					;	\
3143f123214Stsutsui 		jne	1b"					:	\
3153f123214Stsutsui 								:	\
3163f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
317*fbe896c5Stsutsui 		    "a0","a1","d0");					\
3183f123214Stsutsui } while (0)
3193f123214Stsutsui 
3203f123214Stsutsui #define	bus_space_write_multi_2(t, h, o, a, c) do {			\
3213f123214Stsutsui 	(void) t;							\
3225f1c88d7Sperry 	__asm volatile ("						\
3233f123214Stsutsui 		movl	%0,%%a0					;	\
3243f123214Stsutsui 		movl	%1,%%a1					;	\
3253f123214Stsutsui 		movl	%2,%%d0					;	\
3263f123214Stsutsui 	1:	movw	%%a1@+,%%a0@				;	\
3273f123214Stsutsui 		subql	#1,%%d0					;	\
3283f123214Stsutsui 		jne	1b"					:	\
3293f123214Stsutsui 								:	\
3303f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
331*fbe896c5Stsutsui 		    "a0","a1","d0");					\
3323f123214Stsutsui } while (0)
3333f123214Stsutsui 
3343f123214Stsutsui #define	bus_space_write_multi_4(t, h, o, a, c) do {			\
3353f123214Stsutsui 	(void) t;							\
3365f1c88d7Sperry 	__asm volatile ("						\
3373f123214Stsutsui 		movl	%0,%%a0					;	\
3383f123214Stsutsui 		movl	%1,%%a1					;	\
3393f123214Stsutsui 		movl	%2,%%d0					;	\
3403f123214Stsutsui 	1:	movl	%%a1@+,%%a0@				;	\
3413f123214Stsutsui 		subql	#1,%%d0					;	\
3423f123214Stsutsui 		jne	1b"					:	\
3433f123214Stsutsui 								:	\
3443f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
345*fbe896c5Stsutsui 		    "a0","a1","d0");					\
3463f123214Stsutsui } while (0)
3473f123214Stsutsui 
3483f123214Stsutsui /*
3492cac3aaeStsutsui  *	void bus_space_write_region_N(bus_space_tag_t tag,
3503f123214Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset,
3513725e983Stsutsui  *	    const uintN_t *addr, size_t count);
3523f123214Stsutsui  *
3533f123214Stsutsui  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided
3543f123214Stsutsui  * to bus space described by tag/handle starting at `offset'.
3553f123214Stsutsui  */
3563f123214Stsutsui 
3573f123214Stsutsui #define	bus_space_write_region_1(t, h, o, a, c) do {			\
3583f123214Stsutsui 	(void) t;							\
3595f1c88d7Sperry 	__asm volatile ("						\
3603f123214Stsutsui 		movl	%0,%%a0					;	\
3613f123214Stsutsui 		movl	%1,%%a1					;	\
3623f123214Stsutsui 		movl	%2,%%d0					;	\
3633f123214Stsutsui 	1:	movb	%%a1@+,%%a0@+				;	\
3643f123214Stsutsui 		subql	#1,%%d0					;	\
3653f123214Stsutsui 		jne	1b"					:	\
3663f123214Stsutsui 								:	\
3673f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
368*fbe896c5Stsutsui 		    "a0","a1","d0");					\
3693f123214Stsutsui } while (0)
3703f123214Stsutsui 
3713f123214Stsutsui #define	bus_space_write_region_2(t, h, o, a, c) do {			\
3723f123214Stsutsui 	(void) t;							\
3735f1c88d7Sperry 	__asm volatile ("						\
3743f123214Stsutsui 		movl	%0,%%a0					;	\
3753f123214Stsutsui 		movl	%1,%%a1					;	\
3763f123214Stsutsui 		movl	%2,%%d0					;	\
3773f123214Stsutsui 	1:	movw	%%a1@+,%%a0@+				;	\
3783f123214Stsutsui 		subql	#1,%%d0					;	\
3793f123214Stsutsui 		jne	1b"					:	\
3803f123214Stsutsui 								:	\
3813f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
382*fbe896c5Stsutsui 		    "a0","a1","d0");					\
3833f123214Stsutsui } while (0)
3843f123214Stsutsui 
3853f123214Stsutsui #define	bus_space_write_region_4(t, h, o, a, c) do {			\
3863f123214Stsutsui 	(void) t;							\
3875f1c88d7Sperry 	__asm volatile ("						\
3883f123214Stsutsui 		movl	%0,%%a0					;	\
3893f123214Stsutsui 		movl	%1,%%a1					;	\
3903f123214Stsutsui 		movl	%2,%%d0					;	\
3913f123214Stsutsui 	1:	movl	%%a1@+,%%a0@+				;	\
3923f123214Stsutsui 		subql	#1,%%d0					;	\
3933f123214Stsutsui 		jne	1b"					:	\
3943f123214Stsutsui 								:	\
3953f123214Stsutsui 		    "r" ((h) + (o)), "g" (a), "g" (c)		:	\
396*fbe896c5Stsutsui 		    "a0","a1","d0");					\
3973f123214Stsutsui } while (0)
3983f123214Stsutsui 
3993f123214Stsutsui /*
4002cac3aaeStsutsui  *	void bus_space_set_multi_N(bus_space_tag_t tag,
4013725e983Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
4022cac3aaeStsutsui  *	    size_t count);
4033f123214Stsutsui  *
4043f123214Stsutsui  * Write the 1, 2, 4, or 8 byte value `val' to bus space described
4053f123214Stsutsui  * by tag/handle/offset `count' times.
4063f123214Stsutsui  */
4073f123214Stsutsui 
4083f123214Stsutsui #define	bus_space_set_multi_1(t, h, o, val, c) do {			\
4093f123214Stsutsui 	(void) t;							\
4105f1c88d7Sperry 	__asm volatile ("						\
4113f123214Stsutsui 		movl	%0,%%a0					;	\
4123f123214Stsutsui 		movl	%1,%%d1					;	\
4133f123214Stsutsui 		movl	%2,%%d0					;	\
4143f123214Stsutsui 	1:	movb	%%d1,%%a0@				;	\
4153f123214Stsutsui 		subql	#1,%%d0					;	\
4163f123214Stsutsui 		jne	1b"					:	\
4173f123214Stsutsui 								:	\
4183f123214Stsutsui 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
419*fbe896c5Stsutsui 		    "a0","d0","d1");					\
4203f123214Stsutsui } while (0)
4213f123214Stsutsui 
4223f123214Stsutsui #define	bus_space_set_multi_2(t, h, o, val, c) do {			\
4233f123214Stsutsui 	(void) t;							\
4245f1c88d7Sperry 	__asm volatile ("						\
4253f123214Stsutsui 		movl	%0,%%a0					;	\
4263f123214Stsutsui 		movl	%1,%%d1					;	\
4273f123214Stsutsui 		movl	%2,%%d0					;	\
4283f123214Stsutsui 	1:	movw	%%d1,%%a0@				;	\
4293f123214Stsutsui 		subql	#1,%%d0					;	\
4303f123214Stsutsui 		jne	1b"					:	\
4313f123214Stsutsui 								:	\
4323f123214Stsutsui 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
433*fbe896c5Stsutsui 		    "a0","d0","d1");					\
4343f123214Stsutsui } while (0)
4353f123214Stsutsui 
4363f123214Stsutsui #define	bus_space_set_multi_4(t, h, o, val, c) do {			\
4373f123214Stsutsui 	(void) t;							\
4385f1c88d7Sperry 	__asm volatile ("						\
4393f123214Stsutsui 		movl	%0,%%a0					;	\
4403f123214Stsutsui 		movl	%1,%%d1					;	\
4413f123214Stsutsui 		movl	%2,%%d0					;	\
4423f123214Stsutsui 	1:	movl	%%d1,%%a0@				;	\
4433f123214Stsutsui 		subql	#1,%%d0					;	\
4443f123214Stsutsui 		jne	1b"					:	\
4453f123214Stsutsui 								:	\
4463f123214Stsutsui 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
447*fbe896c5Stsutsui 		    "a0","d0","d1");					\
4483f123214Stsutsui } while (0)
4493f123214Stsutsui 
4503f123214Stsutsui /*
4512cac3aaeStsutsui  *	void bus_space_set_region_N(bus_space_tag_t tag,
4523725e983Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
4532cac3aaeStsutsui  *	    size_t count);
4543f123214Stsutsui  *
4553f123214Stsutsui  * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
4563f123214Stsutsui  * by tag/handle starting at `offset'.
4573f123214Stsutsui  */
4583f123214Stsutsui 
4593f123214Stsutsui #define	bus_space_set_region_1(t, h, o, val, c) do {			\
4603f123214Stsutsui 	(void) t;							\
4615f1c88d7Sperry 	__asm volatile ("						\
4623f123214Stsutsui 		movl	%0,%%a0					;	\
4633f123214Stsutsui 		movl	%1,%%d1					;	\
4643f123214Stsutsui 		movl	%2,%%d0					;	\
4653f123214Stsutsui 	1:	movb	%%d1,%%a0@+				;	\
4663f123214Stsutsui 		subql	#1,%%d0					;	\
4673f123214Stsutsui 		jne	1b"					:	\
4683f123214Stsutsui 								:	\
4693f123214Stsutsui 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
470*fbe896c5Stsutsui 		    "a0","d0","d1");					\
4713f123214Stsutsui } while (0)
4723f123214Stsutsui 
4733f123214Stsutsui #define	bus_space_set_region_2(t, h, o, val, c) do {			\
4743f123214Stsutsui 	(void) t;							\
4755f1c88d7Sperry 	__asm volatile ("						\
4763f123214Stsutsui 		movl	%0,%%a0					;	\
4773f123214Stsutsui 		movl	%1,%%d1					;	\
4783f123214Stsutsui 		movl	%2,%%d0					;	\
4793f123214Stsutsui 	1:	movw	%%d1,%%a0@+				;	\
4803f123214Stsutsui 		subql	#1,%%d0					;	\
4813f123214Stsutsui 		jne	1b"					:	\
4823f123214Stsutsui 								:	\
4833f123214Stsutsui 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
484*fbe896c5Stsutsui 		    "a0","d0","d1");					\
4853f123214Stsutsui } while (0)
4863f123214Stsutsui 
4873f123214Stsutsui #define	bus_space_set_region_4(t, h, o, val, c) do {			\
4883f123214Stsutsui 	(void) t;							\
4895f1c88d7Sperry 	__asm volatile ("						\
4903f123214Stsutsui 		movl	%0,%%a0					;	\
4913f123214Stsutsui 		movl	%1,%%d1					;	\
4923f123214Stsutsui 		movl	%2,%%d0					;	\
4933f123214Stsutsui 	1:	movl	%%d1,%%a0@+				;	\
4943f123214Stsutsui 		subql	#1,%%d0					;	\
4953f123214Stsutsui 		jne	1b"					:	\
4963f123214Stsutsui 								:	\
4973f123214Stsutsui 		    "r" ((h) + (o)), "g" (val), "g" (c)		:	\
498*fbe896c5Stsutsui 		    "a0","d0","d1");					\
4993f123214Stsutsui } while (0)
5003f123214Stsutsui 
5013f123214Stsutsui /*
5022cac3aaeStsutsui  *	void bus_space_copy_region_N(bus_space_tag_t tag,
5033f123214Stsutsui  *	    bus_space_handle_t bsh1, bus_size_t off1,
5043f123214Stsutsui  *	    bus_space_handle_t bsh2, bus_size_t off2,
5052cac3aaeStsutsui  *	    bus_size_t count);
5063f123214Stsutsui  *
5073f123214Stsutsui  * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
5083f123214Stsutsui  * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
5093f123214Stsutsui  */
5103f123214Stsutsui 
5113f123214Stsutsui #define	__NEWS68K_copy_region_N(BYTES)					\
512fbae48b9Sperry static __inline void __CONCAT(bus_space_copy_region_,BYTES)		\
5132cac3aaeStsutsui 	(bus_space_tag_t,						\
5143f123214Stsutsui 	 bus_space_handle_t bsh1, bus_size_t off1,			\
5153f123214Stsutsui 	 bus_space_handle_t bsh2, bus_size_t off2,			\
5162cac3aaeStsutsui 	 bus_size_t count);						\
5173f123214Stsutsui 									\
518fbae48b9Sperry static __inline void							\
51952b46dcfStsutsui __CONCAT(bus_space_copy_region_,BYTES)(bus_space_tag_t t,		\
52052b46dcfStsutsui     bus_space_handle_t h1, bus_space_handle_t h2,			\
52152b46dcfStsutsui     bus_size_t o1, bus_size_t o2, bus_size_t c)				\
5223f123214Stsutsui {									\
5233f123214Stsutsui 	bus_size_t o;							\
5243f123214Stsutsui 									\
5253f123214Stsutsui 	if ((h1 + o1) >= (h2 + o2)) {					\
5263f123214Stsutsui 		/* src after dest: copy forward */			\
5273f123214Stsutsui 		for (o = 0; c != 0; c--, o += BYTES)			\
5283f123214Stsutsui 			__CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o,	\
5293f123214Stsutsui 			    __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \
5303f123214Stsutsui 	} else {							\
5313f123214Stsutsui 		/* dest after src: copy backwards */			\
5323f123214Stsutsui 		for (o = (c - 1) * BYTES; c != 0; c--, o -= BYTES)	\
5333f123214Stsutsui 			__CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o,	\
5343f123214Stsutsui 			    __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \
5353f123214Stsutsui 	}								\
5363f123214Stsutsui }
5373f123214Stsutsui __NEWS68K_copy_region_N(1)
5383f123214Stsutsui __NEWS68K_copy_region_N(2)
5393f123214Stsutsui __NEWS68K_copy_region_N(4)
5403f123214Stsutsui 
5413f123214Stsutsui #undef __NEWS68K_copy_region_N
5423f123214Stsutsui 
5433f123214Stsutsui /*
5443f123214Stsutsui  * Bus read/write barrier methods.
5453f123214Stsutsui  *
5462cac3aaeStsutsui  *	void bus_space_barrier(bus_space_tag_t tag,
5473f123214Stsutsui  *	    bus_space_handle_t bsh, bus_size_t offset,
5482cac3aaeStsutsui  *	    bus_size_t len, int flags);
5493f123214Stsutsui  *
5503f123214Stsutsui  * Note: the 680x0 does not currently require barriers, but we must
5513f123214Stsutsui  * provide the flags to MI code.
5523f123214Stsutsui  */
5533f123214Stsutsui #define	bus_space_barrier(t, h, o, l, f)	\
5543f123214Stsutsui 	((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f)))
5553f123214Stsutsui #define	BUS_SPACE_BARRIER_READ	0x01		/* force read barrier */
5563f123214Stsutsui #define	BUS_SPACE_BARRIER_WRITE	0x02		/* force write barrier */
5573f123214Stsutsui 
5583f123214Stsutsui #define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
5593f123214Stsutsui 
560485e133aStsutsui /*
561485e133aStsutsui  * There is no bus_dma(9)'fied bus drivers on this port.
562485e133aStsutsui  */
563485e133aStsutsui #define __HAVE_NO_BUS_DMA
564485e133aStsutsui 
5653f123214Stsutsui #endif /* _NEWS68K_BUS_H_ */
566