xref: /netbsd/sys/arch/atari/atari/be_bus.c (revision 60e2ec70)
1*60e2ec70Stsutsui /*	$NetBSD: be_bus.c,v 1.18 2023/01/06 10:28:27 tsutsui 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  *
19fe41c75bSleo  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20fe41c75bSleo  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21fe41c75bSleo  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22fe41c75bSleo  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23fe41c75bSleo  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24fe41c75bSleo  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25fe41c75bSleo  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26fe41c75bSleo  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27fe41c75bSleo  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28fe41c75bSleo  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29fe41c75bSleo  * POSSIBILITY OF SUCH DAMAGE.
30fe41c75bSleo  */
31e803bea7Slukem 
32e803bea7Slukem #include <sys/cdefs.h>
33*60e2ec70Stsutsui __KERNEL_RCSID(0, "$NetBSD: be_bus.c,v 1.18 2023/01/06 10:28:27 tsutsui Exp $");
34e803bea7Slukem 
35fe41c75bSleo #include <sys/types.h>
36fe41c75bSleo #include <sys/param.h>
37fe41c75bSleo #include <sys/systm.h>
38f5df4b68Sthorpej #include <sys/kmem.h>
39fe41c75bSleo #include <machine/cpu.h>
40af51edd2Sdyoung #include <sys/bus.h>
41fe41c75bSleo 
42fe41c75bSleo /*
43fe41c75bSleo  * This file contains the common functions for using a big endian (linear)
44fe41c75bSleo  * bus on a big endian atari.
45fe41c75bSleo  */
46fe41c75bSleo 
47fe41c75bSleo 	/* Autoconf detection stuff */
4830b80223Stsutsui static int		beb_bus_space_peek_1(bus_space_tag_t,
4930b80223Stsutsui 				bus_space_handle_t, bus_size_t);
5030b80223Stsutsui static int		beb_bus_space_peek_2(bus_space_tag_t,
5130b80223Stsutsui 				bus_space_handle_t, bus_size_t);
5230b80223Stsutsui static int		beb_bus_space_peek_4(bus_space_tag_t,
5330b80223Stsutsui 				bus_space_handle_t, bus_size_t);
5430b80223Stsutsui static int		beb_bus_space_peek_8(bus_space_tag_t,
5530b80223Stsutsui 				bus_space_handle_t, bus_size_t);
56fe41c75bSleo 
57fe41c75bSleo 	/* read (single) */
58981d751aStsutsui static uint8_t		beb_bus_space_read_1(bus_space_tag_t,
5930b80223Stsutsui 				bus_space_handle_t, bus_size_t);
60981d751aStsutsui static uint16_t		beb_bus_space_read_2(bus_space_tag_t,
6130b80223Stsutsui 				bus_space_handle_t, bus_size_t);
62981d751aStsutsui static uint32_t		beb_bus_space_read_4(bus_space_tag_t,
6330b80223Stsutsui 				bus_space_handle_t, bus_size_t);
64981d751aStsutsui static uint64_t		beb_bus_space_read_8(bus_space_tag_t,
6530b80223Stsutsui 				bus_space_handle_t, bus_size_t);
66fe41c75bSleo 
67fe41c75bSleo 	/* write (single) */
6830b80223Stsutsui static void		beb_bus_space_write_1(bus_space_tag_t,
69981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint8_t);
7030b80223Stsutsui static void		beb_bus_space_write_2(bus_space_tag_t,
71981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint16_t);
7230b80223Stsutsui static void		beb_bus_space_write_4(bus_space_tag_t,
73981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint32_t);
7430b80223Stsutsui static void		beb_bus_space_write_8(bus_space_tag_t,
75981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint64_t);
76fe41c75bSleo 
77fe41c75bSleo 	/* read multiple */
7830b80223Stsutsui static void		beb_bus_space_read_multi_1(bus_space_tag_t,
79981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint8_t *,
8030b80223Stsutsui 				bus_size_t);
8130b80223Stsutsui static void		beb_bus_space_read_multi_2(bus_space_tag_t,
82981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint16_t *,
8330b80223Stsutsui 				bus_size_t);
8430b80223Stsutsui static void		beb_bus_space_read_multi_4(bus_space_tag_t,
85981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint32_t *,
8630b80223Stsutsui 				bus_size_t);
8730b80223Stsutsui static void		beb_bus_space_read_multi_8(bus_space_tag_t,
88981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint64_t *,
8930b80223Stsutsui 				bus_size_t);
90fe41c75bSleo 
91fe41c75bSleo 	/* write multiple */
9230b80223Stsutsui static void		beb_bus_space_write_multi_1(bus_space_tag_t,
93fe41c75bSleo 				bus_space_handle_t, bus_size_t,
94981d751aStsutsui 				const uint8_t *, bus_size_t);
9530b80223Stsutsui static void		beb_bus_space_write_multi_2(bus_space_tag_t,
96fe41c75bSleo 				bus_space_handle_t, bus_size_t,
97981d751aStsutsui 				const uint16_t *, bus_size_t);
9830b80223Stsutsui static void		beb_bus_space_write_multi_4(bus_space_tag_t,
99fe41c75bSleo 				bus_space_handle_t, bus_size_t,
100981d751aStsutsui 				const uint32_t *, bus_size_t);
10130b80223Stsutsui static void		beb_bus_space_write_multi_8(bus_space_tag_t,
102fe41c75bSleo 				bus_space_handle_t, bus_size_t,
103981d751aStsutsui 				const uint64_t *, bus_size_t);
104fe41c75bSleo 
105fe41c75bSleo 	/* read region */
10630b80223Stsutsui static void		beb_bus_space_read_region_1(bus_space_tag_t,
107981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint8_t *,
10830b80223Stsutsui 				bus_size_t);
10930b80223Stsutsui static void		beb_bus_space_read_region_2(bus_space_tag_t,
110981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint16_t *,
11130b80223Stsutsui 				bus_size_t);
11230b80223Stsutsui static void		beb_bus_space_read_region_4(bus_space_tag_t,
113981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint32_t *,
11430b80223Stsutsui 				bus_size_t);
11530b80223Stsutsui static void		beb_bus_space_read_region_8(bus_space_tag_t,
116981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint64_t *,
11730b80223Stsutsui 				bus_size_t);
118fe41c75bSleo 
119fe41c75bSleo 	/* read region */
12030b80223Stsutsui static void		beb_bus_space_write_region_1(bus_space_tag_t,
121fe41c75bSleo 				bus_space_handle_t, bus_size_t,
122981d751aStsutsui 				const uint8_t *, bus_size_t);
12330b80223Stsutsui static void		beb_bus_space_write_region_2(bus_space_tag_t,
124fe41c75bSleo 				bus_space_handle_t, bus_size_t,
125981d751aStsutsui 				const uint16_t *, bus_size_t);
12630b80223Stsutsui static void		beb_bus_space_write_region_4(bus_space_tag_t,
127fe41c75bSleo 				bus_space_handle_t, bus_size_t,
128981d751aStsutsui 				const uint32_t *, bus_size_t);
12930b80223Stsutsui static void		beb_bus_space_write_region_8(bus_space_tag_t,
130fe41c75bSleo 				bus_space_handle_t, bus_size_t,
131981d751aStsutsui 				const uint64_t *, bus_size_t);
132fe41c75bSleo 
133fe41c75bSleo 	/* set multi */
13430b80223Stsutsui static void		beb_bus_space_set_multi_1(bus_space_tag_t,
135981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint8_t,
13630b80223Stsutsui 				bus_size_t);
13730b80223Stsutsui static void		beb_bus_space_set_multi_2(bus_space_tag_t,
138981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint16_t,
13930b80223Stsutsui 				bus_size_t);
14030b80223Stsutsui static void		beb_bus_space_set_multi_4(bus_space_tag_t,
141981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint32_t,
14230b80223Stsutsui 				bus_size_t);
14330b80223Stsutsui static void		beb_bus_space_set_multi_8(bus_space_tag_t,
144981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint64_t,
14530b80223Stsutsui 				bus_size_t);
146fe41c75bSleo 
147fe41c75bSleo 	/* set region */
14830b80223Stsutsui static void		beb_bus_space_set_region_1(bus_space_tag_t,
149981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint8_t,
15030b80223Stsutsui 				bus_size_t);
15130b80223Stsutsui static void		beb_bus_space_set_region_2(bus_space_tag_t,
152981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint16_t,
15330b80223Stsutsui 				bus_size_t);
15430b80223Stsutsui static void		beb_bus_space_set_region_4(bus_space_tag_t,
155981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint32_t,
15630b80223Stsutsui 				bus_size_t);
15730b80223Stsutsui static void		beb_bus_space_set_region_8(bus_space_tag_t,
158981d751aStsutsui 				bus_space_handle_t, bus_size_t, uint64_t,
15930b80223Stsutsui 				bus_size_t);
160fe41c75bSleo 
161fe41c75bSleo /*
162fe41c75bSleo  * Don't force a function call overhead on these primitives...
163fe41c75bSleo  */
164981d751aStsutsui #define __read_1(h, o)		*((volatile uint8_t  *)((h) + (o)))
165981d751aStsutsui #define __read_2(h, o)		*((volatile uint16_t *)((h) + (o)))
166981d751aStsutsui #define __read_4(h, o)		*((volatile uint32_t *)((h) + (o)))
167981d751aStsutsui #define __read_8(h, o)		*((volatile uint64_t *)((h) + (o)))
168fe41c75bSleo 
169981d751aStsutsui #define __write_1(h, o, v)	*((volatile uint8_t  *)((h) + (o))) = (v)
170981d751aStsutsui #define __write_2(h, o, v)	*((volatile uint16_t *)((h) + (o))) = (v)
171981d751aStsutsui #define __write_4(h, o, v)	*((volatile uint32_t *)((h) + (o))) = (v)
172981d751aStsutsui #define __write_8(h, o, v)	*((volatile uint64_t *)((h) + (o))) = (v)
173fe41c75bSleo 
174fe41c75bSleo bus_space_tag_t
beb_alloc_bus_space_tag(bus_space_tag_t storage)175981d751aStsutsui beb_alloc_bus_space_tag(bus_space_tag_t storage)
176fe41c75bSleo {
177fe41c75bSleo 	bus_space_tag_t	beb_t;
178fe41c75bSleo 
17949110545Sleo 	/*
18049110545Sleo 	 * Allow the caller to specify storage space for the tag. This
181f5df4b68Sthorpej 	 * is used during console config (when kmem_alloc() can't be used).
18249110545Sleo 	 */
18349110545Sleo 	if (storage != NULL)
18449110545Sleo 		beb_t = storage;
18549110545Sleo 	else {
186f5df4b68Sthorpej 		beb_t = kmem_alloc(sizeof(*beb_t), KM_SLEEP);
18749110545Sleo 	}
188c363a9cbScegger 	memset(beb_t, 0, sizeof(*beb_t));
189fe41c75bSleo 
190fe41c75bSleo 	beb_t->abs_p_1   = beb_bus_space_peek_1;
191fe41c75bSleo 	beb_t->abs_p_2   = beb_bus_space_peek_2;
192fe41c75bSleo 	beb_t->abs_p_4   = beb_bus_space_peek_4;
193fe41c75bSleo 	beb_t->abs_p_8   = beb_bus_space_peek_8;
194fe41c75bSleo 	beb_t->abs_r_1   = beb_bus_space_read_1;
195fe41c75bSleo 	beb_t->abs_r_2   = beb_bus_space_read_2;
196fe41c75bSleo 	beb_t->abs_r_4   = beb_bus_space_read_4;
197fe41c75bSleo 	beb_t->abs_r_8   = beb_bus_space_read_8;
198fe41c75bSleo 	beb_t->abs_rs_1  = beb_bus_space_read_1;
199fe41c75bSleo 	beb_t->abs_rs_2  = beb_bus_space_read_2;
200fe41c75bSleo 	beb_t->abs_rs_4  = beb_bus_space_read_4;
201fe41c75bSleo 	beb_t->abs_rs_8  = beb_bus_space_read_8;
202fe41c75bSleo 	beb_t->abs_rm_1  = beb_bus_space_read_multi_1;
203fe41c75bSleo 	beb_t->abs_rm_2  = beb_bus_space_read_multi_2;
204fe41c75bSleo 	beb_t->abs_rm_4  = beb_bus_space_read_multi_4;
205fe41c75bSleo 	beb_t->abs_rm_8  = beb_bus_space_read_multi_8;
206fe41c75bSleo 	beb_t->abs_rms_1 = beb_bus_space_read_multi_1;
207fe41c75bSleo 	beb_t->abs_rms_2 = beb_bus_space_read_multi_2;
208fe41c75bSleo 	beb_t->abs_rms_4 = beb_bus_space_read_multi_4;
209fe41c75bSleo 	beb_t->abs_rms_8 = beb_bus_space_read_multi_8;
210fe41c75bSleo 	beb_t->abs_rr_1  = beb_bus_space_read_region_1;
211fe41c75bSleo 	beb_t->abs_rr_2  = beb_bus_space_read_region_2;
212fe41c75bSleo 	beb_t->abs_rr_4  = beb_bus_space_read_region_4;
213fe41c75bSleo 	beb_t->abs_rr_8  = beb_bus_space_read_region_8;
214ef7f5080Sleo 	beb_t->abs_rrs_1 = beb_bus_space_read_region_1;
215ef7f5080Sleo 	beb_t->abs_rrs_2 = beb_bus_space_read_region_2;
216ef7f5080Sleo 	beb_t->abs_rrs_4 = beb_bus_space_read_region_4;
217ef7f5080Sleo 	beb_t->abs_rrs_8 = beb_bus_space_read_region_8;
218fe41c75bSleo 	beb_t->abs_w_1   = beb_bus_space_write_1;
219fe41c75bSleo 	beb_t->abs_w_2   = beb_bus_space_write_2;
220fe41c75bSleo 	beb_t->abs_w_4   = beb_bus_space_write_4;
221fe41c75bSleo 	beb_t->abs_w_8   = beb_bus_space_write_8;
222fe41c75bSleo 	beb_t->abs_ws_1  = beb_bus_space_write_1;
223fe41c75bSleo 	beb_t->abs_ws_2  = beb_bus_space_write_2;
224fe41c75bSleo 	beb_t->abs_ws_4  = beb_bus_space_write_4;
225fe41c75bSleo 	beb_t->abs_ws_8  = beb_bus_space_write_8;
226fe41c75bSleo 	beb_t->abs_wm_1  = beb_bus_space_write_multi_1;
227fe41c75bSleo 	beb_t->abs_wm_2  = beb_bus_space_write_multi_2;
228fe41c75bSleo 	beb_t->abs_wm_4  = beb_bus_space_write_multi_4;
229fe41c75bSleo 	beb_t->abs_wm_8  = beb_bus_space_write_multi_8;
230fe41c75bSleo 	beb_t->abs_wms_1 = beb_bus_space_write_multi_1;
231fe41c75bSleo 	beb_t->abs_wms_2 = beb_bus_space_write_multi_2;
232fe41c75bSleo 	beb_t->abs_wms_4 = beb_bus_space_write_multi_4;
233fe41c75bSleo 	beb_t->abs_wms_8 = beb_bus_space_write_multi_8;
234fe41c75bSleo 	beb_t->abs_wr_1  = beb_bus_space_write_region_1;
235fe41c75bSleo 	beb_t->abs_wr_2  = beb_bus_space_write_region_2;
236fe41c75bSleo 	beb_t->abs_wr_4  = beb_bus_space_write_region_4;
237fe41c75bSleo 	beb_t->abs_wr_8  = beb_bus_space_write_region_8;
238ef7f5080Sleo 	beb_t->abs_wrs_1 = beb_bus_space_write_region_1;
239ef7f5080Sleo 	beb_t->abs_wrs_2 = beb_bus_space_write_region_2;
240ef7f5080Sleo 	beb_t->abs_wrs_4 = beb_bus_space_write_region_4;
241ef7f5080Sleo 	beb_t->abs_wrs_8 = beb_bus_space_write_region_8;
242fe41c75bSleo 	beb_t->abs_sm_1  = beb_bus_space_set_multi_1;
243fe41c75bSleo 	beb_t->abs_sm_2  = beb_bus_space_set_multi_2;
244fe41c75bSleo 	beb_t->abs_sm_4  = beb_bus_space_set_multi_4;
245fe41c75bSleo 	beb_t->abs_sm_8  = beb_bus_space_set_multi_8;
246fe41c75bSleo 	beb_t->abs_sr_1  = beb_bus_space_set_region_1;
247fe41c75bSleo 	beb_t->abs_sr_2  = beb_bus_space_set_region_2;
248fe41c75bSleo 	beb_t->abs_sr_4  = beb_bus_space_set_region_4;
249fe41c75bSleo 	beb_t->abs_sr_8  = beb_bus_space_set_region_8;
250fe41c75bSleo 
251981d751aStsutsui 	return beb_t;
252fe41c75bSleo }
253fe41c75bSleo 
254fe41c75bSleo 
255fe41c75bSleo /*
256fe41c75bSleo  * The various access functions
257fe41c75bSleo  */
258fe41c75bSleo 
259fe41c75bSleo /*
26030b80223Stsutsui  *	int bus_space_peek_N(bus_space_tag_t tag,
26130b80223Stsutsui  *		bus_space_handle_t sh, bus_size_t offset);
262fe41c75bSleo  *
263fe41c75bSleo  * Check if the address is suitable for reading N-byte quantities.
264fe41c75bSleo  */
265fe41c75bSleo static int
beb_bus_space_peek_1(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o)266981d751aStsutsui beb_bus_space_peek_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
267fe41c75bSleo {
268981d751aStsutsui 
269981d751aStsutsui 	return !badbaddr((void *)(h + o), 1);
270fe41c75bSleo }
271fe41c75bSleo 
272fe41c75bSleo static int
beb_bus_space_peek_2(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o)273981d751aStsutsui beb_bus_space_peek_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
274fe41c75bSleo {
275981d751aStsutsui 
276981d751aStsutsui 	return !badbaddr((void *)(h + o), 2);
277fe41c75bSleo }
278fe41c75bSleo 
279fe41c75bSleo static int
beb_bus_space_peek_4(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o)280981d751aStsutsui beb_bus_space_peek_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
281fe41c75bSleo {
282981d751aStsutsui 
283981d751aStsutsui 	return !badbaddr((void *)(h + o), 4);
284fe41c75bSleo }
285fe41c75bSleo 
286fe41c75bSleo static int
beb_bus_space_peek_8(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o)287981d751aStsutsui beb_bus_space_peek_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
288fe41c75bSleo {
289981d751aStsutsui 
290981d751aStsutsui 	return !badbaddr((void *)(h + o), 8);
291fe41c75bSleo }
292fe41c75bSleo 
293fe41c75bSleo /*
294981d751aStsutsui  *	uintX_t bus_space_read_N(bus_space_tag_t tag,
29530b80223Stsutsui  *		bus_space_handle_t bsh, bus_size_t offset);
296fe41c75bSleo  *
297fe41c75bSleo  * Return an 1, 2, 4, or 8 byte value read from the bus_space described
298fe41c75bSleo  * by tag/handle at `offset'. The value is converted to host-endian.
299fe41c75bSleo  */
300981d751aStsutsui static uint8_t
beb_bus_space_read_1(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o)301981d751aStsutsui beb_bus_space_read_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
302fe41c75bSleo {
303981d751aStsutsui 
304981d751aStsutsui 	return __read_1(h, o);
305fe41c75bSleo }
306fe41c75bSleo 
307981d751aStsutsui static uint16_t
beb_bus_space_read_2(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o)308981d751aStsutsui beb_bus_space_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
309fe41c75bSleo {
310981d751aStsutsui 
311981d751aStsutsui 	return __read_2(h, o);
312fe41c75bSleo }
313fe41c75bSleo 
314981d751aStsutsui static uint32_t
beb_bus_space_read_4(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o)315981d751aStsutsui beb_bus_space_read_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
316fe41c75bSleo {
317981d751aStsutsui 
318981d751aStsutsui 	return __read_4(h, o);
319fe41c75bSleo }
320fe41c75bSleo 
321981d751aStsutsui static uint64_t
beb_bus_space_read_8(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o)322981d751aStsutsui beb_bus_space_read_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
323fe41c75bSleo {
324981d751aStsutsui 
325981d751aStsutsui 	return __read_8(h, o);
326fe41c75bSleo }
327fe41c75bSleo 
328fe41c75bSleo /*
329981d751aStsutsui  *	uintX_t bus_space_write_N(bus_space_tag_t tag,
330981d751aStsutsui  *		bus_space_handle_t bsh, bus_size_t offset, uintX_t val);
331fe41c75bSleo  *
332fe41c75bSleo  * Write an 1, 2, 4, or 8 byte value to the bus_space described by tag/handle
333fe41c75bSleo  * at `offset'. The value `val' is converted from host to bus endianness
334fe41c75bSleo  * before being written.
335fe41c75bSleo  */
336fe41c75bSleo static void
beb_bus_space_write_1(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint8_t v)337981d751aStsutsui beb_bus_space_write_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
338981d751aStsutsui     uint8_t v)
339fe41c75bSleo {
340981d751aStsutsui 
341fe41c75bSleo 	__write_1(h, o, v);
342fe41c75bSleo }
343fe41c75bSleo 
344fe41c75bSleo static void
beb_bus_space_write_2(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint16_t v)345981d751aStsutsui beb_bus_space_write_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
346981d751aStsutsui     uint16_t v)
347fe41c75bSleo {
348981d751aStsutsui 
349fe41c75bSleo 	__write_2(h, o, v);
350fe41c75bSleo }
351fe41c75bSleo 
352fe41c75bSleo static void
beb_bus_space_write_4(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint32_t v)353981d751aStsutsui beb_bus_space_write_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
354981d751aStsutsui     uint32_t v)
355fe41c75bSleo {
356981d751aStsutsui 
357fe41c75bSleo 	__write_4(h, o, v);
358fe41c75bSleo }
359fe41c75bSleo 
360fe41c75bSleo static void
beb_bus_space_write_8(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint64_t v)361981d751aStsutsui beb_bus_space_write_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
362981d751aStsutsui     uint64_t v)
363fe41c75bSleo {
364981d751aStsutsui 
365fe41c75bSleo 	__write_8(h, o, v);
366fe41c75bSleo }
367fe41c75bSleo 
368fe41c75bSleo /*
36930b80223Stsutsui  *	void bus_space_read_multi_N(bus_space_tag_t tag,
370981d751aStsutsui  *		bus_space_handle_t bsh, bus_size_t offset, uintX_t *address,
37130b80223Stsutsui  *		bus_size_t count);
372fe41c75bSleo  *
373fe41c75bSleo  * Read 'count' 1, 2, 4, or 8 byte values from the bus_space described by
374fe41c75bSleo  * tag/handle at `offset' and store them in the address range starting at
375d20841bbSwiz  * 'address'. The values are converted to CPU endian order before being
376fe41c75bSleo  * being stored.
377fe41c75bSleo  */
378fe41c75bSleo static void
beb_bus_space_read_multi_1(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint8_t * a,bus_size_t c)379981d751aStsutsui beb_bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h,
380981d751aStsutsui     bus_size_t o, uint8_t *a, bus_size_t c)
381fe41c75bSleo {
382981d751aStsutsui 
383fe41c75bSleo 	for (; c; a++, c--)
384fe41c75bSleo 		*a = __read_1(h, o);
385fe41c75bSleo }
386981d751aStsutsui 
387fe41c75bSleo static void
beb_bus_space_read_multi_2(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint16_t * a,bus_size_t c)388981d751aStsutsui beb_bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h,
389981d751aStsutsui     bus_size_t o, uint16_t *a, bus_size_t c)
390fe41c75bSleo {
391981d751aStsutsui 
392fe41c75bSleo 	for (; c; a++, c--)
393fe41c75bSleo 		*a = __read_2(h, o);
394fe41c75bSleo }
395fe41c75bSleo 
396fe41c75bSleo static void
beb_bus_space_read_multi_4(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint32_t * a,bus_size_t c)397981d751aStsutsui beb_bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h,
398981d751aStsutsui     bus_size_t o, uint32_t *a, bus_size_t c)
399fe41c75bSleo {
400981d751aStsutsui 
401fe41c75bSleo 	for (; c; a++, c--)
402fe41c75bSleo 		*a = __read_4(h, o);
403fe41c75bSleo }
404fe41c75bSleo 
405fe41c75bSleo static void
beb_bus_space_read_multi_8(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint64_t * a,bus_size_t c)406981d751aStsutsui beb_bus_space_read_multi_8(bus_space_tag_t t, bus_space_handle_t h,
407981d751aStsutsui     bus_size_t o, uint64_t *a, bus_size_t c)
408fe41c75bSleo {
409981d751aStsutsui 
410fe41c75bSleo 	for (; c; a++, c--)
411fe41c75bSleo 		*a = __read_8(h, o);
412fe41c75bSleo }
413fe41c75bSleo 
414fe41c75bSleo /*
41530b80223Stsutsui  *	void bus_space_write_multi_N(bus_space_tag_t tag,
416fe41c75bSleo  *		bus_space_handle_t bsh, bus_size_t offset,
417981d751aStsutsui  *		const uintX_t *address, bus_size_t count);
418fe41c75bSleo  *
419fe41c75bSleo  * Write 'count' 1, 2, 4, or 8 byte values from the address range starting
420fe41c75bSleo  * at 'address' to the bus_space described by tag/handle at `offset'.
421fe41c75bSleo  * The values are converted to bus endian order before being written to
422fe41c75bSleo  * the bus.
423fe41c75bSleo  */
424fe41c75bSleo static void
beb_bus_space_write_multi_1(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,const uint8_t * a,bus_size_t c)425981d751aStsutsui beb_bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h,
426981d751aStsutsui     bus_size_t o, const uint8_t *a, bus_size_t c)
427fe41c75bSleo {
428981d751aStsutsui 
429fe41c75bSleo 	for (; c; a++, c--)
430fe41c75bSleo 		__write_1(h, o, *a);
431fe41c75bSleo }
432fe41c75bSleo 
433fe41c75bSleo static void
beb_bus_space_write_multi_2(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,const uint16_t * a,bus_size_t c)434981d751aStsutsui beb_bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h,
435981d751aStsutsui     bus_size_t o, const uint16_t *a, bus_size_t c)
436fe41c75bSleo {
437981d751aStsutsui 
438fe41c75bSleo 	for (; c; a++, c--)
439fe41c75bSleo 		__write_2(h, o, *a);
440fe41c75bSleo }
441fe41c75bSleo 
442fe41c75bSleo static void
beb_bus_space_write_multi_4(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,const uint32_t * a,bus_size_t c)443981d751aStsutsui beb_bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h,
444981d751aStsutsui     bus_size_t o, const uint32_t *a, bus_size_t c)
445fe41c75bSleo {
446981d751aStsutsui 
447fe41c75bSleo 	for (; c; a++, c--)
448fe41c75bSleo 		__write_4(h, o, *a);
449fe41c75bSleo }
450fe41c75bSleo 
451fe41c75bSleo static void
beb_bus_space_write_multi_8(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,const uint64_t * a,bus_size_t c)452981d751aStsutsui beb_bus_space_write_multi_8(bus_space_tag_t t, bus_space_handle_t h,
453981d751aStsutsui     bus_size_t o, const uint64_t *a, bus_size_t c)
454fe41c75bSleo {
455981d751aStsutsui 
456fe41c75bSleo 	for (; c; a++, c--)
457fe41c75bSleo 		__write_8(h, o, *a);
458fe41c75bSleo }
459fe41c75bSleo 
460fe41c75bSleo /*
46130b80223Stsutsui  *	void bus_space_read_region_N(bus_space_tag_t tag,
462fe41c75bSleo  *		bus_space_handle_t bsh, bus_size_t offset,
463981d751aStsutsui  *		uintN_t *addr, bus_size_t count);
464fe41c75bSleo  *
465fe41c75bSleo  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
466fe41c75bSleo  * described by tag/handle and starting at `offset' and copy into
467fe41c75bSleo  * buffer provided.
468fe41c75bSleo  */
469fe41c75bSleo static void
beb_bus_space_read_region_1(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint8_t * a,bus_size_t c)470981d751aStsutsui beb_bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h,
471981d751aStsutsui     bus_size_t o, uint8_t *a, bus_size_t c)
472fe41c75bSleo {
473981d751aStsutsui 
474fe41c75bSleo 	for (; c; a++, o++, c--)
475fe41c75bSleo 		*a = __read_1(h, o);
476fe41c75bSleo }
477fe41c75bSleo 
478fe41c75bSleo static void
beb_bus_space_read_region_2(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint16_t * a,bus_size_t c)479981d751aStsutsui beb_bus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h,
480981d751aStsutsui     bus_size_t o, uint16_t *a, bus_size_t c)
481fe41c75bSleo {
482981d751aStsutsui 
483fe41c75bSleo 	for (; c; a++, o += 2, c--)
484fe41c75bSleo 		*a = __read_2(h, o);
485fe41c75bSleo }
486fe41c75bSleo 
487fe41c75bSleo static void
beb_bus_space_read_region_4(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint32_t * a,bus_size_t c)488981d751aStsutsui beb_bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h,
489981d751aStsutsui     bus_size_t o, uint32_t *a, bus_size_t c)
490fe41c75bSleo {
491981d751aStsutsui 
492fe41c75bSleo 	for (; c; a++, o += 4, c--)
493fe41c75bSleo 		*a = __read_4(h, o);
494fe41c75bSleo }
495fe41c75bSleo 
496fe41c75bSleo static void
beb_bus_space_read_region_8(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint64_t * a,bus_size_t c)497981d751aStsutsui beb_bus_space_read_region_8(bus_space_tag_t t, bus_space_handle_t h,
498981d751aStsutsui     bus_size_t o, uint64_t *a, bus_size_t c)
499fe41c75bSleo {
500981d751aStsutsui 
501fe41c75bSleo 	for (; c; a++, o += 8, c--)
502fe41c75bSleo 		*a = __read_8(h, o);
503fe41c75bSleo }
504fe41c75bSleo 
505fe41c75bSleo /*
50630b80223Stsutsui  *	void bus_space_write_region_N(bus_space_tag_t tag,
507fe41c75bSleo  *		bus_space_handle_t bsh, bus_size_t offset,
508981d751aStsutsui  *		uintN_t *addr, bus_size_t count);
509fe41c75bSleo  *
510fe41c75bSleo  * Copy `count' 1, 2, 4, or 8 byte quantities from the buffer provided
511fe41c75bSleo  * into the bus space described by tag/handle and starting at `offset'.
512fe41c75bSleo  */
513fe41c75bSleo static void
beb_bus_space_write_region_1(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,const uint8_t * a,bus_size_t c)514981d751aStsutsui beb_bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h,
515981d751aStsutsui     bus_size_t o, const uint8_t *a, bus_size_t c)
516fe41c75bSleo {
517981d751aStsutsui 
518fe41c75bSleo 	for (; c; a++, o++, c--)
519fe41c75bSleo 		__write_1(h, o, *a);
520fe41c75bSleo }
521fe41c75bSleo 
522fe41c75bSleo static void
beb_bus_space_write_region_2(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,const uint16_t * a,bus_size_t c)523981d751aStsutsui beb_bus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h,
524981d751aStsutsui     bus_size_t o, const uint16_t *a, bus_size_t c)
525fe41c75bSleo {
526981d751aStsutsui 
527fe41c75bSleo 	for (; c; a++, o += 2, c--)
528fe41c75bSleo 		__write_2(h, o, *a);
529fe41c75bSleo }
530fe41c75bSleo 
531fe41c75bSleo static void
beb_bus_space_write_region_4(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,const uint32_t * a,bus_size_t c)532981d751aStsutsui beb_bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h,
533981d751aStsutsui     bus_size_t o, const uint32_t *a, bus_size_t c)
534fe41c75bSleo {
535981d751aStsutsui 
536fe41c75bSleo 	for (; c; a++, o += 4, c--)
537fe41c75bSleo 		__write_4(h, o, *a);
538fe41c75bSleo }
539fe41c75bSleo 
540fe41c75bSleo static void
beb_bus_space_write_region_8(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,const uint64_t * a,bus_size_t c)541981d751aStsutsui beb_bus_space_write_region_8(bus_space_tag_t t, bus_space_handle_t h,
542981d751aStsutsui     bus_size_t o, const uint64_t *a, bus_size_t c)
543fe41c75bSleo {
544981d751aStsutsui 
545fe41c75bSleo 	for (; c; a++, o += 8, c--)
546fe41c75bSleo 		__write_8(h, o, *a);
547fe41c75bSleo }
548fe41c75bSleo 
549fe41c75bSleo /*
55030b80223Stsutsui  *	void bus_space_set_multi_N(bus_space_tag_t tag,
551981d751aStsutsui  *		bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
55230b80223Stsutsui  *		bus_size_t count);
553fe41c75bSleo  *
554fe41c75bSleo  * Write the 1, 2, 4, or 8 byte value `val' to bus space described
555fe41c75bSleo  * by tag/handle/offset `count' times.
556fe41c75bSleo  */
557fe41c75bSleo 
558fe41c75bSleo static void
beb_bus_space_set_multi_1(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint8_t v,bus_size_t c)559981d751aStsutsui beb_bus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h,
560981d751aStsutsui     bus_size_t o, uint8_t v, bus_size_t c)
561fe41c75bSleo {
562981d751aStsutsui 
563fe41c75bSleo 	for (; c; c--)
564fe41c75bSleo 		__write_1(h, o, v);
565fe41c75bSleo }
566fe41c75bSleo 
567fe41c75bSleo static void
beb_bus_space_set_multi_2(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint16_t v,bus_size_t c)568981d751aStsutsui beb_bus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h,
569981d751aStsutsui     bus_size_t o, uint16_t v, bus_size_t c)
570fe41c75bSleo {
571981d751aStsutsui 
572fe41c75bSleo 	for (; c; c--)
573fe41c75bSleo 		__write_2(h, o, v);
574fe41c75bSleo }
575fe41c75bSleo 
576fe41c75bSleo static void
beb_bus_space_set_multi_4(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint32_t v,bus_size_t c)577981d751aStsutsui beb_bus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h,
578981d751aStsutsui     bus_size_t o, uint32_t v, bus_size_t c)
579fe41c75bSleo {
580981d751aStsutsui 
581fe41c75bSleo 	for (; c; c--)
582fe41c75bSleo 		__write_4(h, o, v);
583fe41c75bSleo }
584fe41c75bSleo 
585fe41c75bSleo static void
beb_bus_space_set_multi_8(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint64_t v,bus_size_t c)586981d751aStsutsui beb_bus_space_set_multi_8(bus_space_tag_t t, bus_space_handle_t h,
587981d751aStsutsui     bus_size_t o, uint64_t v, bus_size_t c)
588fe41c75bSleo {
589981d751aStsutsui 
590fe41c75bSleo 	for (; c; c--)
591fe41c75bSleo 		__write_8(h, o, v);
592fe41c75bSleo }
593fe41c75bSleo 
594fe41c75bSleo /*
59530b80223Stsutsui  *	void bus_space_set_region_N(bus_space_tag_t tag,
596981d751aStsutsui  *		bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
59730b80223Stsutsui  *		bus_size_t count);
598fe41c75bSleo  *
599fe41c75bSleo  * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
600fe41c75bSleo  * by tag/handle starting at `offset'.
601fe41c75bSleo  */
602fe41c75bSleo static void
beb_bus_space_set_region_1(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint8_t v,bus_size_t c)603981d751aStsutsui beb_bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h,
604981d751aStsutsui     bus_size_t o, uint8_t v, bus_size_t c)
605fe41c75bSleo {
606981d751aStsutsui 
607fe41c75bSleo 	for (; c; o++, c--)
608fe41c75bSleo 		__write_1(h, o, v);
609fe41c75bSleo }
610fe41c75bSleo 
611fe41c75bSleo static void
beb_bus_space_set_region_2(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint16_t v,bus_size_t c)612981d751aStsutsui beb_bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h,
613981d751aStsutsui     bus_size_t o, uint16_t v, bus_size_t c)
614fe41c75bSleo {
615981d751aStsutsui 
616fe41c75bSleo 	for (; c; o += 2, c--)
617fe41c75bSleo 		__write_2(h, o, v);
618fe41c75bSleo }
619fe41c75bSleo 
620fe41c75bSleo static void
beb_bus_space_set_region_4(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint32_t v,bus_size_t c)621981d751aStsutsui beb_bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h,
622981d751aStsutsui     bus_size_t o, uint32_t v, bus_size_t c)
623fe41c75bSleo {
624981d751aStsutsui 
625fe41c75bSleo 	for (; c; o += 4, c--)
626fe41c75bSleo 		__write_4(h, o, v);
627fe41c75bSleo }
628fe41c75bSleo 
629fe41c75bSleo static void
beb_bus_space_set_region_8(bus_space_tag_t t,bus_space_handle_t h,bus_size_t o,uint64_t v,bus_size_t c)630981d751aStsutsui beb_bus_space_set_region_8(bus_space_tag_t t, bus_space_handle_t h,
631981d751aStsutsui     bus_size_t o, uint64_t v, bus_size_t c)
632fe41c75bSleo {
633981d751aStsutsui 
634fe41c75bSleo 	for (; c; o += 8, c--)
635fe41c75bSleo 		__write_8(h, o, v);
636fe41c75bSleo }
637