xref: /netbsd/sys/arch/atari/atari/mainbus.c (revision f5df4b68)
1 /*	$NetBSD: mainbus.c,v 1.13 2021/01/03 17:42:10 thorpej 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.13 2021/01/03 17:42:10 thorpej Exp $");
34 
35 #include <sys/types.h>
36 #include <sys/param.h>
37 #include <sys/systm.h>
38 #include <sys/kmem.h>
39 #include <machine/cpu.h>
40 #include <sys/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 	mb_t = kmem_zalloc(sizeof(*mb_t), KM_SLEEP);
171 	mb_t->abs_p_1   = mb_bus_space_peek_1;
172 	mb_t->abs_p_2   = mb_bus_space_peek_2;
173 	mb_t->abs_p_4   = mb_bus_space_peek_4;
174 	mb_t->abs_p_8   = mb_bus_space_peek_8;
175 	mb_t->abs_r_1   = mb_bus_space_read_1;
176 	mb_t->abs_r_2   = mb_bus_space_read_2;
177 	mb_t->abs_r_4   = mb_bus_space_read_4;
178 	mb_t->abs_r_8   = mb_bus_space_read_8;
179 	mb_t->abs_rs_1  = mb_bus_space_read_1;
180 	mb_t->abs_rs_2  = mb_bus_space_read_2;
181 	mb_t->abs_rs_4  = mb_bus_space_read_4;
182 	mb_t->abs_rs_8  = mb_bus_space_read_8;
183 	mb_t->abs_rm_1  = mb_bus_space_read_multi_1;
184 	mb_t->abs_rm_2  = mb_bus_space_read_multi_2;
185 	mb_t->abs_rm_4  = mb_bus_space_read_multi_4;
186 	mb_t->abs_rm_8  = mb_bus_space_read_multi_8;
187 	mb_t->abs_rms_1 = mb_bus_space_read_multi_1;
188 	mb_t->abs_rms_2 = mb_bus_space_read_multi_2;
189 	mb_t->abs_rms_4 = mb_bus_space_read_multi_4;
190 	mb_t->abs_rms_8 = mb_bus_space_read_multi_8;
191 	mb_t->abs_rr_1  = mb_bus_space_read_region_1;
192 	mb_t->abs_rr_2  = mb_bus_space_read_region_2;
193 	mb_t->abs_rr_4  = mb_bus_space_read_region_4;
194 	mb_t->abs_rr_8  = mb_bus_space_read_region_8;
195 	mb_t->abs_rrs_1 = mb_bus_space_read_region_1;
196 	mb_t->abs_rrs_2 = mb_bus_space_read_region_2;
197 	mb_t->abs_rrs_4 = mb_bus_space_read_region_4;
198 	mb_t->abs_rrs_8 = mb_bus_space_read_region_8;
199 	mb_t->abs_w_1   = mb_bus_space_write_1;
200 	mb_t->abs_w_2   = mb_bus_space_write_2;
201 	mb_t->abs_w_4   = mb_bus_space_write_4;
202 	mb_t->abs_w_8   = mb_bus_space_write_8;
203 	mb_t->abs_ws_1  = mb_bus_space_write_1;
204 	mb_t->abs_ws_2  = mb_bus_space_write_2;
205 	mb_t->abs_ws_4  = mb_bus_space_write_4;
206 	mb_t->abs_ws_8  = mb_bus_space_write_8;
207 	mb_t->abs_wm_1  = mb_bus_space_write_multi_1;
208 	mb_t->abs_wm_2  = mb_bus_space_write_multi_2;
209 	mb_t->abs_wm_4  = mb_bus_space_write_multi_4;
210 	mb_t->abs_wm_8  = mb_bus_space_write_multi_8;
211 	mb_t->abs_wms_1 = mb_bus_space_write_multi_1;
212 	mb_t->abs_wms_2 = mb_bus_space_write_multi_2;
213 	mb_t->abs_wms_4 = mb_bus_space_write_multi_4;
214 	mb_t->abs_wms_8 = mb_bus_space_write_multi_8;
215 	mb_t->abs_wr_1  = mb_bus_space_write_region_1;
216 	mb_t->abs_wr_2  = mb_bus_space_write_region_2;
217 	mb_t->abs_wr_4  = mb_bus_space_write_region_4;
218 	mb_t->abs_wr_8  = mb_bus_space_write_region_8;
219 	mb_t->abs_wrs_1 = mb_bus_space_write_region_1;
220 	mb_t->abs_wrs_2 = mb_bus_space_write_region_2;
221 	mb_t->abs_wrs_4 = mb_bus_space_write_region_4;
222 	mb_t->abs_wrs_8 = mb_bus_space_write_region_8;
223 	mb_t->abs_sm_1  = mb_bus_space_set_multi_1;
224 	mb_t->abs_sm_2  = mb_bus_space_set_multi_2;
225 	mb_t->abs_sm_4  = mb_bus_space_set_multi_4;
226 	mb_t->abs_sm_8  = mb_bus_space_set_multi_8;
227 	mb_t->abs_sr_1  = mb_bus_space_set_region_1;
228 	mb_t->abs_sr_2  = mb_bus_space_set_region_2;
229 	mb_t->abs_sr_4  = mb_bus_space_set_region_4;
230 	mb_t->abs_sr_8  = mb_bus_space_set_region_8;
231 
232 	return mb_t;
233 }
234 
235 void
236 mb_free_bus_space_tag(bus_space_tag_t mb_t)
237 {
238 
239 	kmem_free(mb_t, sizeof(*mb_t));
240 }
241 
242 static int
243 mb_bus_space_peek_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
244 {
245 
246 	return !badbaddr((void *)(calc_addr(h, o, t->stride, t->wo_1)), 1);
247 }
248 
249 static int
250 mb_bus_space_peek_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
251 {
252 
253 	return !badbaddr((void *)(calc_addr(h, o, t->stride, t->wo_2)), 2);
254 }
255 
256 static int
257 mb_bus_space_peek_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
258 {
259 
260 	return !badbaddr((void *)(calc_addr(h, o, t->stride, t->wo_4)), 4);
261 }
262 
263 static int
264 mb_bus_space_peek_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
265 {
266 
267 	return !badbaddr((void *)(calc_addr(h, o, t->stride, t->wo_8)), 8);
268 }
269 
270 static uint8_t
271 mb_bus_space_read_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
272 {
273 
274 	return __read_1(t, h, o);
275 }
276 
277 static uint16_t
278 mb_bus_space_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
279 {
280 
281 	return __read_2(t, h, o);
282 }
283 
284 static uint32_t
285 mb_bus_space_read_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
286 {
287 
288 	return __read_4(t, h, o);
289 }
290 
291 static uint64_t
292 mb_bus_space_read_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
293 {
294 
295 	return __read_8(t, h, o);
296 }
297 
298 static void
299 mb_bus_space_write_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
300     uint8_t v)
301 {
302 
303 	__write_1(t, h, o, v);
304 }
305 
306 static void
307 mb_bus_space_write_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
308     uint16_t v)
309 {
310 
311 	__write_2(t, h, o, v);
312 }
313 
314 static void
315 mb_bus_space_write_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
316     uint32_t v)
317 {
318 
319 	__write_4(t, h, o, v);
320 }
321 
322 static void
323 mb_bus_space_write_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
324     uint64_t v)
325 {
326 
327 	__write_8(t, h, o, v);
328 }
329 
330 
331 static void
332 mb_bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h,
333     bus_size_t o, uint8_t *a, bus_size_t c)
334 {
335 	volatile uint8_t	*ba;
336 
337 	ba = (volatile uint8_t *)calc_addr(h, o, t->stride, t->wo_1);
338 	for (; c; a++, c--)
339 		*a = *ba;
340 }
341 
342 static void
343 mb_bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h,
344     bus_size_t o, uint16_t *a, bus_size_t c)
345 {
346 	volatile uint16_t	*ba;
347 
348 	ba = (volatile uint16_t *)calc_addr(h, o, t->stride, t->wo_2);
349 	for (; c; a++, c--)
350 		*a = *ba;
351 }
352 
353 static void
354 mb_bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h,
355     bus_size_t o, uint32_t *a, bus_size_t c)
356 {
357 	volatile uint32_t	*ba;
358 
359 	ba = (volatile uint32_t *)calc_addr(h, o, t->stride, t->wo_4);
360 	for (; c; a++, c--)
361 		*a = *ba;
362 }
363 
364 static void
365 mb_bus_space_read_multi_8(bus_space_tag_t t, bus_space_handle_t h,
366     bus_size_t o, uint64_t *a, bus_size_t c)
367 {
368 	volatile uint64_t	*ba;
369 
370 	ba = (volatile uint64_t *)calc_addr(h, o, t->stride, t->wo_8);
371 	for (; c; a++, c--)
372 		*a = *ba;
373 }
374 
375 static void
376 mb_bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h,
377     bus_size_t o, const uint8_t *a, bus_size_t c)
378 {
379 	volatile uint8_t	*ba;
380 
381 	ba = (volatile uint8_t *)calc_addr(h, o, t->stride, t->wo_1);
382 	for (; c; a++, c--)
383 		*ba = *a;
384 }
385 
386 static void
387 mb_bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h,
388     bus_size_t o, const uint16_t *a, bus_size_t c)
389 {
390 	volatile uint16_t	*ba;
391 
392 	ba = (volatile uint16_t *)calc_addr(h, o, t->stride, t->wo_2);
393 	for (; c; a++, c--)
394 		*ba = *a;
395 }
396 
397 static void
398 mb_bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h,
399     bus_size_t o, const uint32_t *a, bus_size_t c)
400 {
401 	volatile uint32_t	*ba;
402 
403 	ba = (volatile uint32_t *)calc_addr(h, o, t->stride, t->wo_4);
404 	for (; c; a++, c--)
405 		*ba = *a;
406 }
407 
408 static void
409 mb_bus_space_write_multi_8(bus_space_tag_t t, bus_space_handle_t h,
410     bus_size_t o, const uint64_t *a, bus_size_t c)
411 {
412 	volatile uint64_t	*ba;
413 
414 	ba = (volatile uint64_t *)calc_addr(h, o, t->stride, t->wo_8);
415 	for (; c; a++, c--)
416 		*ba = *a;
417 }
418 
419 /*
420  *	void bus_space_read_region_N(bus_space_tag_t tag,
421  *		bus_space_handle_t bsh, bus_size_t offset,
422  *		uintN_t *addr, size_t count);
423  *
424  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
425  * described by tag/handle and starting at `offset' and copy into
426  * buffer provided.
427  */
428 static void
429 mb_bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h,
430     bus_size_t o, uint8_t *a, bus_size_t c)
431 {
432 
433 	for (; c; a++, o++, c--)
434 		*a = __read_1(t, h, o);
435 }
436 
437 static void
438 mb_bus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h,
439     bus_size_t o, uint16_t *a, bus_size_t c)
440 {
441 
442 	for (; c; a++, o += 2, c--)
443 		*a = __read_2(t, h, o);
444 }
445 
446 static void
447 mb_bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h,
448     bus_size_t o, uint32_t *a, bus_size_t c)
449 {
450 
451 	for (; c; a++, o += 4, c--)
452 		*a = __read_4(t, h, o);
453 }
454 
455 static void
456 mb_bus_space_read_region_8(bus_space_tag_t t, bus_space_handle_t h,
457     bus_size_t o, uint64_t *a, bus_size_t c)
458 {
459 
460 	for (; c; a++, o += 8, c--)
461 		*a = __read_8(t, h, o);
462 }
463 
464 /*
465  *	void bus_space_write_region_N(bus_space_tag_t tag,
466  *		bus_space_handle_t bsh, bus_size_t offset,
467  *		uintN_t *addr, size_t count);
468  *
469  * Copy `count' 1, 2, 4, or 8 byte quantities from the buffer provided
470  * into the bus space described by tag/handle and starting at `offset'.
471  */
472 static void
473 mb_bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h,
474     bus_size_t o, const uint8_t *a, bus_size_t c)
475 {
476 
477 	for (; c; a++, o++, c--)
478 		__write_1(t, h, o, *a);
479 }
480 
481 static void
482 mb_bus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h,
483     bus_size_t o, const uint16_t *a, bus_size_t c)
484 {
485 
486 	for (; c; a++, o += 2, c--)
487 		__write_2(t, h, o, *a);
488 }
489 
490 static void
491 mb_bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h,
492     bus_size_t o, const uint32_t *a, bus_size_t c)
493 {
494 
495 	for (; c; a++, o += 4, c--)
496 		__write_4(t, h, o, *a);
497 }
498 
499 static void
500 mb_bus_space_write_region_8(bus_space_tag_t t, bus_space_handle_t h,
501     bus_size_t o, const uint64_t *a, bus_size_t c)
502 {
503 
504 	for (; c; a++, o += 8, c--)
505 		__write_8(t, h, o, *a);
506 }
507 
508 /*
509  *	void bus_space_set_multi_N(bus_space_tag_t tag,
510  *		bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
511  *		size_t count);
512  *
513  * Write the 1, 2, 4, or 8 byte value `val' to bus space described
514  * by tag/handle/offset `count' times.
515  */
516 
517 static void
518 mb_bus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h,
519     bus_size_t o, uint8_t v, bus_size_t c)
520 {
521 	volatile uint8_t	*ba;
522 
523 	ba = (volatile uint8_t *)calc_addr(h, o, t->stride, t->wo_1);
524 	for (; c; c--)
525 		*ba = v;
526 }
527 
528 static void
529 mb_bus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h,
530     bus_size_t o, uint16_t v, bus_size_t c)
531 {
532 	volatile uint16_t	*ba;
533 
534 	ba = (volatile uint16_t *)calc_addr(h, o, t->stride, t->wo_2);
535 	for (; c; c--)
536 		*ba = v;
537 }
538 
539 static void
540 mb_bus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h,
541     bus_size_t o, uint32_t v, bus_size_t c)
542 {
543 	volatile uint32_t	*ba;
544 
545 	ba = (volatile uint32_t *)calc_addr(h, o, t->stride, t->wo_4);
546 	for (; c; c--)
547 		*ba = v;
548 }
549 
550 static void
551 mb_bus_space_set_multi_8(bus_space_tag_t t, bus_space_handle_t h,
552     bus_size_t o, uint64_t v, bus_size_t c)
553 {
554 	volatile uint64_t	*ba;
555 
556 	ba = (volatile uint64_t *)calc_addr(h, o, t->stride, t->wo_8);
557 	for (; c; c--)
558 		*ba = v;
559 }
560 
561 /*
562  *	void bus_space_set_region_N(bus_space_tag_t tag,
563  *		bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
564  *		size_t count);
565  *
566  * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
567  * by tag/handle starting at `offset'.
568  */
569 static void
570 mb_bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h,
571     bus_size_t o, uint8_t v, bus_size_t c)
572 {
573 
574 	for (; c; o++, c--)
575 		__write_1(t, h, o, v);
576 }
577 
578 static void
579 mb_bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h,
580     bus_size_t o, uint16_t v, bus_size_t c)
581 {
582 
583 	for (; c; o += 2, c--)
584 		__write_2(t, h, o, v);
585 }
586 
587 static void
588 mb_bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h,
589     bus_size_t o, uint32_t v, bus_size_t c)
590 {
591 
592 	for (; c; o += 4, c--)
593 		__write_4(t, h, o, v);
594 }
595 
596 static void
597 mb_bus_space_set_region_8(bus_space_tag_t t, bus_space_handle_t h,
598     bus_size_t o, uint64_t v, bus_size_t c)
599 {
600 
601 	for (; c; o += 8, c--)
602 		__write_8(t, h, o, v);
603 }
604