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