1/*	$NetBSD: bus.h,v 1.30 2021/01/23 19:38:08 christos 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 *
20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32
33/*
34 * Copyright (C) 1997 Scott Reynolds.  All rights reserved.
35 *
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
38 * are met:
39 * 1. Redistributions of source code must retain the above copyright
40 *    notice, this list of conditions and the following disclaimer.
41 * 2. Redistributions in binary form must reproduce the above copyright
42 *    notice, this list of conditions and the following disclaimer in the
43 *    documentation and/or other materials provided with the distribution.
44 * 3. The name of the author may not be used to endorse or promote products
45 *    derived from this software without specific prior written permission
46 *
47 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
48 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
49 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
50 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
51 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
52 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
53 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
54 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
55 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
56 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
57 */
58
59#ifndef _MAC68K_BUS_H_
60#define _MAC68K_BUS_H_
61
62/*
63 * Value for the mac68k bus space tag, not to be used directly by MI code.
64 */
65#define MAC68K_BUS_SPACE_MEM	0	/* space is mem space */
66
67#define __BUS_SPACE_HAS_STREAM_METHODS 1
68
69/*
70 * Bus address and size types
71 */
72typedef u_long bus_addr_t;
73typedef u_long bus_size_t;
74
75#define PRIxBUSADDR	"lx"
76#define PRIxBUSSIZE	"lx"
77#define PRIuBUSSIZE	"lu"
78/*
79 * Access methods for bus resources and address space.
80 */
81#define BSH_T	struct bus_space_handle_s
82typedef int	bus_space_tag_t;
83typedef struct bus_space_handle_s {
84	u_long	base;
85	int	swapped;
86	int	stride;
87
88	u_int8_t	(*bsr1)(bus_space_tag_t, BSH_T *, bus_size_t);
89	u_int16_t	(*bsr2)(bus_space_tag_t, BSH_T *, bus_size_t);
90	u_int32_t	(*bsr4)(bus_space_tag_t, BSH_T *, bus_size_t);
91	u_int8_t	(*bsrs1)(bus_space_tag_t, BSH_T *, bus_size_t);
92	u_int16_t	(*bsrs2)(bus_space_tag_t, BSH_T *, bus_size_t);
93	u_int32_t	(*bsrs4)(bus_space_tag_t, BSH_T *, bus_size_t);
94	void		(*bsrm1)(bus_space_tag_t, BSH_T *, bus_size_t,
95				 u_int8_t *, size_t);
96	void		(*bsrm2)(bus_space_tag_t, BSH_T *, bus_size_t,
97				 u_int16_t *, size_t);
98	void		(*bsrm4)(bus_space_tag_t, BSH_T *, bus_size_t,
99				 u_int32_t *, size_t);
100	void		(*bsrms1)(bus_space_tag_t, BSH_T *, bus_size_t,
101				  u_int8_t *, size_t);
102	void		(*bsrms2)(bus_space_tag_t, BSH_T *, bus_size_t,
103				  u_int16_t *, size_t);
104	void		(*bsrms4)(bus_space_tag_t, BSH_T *, bus_size_t,
105				  u_int32_t *, size_t);
106	void		(*bsrr1)(bus_space_tag_t, BSH_T *, bus_size_t,
107				 u_int8_t *, size_t);
108	void		(*bsrr2)(bus_space_tag_t, BSH_T *, bus_size_t,
109				 u_int16_t *, size_t);
110	void		(*bsrr4)(bus_space_tag_t, BSH_T *, bus_size_t,
111				 u_int32_t *, size_t);
112	void		(*bsrrs1)(bus_space_tag_t, BSH_T *, bus_size_t,
113				  u_int8_t *, size_t);
114	void		(*bsrrs2)(bus_space_tag_t, BSH_T *, bus_size_t,
115				  u_int16_t *, size_t);
116	void		(*bsrrs4)(bus_space_tag_t, BSH_T *, bus_size_t,
117				  u_int32_t *, size_t);
118	void		(*bsw1)(bus_space_tag_t, BSH_T *, bus_size_t, u_int8_t);
119	void		(*bsw2)(bus_space_tag_t, BSH_T *, bus_size_t,
120				u_int16_t);
121	void		(*bsw4)(bus_space_tag_t, BSH_T *, bus_size_t,
122				u_int32_t);
123	void		(*bsws1)(bus_space_tag_t, BSH_T *, bus_size_t,
124				 u_int8_t);
125	void		(*bsws2)(bus_space_tag_t, BSH_T *, bus_size_t,
126				 u_int16_t);
127	void		(*bsws4)(bus_space_tag_t, BSH_T *, bus_size_t,
128				 u_int32_t);
129	void		(*bswm1)(bus_space_tag_t, BSH_T *, bus_size_t,
130				 const u_int8_t *, size_t);
131	void		(*bswm2)(bus_space_tag_t, BSH_T *, bus_size_t,
132				 const u_int16_t *, size_t);
133	void		(*bswm4)(bus_space_tag_t, BSH_T *, bus_size_t,
134				 const u_int32_t *, size_t);
135	void		(*bswms1)(bus_space_tag_t, BSH_T *, bus_size_t,
136				  const u_int8_t *, size_t);
137	void		(*bswms2)(bus_space_tag_t, BSH_T *, bus_size_t,
138				  const u_int16_t *, size_t);
139	void		(*bswms4)(bus_space_tag_t, BSH_T *, bus_size_t,
140				  const u_int32_t *, size_t);
141	void		(*bswr1)(bus_space_tag_t, BSH_T *, bus_size_t,
142				 const u_int8_t *, size_t);
143	void		(*bswr2)(bus_space_tag_t, BSH_T *, bus_size_t,
144				 const u_int16_t *, size_t);
145	void		(*bswr4)(bus_space_tag_t, BSH_T *, bus_size_t,
146				 const u_int32_t *, size_t);
147	void		(*bswrs1)(bus_space_tag_t, BSH_T *, bus_size_t,
148				  const u_int8_t *, size_t);
149	void		(*bswrs2)(bus_space_tag_t, BSH_T *, bus_size_t,
150				  const u_int16_t *, size_t);
151	void		(*bswrs4)(bus_space_tag_t, BSH_T *, bus_size_t,
152				  const u_int32_t *, size_t);
153	void		(*bssm1)(bus_space_tag_t, BSH_T *, bus_size_t,
154				 u_int8_t v, size_t);
155	void		(*bssm2)(bus_space_tag_t, BSH_T *, bus_size_t,
156				 u_int16_t v, size_t);
157	void		(*bssm4)(bus_space_tag_t, BSH_T *, bus_size_t,
158				 u_int32_t v, size_t);
159	void		(*bssr1)(bus_space_tag_t, BSH_T *, bus_size_t,
160				 u_int8_t v, size_t);
161	void		(*bssr2)(bus_space_tag_t, BSH_T *, bus_size_t,
162				 u_int16_t v, size_t);
163	void		(*bssr4)(bus_space_tag_t, BSH_T *, bus_size_t,
164				 u_int32_t v, size_t);
165} bus_space_handle_t;
166#undef BSH_T
167
168void	mac68k_bus_space_handle_swapped(bus_space_tag_t,
169		bus_space_handle_t *);
170void	mac68k_bus_space_handle_set_stride(bus_space_tag_t,
171		bus_space_handle_t *, int);
172
173/*
174 *	int bus_space_map(bus_space_tag_t t, bus_addr_t addr,
175 *	    bus_size_t size, int flags, bus_space_handle_t *bshp);
176 *
177 * Map a region of bus space.
178 */
179
180#define	BUS_SPACE_MAP_CACHEABLE		0x01
181#define	BUS_SPACE_MAP_LINEAR		0x02
182#define	BUS_SPACE_MAP_PREFETCHABLE	0x04
183
184int	bus_space_map(bus_space_tag_t, bus_addr_t, bus_size_t,
185	    int, bus_space_handle_t *);
186
187/*
188 *	void bus_space_unmap(bus_space_tag_t t, bus_space_handle_t bsh,
189 *	    bus_size_t size);
190 *
191 * Unmap a region of bus space.
192 */
193
194void	bus_space_unmap(bus_space_tag_t, bus_space_handle_t, bus_size_t);
195
196/*
197 *	int bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh,
198 *	    bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp);
199 *
200 * Get a new handle for a subregion of an already-mapped area of bus space.
201 */
202
203int	bus_space_subregion(bus_space_tag_t, bus_space_handle_t,
204	    bus_size_t, bus_size_t size, bus_space_handle_t *);
205
206/*
207 *	int bus_space_alloc(bus_space_tag_t t, bus_addr_t, rstart,
208 *	    bus_addr_t rend, bus_size_t size, bus_size_t align,
209 *	    bus_size_t boundary, int flags, bus_addr_t *addrp,
210 *	    bus_space_handle_t *bshp);
211 *
212 * Allocate a region of bus space.
213 */
214
215int	bus_space_alloc(bus_space_tag_t, bus_addr_t rstart,
216	    bus_addr_t rend, bus_size_t size, bus_size_t align,
217	    bus_size_t boundary, int cacheable, bus_addr_t *addrp,
218	    bus_space_handle_t *bshp);
219
220/*
221 *	int bus_space_free(bus_space_tag_t t, bus_space_handle_t bsh,
222 *	    bus_size_t size);
223 *
224 * Free a region of bus space.
225 */
226
227void	bus_space_free(bus_space_tag_t, bus_space_handle_t bsh,
228	    bus_size_t size);
229
230/*
231 *	int mac68k_bus_space_probe(bus_space_tag_t t, bus_space_handle_t bsh,
232 *	    bus_size_t offset, int sz);
233 *
234 * Probe the bus at t/bsh/offset, using sz as the size of the load.
235 *
236 * This is a machine-dependent extension, and is not to be used by
237 * machine-independent code.
238 */
239
240int	mac68k_bus_space_probe(bus_space_tag_t,
241	    bus_space_handle_t bsh, bus_size_t, int sz);
242
243/*
244 *	u_intN_t bus_space_read_N(bus_space_tag_t tag,
245 *	    bus_space_handle_t bsh, bus_size_t offset);
246 *
247 * Read a 1, 2, 4, or 8 byte quantity from bus space
248 * described by tag/handle/offset.
249 */
250
251u_int8_t mac68k_bsr1(bus_space_tag_t, bus_space_handle_t *, bus_size_t);
252u_int8_t mac68k_bsr1_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t);
253u_int16_t mac68k_bsr2(bus_space_tag_t, bus_space_handle_t *, bus_size_t);
254u_int16_t mac68k_bsr2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t);
255u_int16_t mac68k_bsr2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t);
256u_int16_t mac68k_bsrs2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t);
257u_int32_t mac68k_bsr4(bus_space_tag_t, bus_space_handle_t *, bus_size_t);
258u_int32_t mac68k_bsr4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t);
259u_int32_t mac68k_bsr4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t);
260u_int32_t mac68k_bsrs4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t);
261
262#define	bus_space_read_1(t,h,o)	(h).bsr1((t), &(h), (o))
263#define	bus_space_read_2(t,h,o)	(h).bsr2((t), &(h), (o))
264#define	bus_space_read_4(t,h,o)	(h).bsr4((t), &(h), (o))
265#define	bus_space_read_stream_1(t,h,o)	(h).bsrs1((t), &(h), (o))
266#define	bus_space_read_stream_2(t,h,o)	(h).bsrs2((t), &(h), (o))
267#define	bus_space_read_stream_4(t,h,o)	(h).bsrs4((t), &(h), (o))
268
269/*
270 *	void bus_space_read_multi_N(bus_space_tag_t tag,
271 *	    bus_space_handle_t bsh, bus_size_t offset, u_intN_t *addr,
272 *	    size_t count);
273 *
274 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
275 * described by tag/handle/offset and copy into buffer provided.
276 */
277
278void mac68k_bsrm1(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
279	u_int8_t *, size_t);
280void mac68k_bsrm1_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
281	u_int8_t *, size_t);
282void mac68k_bsrm2(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
283	u_int16_t *, size_t);
284void mac68k_bsrm2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
285	u_int16_t *, size_t);
286void mac68k_bsrm2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
287	u_int16_t *, size_t);
288void mac68k_bsrms2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
289	u_int16_t *, size_t);
290void mac68k_bsrm4(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
291	u_int32_t *, size_t);
292void mac68k_bsrms4(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
293	u_int32_t *, size_t);
294void mac68k_bsrm4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
295	u_int32_t *, size_t);
296void mac68k_bsrm4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
297	u_int32_t *, size_t);
298void mac68k_bsrms4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
299	u_int32_t *, size_t);
300
301#if defined(DIAGNOSTIC)
302#define	bus_space_read_multi_1(t, h, o, a, c) do {			 \
303	if ((c) == 0)							 \
304		panic("bus_space_read_multi_1 called with zero count."); \
305	(h).bsrm1(t,&(h),o,a,c); } while (0)
306#define	bus_space_read_multi_2(t, h, o, a, c) do {			 \
307	if ((c) == 0)							 \
308		panic("bus_space_read_multi_2 called with zero count."); \
309	(h).bsrm2(t,&(h),o,a,c); } while (0)
310#define	bus_space_read_multi_4(t, h, o, a, c) do {			 \
311	if ((c) == 0)							 \
312		panic("bus_space_read_multi_4 called with zero count."); \
313	(h).bsrm4(t,&(h),o,a,c); } while (0)
314#define	bus_space_read_multi_stream_1(t, h, o, a, c) do {		 \
315	if ((c) == 0)							 \
316		panic("bus_space_read_multi_stream_1 called with count=0."); \
317	(h).bsrms1(t,&(h),o,a,c); } while (0)
318#define	bus_space_read_multi_stream_2(t, h, o, a, c) do {		 \
319	if ((c) == 0)							 \
320		panic("bus_space_read_multi_stream_2 called with count=0."); \
321	(h).bsrms2(t,&(h),o,a,c); } while (0)
322#define	bus_space_read_multi_stream_4(t, h, o, a, c) do {		 \
323	if ((c) == 0)							 \
324		panic("bus_space_read_multi_stream_4 called with count=0."); \
325	(h).bsrms4(t,&(h),o,a,c); } while (0)
326#else
327#define	bus_space_read_multi_1(t, h, o, a, c) \
328	do { if (c) (h).bsrm1(t, &(h), o, a, c); } while (0)
329#define	bus_space_read_multi_2(t, h, o, a, c) \
330	do { if (c) (h).bsrm2(t, &(h), o, a, c); } while (0)
331#define	bus_space_read_multi_4(t, h, o, a, c) \
332	do { if (c) (h).bsrm4(t, &(h), o, a, c); } while (0)
333#define	bus_space_read_multi_stream_1(t, h, o, a, c) \
334	do { if (c) (h).bsrms1(t, &(h), o, a, c); } while (0)
335#define	bus_space_read_multi_stream_2(t, h, o, a, c) \
336	do { if (c) (h).bsrms2(t, &(h), o, a, c); } while (0)
337#define	bus_space_read_multi_stream_4(t, h, o, a, c) \
338	do { if (c) (h).bsrms4(t, &(h), o, a, c); } while (0)
339#endif
340
341/*
342 *	void bus_space_read_region_N(bus_space_tag_t tag,
343 *	    bus_space_handle_t bsh, bus_size_t offset,
344 *	    u_intN_t *addr, size_t count);
345 *
346 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
347 * described by tag/handle and starting at `offset' and copy into
348 * buffer provided.
349 */
350
351void mac68k_bsrr1(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
352	u_int8_t *, size_t);
353void mac68k_bsrr1_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
354	u_int8_t *, size_t);
355void mac68k_bsrr2(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
356	u_int16_t *, size_t);
357void mac68k_bsrr2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
358	u_int16_t *, size_t);
359void mac68k_bsrr2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
360	u_int16_t *, size_t);
361void mac68k_bsrrs2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
362	u_int16_t *, size_t);
363void mac68k_bsrr4(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
364	u_int32_t *, size_t);
365void mac68k_bsrr4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
366	u_int32_t *, size_t);
367void mac68k_bsrr4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
368	u_int32_t *, size_t);
369void mac68k_bsrrs4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
370	u_int32_t *, size_t);
371
372#if defined(DIAGNOSTIC)
373#define	bus_space_read_region_1(t, h, o, a, c) do {			  \
374	if ((c) == 0)							  \
375		panic("bus_space_read_region_1 called with zero count."); \
376	(h).bsrr1(t,&(h),o,a,c); } while (0)
377#define	bus_space_read_region_2(t, h, o, a, c) do {			  \
378	if ((c) == 0)							  \
379		panic("bus_space_read_region_2 called with zero count."); \
380	(h).bsrr2(t,&(h),o,a,c); } while (0)
381#define	bus_space_read_region_4(t, h, o, a, c) do {			  \
382	if ((c) == 0)							  \
383		panic("bus_space_read_region_4 called with zero count."); \
384	(h).bsrr4(t,&(h),o,a,c); } while (0)
385#define	bus_space_read_region_stream_1(t, h, o, a, c) do {		  \
386	if ((c) == 0)							  \
387		panic("bus_space_read_region_stream_1 called with count=0."); \
388	(h).bsrrs1(t,&(h),o,a,c); } while (0)
389#define	bus_space_read_region_stream_2(t, h, o, a, c) do {		  \
390	if ((c) == 0)							  \
391		 panic("bus_space_read_region_stream_2 called with count=0."); \
392	(h).bsrrs2(t,&(h),o,a,c); } while (0)
393#define	bus_space_read_region_stream_4(t, h, o, a, c) do {		  \
394	if ((c) == 0)							  \
395		panic("bus_space_read_region_stream_4 called with count=0."); \
396	(h).bsrrs4(t,&(h),o,a,c); } while (0)
397#else
398#define	bus_space_read_region_1(t, h, o, a, c) \
399	do { if (c) (h).bsrr1(t,&(h),o,a,c); } while (0)
400#define	bus_space_read_region_2(t, h, o, a, c) \
401	do { if (c) (h).bsrr2(t,&(h),o,a,c); } while (0)
402#define	bus_space_read_region_4(t, h, o, a, c) \
403	do { if (c) (h).bsrr4(t,&(h),o,a,c); } while (0)
404#define	bus_space_read_region_stream_1(t, h, o, a, c) \
405	do { if (c) (h).bsrrs1(t,&(h),o,a,c); } while (0)
406#define	bus_space_read_region_stream_2(t, h, o, a, c) \
407	do { if (c) (h).bsrrs2(t,&(h),o,a,c); } while (0)
408#define	bus_space_read_region_stream_4(t, h, o, a, c) \
409	do { if (c) (h).bsrrs4(t,&(h),o,a,c); } while (0)
410#endif
411
412/*
413 *	void bus_space_write_N(bus_space_tag_t tag,
414 *	    bus_space_handle_t bsh, bus_size_t offset, u_intN_t value);
415 *
416 * Write the 1, 2, 4, or 8 byte value `value' to bus space
417 * described by tag/handle/offset.
418 */
419
420void mac68k_bsw1(bus_space_tag_t, bus_space_handle_t *, bus_size_t, u_int8_t);
421void mac68k_bsw1_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
422	u_int8_t);
423void mac68k_bsw2(bus_space_tag_t, bus_space_handle_t *, bus_size_t, u_int16_t);
424void mac68k_bsw2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
425	u_int16_t);
426void mac68k_bsw2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
427	u_int16_t);
428void mac68k_bsws2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
429	u_int16_t);
430void mac68k_bsw4(bus_space_tag_t, bus_space_handle_t *, bus_size_t, u_int32_t);
431void mac68k_bsw4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
432	u_int32_t);
433void mac68k_bsw4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
434	u_int32_t);
435void mac68k_bsws4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
436	u_int32_t);
437
438#define	bus_space_write_1(t, h, o, v) (h).bsw1(t, &(h), o, v)
439#define	bus_space_write_2(t, h, o, v) (h).bsw2(t, &(h), o, v)
440#define	bus_space_write_4(t, h, o, v) (h).bsw4(t, &(h), o, v)
441#define	bus_space_write_stream_1(t, h, o, v) (h).bsws1(t, &(h), o, v)
442#define	bus_space_write_stream_2(t, h, o, v) (h).bsws2(t, &(h), o, v)
443#define	bus_space_write_stream_4(t, h, o, v) (h).bsws4(t, &(h), o, v)
444
445/*
446 *	void bus_space_write_multi_N(bus_space_tag_t tag,
447 *	    bus_space_handle_t bsh, bus_size_t offset, const u_intN_t *addr,
448 *	    size_t count);
449 *
450 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
451 * provided to bus space described by tag/handle/offset.
452 */
453
454void mac68k_bswm1(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
455	const u_int8_t *, size_t);
456void mac68k_bswm1_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
457	const u_int8_t *, size_t);
458void mac68k_bswm2(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
459	const u_int16_t *, size_t);
460void mac68k_bswm2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
461	const u_int16_t *, size_t);
462void mac68k_bswm2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
463	const u_int16_t *, size_t);
464void mac68k_bswms2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
465	const u_int16_t *, size_t);
466void mac68k_bswm4(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
467	const u_int32_t *, size_t);
468void mac68k_bswm4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
469	const u_int32_t *, size_t);
470void mac68k_bswm4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
471	const u_int32_t *, size_t);
472void mac68k_bswms4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
473	const u_int32_t *, size_t);
474
475#if defined(DIAGNOSTIC)
476#define	bus_space_write_multi_1(t, h, o, a, c) do {			  \
477	if ((c) == 0)							  \
478		panic("bus_space_write_multi_1 called with zero count."); \
479	(h).bswm1(t,&(h),o,a,c); } while (0)
480#define	bus_space_write_multi_2(t, h, o, a, c) do {			  \
481	if ((c) == 0)							  \
482		panic("bus_space_write_multi_2 called with zero count."); \
483	(h).bswm2(t,&(h),o,a,c); } while (0)
484#define	bus_space_write_multi_4(t, h, o, a, c) do {			  \
485	if ((c) == 0)							  \
486		panic("bus_space_write_multi_4 called with zero count."); \
487	(h).bswm4(t,&(h),o,a,c); } while (0)
488#define	bus_space_write_multi_stream_1(t, h, o, a, c) do {		  \
489	if ((c) == 0)							  \
490		panic("bus_space_write_multi_stream_1 called with count=0."); \
491	(h).bswms1(t,&(h),o,a,c); } while (0)
492#define	bus_space_write_multi_stream_2(t, h, o, a, c) do {		  \
493	if ((c) == 0)							  \
494		panic("bus_space_write_multi_stream_2 called with count=0."); \
495	(h).bswms2(t,&(h),o,a,c); } while (0)
496#define	bus_space_write_multi_stream_4(t, h, o, a, c) do {		  \
497	if ((c) == 0)							  \
498		panic("bus_space_write_multi_stream_4 called with count=0."); \
499	(h).bswms4(t,&(h),o,a,c); } while (0)
500#else
501#define	bus_space_write_multi_1(t, h, o, a, c) \
502	do { if (c) (h).bswm1(t, &(h), o, a, c); } while (0)
503#define	bus_space_write_multi_2(t, h, o, a, c) \
504	do { if (c) (h).bswm2(t, &(h), o, a, c); } while (0)
505#define	bus_space_write_multi_4(t, h, o, a, c) \
506	do { if (c) (h).bswm4(t, &(h), o, a, c); } while (0)
507#define	bus_space_write_multi_stream_1(t, h, o, a, c) \
508	do { if (c) (h).bswms1(t, &(h), o, a, c); } while (0)
509#define	bus_space_write_multi_stream_2(t, h, o, a, c) \
510	do { if (c) (h).bswms2(t, &(h), o, a, c); } while (0)
511#define	bus_space_write_multi_stream_4(t, h, o, a, c) \
512	do { if (c) (h).bswms4(t, &(h), o, a, c); } while (0)
513#endif
514
515/*
516 *	void bus_space_write_region_N(bus_space_tag_t tag,
517 *	    bus_space_handle_t bsh, bus_size_t offset, const u_intN_t *addr,
518 *	    size_t count);
519 *
520 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided
521 * to bus space described by tag/handle starting at `offset'.
522 */
523
524void mac68k_bswr1(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
525	const u_int8_t *, size_t);
526void mac68k_bswr1_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
527	const u_int8_t *, size_t);
528void mac68k_bswr2(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
529	const u_int16_t *, size_t);
530void mac68k_bswr2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
531	const u_int16_t *, size_t);
532void mac68k_bswr2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
533	const u_int16_t *, size_t);
534void mac68k_bswrs2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
535	const u_int16_t *, size_t);
536void mac68k_bswr4(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
537	const u_int32_t *, size_t);
538void mac68k_bswr4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
539	const u_int32_t *, size_t);
540void mac68k_bswr4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
541	const u_int32_t *, size_t);
542void mac68k_bswrs4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
543	const u_int32_t *, size_t);
544
545#if defined(DIAGNOSTIC)
546#define	bus_space_write_region_1(t, h, o, a, c) do {			   \
547	if ((c) == 0)							   \
548		panic("bus_space_write_region_1 called with zero count."); \
549	(h).bswr1(t,&(h),o,a,c); } while (0)
550#define	bus_space_write_region_2(t, h, o, a, c) do {			   \
551	if ((c) == 0)							   \
552		panic("bus_space_write_region_2 called with zero count."); \
553	(h).bswr2(t,&(h),o,a,c); } while (0)
554#define	bus_space_write_region_4(t, h, o, a, c) do {			   \
555	if ((c) == 0)							   \
556		panic("bus_space_write_region_4 called with zero count."); \
557	(h).bswr4(t,&(h),o,a,c); } while (0)
558#define	bus_space_write_region_stream_1(t, h, o, a, c) do {		   \
559	if ((c) == 0)							   \
560		panic("bus_space_write_region_stream_1 called with count=0."); \
561	(h).bswrs1(t,&(h),o,a,c); } while (0)
562#define	bus_space_write_region_stream_2(t, h, o, a, c) do {		   \
563	if ((c) == 0)							   \
564		panic("bus_space_write_region_stream_2 called with count=0."); \
565	(h).bswrs2(t,&(h),o,a,c); } while (0)
566#define	bus_space_write_region_stream_4(t, h, o, a, c) do {		   \
567	if ((c) == 0)							   \
568		panic("bus_space_write_region_stream_4 called with count=0."); \
569	(h).bswrs4(t,&(h),o,a,c); } while (0)
570#else
571#define	bus_space_write_region_1(t, h, o, a, c) \
572	do { if (c) (h).bswr1(t,&(h),o,a,c); } while (0)
573#define	bus_space_write_region_2(t, h, o, a, c) \
574	do { if (c) (h).bswr2(t,&(h),o,a,c); } while (0)
575#define	bus_space_write_region_4(t, h, o, a, c) \
576	do { if (c) (h).bswr4(t,&(h),o,a,c); } while (0)
577#define	bus_space_write_region_stream_1(t, h, o, a, c) \
578	do { if (c) (h).bswrs1(t,&(h),o,a,c); } while (0)
579#define	bus_space_write_region_stream_2(t, h, o, a, c) \
580	do { if (c) (h).bswrs2(t,&(h),o,a,c); } while (0)
581#define	bus_space_write_region_stream_4(t, h, o, a, c) \
582	do { if (c) (h).bswrs4(t,&(h),o,a,c); } while (0)
583#endif
584
585/*
586 *	void bus_space_set_multi_N(bus_space_tag_t tag,
587 *	    bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
588 *	    size_t count);
589 *
590 * Write the 1, 2, 4, or 8 byte value `val' to bus space described
591 * by tag/handle/offset `count' times.
592 */
593
594void mac68k_bssm1(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
595	u_int8_t, size_t);
596void mac68k_bssm1_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
597	u_int8_t, size_t);
598void mac68k_bssm2(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
599	u_int16_t, size_t);
600void mac68k_bssm2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
601	u_int16_t, size_t);
602void mac68k_bssm2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
603	u_int16_t, size_t);
604void mac68k_bssm4(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
605	u_int32_t, size_t);
606void mac68k_bssm4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
607	u_int32_t, size_t);
608void mac68k_bssm4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
609	u_int32_t, size_t);
610
611#if defined(DIAGNOSTIC)
612#define	bus_space_set_multi_1(t, h, o, val, c) do {			\
613	if ((c) == 0)							\
614		 panic("bus_space_set_multi_1 called with zero count."); \
615	(h).bssm1(t,&(h),o,val,c); } while (0)
616#define	bus_space_set_multi_2(t, h, o, val, c) do {			\
617	if ((c) == 0)							\
618		panic("bus_space_set_multi_2 called with zero count."); \
619	(h).bssm2(t,&(h),o,val,c); } while (0)
620#define	bus_space_set_multi_4(t, h, o, val, c) do {			\
621	if ((c) == 0)							\
622		panic("bus_space_set_multi_4 called with zero count."); \
623	(h).bssm4(t,&(h),o,val,c); } while (0)
624#else
625#define	bus_space_set_multi_1(t, h, o, val, c) \
626	do { if (c) (h).bssm1(t,&(h),o,val,c); } while (0)
627#define	bus_space_set_multi_2(t, h, o, val, c) \
628	do { if (c) (h).bssm2(t,&(h),o,val,c); } while (0)
629#define	bus_space_set_multi_4(t, h, o, val, c) \
630	do { if (c) (h).bssm4(t,&(h),o,val,c); } while (0)
631#endif
632
633/*
634 *	void bus_space_set_region_N(bus_space_tag_t tag,
635 *	    bus_space_handle_t bsh, bus_size_t, u_intN_t val,
636 *	    size_t count);
637 *
638 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
639 * by tag/handle starting at `offset'.
640 */
641
642void mac68k_bssr1(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
643	u_int8_t, size_t);
644void mac68k_bssr1_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
645	u_int8_t, size_t);
646void mac68k_bssr2(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
647	u_int16_t, size_t);
648void mac68k_bssr2_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
649	u_int16_t, size_t);
650void mac68k_bssr2_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
651	u_int16_t, size_t);
652void mac68k_bssr4(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
653	u_int32_t, size_t);
654void mac68k_bssr4_swap(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
655	u_int32_t, size_t);
656void mac68k_bssr4_gen(bus_space_tag_t, bus_space_handle_t *, bus_size_t,
657	u_int32_t, size_t);
658
659#if defined(DIAGNOSTIC)
660#define	bus_space_set_region_1(t, h, o, val, c) do {			 \
661	if ((c) == 0)							 \
662		panic("bus_space_set_region_1 called with zero count."); \
663	(h).bssr1(t,&(h),o,val,c); } while (0)
664#define	bus_space_set_region_2(t, h, o, val, c) do {			 \
665	if ((c) == 0)							 \
666		panic("bus_space_set_region_2 called with zero count."); \
667	(h).bssr2(t,&(h),o,val,c); } while (0)
668#define	bus_space_set_region_4(t, h, o, val, c) do {			 \
669	if ((c) == 0)							 \
670		panic("bus_space_set_region_4 called with zero count."); \
671	(h).bssr4(t,&(h),o,val,c); } while (0)
672#else
673#define	bus_space_set_region_1(t, h, o, val, c) \
674	do { if (c) (h).bssr1(t,&(h),o,val,c); } while (0)
675#define	bus_space_set_region_2(t, h, o, val, c) \
676	do { if (c) (h).bssr2(t,&(h),o,val,c); } while (0)
677#define	bus_space_set_region_4(t, h, o, val, c) \
678	do { if (c) (h).bssr4(t,&(h),o,val,c); } while (0)
679#endif
680
681/*
682 *	void bus_space_copy_N(bus_space_tag_t tag,
683 *	    bus_space_handle_t bsh1, bus_size_t off1,
684 *	    bus_space_handle_t bsh2, bus_size_t off2, size_t count);
685 *
686 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
687 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
688 */
689
690#define	__MAC68K_copy_region_N(BYTES)					\
691static __inline void __CONCAT(bus_space_copy_region_,BYTES)		\
692	(bus_space_tag_t,						\
693	    bus_space_handle_t, bus_size_t,				\
694	    bus_space_handle_t, bus_size_t,				\
695	    bus_size_t);						\
696									\
697static __inline void							\
698__CONCAT(bus_space_copy_region_,BYTES)(					\
699	bus_space_tag_t t,						\
700	bus_space_handle_t h1,						\
701	bus_size_t o1,							\
702	bus_space_handle_t h2,						\
703	bus_size_t o2,							\
704	bus_size_t c)							\
705{									\
706	bus_size_t o;							\
707									\
708	if ((h1.base + o1) >= (h2.base + o2)) {				\
709		/* src after dest: copy forward */			\
710		for (o = 0; c != 0; c--, o += BYTES)			\
711			__CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o,	\
712			    __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \
713	} else {							\
714		/* dest after src: copy backwards */			\
715		for (o = (c - 1) * BYTES; c != 0; c--, o -= BYTES)	\
716			__CONCAT(bus_space_write_,BYTES)(t, h2, o2 + o,	\
717			    __CONCAT(bus_space_read_,BYTES)(t, h1, o1 + o)); \
718	}								\
719}
720__MAC68K_copy_region_N(1)
721__MAC68K_copy_region_N(2)
722__MAC68K_copy_region_N(4)
723
724#undef __MAC68K_copy_region_N
725
726/*
727 * Bus read/write barrier methods.
728 *
729 *	void bus_space_barrier(bus_space_tag_t tag, bus_space_handle_t bsh,
730 *	    bus_size_t offset, bus_size_t len, int flags);
731 *
732 * Note: the 680x0 does not currently require barriers, but we must
733 * provide the flags to MI code.
734 */
735#define	bus_space_barrier(t, h, o, l, f)	\
736	((void)((void)(t), (void)(h), (void)(o), (void)(l), (void)(f)))
737#define	BUS_SPACE_BARRIER_READ	0x01		/* force read barrier */
738#define	BUS_SPACE_BARRIER_WRITE	0x02		/* force write barrier */
739
740/*
741 *	void *bus_space_vaddr(bus_space_tag_t, bus_space_handle_t);
742 *
743 * Get the kernel virtual address for the mapped bus space.
744 */
745#define	bus_space_vaddr(t, h)	((void)(t), (void *)(h.base))
746
747#define BUS_SPACE_ALIGNED_POINTER(p, t) ALIGNED_POINTER(p, t)
748
749#include <m68k/bus_dma.h>
750
751#endif /* _MAC68K_BUS_H_ */
752