bus_space_rmi_pci.c revision 302408
11590Srgrimes/*-
21590Srgrimes * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
31590Srgrimes * reserved.
41590Srgrimes *
51590Srgrimes * Redistribution and use in source and binary forms, with or without
61590Srgrimes * modification, are permitted provided that the following conditions are
71590Srgrimes * met:
81590Srgrimes *
91590Srgrimes * 1. Redistributions of source code must retain the above copyright
101590Srgrimes *    notice, this list of conditions and the following disclaimer.
111590Srgrimes * 2. Redistributions in binary form must reproduce the above copyright
121590Srgrimes *    notice, this list of conditions and the following disclaimer in
131590Srgrimes *    the documentation and/or other materials provided with the
141590Srgrimes *    distribution.
151590Srgrimes *
161590Srgrimes * THIS SOFTWARE IS PROVIDED BY Netlogic Microsystems ``AS IS'' AND
171590Srgrimes * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
181590Srgrimes * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
191590Srgrimes * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETLOGIC OR CONTRIBUTORS BE
201590Srgrimes * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
211590Srgrimes * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
221590Srgrimes * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
231590Srgrimes * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
241590Srgrimes * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
251590Srgrimes * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
261590Srgrimes * THE POSSIBILITY OF SUCH DAMAGE.
271590Srgrimes *
281590Srgrimes * NETLOGIC_BSD */
291590Srgrimes
301590Srgrimes#include <sys/cdefs.h>
3187295Sdwmalone__FBSDID("$FreeBSD: stable/11/sys/mips/nlm/bus_space_rmi_pci.c 279387 2015-02-28 00:17:29Z jchandra $");
321590Srgrimes
331590Srgrimes#include <sys/param.h>
341590Srgrimes#include <sys/systm.h>
351590Srgrimes#include <sys/bus.h>
3687628Sdwmalone#include <sys/kernel.h>
371590Srgrimes#include <sys/endian.h>
3887628Sdwmalone#include <sys/malloc.h>
391590Srgrimes#include <sys/ktr.h>
4087628Sdwmalone
411590Srgrimes#include <vm/vm.h>
4287628Sdwmalone#include <vm/pmap.h>
4387628Sdwmalone#include <vm/vm_kern.h>
4487628Sdwmalone#include <vm/vm_extern.h>
451590Srgrimes
461590Srgrimes#include <machine/bus.h>
471590Srgrimes#include <machine/cache.h>
48200462Sdelphij
49132245Stjrstatic int
501590Srgrimesrmi_pci_bus_space_map(void *t, bus_addr_t addr,
511590Srgrimes    bus_size_t size, int flags,
52200462Sdelphij    bus_space_handle_t * bshp);
5323690Speter
54132245Stjrstatic void
551590Srgrimesrmi_pci_bus_space_unmap(void *t, bus_space_handle_t bsh,
56179652Swkoszek    bus_size_t size);
571590Srgrimes
581590Srgrimesstatic int
59102944Sdwmalonermi_pci_bus_space_subregion(void *t,
601590Srgrimes    bus_space_handle_t bsh,
61132245Stjr    bus_size_t offset, bus_size_t size,
62132245Stjr    bus_space_handle_t * nbshp);
631590Srgrimes
641590Srgrimesstatic u_int8_t
651590Srgrimesrmi_pci_bus_space_read_1(void *t,
661590Srgrimes    bus_space_handle_t handle,
67132245Stjr    bus_size_t offset);
68132245Stjr
6924360Simpstatic u_int16_t
701590Srgrimesrmi_pci_bus_space_read_2(void *t,
711590Srgrimes    bus_space_handle_t handle,
721590Srgrimes    bus_size_t offset);
731590Srgrimes
741590Srgrimesstatic u_int32_t
751590Srgrimesrmi_pci_bus_space_read_4(void *t,
761590Srgrimes    bus_space_handle_t handle,
771590Srgrimes    bus_size_t offset);
781590Srgrimes
791590Srgrimesstatic void
801590Srgrimesrmi_pci_bus_space_read_multi_1(void *t,
811590Srgrimes    bus_space_handle_t handle,
821590Srgrimes    bus_size_t offset, u_int8_t * addr,
831590Srgrimes    size_t count);
841590Srgrimes
851590Srgrimesstatic void
861590Srgrimesrmi_pci_bus_space_read_multi_2(void *t,
871590Srgrimes    bus_space_handle_t handle,
881590Srgrimes    bus_size_t offset, u_int16_t * addr,
891590Srgrimes    size_t count);
901590Srgrimes
911590Srgrimesstatic void
92132245Stjrrmi_pci_bus_space_read_multi_4(void *t,
931590Srgrimes    bus_space_handle_t handle,
941590Srgrimes    bus_size_t offset, u_int32_t * addr,
951590Srgrimes    size_t count);
96132245Stjr
97132245Stjrstatic void
981590Srgrimesrmi_pci_bus_space_read_region_1(void *t,
991590Srgrimes    bus_space_handle_t bsh,
1001590Srgrimes    bus_size_t offset, u_int8_t * addr,
101138883Sssouhlal    size_t count);
1021590Srgrimes
1031590Srgrimesstatic void
1041590Srgrimesrmi_pci_bus_space_read_region_2(void *t,
1051590Srgrimes    bus_space_handle_t bsh,
1061590Srgrimes    bus_size_t offset, u_int16_t * addr,
1071590Srgrimes    size_t count);
1081590Srgrimes
1091590Srgrimesstatic void
110102944Sdwmalonermi_pci_bus_space_read_region_4(void *t,
1111590Srgrimes    bus_space_handle_t bsh,
1121590Srgrimes    bus_size_t offset, u_int32_t * addr,
1131590Srgrimes    size_t count);
1141590Srgrimes
115static void
116rmi_pci_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_pci_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_pci_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_pci_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);
136
137static void
138rmi_pci_bus_space_write_multi_2(void *t,
139    bus_space_handle_t handle,
140    bus_size_t offset,
141    const u_int16_t * addr,
142    size_t count);
143
144static void
145rmi_pci_bus_space_write_multi_4(void *t,
146    bus_space_handle_t handle,
147    bus_size_t offset,
148    const u_int32_t * addr,
149    size_t count);
150
151static void
152rmi_pci_bus_space_write_region_2(void *t,
153    bus_space_handle_t bsh,
154    bus_size_t offset,
155    const u_int16_t * addr,
156    size_t count);
157
158static void
159rmi_pci_bus_space_write_region_4(void *t,
160    bus_space_handle_t bsh,
161    bus_size_t offset,
162    const u_int32_t * addr,
163    size_t count);
164
165static void
166rmi_pci_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);
170
171static void
172rmi_pci_bus_space_set_region_4(void *t,
173    bus_space_handle_t bsh,
174    bus_size_t offset, u_int32_t value,
175    size_t count);
176
177static void
178rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
179    bus_size_t offset __unused, bus_size_t len __unused, int flags);
180
181static void
182rmi_pci_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_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
190    bus_size_t offset);
191
192static u_int16_t
193rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
194    bus_size_t offset);
195
196static u_int32_t
197rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
198    bus_size_t offset);
199
200static void
201rmi_pci_bus_space_read_multi_stream_1(void *t,
202    bus_space_handle_t handle,
203    bus_size_t offset, u_int8_t * addr,
204    size_t count);
205
206static void
207rmi_pci_bus_space_read_multi_stream_2(void *t,
208    bus_space_handle_t handle,
209    bus_size_t offset, u_int16_t * addr,
210    size_t count);
211
212static void
213rmi_pci_bus_space_read_multi_stream_4(void *t,
214    bus_space_handle_t handle,
215    bus_size_t offset, u_int32_t * addr,
216    size_t count);
217
218void
219rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
220    bus_size_t offset, u_int8_t value);
221
222static void
223rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
224    bus_size_t offset, u_int16_t value);
225
226static void
227rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
228    bus_size_t offset, u_int32_t value);
229
230static void
231rmi_pci_bus_space_write_multi_stream_1(void *t,
232    bus_space_handle_t handle,
233    bus_size_t offset,
234    const u_int8_t * addr,
235    size_t count);
236
237static void
238rmi_pci_bus_space_write_multi_stream_2(void *t,
239    bus_space_handle_t handle,
240    bus_size_t offset,
241    const u_int16_t * addr,
242    size_t count);
243
244static void
245rmi_pci_bus_space_write_multi_stream_4(void *t,
246    bus_space_handle_t handle,
247    bus_size_t offset,
248    const u_int32_t * addr,
249    size_t count);
250
251#define TODO() printf("XLR memory bus space function '%s' unimplemented\n", __func__)
252
253static struct bus_space local_rmi_pci_bus_space = {
254	/* cookie */
255	(void *)0,
256
257	/* mapping/unmapping */
258	rmi_pci_bus_space_map,
259	rmi_pci_bus_space_unmap,
260	rmi_pci_bus_space_subregion,
261
262	/* allocation/deallocation */
263	NULL,
264	NULL,
265
266	/* barrier */
267	rmi_pci_bus_space_barrier,
268
269	/* read (single) */
270	rmi_pci_bus_space_read_1,
271	rmi_pci_bus_space_read_2,
272	rmi_pci_bus_space_read_4,
273	NULL,
274
275	/* read multiple */
276	rmi_pci_bus_space_read_multi_1,
277	rmi_pci_bus_space_read_multi_2,
278	rmi_pci_bus_space_read_multi_4,
279	NULL,
280
281	/* read region */
282	rmi_pci_bus_space_read_region_1,
283	rmi_pci_bus_space_read_region_2,
284	rmi_pci_bus_space_read_region_4,
285	NULL,
286
287	/* write (single) */
288	rmi_pci_bus_space_write_1,
289	rmi_pci_bus_space_write_2,
290	rmi_pci_bus_space_write_4,
291	NULL,
292
293	/* write multiple */
294	rmi_pci_bus_space_write_multi_1,
295	rmi_pci_bus_space_write_multi_2,
296	rmi_pci_bus_space_write_multi_4,
297	NULL,
298
299	/* write region */
300	NULL,
301	rmi_pci_bus_space_write_region_2,
302	rmi_pci_bus_space_write_region_4,
303	NULL,
304
305	/* set multiple */
306	NULL,
307	NULL,
308	NULL,
309	NULL,
310
311	/* set region */
312	NULL,
313	rmi_pci_bus_space_set_region_2,
314	rmi_pci_bus_space_set_region_4,
315	NULL,
316
317	/* copy */
318	NULL,
319	rmi_pci_bus_space_copy_region_2,
320	NULL,
321	NULL,
322
323	/* read (single) stream */
324	rmi_pci_bus_space_read_stream_1,
325	rmi_pci_bus_space_read_stream_2,
326	rmi_pci_bus_space_read_stream_4,
327	NULL,
328
329	/* read multiple stream */
330	rmi_pci_bus_space_read_multi_stream_1,
331	rmi_pci_bus_space_read_multi_stream_2,
332	rmi_pci_bus_space_read_multi_stream_4,
333	NULL,
334
335	/* read region stream */
336	rmi_pci_bus_space_read_region_1,
337	rmi_pci_bus_space_read_region_2,
338	rmi_pci_bus_space_read_region_4,
339	NULL,
340
341	/* write (single) stream */
342	rmi_pci_bus_space_write_stream_1,
343	rmi_pci_bus_space_write_stream_2,
344	rmi_pci_bus_space_write_stream_4,
345	NULL,
346
347	/* write multiple stream */
348	rmi_pci_bus_space_write_multi_stream_1,
349	rmi_pci_bus_space_write_multi_stream_2,
350	rmi_pci_bus_space_write_multi_stream_4,
351	NULL,
352
353	/* write region stream */
354	NULL,
355	rmi_pci_bus_space_write_region_2,
356	rmi_pci_bus_space_write_region_4,
357	NULL,
358};
359
360/* generic bus_space tag */
361bus_space_tag_t rmi_pci_bus_space = &local_rmi_pci_bus_space;
362
363/*
364 * Map a region of device bus space into CPU virtual address space.
365 */
366static int
367rmi_pci_bus_space_map(void *t __unused, bus_addr_t addr,
368    bus_size_t size __unused, int flags __unused,
369    bus_space_handle_t * bshp)
370{
371	*bshp = addr;
372	return (0);
373}
374
375/*
376 * Unmap a region of device bus space.
377 */
378static void
379rmi_pci_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
380    bus_size_t size __unused)
381{
382}
383
384/*
385 * Get a new handle for a subregion of an already-mapped area of bus space.
386 */
387
388static int
389rmi_pci_bus_space_subregion(void *t __unused, bus_space_handle_t bsh,
390    bus_size_t offset, bus_size_t size __unused,
391    bus_space_handle_t * nbshp)
392{
393	*nbshp = bsh + offset;
394	return (0);
395}
396
397/*
398 * Read a 1, 2, 4, or 8 byte quantity from bus space
399 * described by tag/handle/offset.
400 */
401
402static u_int8_t
403rmi_pci_bus_space_read_1(void *tag, bus_space_handle_t handle,
404    bus_size_t offset)
405{
406	return (u_int8_t) (*(volatile u_int8_t *)(handle + offset));
407}
408
409static u_int16_t
410rmi_pci_bus_space_read_2(void *tag, bus_space_handle_t handle,
411    bus_size_t offset)
412{
413	u_int16_t value;
414
415	value = *(volatile u_int16_t *)(handle + offset);
416	return bswap16(value);
417}
418
419static u_int32_t
420rmi_pci_bus_space_read_4(void *tag, bus_space_handle_t handle,
421    bus_size_t offset)
422{
423	uint32_t value;
424
425	value = *(volatile u_int32_t *)(handle + offset);
426	return bswap32(value);
427}
428
429/*
430 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
431 * described by tag/handle/offset and copy into buffer provided.
432 */
433static void
434rmi_pci_bus_space_read_multi_1(void *tag, bus_space_handle_t handle,
435    bus_size_t offset, u_int8_t * addr, size_t count)
436{
437	while (count--) {
438		*addr = *(volatile u_int8_t *)(handle + offset);
439		addr++;
440	}
441}
442
443static void
444rmi_pci_bus_space_read_multi_2(void *tag, bus_space_handle_t handle,
445    bus_size_t offset, u_int16_t * addr, size_t count)
446{
447
448	while (count--) {
449		*addr = *(volatile u_int16_t *)(handle + offset);
450		*addr = bswap16(*addr);
451		addr++;
452	}
453}
454
455static void
456rmi_pci_bus_space_read_multi_4(void *tag, bus_space_handle_t handle,
457    bus_size_t offset, u_int32_t * addr, size_t count)
458{
459
460	while (count--) {
461		*addr = *(volatile u_int32_t *)(handle + offset);
462		*addr = bswap32(*addr);
463		addr++;
464	}
465}
466
467/*
468 * Write the 1, 2, 4, or 8 byte value `value' to bus space
469 * described by tag/handle/offset.
470 */
471
472static void
473rmi_pci_bus_space_write_1(void *tag, bus_space_handle_t handle,
474    bus_size_t offset, u_int8_t value)
475{
476	mips_sync();
477	*(volatile u_int8_t *)(handle + offset) = value;
478}
479
480static void
481rmi_pci_bus_space_write_2(void *tag, bus_space_handle_t handle,
482    bus_size_t offset, u_int16_t value)
483{
484	mips_sync();
485	*(volatile u_int16_t *)(handle + offset) = bswap16(value);
486}
487
488
489static void
490rmi_pci_bus_space_write_4(void *tag, bus_space_handle_t handle,
491    bus_size_t offset, u_int32_t value)
492{
493	mips_sync();
494	*(volatile u_int32_t *)(handle + offset) = bswap32(value);
495}
496
497/*
498 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
499 * provided to bus space described by tag/handle/offset.
500 */
501
502
503static void
504rmi_pci_bus_space_write_multi_1(void *tag, bus_space_handle_t handle,
505    bus_size_t offset, const u_int8_t * addr, size_t count)
506{
507	mips_sync();
508	while (count--) {
509		(*(volatile u_int8_t *)(handle + offset)) = *addr;
510		addr++;
511	}
512}
513
514static void
515rmi_pci_bus_space_write_multi_2(void *tag, bus_space_handle_t handle,
516    bus_size_t offset, const u_int16_t * addr, size_t count)
517{
518	mips_sync();
519	while (count--) {
520		(*(volatile u_int16_t *)(handle + offset)) = bswap16(*addr);
521		addr++;
522	}
523}
524
525static void
526rmi_pci_bus_space_write_multi_4(void *tag, bus_space_handle_t handle,
527    bus_size_t offset, const u_int32_t * addr, size_t count)
528{
529	mips_sync();
530	while (count--) {
531		(*(volatile u_int32_t *)(handle + offset)) = bswap32(*addr);
532		addr++;
533	}
534}
535
536/*
537 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
538 * by tag/handle starting at `offset'.
539 */
540
541static void
542rmi_pci_bus_space_set_region_2(void *t, bus_space_handle_t bsh,
543    bus_size_t offset, u_int16_t value, size_t count)
544{
545	bus_addr_t addr = bsh + offset;
546
547	for (; count != 0; count--, addr += 2)
548		(*(volatile u_int16_t *)(addr)) = value;
549}
550
551static void
552rmi_pci_bus_space_set_region_4(void *t, bus_space_handle_t bsh,
553    bus_size_t offset, u_int32_t value, size_t count)
554{
555	bus_addr_t addr = bsh + offset;
556
557	for (; count != 0; count--, addr += 4)
558		(*(volatile u_int32_t *)(addr)) = value;
559}
560
561
562/*
563 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
564 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
565 */
566static void
567rmi_pci_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1,
568    bus_size_t off1, bus_space_handle_t bsh2,
569    bus_size_t off2, size_t count)
570{
571	TODO();
572}
573
574/*
575 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
576 * described by tag/handle/offset and copy into buffer provided.
577 */
578
579u_int8_t
580rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
581    bus_size_t offset)
582{
583
584	return *((volatile u_int8_t *)(handle + offset));
585}
586
587
588static u_int16_t
589rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
590    bus_size_t offset)
591{
592	return *(volatile u_int16_t *)(handle + offset);
593}
594
595
596static u_int32_t
597rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
598    bus_size_t offset)
599{
600	return (*(volatile u_int32_t *)(handle + offset));
601}
602
603
604static void
605rmi_pci_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle,
606    bus_size_t offset, u_int8_t * addr, size_t count)
607{
608	while (count--) {
609		*addr = (*(volatile u_int8_t *)(handle + offset));
610		addr++;
611	}
612}
613
614static void
615rmi_pci_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle,
616    bus_size_t offset, u_int16_t * addr, size_t count)
617{
618	while (count--) {
619		*addr = (*(volatile u_int16_t *)(handle + offset));
620		addr++;
621	}
622}
623
624static void
625rmi_pci_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle,
626    bus_size_t offset, u_int32_t * addr, size_t count)
627{
628	while (count--) {
629		*addr = (*(volatile u_int32_t *)(handle + offset));
630		addr++;
631	}
632}
633
634
635
636/*
637 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
638 * described by tag/handle and starting at `offset' and copy into
639 * buffer provided.
640 */
641void
642rmi_pci_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
643    bus_size_t offset, u_int8_t * addr, size_t count)
644{
645	bus_addr_t baddr = bsh + offset;
646
647	while (count--) {
648		*addr++ = (*(volatile u_int8_t *)(baddr));
649		baddr += 1;
650	}
651}
652
653void
654rmi_pci_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
655    bus_size_t offset, u_int16_t * addr, size_t count)
656{
657	bus_addr_t baddr = bsh + offset;
658
659	while (count--) {
660		*addr++ = (*(volatile u_int16_t *)(baddr));
661		baddr += 2;
662	}
663}
664
665void
666rmi_pci_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
667    bus_size_t offset, u_int32_t * addr, size_t count)
668{
669	bus_addr_t baddr = bsh + offset;
670
671	while (count--) {
672		*addr++ = (*(volatile u_int32_t *)(baddr));
673		baddr += 4;
674	}
675}
676
677
678void
679rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
680    bus_size_t offset, u_int8_t value)
681{
682	mips_sync();
683	*(volatile u_int8_t *)(handle + offset) = value;
684}
685
686static void
687rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
688    bus_size_t offset, u_int16_t value)
689{
690	mips_sync();
691	*(volatile u_int16_t *)(handle + offset) = value;
692}
693
694
695static void
696rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
697    bus_size_t offset, u_int32_t value)
698{
699	mips_sync();
700	*(volatile u_int32_t *)(handle + offset) = value;
701}
702
703
704static void
705rmi_pci_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle,
706    bus_size_t offset, const u_int8_t * addr, size_t count)
707{
708	mips_sync();
709	while (count--) {
710		(*(volatile u_int8_t *)(handle + offset)) = *addr;
711		addr++;
712	}
713}
714
715static void
716rmi_pci_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle,
717    bus_size_t offset, const u_int16_t * addr, size_t count)
718{
719	mips_sync();
720	while (count--) {
721		(*(volatile u_int16_t *)(handle + offset)) = *addr;
722		addr++;
723	}
724}
725
726static void
727rmi_pci_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle,
728    bus_size_t offset, const u_int32_t * addr, size_t count)
729{
730	mips_sync();
731	while (count--) {
732		(*(volatile u_int32_t *)(handle + offset)) = *addr;
733		addr++;
734	}
735}
736
737void
738rmi_pci_bus_space_write_region_2(void *t,
739    bus_space_handle_t bsh,
740    bus_size_t offset,
741    const u_int16_t * addr,
742    size_t count)
743{
744	bus_addr_t baddr = (bus_addr_t) bsh + offset;
745
746	while (count--) {
747		(*(volatile u_int16_t *)(baddr)) = *addr;
748		addr++;
749		baddr += 2;
750	}
751}
752
753void
754rmi_pci_bus_space_write_region_4(void *t, bus_space_handle_t bsh,
755    bus_size_t offset, const u_int32_t * addr, size_t count)
756{
757	bus_addr_t baddr = bsh + offset;
758
759	while (count--) {
760		(*(volatile u_int32_t *)(baddr)) = *addr;
761		addr++;
762		baddr += 4;
763	}
764}
765
766static void
767rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
768    bus_size_t offset __unused, bus_size_t len __unused, int flags)
769{
770
771}
772