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