xref: /netbsd/sys/arch/atari/atari/be_bus.c (revision 49110545)
1*49110545Sleo /*	$NetBSD: be_bus.c,v 1.4 2000/01/19 13:12:54 leo Exp $	*/
2fe41c75bSleo 
3fe41c75bSleo /*-
4243c5f7bSleo  * Copyright (c) 1998 The NetBSD Foundation, Inc.
5fe41c75bSleo  * All rights reserved.
6fe41c75bSleo  *
7fe41c75bSleo  * This code is derived from software contributed to The NetBSD Foundation
8fe41c75bSleo  * by Leo Weppelman.
9fe41c75bSleo  *
10fe41c75bSleo  * Redistribution and use in source and binary forms, with or without
11fe41c75bSleo  * modification, are permitted provided that the following conditions
12fe41c75bSleo  * are met:
13fe41c75bSleo  * 1. Redistributions of source code must retain the above copyright
14fe41c75bSleo  *    notice, this list of conditions and the following disclaimer.
15fe41c75bSleo  * 2. Redistributions in binary form must reproduce the above copyright
16fe41c75bSleo  *    notice, this list of conditions and the following disclaimer in the
17fe41c75bSleo  *    documentation and/or other materials provided with the distribution.
18fe41c75bSleo  * 3. All advertising materials mentioning features or use of this software
19fe41c75bSleo  *    must display the following acknowledgement:
20fe41c75bSleo  *        This product includes software developed by the NetBSD
21fe41c75bSleo  *        Foundation, Inc. and its contributors.
22fe41c75bSleo  * 4. Neither the name of The NetBSD Foundation nor the names of its
23fe41c75bSleo  *    contributors may be used to endorse or promote products derived
24fe41c75bSleo  *    from this software without specific prior written permission.
25fe41c75bSleo  *
26fe41c75bSleo  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27fe41c75bSleo  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28fe41c75bSleo  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29fe41c75bSleo  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30fe41c75bSleo  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31fe41c75bSleo  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32fe41c75bSleo  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33fe41c75bSleo  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34fe41c75bSleo  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35fe41c75bSleo  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36fe41c75bSleo  * POSSIBILITY OF SUCH DAMAGE.
37fe41c75bSleo  */
38fe41c75bSleo #include <sys/types.h>
39fe41c75bSleo #include <sys/param.h>
40fe41c75bSleo #include <sys/systm.h>
41fe41c75bSleo #include <sys/malloc.h>
42fe41c75bSleo #include <machine/cpu.h>
43fe41c75bSleo #include <machine/bus.h>
44fe41c75bSleo 
45fe41c75bSleo /*
46fe41c75bSleo  * This file contains the common functions for using a big endian (linear)
47fe41c75bSleo  * bus on a big endian atari.
48fe41c75bSleo  */
49fe41c75bSleo 
50fe41c75bSleo 	/* Autoconf detection stuff */
51fe41c75bSleo static int		beb_bus_space_peek_1 __P((bus_space_tag_t,
52fe41c75bSleo 				bus_space_handle_t, bus_size_t));
53fe41c75bSleo static int		beb_bus_space_peek_2 __P((bus_space_tag_t,
54fe41c75bSleo 				bus_space_handle_t, bus_size_t));
55fe41c75bSleo static int		beb_bus_space_peek_4 __P((bus_space_tag_t,
56fe41c75bSleo 				bus_space_handle_t, bus_size_t));
57fe41c75bSleo static int		beb_bus_space_peek_8 __P((bus_space_tag_t,
58fe41c75bSleo 				bus_space_handle_t, bus_size_t));
59fe41c75bSleo 
60fe41c75bSleo 	/* read (single) */
61fe41c75bSleo static u_int8_t		beb_bus_space_read_1 __P((bus_space_tag_t,
62fe41c75bSleo 				bus_space_handle_t, bus_size_t));
63fe41c75bSleo static u_int16_t	beb_bus_space_read_2 __P((bus_space_tag_t,
64fe41c75bSleo 				bus_space_handle_t, bus_size_t));
65fe41c75bSleo static u_int32_t	beb_bus_space_read_4 __P((bus_space_tag_t,
66fe41c75bSleo 				bus_space_handle_t, bus_size_t));
67fe41c75bSleo static u_int64_t	beb_bus_space_read_8 __P((bus_space_tag_t,
68fe41c75bSleo 				bus_space_handle_t, bus_size_t));
69fe41c75bSleo 
70fe41c75bSleo 	/* write (single) */
71fe41c75bSleo static void		beb_bus_space_write_1 __P((bus_space_tag_t,
72fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int8_t));
73fe41c75bSleo static void		beb_bus_space_write_2 __P((bus_space_tag_t,
74fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int16_t));
75fe41c75bSleo static void		beb_bus_space_write_4 __P((bus_space_tag_t,
76fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int32_t));
77fe41c75bSleo static void		beb_bus_space_write_8 __P((bus_space_tag_t,
78fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int64_t));
79fe41c75bSleo 
80fe41c75bSleo 	/* read multiple */
81fe41c75bSleo static void		beb_bus_space_read_multi_1 __P((bus_space_tag_t,
82fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int8_t *,
83fe41c75bSleo 				bus_size_t));
84fe41c75bSleo static void		beb_bus_space_read_multi_2 __P((bus_space_tag_t,
85fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int16_t *,
86fe41c75bSleo 				bus_size_t));
87fe41c75bSleo static void		beb_bus_space_read_multi_4 __P((bus_space_tag_t,
88fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int32_t *,
89fe41c75bSleo 				bus_size_t));
90fe41c75bSleo static void		beb_bus_space_read_multi_8 __P((bus_space_tag_t,
91fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int64_t *,
92fe41c75bSleo 				bus_size_t));
93fe41c75bSleo 
94fe41c75bSleo 	/* write multiple */
95fe41c75bSleo static void		beb_bus_space_write_multi_1 __P((bus_space_tag_t,
96fe41c75bSleo 				bus_space_handle_t, bus_size_t,
97fe41c75bSleo 				const u_int8_t *, bus_size_t));
98fe41c75bSleo static void		beb_bus_space_write_multi_2 __P((bus_space_tag_t,
99fe41c75bSleo 				bus_space_handle_t, bus_size_t,
100fe41c75bSleo 				const u_int16_t *, bus_size_t));
101fe41c75bSleo static void		beb_bus_space_write_multi_4 __P((bus_space_tag_t,
102fe41c75bSleo 				bus_space_handle_t, bus_size_t,
103fe41c75bSleo 				const u_int32_t *, bus_size_t));
104fe41c75bSleo static void		beb_bus_space_write_multi_8 __P((bus_space_tag_t,
105fe41c75bSleo 				bus_space_handle_t, bus_size_t,
106fe41c75bSleo 				const u_int64_t *, bus_size_t));
107fe41c75bSleo 
108fe41c75bSleo 	/* read region */
109fe41c75bSleo static void		beb_bus_space_read_region_1 __P((bus_space_tag_t,
110fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int8_t *,
111fe41c75bSleo 				bus_size_t));
112fe41c75bSleo static void		beb_bus_space_read_region_2 __P((bus_space_tag_t,
113fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int16_t *,
114fe41c75bSleo 				bus_size_t));
115fe41c75bSleo static void		beb_bus_space_read_region_4 __P((bus_space_tag_t,
116fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int32_t *,
117fe41c75bSleo 				bus_size_t));
118fe41c75bSleo static void		beb_bus_space_read_region_8 __P((bus_space_tag_t,
119fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int64_t *,
120fe41c75bSleo 				bus_size_t));
121fe41c75bSleo 
122fe41c75bSleo 	/* read region */
123fe41c75bSleo static void		beb_bus_space_write_region_1 __P((bus_space_tag_t,
124fe41c75bSleo 				bus_space_handle_t, bus_size_t,
125fe41c75bSleo 				const u_int8_t *, bus_size_t));
126fe41c75bSleo static void		beb_bus_space_write_region_2 __P((bus_space_tag_t,
127fe41c75bSleo 				bus_space_handle_t, bus_size_t,
128fe41c75bSleo 				const u_int16_t *, bus_size_t));
129fe41c75bSleo static void		beb_bus_space_write_region_4 __P((bus_space_tag_t,
130fe41c75bSleo 				bus_space_handle_t, bus_size_t,
131fe41c75bSleo 				const u_int32_t *, bus_size_t));
132fe41c75bSleo static void		beb_bus_space_write_region_8 __P((bus_space_tag_t,
133fe41c75bSleo 				bus_space_handle_t, bus_size_t,
134fe41c75bSleo 				const u_int64_t *, bus_size_t));
135fe41c75bSleo 
136fe41c75bSleo 	/* set multi */
137fe41c75bSleo static void		beb_bus_space_set_multi_1 __P((bus_space_tag_t,
138fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int8_t,
139fe41c75bSleo 				bus_size_t));
140fe41c75bSleo static void		beb_bus_space_set_multi_2 __P((bus_space_tag_t,
141fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int16_t,
142fe41c75bSleo 				bus_size_t));
143fe41c75bSleo static void		beb_bus_space_set_multi_4 __P((bus_space_tag_t,
144fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int32_t,
145fe41c75bSleo 				bus_size_t));
146fe41c75bSleo static void		beb_bus_space_set_multi_8 __P((bus_space_tag_t,
147fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int64_t,
148fe41c75bSleo 				bus_size_t));
149fe41c75bSleo 
150fe41c75bSleo 	/* set region */
151fe41c75bSleo static void		beb_bus_space_set_region_1 __P((bus_space_tag_t,
152fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int8_t,
153fe41c75bSleo 				bus_size_t));
154fe41c75bSleo static void		beb_bus_space_set_region_2 __P((bus_space_tag_t,
155fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int16_t,
156fe41c75bSleo 				bus_size_t));
157fe41c75bSleo static void		beb_bus_space_set_region_4 __P((bus_space_tag_t,
158fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int32_t,
159fe41c75bSleo 				bus_size_t));
160fe41c75bSleo static void		beb_bus_space_set_region_8 __P((bus_space_tag_t,
161fe41c75bSleo 				bus_space_handle_t, bus_size_t, u_int64_t,
162fe41c75bSleo 				bus_size_t));
163fe41c75bSleo 
164fe41c75bSleo /*
165fe41c75bSleo  * Don't force a function call overhead on these primitives...
166fe41c75bSleo  */
167fe41c75bSleo #define __read_1(h, o)		*((u_int8_t  *)((h) + (o)))
168fe41c75bSleo #define __read_2(h, o)		*((u_int16_t *)((h) + (o)))
169fe41c75bSleo #define __read_4(h, o)		*((u_int32_t *)((h) + (o)))
170fe41c75bSleo #define __read_8(h, o)		*((u_int64_t *)((h) + (o)))
171fe41c75bSleo 
172fe41c75bSleo #define __write_1(h, o, v)	*((u_int8_t  *)((h) + (o))) = (v)
173fe41c75bSleo #define __write_2(h, o, v)	*((u_int16_t *)((h) + (o))) = (v)
174fe41c75bSleo #define __write_4(h, o, v)	*((u_int32_t *)((h) + (o))) = (v)
175fe41c75bSleo #define __write_8(h, o, v)	*((u_int64_t *)((h) + (o))) = (v)
176fe41c75bSleo 
177fe41c75bSleo bus_space_tag_t
178*49110545Sleo beb_alloc_bus_space_tag(storage)
179*49110545Sleo bus_space_tag_t	storage;
180fe41c75bSleo {
181fe41c75bSleo 	bus_space_tag_t	beb_t;
182fe41c75bSleo 
183*49110545Sleo 	/*
184*49110545Sleo 	 * Allow the caller to specify storage space for the tag. This
185*49110545Sleo 	 * is used during console config (when malloc() can't be used).
186*49110545Sleo 	 */
187*49110545Sleo 	if (storage != NULL)
188*49110545Sleo 		beb_t = storage;
189*49110545Sleo 	else {
190fe41c75bSleo 	    if ((beb_t = malloc(sizeof(*beb_t), M_TEMP, M_NOWAIT)) == NULL)
191fe41c75bSleo 		return(NULL);
192*49110545Sleo 	}
193fe41c75bSleo 	bzero(beb_t, sizeof(*beb_t));
194fe41c75bSleo 
195fe41c75bSleo 	beb_t->abs_p_1   = beb_bus_space_peek_1;
196fe41c75bSleo 	beb_t->abs_p_2   = beb_bus_space_peek_2;
197fe41c75bSleo 	beb_t->abs_p_4   = beb_bus_space_peek_4;
198fe41c75bSleo 	beb_t->abs_p_8   = beb_bus_space_peek_8;
199fe41c75bSleo 	beb_t->abs_r_1   = beb_bus_space_read_1;
200fe41c75bSleo 	beb_t->abs_r_2   = beb_bus_space_read_2;
201fe41c75bSleo 	beb_t->abs_r_4   = beb_bus_space_read_4;
202fe41c75bSleo 	beb_t->abs_r_8   = beb_bus_space_read_8;
203fe41c75bSleo 	beb_t->abs_rs_1  = beb_bus_space_read_1;
204fe41c75bSleo 	beb_t->abs_rs_2  = beb_bus_space_read_2;
205fe41c75bSleo 	beb_t->abs_rs_4  = beb_bus_space_read_4;
206fe41c75bSleo 	beb_t->abs_rs_8  = beb_bus_space_read_8;
207fe41c75bSleo 	beb_t->abs_rm_1  = beb_bus_space_read_multi_1;
208fe41c75bSleo 	beb_t->abs_rm_2  = beb_bus_space_read_multi_2;
209fe41c75bSleo 	beb_t->abs_rm_4  = beb_bus_space_read_multi_4;
210fe41c75bSleo 	beb_t->abs_rm_8  = beb_bus_space_read_multi_8;
211fe41c75bSleo 	beb_t->abs_rms_1 = beb_bus_space_read_multi_1;
212fe41c75bSleo 	beb_t->abs_rms_2 = beb_bus_space_read_multi_2;
213fe41c75bSleo 	beb_t->abs_rms_4 = beb_bus_space_read_multi_4;
214fe41c75bSleo 	beb_t->abs_rms_8 = beb_bus_space_read_multi_8;
215fe41c75bSleo 	beb_t->abs_rr_1  = beb_bus_space_read_region_1;
216fe41c75bSleo 	beb_t->abs_rr_2  = beb_bus_space_read_region_2;
217fe41c75bSleo 	beb_t->abs_rr_4  = beb_bus_space_read_region_4;
218fe41c75bSleo 	beb_t->abs_rr_8  = beb_bus_space_read_region_8;
219ef7f5080Sleo 	beb_t->abs_rrs_1 = beb_bus_space_read_region_1;
220ef7f5080Sleo 	beb_t->abs_rrs_2 = beb_bus_space_read_region_2;
221ef7f5080Sleo 	beb_t->abs_rrs_4 = beb_bus_space_read_region_4;
222ef7f5080Sleo 	beb_t->abs_rrs_8 = beb_bus_space_read_region_8;
223fe41c75bSleo 	beb_t->abs_w_1   = beb_bus_space_write_1;
224fe41c75bSleo 	beb_t->abs_w_2   = beb_bus_space_write_2;
225fe41c75bSleo 	beb_t->abs_w_4   = beb_bus_space_write_4;
226fe41c75bSleo 	beb_t->abs_w_8   = beb_bus_space_write_8;
227fe41c75bSleo 	beb_t->abs_ws_1  = beb_bus_space_write_1;
228fe41c75bSleo 	beb_t->abs_ws_2  = beb_bus_space_write_2;
229fe41c75bSleo 	beb_t->abs_ws_4  = beb_bus_space_write_4;
230fe41c75bSleo 	beb_t->abs_ws_8  = beb_bus_space_write_8;
231fe41c75bSleo 	beb_t->abs_wm_1  = beb_bus_space_write_multi_1;
232fe41c75bSleo 	beb_t->abs_wm_2  = beb_bus_space_write_multi_2;
233fe41c75bSleo 	beb_t->abs_wm_4  = beb_bus_space_write_multi_4;
234fe41c75bSleo 	beb_t->abs_wm_8  = beb_bus_space_write_multi_8;
235fe41c75bSleo 	beb_t->abs_wms_1 = beb_bus_space_write_multi_1;
236fe41c75bSleo 	beb_t->abs_wms_2 = beb_bus_space_write_multi_2;
237fe41c75bSleo 	beb_t->abs_wms_4 = beb_bus_space_write_multi_4;
238fe41c75bSleo 	beb_t->abs_wms_8 = beb_bus_space_write_multi_8;
239fe41c75bSleo 	beb_t->abs_wr_1  = beb_bus_space_write_region_1;
240fe41c75bSleo 	beb_t->abs_wr_2  = beb_bus_space_write_region_2;
241fe41c75bSleo 	beb_t->abs_wr_4  = beb_bus_space_write_region_4;
242fe41c75bSleo 	beb_t->abs_wr_8  = beb_bus_space_write_region_8;
243ef7f5080Sleo 	beb_t->abs_wrs_1 = beb_bus_space_write_region_1;
244ef7f5080Sleo 	beb_t->abs_wrs_2 = beb_bus_space_write_region_2;
245ef7f5080Sleo 	beb_t->abs_wrs_4 = beb_bus_space_write_region_4;
246ef7f5080Sleo 	beb_t->abs_wrs_8 = beb_bus_space_write_region_8;
247fe41c75bSleo 	beb_t->abs_sm_1  = beb_bus_space_set_multi_1;
248fe41c75bSleo 	beb_t->abs_sm_2  = beb_bus_space_set_multi_2;
249fe41c75bSleo 	beb_t->abs_sm_4  = beb_bus_space_set_multi_4;
250fe41c75bSleo 	beb_t->abs_sm_8  = beb_bus_space_set_multi_8;
251fe41c75bSleo 	beb_t->abs_sr_1  = beb_bus_space_set_region_1;
252fe41c75bSleo 	beb_t->abs_sr_2  = beb_bus_space_set_region_2;
253fe41c75bSleo 	beb_t->abs_sr_4  = beb_bus_space_set_region_4;
254fe41c75bSleo 	beb_t->abs_sr_8  = beb_bus_space_set_region_8;
255fe41c75bSleo 
256fe41c75bSleo 	return(beb_t);
257fe41c75bSleo }
258fe41c75bSleo 
259fe41c75bSleo 
260fe41c75bSleo /*
261fe41c75bSleo  * The various access functions
262fe41c75bSleo  */
263fe41c75bSleo 
264fe41c75bSleo /*
265fe41c75bSleo  *	int bus_space_peek_N __P((bus_space_tag_t tag,
266fe41c75bSleo  *		bus_space_handle_t sh, bus_size_t offset));
267fe41c75bSleo  *
268fe41c75bSleo  * Check if the address is suitable for reading N-byte quantities.
269fe41c75bSleo  */
270fe41c75bSleo static int
271fe41c75bSleo beb_bus_space_peek_1(t, h, o)
272fe41c75bSleo     bus_space_tag_t	t;
273fe41c75bSleo     bus_space_handle_t	h;
274fe41c75bSleo     bus_size_t		o;
275fe41c75bSleo {
276fe41c75bSleo     return(!badbaddr((caddr_t)(h + o), 1));
277fe41c75bSleo }
278fe41c75bSleo 
279fe41c75bSleo static int
280fe41c75bSleo beb_bus_space_peek_2(t, h, o)
281fe41c75bSleo     bus_space_tag_t	t;
282fe41c75bSleo     bus_space_handle_t	h;
283fe41c75bSleo     bus_size_t		o;
284fe41c75bSleo {
285fe41c75bSleo     return(!badbaddr((caddr_t)(h + o), 2));
286fe41c75bSleo }
287fe41c75bSleo 
288fe41c75bSleo static int
289fe41c75bSleo beb_bus_space_peek_4(t, h, o)
290fe41c75bSleo     bus_space_tag_t	t;
291fe41c75bSleo     bus_space_handle_t	h;
292fe41c75bSleo     bus_size_t		o;
293fe41c75bSleo {
294fe41c75bSleo     return(!badbaddr((caddr_t)(h + o), 4));
295fe41c75bSleo }
296fe41c75bSleo 
297fe41c75bSleo static int
298fe41c75bSleo beb_bus_space_peek_8(t, h, o)
299fe41c75bSleo     bus_space_tag_t	t;
300fe41c75bSleo     bus_space_handle_t	h;
301fe41c75bSleo     bus_size_t		o;
302fe41c75bSleo {
303fe41c75bSleo     return(!badbaddr((caddr_t)(h + o), 8));
304fe41c75bSleo }
305fe41c75bSleo 
306fe41c75bSleo /*
307fe41c75bSleo  *	u_intX_t bus_space_read_N __P((bus_space_tag_t tag,
308fe41c75bSleo  *		bus_space_handle_t bsh, bus_size_t offset));
309fe41c75bSleo  *
310fe41c75bSleo  * Return an 1, 2, 4, or 8 byte value read from the bus_space described
311fe41c75bSleo  * by tag/handle at `offset'. The value is converted to host-endian.
312fe41c75bSleo  */
313fe41c75bSleo static u_int8_t
314fe41c75bSleo beb_bus_space_read_1(t, h, o)
315fe41c75bSleo     bus_space_tag_t	t;
316fe41c75bSleo     bus_space_handle_t	h;
317fe41c75bSleo     bus_size_t		o;
318fe41c75bSleo {
319fe41c75bSleo     return(__read_1(h, o));
320fe41c75bSleo }
321fe41c75bSleo 
322fe41c75bSleo static u_int16_t
323fe41c75bSleo beb_bus_space_read_2(t, h, o)
324fe41c75bSleo     bus_space_tag_t	t;
325fe41c75bSleo     bus_space_handle_t	h;
326fe41c75bSleo     bus_size_t		o;
327fe41c75bSleo {
328fe41c75bSleo     return(__read_2(h, o));
329fe41c75bSleo }
330fe41c75bSleo 
331fe41c75bSleo static u_int32_t
332fe41c75bSleo beb_bus_space_read_4(t, h, o)
333fe41c75bSleo     bus_space_tag_t	t;
334fe41c75bSleo     bus_space_handle_t	h;
335fe41c75bSleo     bus_size_t		o;
336fe41c75bSleo {
337fe41c75bSleo     return(__read_4(h, o));
338fe41c75bSleo }
339fe41c75bSleo 
340fe41c75bSleo static u_int64_t
341fe41c75bSleo beb_bus_space_read_8(t, h, o)
342fe41c75bSleo     bus_space_tag_t	t;
343fe41c75bSleo     bus_space_handle_t	h;
344fe41c75bSleo     bus_size_t		o;
345fe41c75bSleo {
346fe41c75bSleo     return(__read_8(h, o));
347fe41c75bSleo }
348fe41c75bSleo 
349fe41c75bSleo /*
350fe41c75bSleo  *	u_intX_t bus_space_write_N __P((bus_space_tag_t tag,
351fe41c75bSleo  *		bus_space_handle_t bsh, bus_size_t offset, u_intX_t val));
352fe41c75bSleo  *
353fe41c75bSleo  * Write an 1, 2, 4, or 8 byte value to the bus_space described by tag/handle
354fe41c75bSleo  * at `offset'. The value `val' is converted from host to bus endianness
355fe41c75bSleo  * before being written.
356fe41c75bSleo  */
357fe41c75bSleo static void
358fe41c75bSleo beb_bus_space_write_1(t, h, o, v)
359fe41c75bSleo     bus_space_tag_t	t;
360fe41c75bSleo     bus_space_handle_t	h;
361fe41c75bSleo     bus_size_t		o;
362fe41c75bSleo     u_int8_t		v;
363fe41c75bSleo {
364fe41c75bSleo     __write_1(h, o, v);
365fe41c75bSleo }
366fe41c75bSleo 
367fe41c75bSleo static void
368fe41c75bSleo beb_bus_space_write_2(t, h, o, v)
369fe41c75bSleo     bus_space_tag_t	t;
370fe41c75bSleo     bus_space_handle_t	h;
371fe41c75bSleo     bus_size_t		o;
372fe41c75bSleo     u_int16_t		v;
373fe41c75bSleo {
374fe41c75bSleo     __write_2(h, o, v);
375fe41c75bSleo }
376fe41c75bSleo 
377fe41c75bSleo static void
378fe41c75bSleo beb_bus_space_write_4(t, h, o, v)
379fe41c75bSleo     bus_space_tag_t	t;
380fe41c75bSleo     bus_space_handle_t	h;
381fe41c75bSleo     bus_size_t		o;
382fe41c75bSleo     u_int32_t		v;
383fe41c75bSleo {
384fe41c75bSleo     __write_4(h, o, v);
385fe41c75bSleo }
386fe41c75bSleo 
387fe41c75bSleo static void
388fe41c75bSleo beb_bus_space_write_8(t, h, o, v)
389fe41c75bSleo     bus_space_tag_t	t;
390fe41c75bSleo     bus_space_handle_t	h;
391fe41c75bSleo     bus_size_t		o;
392fe41c75bSleo     u_int64_t		v;
393fe41c75bSleo {
394fe41c75bSleo     __write_8(h, o, v);
395fe41c75bSleo }
396fe41c75bSleo 
397fe41c75bSleo /*
398fe41c75bSleo  *	void bus_space_read_multi_N __P((bus_space_tag_t tag,
399fe41c75bSleo  *		bus_space_handle_t bsh, bus_size_t offset, u_intX_t *address,
400fe41c75bSleo  *	 	bus_size_t count));
401fe41c75bSleo  *
402fe41c75bSleo  * Read 'count' 1, 2, 4, or 8 byte values from the bus_space described by
403fe41c75bSleo  * tag/handle at `offset' and store them in the address range starting at
404fe41c75bSleo  * 'address'. The values are converted to cpu endian order before being
405fe41c75bSleo  * being stored.
406fe41c75bSleo  */
407fe41c75bSleo static void
408fe41c75bSleo beb_bus_space_read_multi_1(t, h, o, a, c)
409fe41c75bSleo 	bus_space_tag_t		t;
410fe41c75bSleo 	bus_space_handle_t	h;
411fe41c75bSleo 	bus_size_t		o, c;
412fe41c75bSleo 	u_int8_t		*a;
413fe41c75bSleo {
414fe41c75bSleo 	for (; c; a++, c--)
415fe41c75bSleo 		*a = __read_1(h, o);
416fe41c75bSleo }
417fe41c75bSleo static void
418fe41c75bSleo beb_bus_space_read_multi_2(t, h, o, a, c)
419fe41c75bSleo 	bus_space_tag_t		t;
420fe41c75bSleo 	bus_space_handle_t	h;
421fe41c75bSleo 	bus_size_t		o, c;
422fe41c75bSleo 	u_int16_t		*a;
423fe41c75bSleo {
424fe41c75bSleo 	for (; c; a++, c--)
425fe41c75bSleo 		*a = __read_2(h, o);
426fe41c75bSleo }
427fe41c75bSleo 
428fe41c75bSleo static void
429fe41c75bSleo beb_bus_space_read_multi_4(t, h, o, a, c)
430fe41c75bSleo 	bus_space_tag_t		t;
431fe41c75bSleo 	bus_space_handle_t	h;
432fe41c75bSleo 	bus_size_t		o, c;
433fe41c75bSleo 	u_int32_t		*a;
434fe41c75bSleo {
435fe41c75bSleo 	for (; c; a++, c--)
436fe41c75bSleo 		*a = __read_4(h, o);
437fe41c75bSleo }
438fe41c75bSleo 
439fe41c75bSleo static void
440fe41c75bSleo beb_bus_space_read_multi_8(t, h, o, a, c)
441fe41c75bSleo 	bus_space_tag_t		t;
442fe41c75bSleo 	bus_space_handle_t	h;
443fe41c75bSleo 	bus_size_t		o, c;
444fe41c75bSleo 	u_int64_t		*a;
445fe41c75bSleo {
446fe41c75bSleo 	for (; c; a++, c--)
447fe41c75bSleo 		*a = __read_8(h, o);
448fe41c75bSleo }
449fe41c75bSleo 
450fe41c75bSleo /*
451fe41c75bSleo  *	void bus_space_write_multi_N __P((bus_space_tag_t tag,
452fe41c75bSleo  *		bus_space_handle_t bsh, bus_size_t offset,
453fe41c75bSleo  *		const u_intX_t *address, bus_size_t count));
454fe41c75bSleo  *
455fe41c75bSleo  * Write 'count' 1, 2, 4, or 8 byte values from the address range starting
456fe41c75bSleo  * at 'address' to the bus_space described by tag/handle at `offset'.
457fe41c75bSleo  * The values are converted to bus endian order before being written to
458fe41c75bSleo  * the bus.
459fe41c75bSleo  */
460fe41c75bSleo static void
461fe41c75bSleo beb_bus_space_write_multi_1(t, h, o, a, c)
462fe41c75bSleo 	bus_space_tag_t		t;
463fe41c75bSleo 	bus_space_handle_t	h;
464fe41c75bSleo 	bus_size_t		o, c;
465fe41c75bSleo 	const u_int8_t		*a;
466fe41c75bSleo {
467fe41c75bSleo 	for (; c; a++, c--)
468fe41c75bSleo 		__write_1(h, o, *a);
469fe41c75bSleo }
470fe41c75bSleo 
471fe41c75bSleo static void
472fe41c75bSleo beb_bus_space_write_multi_2(t, h, o, a, c)
473fe41c75bSleo 	bus_space_tag_t		t;
474fe41c75bSleo 	bus_space_handle_t	h;
475fe41c75bSleo 	bus_size_t		o, c;
476fe41c75bSleo 	const u_int16_t		*a;
477fe41c75bSleo {
478fe41c75bSleo 	for (; c; a++, c--)
479fe41c75bSleo 		__write_2(h, o, *a);
480fe41c75bSleo }
481fe41c75bSleo 
482fe41c75bSleo static void
483fe41c75bSleo beb_bus_space_write_multi_4(t, h, o, a, c)
484fe41c75bSleo 	bus_space_tag_t		t;
485fe41c75bSleo 	bus_space_handle_t	h;
486fe41c75bSleo 	bus_size_t		o, c;
487fe41c75bSleo 	const u_int32_t		*a;
488fe41c75bSleo {
489fe41c75bSleo 	for (; c; a++, c--)
490fe41c75bSleo 		__write_4(h, o, *a);
491fe41c75bSleo }
492fe41c75bSleo 
493fe41c75bSleo static void
494fe41c75bSleo beb_bus_space_write_multi_8(t, h, o, a, c)
495fe41c75bSleo 	bus_space_tag_t		t;
496fe41c75bSleo 	bus_space_handle_t	h;
497fe41c75bSleo 	bus_size_t		o, c;
498fe41c75bSleo 	const u_int64_t		*a;
499fe41c75bSleo {
500fe41c75bSleo 	for (; c; a++, c--)
501fe41c75bSleo 		__write_8(h, o, *a);
502fe41c75bSleo }
503fe41c75bSleo 
504fe41c75bSleo /*
505fe41c75bSleo  *	void bus_space_read_region_N __P((bus_space_tag_t tag,
506fe41c75bSleo  *		bus_space_handle_t bsh, bus_size_t offset,
507fe41c75bSleo  *		u_intN_t *addr, bus_size_t count));
508fe41c75bSleo  *
509fe41c75bSleo  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
510fe41c75bSleo  * described by tag/handle and starting at `offset' and copy into
511fe41c75bSleo  * buffer provided.
512fe41c75bSleo  */
513fe41c75bSleo static void
514fe41c75bSleo beb_bus_space_read_region_1(t, h, o, a, c)
515fe41c75bSleo 	bus_space_tag_t		t;
516fe41c75bSleo 	bus_space_handle_t	h;
517fe41c75bSleo 	bus_size_t		o, c;
518fe41c75bSleo 	u_int8_t		*a;
519fe41c75bSleo {
520fe41c75bSleo 	for (; c; a++, o++, c--)
521fe41c75bSleo 		*a = __read_1(h, o);
522fe41c75bSleo }
523fe41c75bSleo 
524fe41c75bSleo static void
525fe41c75bSleo beb_bus_space_read_region_2(t, h, o, a, c)
526fe41c75bSleo 	bus_space_tag_t		t;
527fe41c75bSleo 	bus_space_handle_t	h;
528fe41c75bSleo 	bus_size_t		o, c;
529fe41c75bSleo 	u_int16_t		*a;
530fe41c75bSleo {
531fe41c75bSleo 	for (; c; a++, o += 2, c--)
532fe41c75bSleo 		*a = __read_2(h, o);
533fe41c75bSleo }
534fe41c75bSleo 
535fe41c75bSleo static void
536fe41c75bSleo beb_bus_space_read_region_4(t, h, o, a, c)
537fe41c75bSleo 	bus_space_tag_t		t;
538fe41c75bSleo 	bus_space_handle_t	h;
539fe41c75bSleo 	bus_size_t		o, c;
540fe41c75bSleo 	u_int32_t		*a;
541fe41c75bSleo {
542fe41c75bSleo 	for (; c; a++, o += 4, c--)
543fe41c75bSleo 		*a = __read_4(h, o);
544fe41c75bSleo }
545fe41c75bSleo 
546fe41c75bSleo static void
547fe41c75bSleo beb_bus_space_read_region_8(t, h, o, a, c)
548fe41c75bSleo 	bus_space_tag_t		t;
549fe41c75bSleo 	bus_space_handle_t	h;
550fe41c75bSleo 	bus_size_t		o, c;
551fe41c75bSleo 	u_int64_t		*a;
552fe41c75bSleo {
553fe41c75bSleo 	for (; c; a++, o += 8, c--)
554fe41c75bSleo 		*a = __read_8(h, o);
555fe41c75bSleo }
556fe41c75bSleo 
557fe41c75bSleo /*
558fe41c75bSleo  *	void bus_space_write_region_N __P((bus_space_tag_t tag,
559fe41c75bSleo  *		bus_space_handle_t bsh, bus_size_t offset,
560fe41c75bSleo  *		u_intN_t *addr, bus_size_t count));
561fe41c75bSleo  *
562fe41c75bSleo  * Copy `count' 1, 2, 4, or 8 byte quantities from the buffer provided
563fe41c75bSleo  * into the bus space described by tag/handle and starting at `offset'.
564fe41c75bSleo  */
565fe41c75bSleo static void
566fe41c75bSleo beb_bus_space_write_region_1(t, h, o, a, c)
567fe41c75bSleo 	bus_space_tag_t		t;
568fe41c75bSleo 	bus_space_handle_t	h;
569fe41c75bSleo 	bus_size_t		o, c;
570fe41c75bSleo 	const u_int8_t		*a;
571fe41c75bSleo {
572fe41c75bSleo 	for (; c; a++, o++, c--)
573fe41c75bSleo 		__write_1(h, o, *a);
574fe41c75bSleo }
575fe41c75bSleo 
576fe41c75bSleo static void
577fe41c75bSleo beb_bus_space_write_region_2(t, h, o, a, c)
578fe41c75bSleo 	bus_space_tag_t		t;
579fe41c75bSleo 	bus_space_handle_t	h;
580fe41c75bSleo 	bus_size_t		o, c;
581fe41c75bSleo 	const u_int16_t		*a;
582fe41c75bSleo {
583fe41c75bSleo 	for (; c; a++, o += 2, c--)
584fe41c75bSleo 		__write_2(h, o, *a);
585fe41c75bSleo }
586fe41c75bSleo 
587fe41c75bSleo static void
588fe41c75bSleo beb_bus_space_write_region_4(t, h, o, a, c)
589fe41c75bSleo 	bus_space_tag_t		t;
590fe41c75bSleo 	bus_space_handle_t	h;
591fe41c75bSleo 	bus_size_t		o, c;
592fe41c75bSleo 	const u_int32_t		*a;
593fe41c75bSleo {
594fe41c75bSleo 	for (; c; a++, o += 4, c--)
595fe41c75bSleo 		__write_4(h, o, *a);
596fe41c75bSleo }
597fe41c75bSleo 
598fe41c75bSleo static void
599fe41c75bSleo beb_bus_space_write_region_8(t, h, o, a, c)
600fe41c75bSleo 	bus_space_tag_t		t;
601fe41c75bSleo 	bus_space_handle_t	h;
602fe41c75bSleo 	bus_size_t		o, c;
603fe41c75bSleo 	const u_int64_t		*a;
604fe41c75bSleo {
605fe41c75bSleo 	for (; c; a++, o += 8, c--)
606fe41c75bSleo 		__write_8(h, o, *a);
607fe41c75bSleo }
608fe41c75bSleo 
609fe41c75bSleo /*
610fe41c75bSleo  *	void bus_space_set_multi_N __P((bus_space_tag_t tag,
611fe41c75bSleo  *		bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
612fe41c75bSleo  *		bus_size_t count));
613fe41c75bSleo  *
614fe41c75bSleo  * Write the 1, 2, 4, or 8 byte value `val' to bus space described
615fe41c75bSleo  * by tag/handle/offset `count' times.
616fe41c75bSleo  */
617fe41c75bSleo 
618fe41c75bSleo static void
619fe41c75bSleo beb_bus_space_set_multi_1(t, h, o, v, c)
620fe41c75bSleo 	bus_space_tag_t		t;
621fe41c75bSleo 	bus_space_handle_t	h;
622fe41c75bSleo 	bus_size_t		o, c;
623fe41c75bSleo 	u_int8_t		v;
624fe41c75bSleo {
625fe41c75bSleo 	for (; c; c--)
626fe41c75bSleo 		__write_1(h, o, v);
627fe41c75bSleo }
628fe41c75bSleo 
629fe41c75bSleo static void
630fe41c75bSleo beb_bus_space_set_multi_2(t, h, o, v, c)
631fe41c75bSleo 	bus_space_tag_t		t;
632fe41c75bSleo 	bus_space_handle_t	h;
633fe41c75bSleo 	bus_size_t		o, c;
634fe41c75bSleo 	u_int16_t		v;
635fe41c75bSleo {
636fe41c75bSleo 	for (; c; c--)
637fe41c75bSleo 		__write_2(h, o, v);
638fe41c75bSleo }
639fe41c75bSleo 
640fe41c75bSleo static void
641fe41c75bSleo beb_bus_space_set_multi_4(t, h, o, v, c)
642fe41c75bSleo 	bus_space_tag_t		t;
643fe41c75bSleo 	bus_space_handle_t	h;
644fe41c75bSleo 	bus_size_t		o, c;
645fe41c75bSleo 	u_int32_t		v;
646fe41c75bSleo {
647fe41c75bSleo 	for (; c; c--)
648fe41c75bSleo 		__write_4(h, o, v);
649fe41c75bSleo }
650fe41c75bSleo 
651fe41c75bSleo static void
652fe41c75bSleo beb_bus_space_set_multi_8(t, h, o, v, c)
653fe41c75bSleo 	bus_space_tag_t		t;
654fe41c75bSleo 	bus_space_handle_t	h;
655fe41c75bSleo 	bus_size_t		o, c;
656fe41c75bSleo 	u_int64_t		v;
657fe41c75bSleo {
658fe41c75bSleo 	for (; c; c--)
659fe41c75bSleo 		__write_8(h, o, v);
660fe41c75bSleo }
661fe41c75bSleo 
662fe41c75bSleo /*
663fe41c75bSleo  *	void bus_space_set_region_N __P((bus_space_tag_t tag,
664fe41c75bSleo  *		bus_space_handle_t bsh, bus_size_t offset, u_intN_t val,
665fe41c75bSleo  *		bus_size_t count));
666fe41c75bSleo  *
667fe41c75bSleo  * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
668fe41c75bSleo  * by tag/handle starting at `offset'.
669fe41c75bSleo  */
670fe41c75bSleo static void
671fe41c75bSleo beb_bus_space_set_region_1(t, h, o, v, c)
672fe41c75bSleo 	bus_space_tag_t		t;
673fe41c75bSleo 	bus_space_handle_t	h;
674fe41c75bSleo 	bus_size_t		o, c;
675fe41c75bSleo 	u_int8_t		v;
676fe41c75bSleo {
677fe41c75bSleo 	for (; c; o++, c--)
678fe41c75bSleo 		__write_1(h, o, v);
679fe41c75bSleo }
680fe41c75bSleo 
681fe41c75bSleo static void
682fe41c75bSleo beb_bus_space_set_region_2(t, h, o, v, c)
683fe41c75bSleo 	bus_space_tag_t		t;
684fe41c75bSleo 	bus_space_handle_t	h;
685fe41c75bSleo 	bus_size_t		o, c;
686fe41c75bSleo 	u_int16_t		v;
687fe41c75bSleo {
688fe41c75bSleo 	for (; c; o += 2, c--)
689fe41c75bSleo 		__write_2(h, o, v);
690fe41c75bSleo }
691fe41c75bSleo 
692fe41c75bSleo static void
693fe41c75bSleo beb_bus_space_set_region_4(t, h, o, v, c)
694fe41c75bSleo 	bus_space_tag_t		t;
695fe41c75bSleo 	bus_space_handle_t	h;
696fe41c75bSleo 	bus_size_t		o, c;
697fe41c75bSleo 	u_int32_t		v;
698fe41c75bSleo {
699fe41c75bSleo 	for (; c; o += 4, c--)
700fe41c75bSleo 		__write_4(h, o, v);
701fe41c75bSleo }
702fe41c75bSleo 
703fe41c75bSleo static void
704fe41c75bSleo beb_bus_space_set_region_8(t, h, o, v, c)
705fe41c75bSleo 	bus_space_tag_t		t;
706fe41c75bSleo 	bus_space_handle_t	h;
707fe41c75bSleo 	bus_size_t		o, c;
708fe41c75bSleo 	u_int64_t		v;
709fe41c75bSleo {
710fe41c75bSleo 	for (; c; o += 8, c--)
711fe41c75bSleo 		__write_8(h, o, v);
712fe41c75bSleo }
713