be_bus.c revision 1.12
1/*	$NetBSD: be_bus.c,v 1.12 2009/03/08 05:25:30 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: be_bus.c,v 1.12 2009/03/08 05:25:30 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/*
43 * This file contains the common functions for using a big endian (linear)
44 * bus on a big endian atari.
45 */
46
47	/* Autoconf detection stuff */
48static int		beb_bus_space_peek_1(bus_space_tag_t,
49				bus_space_handle_t, bus_size_t);
50static int		beb_bus_space_peek_2(bus_space_tag_t,
51				bus_space_handle_t, bus_size_t);
52static int		beb_bus_space_peek_4(bus_space_tag_t,
53				bus_space_handle_t, bus_size_t);
54static int		beb_bus_space_peek_8(bus_space_tag_t,
55				bus_space_handle_t, bus_size_t);
56
57	/* read (single) */
58static uint8_t		beb_bus_space_read_1(bus_space_tag_t,
59				bus_space_handle_t, bus_size_t);
60static uint16_t		beb_bus_space_read_2(bus_space_tag_t,
61				bus_space_handle_t, bus_size_t);
62static uint32_t		beb_bus_space_read_4(bus_space_tag_t,
63				bus_space_handle_t, bus_size_t);
64static uint64_t		beb_bus_space_read_8(bus_space_tag_t,
65				bus_space_handle_t, bus_size_t);
66
67	/* write (single) */
68static void		beb_bus_space_write_1(bus_space_tag_t,
69				bus_space_handle_t, bus_size_t, uint8_t);
70static void		beb_bus_space_write_2(bus_space_tag_t,
71				bus_space_handle_t, bus_size_t, uint16_t);
72static void		beb_bus_space_write_4(bus_space_tag_t,
73				bus_space_handle_t, bus_size_t, uint32_t);
74static void		beb_bus_space_write_8(bus_space_tag_t,
75				bus_space_handle_t, bus_size_t, uint64_t);
76
77	/* read multiple */
78static void		beb_bus_space_read_multi_1(bus_space_tag_t,
79				bus_space_handle_t, bus_size_t, uint8_t *,
80				bus_size_t);
81static void		beb_bus_space_read_multi_2(bus_space_tag_t,
82				bus_space_handle_t, bus_size_t, uint16_t *,
83				bus_size_t);
84static void		beb_bus_space_read_multi_4(bus_space_tag_t,
85				bus_space_handle_t, bus_size_t, uint32_t *,
86				bus_size_t);
87static void		beb_bus_space_read_multi_8(bus_space_tag_t,
88				bus_space_handle_t, bus_size_t, uint64_t *,
89				bus_size_t);
90
91	/* write multiple */
92static void		beb_bus_space_write_multi_1(bus_space_tag_t,
93				bus_space_handle_t, bus_size_t,
94				const uint8_t *, bus_size_t);
95static void		beb_bus_space_write_multi_2(bus_space_tag_t,
96				bus_space_handle_t, bus_size_t,
97				const uint16_t *, bus_size_t);
98static void		beb_bus_space_write_multi_4(bus_space_tag_t,
99				bus_space_handle_t, bus_size_t,
100				const uint32_t *, bus_size_t);
101static void		beb_bus_space_write_multi_8(bus_space_tag_t,
102				bus_space_handle_t, bus_size_t,
103				const uint64_t *, bus_size_t);
104
105	/* read region */
106static void		beb_bus_space_read_region_1(bus_space_tag_t,
107				bus_space_handle_t, bus_size_t, uint8_t *,
108				bus_size_t);
109static void		beb_bus_space_read_region_2(bus_space_tag_t,
110				bus_space_handle_t, bus_size_t, uint16_t *,
111				bus_size_t);
112static void		beb_bus_space_read_region_4(bus_space_tag_t,
113				bus_space_handle_t, bus_size_t, uint32_t *,
114				bus_size_t);
115static void		beb_bus_space_read_region_8(bus_space_tag_t,
116				bus_space_handle_t, bus_size_t, uint64_t *,
117				bus_size_t);
118
119	/* read region */
120static void		beb_bus_space_write_region_1(bus_space_tag_t,
121				bus_space_handle_t, bus_size_t,
122				const uint8_t *, bus_size_t);
123static void		beb_bus_space_write_region_2(bus_space_tag_t,
124				bus_space_handle_t, bus_size_t,
125				const uint16_t *, bus_size_t);
126static void		beb_bus_space_write_region_4(bus_space_tag_t,
127				bus_space_handle_t, bus_size_t,
128				const uint32_t *, bus_size_t);
129static void		beb_bus_space_write_region_8(bus_space_tag_t,
130				bus_space_handle_t, bus_size_t,
131				const uint64_t *, bus_size_t);
132
133	/* set multi */
134static void		beb_bus_space_set_multi_1(bus_space_tag_t,
135				bus_space_handle_t, bus_size_t, uint8_t,
136				bus_size_t);
137static void		beb_bus_space_set_multi_2(bus_space_tag_t,
138				bus_space_handle_t, bus_size_t, uint16_t,
139				bus_size_t);
140static void		beb_bus_space_set_multi_4(bus_space_tag_t,
141				bus_space_handle_t, bus_size_t, uint32_t,
142				bus_size_t);
143static void		beb_bus_space_set_multi_8(bus_space_tag_t,
144				bus_space_handle_t, bus_size_t, uint64_t,
145				bus_size_t);
146
147	/* set region */
148static void		beb_bus_space_set_region_1(bus_space_tag_t,
149				bus_space_handle_t, bus_size_t, uint8_t,
150				bus_size_t);
151static void		beb_bus_space_set_region_2(bus_space_tag_t,
152				bus_space_handle_t, bus_size_t, uint16_t,
153				bus_size_t);
154static void		beb_bus_space_set_region_4(bus_space_tag_t,
155				bus_space_handle_t, bus_size_t, uint32_t,
156				bus_size_t);
157static void		beb_bus_space_set_region_8(bus_space_tag_t,
158				bus_space_handle_t, bus_size_t, uint64_t,
159				bus_size_t);
160
161/*
162 * Don't force a function call overhead on these primitives...
163 */
164#define __read_1(h, o)		*((volatile uint8_t  *)((h) + (o)))
165#define __read_2(h, o)		*((volatile uint16_t *)((h) + (o)))
166#define __read_4(h, o)		*((volatile uint32_t *)((h) + (o)))
167#define __read_8(h, o)		*((volatile uint64_t *)((h) + (o)))
168
169#define __write_1(h, o, v)	*((volatile uint8_t  *)((h) + (o))) = (v)
170#define __write_2(h, o, v)	*((volatile uint16_t *)((h) + (o))) = (v)
171#define __write_4(h, o, v)	*((volatile uint32_t *)((h) + (o))) = (v)
172#define __write_8(h, o, v)	*((volatile uint64_t *)((h) + (o))) = (v)
173
174bus_space_tag_t
175beb_alloc_bus_space_tag(bus_space_tag_t storage)
176{
177	bus_space_tag_t	beb_t;
178
179	/*
180	 * Allow the caller to specify storage space for the tag. This
181	 * is used during console config (when malloc() can't be used).
182	 */
183	if (storage != NULL)
184		beb_t = storage;
185	else {
186	    if ((beb_t = malloc(sizeof(*beb_t), M_TEMP, M_NOWAIT)) == NULL)
187		return(NULL);
188	}
189	bzero(beb_t, sizeof(*beb_t));
190
191	beb_t->abs_p_1   = beb_bus_space_peek_1;
192	beb_t->abs_p_2   = beb_bus_space_peek_2;
193	beb_t->abs_p_4   = beb_bus_space_peek_4;
194	beb_t->abs_p_8   = beb_bus_space_peek_8;
195	beb_t->abs_r_1   = beb_bus_space_read_1;
196	beb_t->abs_r_2   = beb_bus_space_read_2;
197	beb_t->abs_r_4   = beb_bus_space_read_4;
198	beb_t->abs_r_8   = beb_bus_space_read_8;
199	beb_t->abs_rs_1  = beb_bus_space_read_1;
200	beb_t->abs_rs_2  = beb_bus_space_read_2;
201	beb_t->abs_rs_4  = beb_bus_space_read_4;
202	beb_t->abs_rs_8  = beb_bus_space_read_8;
203	beb_t->abs_rm_1  = beb_bus_space_read_multi_1;
204	beb_t->abs_rm_2  = beb_bus_space_read_multi_2;
205	beb_t->abs_rm_4  = beb_bus_space_read_multi_4;
206	beb_t->abs_rm_8  = beb_bus_space_read_multi_8;
207	beb_t->abs_rms_1 = beb_bus_space_read_multi_1;
208	beb_t->abs_rms_2 = beb_bus_space_read_multi_2;
209	beb_t->abs_rms_4 = beb_bus_space_read_multi_4;
210	beb_t->abs_rms_8 = beb_bus_space_read_multi_8;
211	beb_t->abs_rr_1  = beb_bus_space_read_region_1;
212	beb_t->abs_rr_2  = beb_bus_space_read_region_2;
213	beb_t->abs_rr_4  = beb_bus_space_read_region_4;
214	beb_t->abs_rr_8  = beb_bus_space_read_region_8;
215	beb_t->abs_rrs_1 = beb_bus_space_read_region_1;
216	beb_t->abs_rrs_2 = beb_bus_space_read_region_2;
217	beb_t->abs_rrs_4 = beb_bus_space_read_region_4;
218	beb_t->abs_rrs_8 = beb_bus_space_read_region_8;
219	beb_t->abs_w_1   = beb_bus_space_write_1;
220	beb_t->abs_w_2   = beb_bus_space_write_2;
221	beb_t->abs_w_4   = beb_bus_space_write_4;
222	beb_t->abs_w_8   = beb_bus_space_write_8;
223	beb_t->abs_ws_1  = beb_bus_space_write_1;
224	beb_t->abs_ws_2  = beb_bus_space_write_2;
225	beb_t->abs_ws_4  = beb_bus_space_write_4;
226	beb_t->abs_ws_8  = beb_bus_space_write_8;
227	beb_t->abs_wm_1  = beb_bus_space_write_multi_1;
228	beb_t->abs_wm_2  = beb_bus_space_write_multi_2;
229	beb_t->abs_wm_4  = beb_bus_space_write_multi_4;
230	beb_t->abs_wm_8  = beb_bus_space_write_multi_8;
231	beb_t->abs_wms_1 = beb_bus_space_write_multi_1;
232	beb_t->abs_wms_2 = beb_bus_space_write_multi_2;
233	beb_t->abs_wms_4 = beb_bus_space_write_multi_4;
234	beb_t->abs_wms_8 = beb_bus_space_write_multi_8;
235	beb_t->abs_wr_1  = beb_bus_space_write_region_1;
236	beb_t->abs_wr_2  = beb_bus_space_write_region_2;
237	beb_t->abs_wr_4  = beb_bus_space_write_region_4;
238	beb_t->abs_wr_8  = beb_bus_space_write_region_8;
239	beb_t->abs_wrs_1 = beb_bus_space_write_region_1;
240	beb_t->abs_wrs_2 = beb_bus_space_write_region_2;
241	beb_t->abs_wrs_4 = beb_bus_space_write_region_4;
242	beb_t->abs_wrs_8 = beb_bus_space_write_region_8;
243	beb_t->abs_sm_1  = beb_bus_space_set_multi_1;
244	beb_t->abs_sm_2  = beb_bus_space_set_multi_2;
245	beb_t->abs_sm_4  = beb_bus_space_set_multi_4;
246	beb_t->abs_sm_8  = beb_bus_space_set_multi_8;
247	beb_t->abs_sr_1  = beb_bus_space_set_region_1;
248	beb_t->abs_sr_2  = beb_bus_space_set_region_2;
249	beb_t->abs_sr_4  = beb_bus_space_set_region_4;
250	beb_t->abs_sr_8  = beb_bus_space_set_region_8;
251
252	return beb_t;
253}
254
255
256/*
257 * The various access functions
258 */
259
260/*
261 *	int bus_space_peek_N(bus_space_tag_t tag,
262 *		bus_space_handle_t sh, bus_size_t offset);
263 *
264 * Check if the address is suitable for reading N-byte quantities.
265 */
266static int
267beb_bus_space_peek_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
268{
269
270	return !badbaddr((void *)(h + o), 1);
271}
272
273static int
274beb_bus_space_peek_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
275{
276
277	return !badbaddr((void *)(h + o), 2);
278}
279
280static int
281beb_bus_space_peek_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
282{
283
284	return !badbaddr((void *)(h + o), 4);
285}
286
287static int
288beb_bus_space_peek_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
289{
290
291	return !badbaddr((void *)(h + o), 8);
292}
293
294/*
295 *	uintX_t bus_space_read_N(bus_space_tag_t tag,
296 *		bus_space_handle_t bsh, bus_size_t offset);
297 *
298 * Return an 1, 2, 4, or 8 byte value read from the bus_space described
299 * by tag/handle at `offset'. The value is converted to host-endian.
300 */
301static uint8_t
302beb_bus_space_read_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
303{
304
305	return __read_1(h, o);
306}
307
308static uint16_t
309beb_bus_space_read_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
310{
311
312	return __read_2(h, o);
313}
314
315static uint32_t
316beb_bus_space_read_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
317{
318
319	return __read_4(h, o);
320}
321
322static uint64_t
323beb_bus_space_read_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o)
324{
325
326	return __read_8(h, o);
327}
328
329/*
330 *	uintX_t bus_space_write_N(bus_space_tag_t tag,
331 *		bus_space_handle_t bsh, bus_size_t offset, uintX_t val);
332 *
333 * Write an 1, 2, 4, or 8 byte value to the bus_space described by tag/handle
334 * at `offset'. The value `val' is converted from host to bus endianness
335 * before being written.
336 */
337static void
338beb_bus_space_write_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
339    uint8_t v)
340{
341
342	__write_1(h, o, v);
343}
344
345static void
346beb_bus_space_write_2(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
347    uint16_t v)
348{
349
350	__write_2(h, o, v);
351}
352
353static void
354beb_bus_space_write_4(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
355    uint32_t v)
356{
357
358	__write_4(h, o, v);
359}
360
361static void
362beb_bus_space_write_8(bus_space_tag_t t, bus_space_handle_t h, bus_size_t o,
363    uint64_t v)
364{
365
366	__write_8(h, o, v);
367}
368
369/*
370 *	void bus_space_read_multi_N(bus_space_tag_t tag,
371 *		bus_space_handle_t bsh, bus_size_t offset, uintX_t *address,
372 *	 	bus_size_t count);
373 *
374 * Read 'count' 1, 2, 4, or 8 byte values from the bus_space described by
375 * tag/handle at `offset' and store them in the address range starting at
376 * 'address'. The values are converted to CPU endian order before being
377 * being stored.
378 */
379static void
380beb_bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h,
381    bus_size_t o, uint8_t *a, bus_size_t c)
382{
383
384	for (; c; a++, c--)
385		*a = __read_1(h, o);
386}
387
388static void
389beb_bus_space_read_multi_2(bus_space_tag_t t, bus_space_handle_t h,
390    bus_size_t o, uint16_t *a, bus_size_t c)
391{
392
393	for (; c; a++, c--)
394		*a = __read_2(h, o);
395}
396
397static void
398beb_bus_space_read_multi_4(bus_space_tag_t t, bus_space_handle_t h,
399    bus_size_t o, uint32_t *a, bus_size_t c)
400{
401
402	for (; c; a++, c--)
403		*a = __read_4(h, o);
404}
405
406static void
407beb_bus_space_read_multi_8(bus_space_tag_t t, bus_space_handle_t h,
408    bus_size_t o, uint64_t *a, bus_size_t c)
409{
410
411	for (; c; a++, c--)
412		*a = __read_8(h, o);
413}
414
415/*
416 *	void bus_space_write_multi_N(bus_space_tag_t tag,
417 *		bus_space_handle_t bsh, bus_size_t offset,
418 *		const uintX_t *address, bus_size_t count);
419 *
420 * Write 'count' 1, 2, 4, or 8 byte values from the address range starting
421 * at 'address' to the bus_space described by tag/handle at `offset'.
422 * The values are converted to bus endian order before being written to
423 * the bus.
424 */
425static void
426beb_bus_space_write_multi_1(bus_space_tag_t t, bus_space_handle_t h,
427    bus_size_t o, const uint8_t *a, bus_size_t c)
428{
429
430	for (; c; a++, c--)
431		__write_1(h, o, *a);
432}
433
434static void
435beb_bus_space_write_multi_2(bus_space_tag_t t, bus_space_handle_t h,
436    bus_size_t o, const uint16_t *a, bus_size_t c)
437{
438
439	for (; c; a++, c--)
440		__write_2(h, o, *a);
441}
442
443static void
444beb_bus_space_write_multi_4(bus_space_tag_t t, bus_space_handle_t h,
445    bus_size_t o, const uint32_t *a, bus_size_t c)
446{
447
448	for (; c; a++, c--)
449		__write_4(h, o, *a);
450}
451
452static void
453beb_bus_space_write_multi_8(bus_space_tag_t t, bus_space_handle_t h,
454    bus_size_t o, const uint64_t *a, bus_size_t c)
455{
456
457	for (; c; a++, c--)
458		__write_8(h, o, *a);
459}
460
461/*
462 *	void bus_space_read_region_N(bus_space_tag_t tag,
463 *		bus_space_handle_t bsh, bus_size_t offset,
464 *		uintN_t *addr, bus_size_t count);
465 *
466 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
467 * described by tag/handle and starting at `offset' and copy into
468 * buffer provided.
469 */
470static void
471beb_bus_space_read_region_1(bus_space_tag_t t, bus_space_handle_t h,
472    bus_size_t o, uint8_t *a, bus_size_t c)
473{
474
475	for (; c; a++, o++, c--)
476		*a = __read_1(h, o);
477}
478
479static void
480beb_bus_space_read_region_2(bus_space_tag_t t, bus_space_handle_t h,
481    bus_size_t o, uint16_t *a, bus_size_t c)
482{
483
484	for (; c; a++, o += 2, c--)
485		*a = __read_2(h, o);
486}
487
488static void
489beb_bus_space_read_region_4(bus_space_tag_t t, bus_space_handle_t h,
490    bus_size_t o, uint32_t *a, bus_size_t c)
491{
492
493	for (; c; a++, o += 4, c--)
494		*a = __read_4(h, o);
495}
496
497static void
498beb_bus_space_read_region_8(bus_space_tag_t t, bus_space_handle_t h,
499    bus_size_t o, uint64_t *a, bus_size_t c)
500{
501
502	for (; c; a++, o += 8, c--)
503		*a = __read_8(h, o);
504}
505
506/*
507 *	void bus_space_write_region_N(bus_space_tag_t tag,
508 *		bus_space_handle_t bsh, bus_size_t offset,
509 *		uintN_t *addr, bus_size_t count);
510 *
511 * Copy `count' 1, 2, 4, or 8 byte quantities from the buffer provided
512 * into the bus space described by tag/handle and starting at `offset'.
513 */
514static void
515beb_bus_space_write_region_1(bus_space_tag_t t, bus_space_handle_t h,
516    bus_size_t o, const uint8_t *a, bus_size_t c)
517{
518
519	for (; c; a++, o++, c--)
520		__write_1(h, o, *a);
521}
522
523static void
524beb_bus_space_write_region_2(bus_space_tag_t t, bus_space_handle_t h,
525    bus_size_t o, const uint16_t *a, bus_size_t c)
526{
527
528	for (; c; a++, o += 2, c--)
529		__write_2(h, o, *a);
530}
531
532static void
533beb_bus_space_write_region_4(bus_space_tag_t t, bus_space_handle_t h,
534    bus_size_t o, const uint32_t *a, bus_size_t c)
535{
536
537	for (; c; a++, o += 4, c--)
538		__write_4(h, o, *a);
539}
540
541static void
542beb_bus_space_write_region_8(bus_space_tag_t t, bus_space_handle_t h,
543    bus_size_t o, const uint64_t *a, bus_size_t c)
544{
545
546	for (; c; a++, o += 8, c--)
547		__write_8(h, o, *a);
548}
549
550/*
551 *	void bus_space_set_multi_N(bus_space_tag_t tag,
552 *		bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
553 *		bus_size_t count);
554 *
555 * Write the 1, 2, 4, or 8 byte value `val' to bus space described
556 * by tag/handle/offset `count' times.
557 */
558
559static void
560beb_bus_space_set_multi_1(bus_space_tag_t t, bus_space_handle_t h,
561    bus_size_t o, uint8_t v, bus_size_t c)
562{
563
564	for (; c; c--)
565		__write_1(h, o, v);
566}
567
568static void
569beb_bus_space_set_multi_2(bus_space_tag_t t, bus_space_handle_t h,
570    bus_size_t o, uint16_t v, bus_size_t c)
571{
572
573	for (; c; c--)
574		__write_2(h, o, v);
575}
576
577static void
578beb_bus_space_set_multi_4(bus_space_tag_t t, bus_space_handle_t h,
579    bus_size_t o, uint32_t v, bus_size_t c)
580{
581
582	for (; c; c--)
583		__write_4(h, o, v);
584}
585
586static void
587beb_bus_space_set_multi_8(bus_space_tag_t t, bus_space_handle_t h,
588    bus_size_t o, uint64_t v, bus_size_t c)
589{
590
591	for (; c; c--)
592		__write_8(h, o, v);
593}
594
595/*
596 *	void bus_space_set_region_N(bus_space_tag_t tag,
597 *		bus_space_handle_t bsh, bus_size_t offset, uintN_t val,
598 *		bus_size_t count);
599 *
600 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
601 * by tag/handle starting at `offset'.
602 */
603static void
604beb_bus_space_set_region_1(bus_space_tag_t t, bus_space_handle_t h,
605    bus_size_t o, uint8_t v, bus_size_t c)
606{
607
608	for (; c; o++, c--)
609		__write_1(h, o, v);
610}
611
612static void
613beb_bus_space_set_region_2(bus_space_tag_t t, bus_space_handle_t h,
614    bus_size_t o, uint16_t v, bus_size_t c)
615{
616
617	for (; c; o += 2, c--)
618		__write_2(h, o, v);
619}
620
621static void
622beb_bus_space_set_region_4(bus_space_tag_t t, bus_space_handle_t h,
623    bus_size_t o, uint32_t v, bus_size_t c)
624{
625
626	for (; c; o += 4, c--)
627		__write_4(h, o, v);
628}
629
630static void
631beb_bus_space_set_region_8(bus_space_tag_t t, bus_space_handle_t h,
632    bus_size_t o, uint64_t v, bus_size_t c)
633{
634
635	for (; c; o += 8, c--)
636		__write_8(h, o, v);
637}
638