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