bus_space_rmi.c revision 198957
1/*-
2 * Copyright (c) 2009 RMI Corporation
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD$
27 */
28#include <sys/cdefs.h>
29__FBSDID("$FreeBSD$");
30
31#include <sys/param.h>
32#include <sys/systm.h>
33#include <sys/bus.h>
34#include <sys/kernel.h>
35#include <sys/malloc.h>
36#include <sys/ktr.h>
37
38#include <vm/vm.h>
39#include <vm/pmap.h>
40#include <vm/vm_kern.h>
41#include <vm/vm_extern.h>
42
43#include <machine/bus.h>
44#include <machine/cache.h>
45void xlr_putc(char);
46void xlr_print_int(uint32_t);
47
48static int
49rmi_bus_space_map(void *t, bus_addr_t addr,
50    bus_size_t size, int flags,
51    bus_space_handle_t * bshp);
52
53
54static void
55rmi_bus_space_unmap(void *t, bus_space_handle_t bsh,
56    bus_size_t size);
57
58static int
59rmi_bus_space_subregion(void *t,
60    bus_space_handle_t bsh,
61    bus_size_t offset, bus_size_t size,
62    bus_space_handle_t * nbshp);
63
64static u_int8_t
65rmi_bus_space_read_1(void *t,
66    bus_space_handle_t handle,
67    bus_size_t offset);
68
69static u_int16_t
70rmi_bus_space_read_2(void *t,
71    bus_space_handle_t handle,
72    bus_size_t offset);
73
74static u_int32_t
75rmi_bus_space_read_4(void *t,
76    bus_space_handle_t handle,
77    bus_size_t offset);
78
79static void
80rmi_bus_space_read_multi_1(void *t,
81    bus_space_handle_t handle,
82    bus_size_t offset, u_int8_t * addr,
83    size_t count);
84
85static void
86rmi_bus_space_read_multi_2(void *t,
87    bus_space_handle_t handle,
88    bus_size_t offset, u_int16_t * addr,
89    size_t count);
90
91static void
92rmi_bus_space_read_multi_4(void *t,
93    bus_space_handle_t handle,
94    bus_size_t offset, u_int32_t * addr,
95    size_t count);
96
97static void
98rmi_bus_space_read_region_1(void *t,
99    bus_space_handle_t bsh,
100    bus_size_t offset, u_int8_t * addr,
101    size_t count);
102
103static void
104rmi_bus_space_read_region_2(void *t,
105    bus_space_handle_t bsh,
106    bus_size_t offset, u_int16_t * addr,
107    size_t count);
108
109static void
110rmi_bus_space_read_region_4(void *t,
111    bus_space_handle_t bsh,
112    bus_size_t offset, u_int32_t * addr,
113    size_t count);
114
115static void
116rmi_bus_space_write_1(void *t,
117    bus_space_handle_t handle,
118    bus_size_t offset, u_int8_t value);
119
120static void
121rmi_bus_space_write_2(void *t,
122    bus_space_handle_t handle,
123    bus_size_t offset, u_int16_t value);
124
125static void
126rmi_bus_space_write_4(void *t,
127    bus_space_handle_t handle,
128    bus_size_t offset, u_int32_t value);
129
130static void
131rmi_bus_space_write_multi_1(void *t,
132    bus_space_handle_t handle,
133    bus_size_t offset,
134    const u_int8_t * addr,
135    size_t count);
136static void
137rmi_bus_space_write_multi_2(void *t,
138    bus_space_handle_t handle,
139    bus_size_t offset,
140    const u_int16_t * addr,
141    size_t count);
142
143static void
144rmi_bus_space_write_multi_4(void *t,
145    bus_space_handle_t handle,
146    bus_size_t offset,
147    const u_int32_t * addr,
148    size_t count);
149
150static void
151rmi_bus_space_write_region_2(void *t,
152    bus_space_handle_t bsh,
153    bus_size_t offset,
154    const u_int16_t * addr,
155    size_t count);
156
157static void
158rmi_bus_space_write_region_4(void *t,
159    bus_space_handle_t bsh,
160    bus_size_t offset,
161    const u_int32_t * addr,
162    size_t count);
163
164
165static void
166rmi_bus_space_set_region_2(void *t,
167    bus_space_handle_t bsh,
168    bus_size_t offset, u_int16_t value,
169    size_t count);
170static void
171rmi_bus_space_set_region_4(void *t,
172    bus_space_handle_t bsh,
173    bus_size_t offset, u_int32_t value,
174    size_t count);
175
176static void
177rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
178    bus_size_t offset __unused, bus_size_t len __unused, int flags);
179
180
181static void
182rmi_bus_space_copy_region_2(void *t,
183    bus_space_handle_t bsh1,
184    bus_size_t off1,
185    bus_space_handle_t bsh2,
186    bus_size_t off2, size_t count);
187
188u_int8_t
189rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
190    bus_size_t offset);
191
192static u_int16_t
193rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
194    bus_size_t offset);
195
196static u_int32_t
197rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
198    bus_size_t offset);
199static void
200rmi_bus_space_read_multi_stream_1(void *t,
201    bus_space_handle_t handle,
202    bus_size_t offset, u_int8_t * addr,
203    size_t count);
204
205static void
206rmi_bus_space_read_multi_stream_2(void *t,
207    bus_space_handle_t handle,
208    bus_size_t offset, u_int16_t * addr,
209    size_t count);
210
211static void
212rmi_bus_space_read_multi_stream_4(void *t,
213    bus_space_handle_t handle,
214    bus_size_t offset, u_int32_t * addr,
215    size_t count);
216
217void
218rmi_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
219    bus_size_t offset, u_int8_t value);
220static void
221rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
222    bus_size_t offset, u_int16_t value);
223
224static void
225rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
226    bus_size_t offset, u_int32_t value);
227
228static void
229rmi_bus_space_write_multi_stream_1(void *t,
230    bus_space_handle_t handle,
231    bus_size_t offset,
232    const u_int8_t * addr,
233    size_t count);
234static void
235rmi_bus_space_write_multi_stream_2(void *t,
236    bus_space_handle_t handle,
237    bus_size_t offset,
238    const u_int16_t * addr,
239    size_t count);
240
241static void
242rmi_bus_space_write_multi_stream_4(void *t,
243    bus_space_handle_t handle,
244    bus_size_t offset,
245    const u_int32_t * addr,
246    size_t count);
247
248
249static struct bus_space local_rmi_bus_space = {
250	/* cookie */
251	(void *)0,
252
253	/* mapping/unmapping */
254	rmi_bus_space_map,
255	rmi_bus_space_unmap,
256	rmi_bus_space_subregion,
257
258	/* allocation/deallocation */
259	NULL,
260	NULL,
261
262	/* barrier */
263	rmi_bus_space_barrier,
264
265	/* read (single) */
266	rmi_bus_space_read_1,
267	rmi_bus_space_read_2,
268	rmi_bus_space_read_4,
269	NULL,
270
271	/* read multiple */
272	rmi_bus_space_read_multi_1,
273	rmi_bus_space_read_multi_2,
274	rmi_bus_space_read_multi_4,
275	NULL,
276
277	/* read region */
278	rmi_bus_space_read_region_1,
279	rmi_bus_space_read_region_2,
280	rmi_bus_space_read_region_4,
281	NULL,
282
283	/* write (single) */
284	rmi_bus_space_write_1,
285	rmi_bus_space_write_2,
286	rmi_bus_space_write_4,
287	NULL,
288
289	/* write multiple */
290	rmi_bus_space_write_multi_1,
291	rmi_bus_space_write_multi_2,
292	rmi_bus_space_write_multi_4,
293	NULL,
294
295	/* write region */
296	NULL,
297	rmi_bus_space_write_region_2,
298	rmi_bus_space_write_region_4,
299	NULL,
300
301	/* set multiple */
302	NULL,
303	NULL,
304	NULL,
305	NULL,
306
307	/* set region */
308	NULL,
309	rmi_bus_space_set_region_2,
310	rmi_bus_space_set_region_4,
311	NULL,
312
313	/* copy */
314	NULL,
315	rmi_bus_space_copy_region_2,
316	NULL,
317	NULL,
318
319	/* read (single) stream */
320	rmi_bus_space_read_stream_1,
321	rmi_bus_space_read_stream_2,
322	rmi_bus_space_read_stream_4,
323	NULL,
324
325	/* read multiple stream */
326	rmi_bus_space_read_multi_stream_1,
327	rmi_bus_space_read_multi_stream_2,
328	rmi_bus_space_read_multi_stream_4,
329	NULL,
330
331	/* read region stream */
332	rmi_bus_space_read_region_1,
333	rmi_bus_space_read_region_2,
334	rmi_bus_space_read_region_4,
335	NULL,
336
337	/* write (single) stream */
338	rmi_bus_space_write_stream_1,
339	rmi_bus_space_write_stream_2,
340	rmi_bus_space_write_stream_4,
341	NULL,
342
343	/* write multiple stream */
344	rmi_bus_space_write_multi_stream_1,
345	rmi_bus_space_write_multi_stream_2,
346	rmi_bus_space_write_multi_stream_4,
347	NULL,
348
349	/* write region stream */
350	NULL,
351	rmi_bus_space_write_region_2,
352	rmi_bus_space_write_region_4,
353	NULL,
354};
355
356/* generic bus_space tag */
357bus_space_tag_t rmi_bus_space = &local_rmi_bus_space;
358
359#define	MIPS_BUS_SPACE_IO	0	/* space is i/o space */
360#define MIPS_BUS_SPACE_MEM	1	/* space is mem space */
361#define MIPS_BUS_SPACE_PCI	10	/* avoid conflict with other spaces */
362
363#define BUS_SPACE_UNRESTRICTED	(~0)
364
365#define SWAP32(x)\
366        (((x) & 0xff000000) >> 24) | \
367        (((x) & 0x000000ff) << 24) | \
368        (((x) & 0x0000ff00) << 8)  | \
369        (((x) & 0x00ff0000) >> 8)
370
371#define SWAP16(x)\
372        (((x) & 0xff00) >> 8) | \
373        (((x) & 0x00ff) << 8)
374
375/*
376 * Map a region of device bus space into CPU virtual address space.
377 */
378
379
380static int
381rmi_bus_space_map(void *t __unused, bus_addr_t addr,
382    bus_size_t size __unused, int flags __unused,
383    bus_space_handle_t * bshp)
384{
385
386	*bshp = addr;
387	return (0);
388}
389
390/*
391 * Unmap a region of device bus space.
392 */
393static void
394rmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
395    bus_size_t size __unused)
396{
397}
398
399/*
400 * Get a new handle for a subregion of an already-mapped area of bus space.
401 */
402
403static int
404rmi_bus_space_subregion(void *t __unused, bus_space_handle_t bsh,
405    bus_size_t offset, bus_size_t size __unused,
406    bus_space_handle_t * nbshp)
407{
408	*nbshp = bsh + offset;
409	return (0);
410}
411
412/*
413 * Read a 1, 2, 4, or 8 byte quantity from bus space
414 * described by tag/handle/offset.
415 */
416
417static u_int8_t
418rmi_bus_space_read_1(void *tag, bus_space_handle_t handle,
419    bus_size_t offset)
420{
421	if ((int)tag == MIPS_BUS_SPACE_PCI)
422		return (u_int8_t) (*(volatile u_int8_t *)(handle + offset));
423	else
424		return (u_int8_t) (*(volatile u_int32_t *)(handle + offset));
425}
426
427static u_int16_t
428rmi_bus_space_read_2(void *tag, bus_space_handle_t handle,
429    bus_size_t offset)
430{
431	if ((int)tag == MIPS_BUS_SPACE_PCI)
432		return SWAP16((u_int16_t) (*(volatile u_int16_t *)(handle + offset)));
433	else
434		return *(volatile u_int16_t *)(handle + offset);
435}
436
437static u_int32_t
438rmi_bus_space_read_4(void *tag, bus_space_handle_t handle,
439    bus_size_t offset)
440{
441	if ((int)tag == MIPS_BUS_SPACE_PCI)
442		return SWAP32((*(volatile u_int32_t *)(handle + offset)));
443	else
444		return (*(volatile u_int32_t *)(handle + offset));
445}
446
447
448
449/*
450 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
451 * described by tag/handle/offset and copy into buffer provided.
452 */
453static void
454rmi_bus_space_read_multi_1(void *tag, bus_space_handle_t handle,
455    bus_size_t offset, u_int8_t * addr, size_t count)
456{
457
458	if ((int)tag != MIPS_BUS_SPACE_PCI)
459		return;
460	while (count--) {
461		*addr = (*(volatile u_int8_t *)(handle + offset));
462		addr++;
463	}
464}
465
466static void
467rmi_bus_space_read_multi_2(void *tag, bus_space_handle_t handle,
468    bus_size_t offset, u_int16_t * addr, size_t count)
469{
470
471	if ((int)tag != MIPS_BUS_SPACE_PCI)
472		return;
473	while (count--) {
474		*addr = *(volatile u_int16_t *)(handle + offset);
475		*addr = SWAP16(*addr);
476		addr++;
477	}
478}
479
480static void
481rmi_bus_space_read_multi_4(void *tag, bus_space_handle_t handle,
482    bus_size_t offset, u_int32_t * addr, size_t count)
483{
484
485	if ((int)tag != MIPS_BUS_SPACE_PCI)
486		return;
487	while (count--) {
488		*addr = *(volatile u_int32_t *)(handle + offset);
489		*addr = SWAP32(*addr);
490		addr++;
491	}
492}
493
494/*
495 * Write the 1, 2, 4, or 8 byte value `value' to bus space
496 * described by tag/handle/offset.
497 */
498
499
500static void
501rmi_bus_space_write_1(void *tag, bus_space_handle_t handle,
502    bus_size_t offset, u_int8_t value)
503{
504	mips_sync();
505	if ((int)tag == MIPS_BUS_SPACE_PCI)
506		*(volatile u_int8_t *)(handle + offset) = value;
507	else
508		*(volatile u_int32_t *)(handle + offset) = (u_int32_t) value;
509}
510
511static void
512rmi_bus_space_write_2(void *tag, bus_space_handle_t handle,
513    bus_size_t offset, u_int16_t value)
514{
515	mips_sync();
516	if ((int)tag == MIPS_BUS_SPACE_PCI) {
517		*(volatile u_int16_t *)(handle + offset) = SWAP16(value);
518	} else
519		*(volatile u_int16_t *)(handle + offset) = value;
520}
521
522
523static void
524rmi_bus_space_write_4(void *tag, bus_space_handle_t handle,
525    bus_size_t offset, u_int32_t value)
526{
527	mips_sync();
528	if ((int)tag == MIPS_BUS_SPACE_PCI) {
529		*(volatile u_int32_t *)(handle + offset) = SWAP32(value);
530	} else
531		*(volatile u_int32_t *)(handle + offset) = value;
532}
533
534
535
536/*
537 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
538 * provided to bus space described by tag/handle/offset.
539 */
540
541
542static void
543rmi_bus_space_write_multi_1(void *tag, bus_space_handle_t handle,
544    bus_size_t offset, const u_int8_t * addr, size_t count)
545{
546	mips_sync();
547	if ((int)tag != MIPS_BUS_SPACE_PCI)
548		return;
549	while (count--) {
550		(*(volatile u_int8_t *)(handle + offset)) = *addr;
551		addr++;
552	}
553}
554
555static void
556rmi_bus_space_write_multi_2(void *tag, bus_space_handle_t handle,
557    bus_size_t offset, const u_int16_t * addr, size_t count)
558{
559	mips_sync();
560	if ((int)tag != MIPS_BUS_SPACE_PCI)
561		return;
562	while (count--) {
563		(*(volatile u_int16_t *)(handle + offset)) = SWAP16(*addr);
564		addr++;
565	}
566}
567
568static void
569rmi_bus_space_write_multi_4(void *tag, bus_space_handle_t handle,
570    bus_size_t offset, const u_int32_t * addr, size_t count)
571{
572	mips_sync();
573	if ((int)tag != MIPS_BUS_SPACE_PCI)
574		return;
575	while (count--) {
576		(*(volatile u_int32_t *)(handle + offset)) = SWAP32(*addr);
577		addr++;
578	}
579}
580
581/*
582 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
583 * by tag/handle starting at `offset'.
584 */
585
586static void
587rmi_bus_space_set_region_2(void *t, bus_space_handle_t bsh,
588    bus_size_t offset, u_int16_t value, size_t count)
589{
590	bus_addr_t addr = bsh + offset;
591
592	for (; count != 0; count--, addr += 2)
593		(*(volatile u_int16_t *)(addr)) = value;
594}
595
596static void
597rmi_bus_space_set_region_4(void *t, bus_space_handle_t bsh,
598    bus_size_t offset, u_int32_t value, size_t count)
599{
600	bus_addr_t addr = bsh + offset;
601
602	for (; count != 0; count--, addr += 4)
603		(*(volatile u_int32_t *)(addr)) = value;
604}
605
606
607/*
608 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
609 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
610 */
611static void
612rmi_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1,
613    bus_size_t off1, bus_space_handle_t bsh2,
614    bus_size_t off2, size_t count)
615{
616	printf("bus_space_copy_region_2 - unimplemented\n");
617}
618
619/*
620 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
621 * described by tag/handle/offset and copy into buffer provided.
622 */
623
624u_int8_t
625rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
626    bus_size_t offset)
627{
628
629	return *((volatile u_int8_t *)(handle + offset));
630}
631
632
633static u_int16_t
634rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
635    bus_size_t offset)
636{
637	return *(volatile u_int16_t *)(handle + offset);
638}
639
640
641static u_int32_t
642rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
643    bus_size_t offset)
644{
645	return (*(volatile u_int32_t *)(handle + offset));
646}
647
648
649static void
650rmi_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle,
651    bus_size_t offset, u_int8_t * addr, size_t count)
652{
653
654	if ((int)tag != MIPS_BUS_SPACE_PCI)
655		return;
656	while (count--) {
657		*addr = (*(volatile u_int8_t *)(handle + offset));
658		addr++;
659	}
660}
661
662static void
663rmi_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle,
664    bus_size_t offset, u_int16_t * addr, size_t count)
665{
666
667	if ((int)tag != MIPS_BUS_SPACE_PCI)
668		return;
669	while (count--) {
670		*addr = (*(volatile u_int16_t *)(handle + offset));
671		addr++;
672	}
673}
674
675static void
676rmi_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle,
677    bus_size_t offset, u_int32_t * addr, size_t count)
678{
679
680	if ((int)tag != MIPS_BUS_SPACE_PCI)
681		return;
682	while (count--) {
683		*addr = (*(volatile u_int32_t *)(handle + offset));
684		addr++;
685	}
686}
687
688
689
690/*
691 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
692 * described by tag/handle and starting at `offset' and copy into
693 * buffer provided.
694 */
695void
696rmi_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
697    bus_size_t offset, u_int8_t * addr, size_t count)
698{
699	bus_addr_t baddr = bsh + offset;
700
701	while (count--) {
702		*addr++ = (*(volatile u_int8_t *)(baddr));
703		baddr += 1;
704	}
705}
706
707void
708rmi_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
709    bus_size_t offset, u_int16_t * addr, size_t count)
710{
711	bus_addr_t baddr = bsh + offset;
712
713	while (count--) {
714		*addr++ = (*(volatile u_int16_t *)(baddr));
715		baddr += 2;
716	}
717}
718
719void
720rmi_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
721    bus_size_t offset, u_int32_t * addr, size_t count)
722{
723	bus_addr_t baddr = bsh + offset;
724
725	while (count--) {
726		*addr++ = (*(volatile u_int32_t *)(baddr));
727		baddr += 4;
728	}
729}
730
731
732void
733rmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
734    bus_size_t offset, u_int8_t value)
735{
736	mips_sync();
737	*(volatile u_int8_t *)(handle + offset) = value;
738}
739
740
741static void
742rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
743    bus_size_t offset, u_int16_t value)
744{
745	mips_sync();
746	*(volatile u_int16_t *)(handle + offset) = value;
747}
748
749
750static void
751rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
752    bus_size_t offset, u_int32_t value)
753{
754	mips_sync();
755	*(volatile u_int32_t *)(handle + offset) = value;
756}
757
758
759static void
760rmi_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle,
761    bus_size_t offset, const u_int8_t * addr, size_t count)
762{
763	mips_sync();
764	if ((int)tag != MIPS_BUS_SPACE_PCI)
765		return;
766	while (count--) {
767		(*(volatile u_int8_t *)(handle + offset)) = *addr;
768		addr++;
769	}
770}
771
772static void
773rmi_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle,
774    bus_size_t offset, const u_int16_t * addr, size_t count)
775{
776	mips_sync();
777	if ((int)tag != MIPS_BUS_SPACE_PCI)
778		return;
779	while (count--) {
780		(*(volatile u_int16_t *)(handle + offset)) = *addr;
781		addr++;
782	}
783}
784
785static void
786rmi_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle,
787    bus_size_t offset, const u_int32_t * addr, size_t count)
788{
789	mips_sync();
790	if ((int)tag != MIPS_BUS_SPACE_PCI)
791		return;
792	while (count--) {
793		(*(volatile u_int32_t *)(handle + offset)) = *addr;
794		addr++;
795	}
796}
797
798void
799rmi_bus_space_write_region_2(void *t,
800    bus_space_handle_t bsh,
801    bus_size_t offset,
802    const u_int16_t * addr,
803    size_t count)
804{
805	bus_addr_t baddr = (bus_addr_t) bsh + offset;
806
807	while (count--) {
808		(*(volatile u_int16_t *)(baddr)) = *addr;
809		addr++;
810		baddr += 2;
811	}
812}
813
814void
815rmi_bus_space_write_region_4(void *t, bus_space_handle_t bsh,
816    bus_size_t offset, const u_int32_t * addr, size_t count)
817{
818	bus_addr_t baddr = bsh + offset;
819
820	while (count--) {
821		(*(volatile u_int32_t *)(baddr)) = *addr;
822		addr++;
823		baddr += 4;
824	}
825}
826
827static void
828rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
829    bus_size_t offset __unused, bus_size_t len __unused, int flags)
830{
831
832}
833