bus_space_rmi_pci.c revision 204136
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_pci.c 204136 2010-02-20 17:19:16Z rrs $
27 */
28#include <sys/cdefs.h>
29__FBSDID("$FreeBSD: head/sys/mips/rmi/bus_space_rmi_pci.c 204136 2010-02-20 17:19:16Z rrs $");
30
31#include <sys/param.h>
32#include <sys/systm.h>
33#include <sys/bus.h>
34#include <sys/kernel.h>
35#include <sys/endian.h>
36#include <sys/malloc.h>
37#include <sys/ktr.h>
38
39#include <vm/vm.h>
40#include <vm/pmap.h>
41#include <vm/vm_kern.h>
42#include <vm/vm_extern.h>
43
44#include <machine/bus.h>
45#include <machine/cache.h>
46
47static int
48rmi_pci_bus_space_map(void *t, bus_addr_t addr,
49    bus_size_t size, int flags,
50    bus_space_handle_t * bshp);
51
52static void
53rmi_pci_bus_space_unmap(void *t, bus_space_handle_t bsh,
54    bus_size_t size);
55
56static int
57rmi_pci_bus_space_subregion(void *t,
58    bus_space_handle_t bsh,
59    bus_size_t offset, bus_size_t size,
60    bus_space_handle_t * nbshp);
61
62static u_int8_t
63rmi_pci_bus_space_read_1(void *t,
64    bus_space_handle_t handle,
65    bus_size_t offset);
66
67static u_int16_t
68rmi_pci_bus_space_read_2(void *t,
69    bus_space_handle_t handle,
70    bus_size_t offset);
71
72static u_int32_t
73rmi_pci_bus_space_read_4(void *t,
74    bus_space_handle_t handle,
75    bus_size_t offset);
76
77static void
78rmi_pci_bus_space_read_multi_1(void *t,
79    bus_space_handle_t handle,
80    bus_size_t offset, u_int8_t * addr,
81    size_t count);
82
83static void
84rmi_pci_bus_space_read_multi_2(void *t,
85    bus_space_handle_t handle,
86    bus_size_t offset, u_int16_t * addr,
87    size_t count);
88
89static void
90rmi_pci_bus_space_read_multi_4(void *t,
91    bus_space_handle_t handle,
92    bus_size_t offset, u_int32_t * addr,
93    size_t count);
94
95static void
96rmi_pci_bus_space_read_region_1(void *t,
97    bus_space_handle_t bsh,
98    bus_size_t offset, u_int8_t * addr,
99    size_t count);
100
101static void
102rmi_pci_bus_space_read_region_2(void *t,
103    bus_space_handle_t bsh,
104    bus_size_t offset, u_int16_t * addr,
105    size_t count);
106
107static void
108rmi_pci_bus_space_read_region_4(void *t,
109    bus_space_handle_t bsh,
110    bus_size_t offset, u_int32_t * addr,
111    size_t count);
112
113static void
114rmi_pci_bus_space_write_1(void *t,
115    bus_space_handle_t handle,
116    bus_size_t offset, u_int8_t value);
117
118static void
119rmi_pci_bus_space_write_2(void *t,
120    bus_space_handle_t handle,
121    bus_size_t offset, u_int16_t value);
122
123static void
124rmi_pci_bus_space_write_4(void *t,
125    bus_space_handle_t handle,
126    bus_size_t offset, u_int32_t value);
127
128static void
129rmi_pci_bus_space_write_multi_1(void *t,
130    bus_space_handle_t handle,
131    bus_size_t offset,
132    const u_int8_t * addr,
133    size_t count);
134
135static void
136rmi_pci_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_pci_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_pci_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_pci_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_pci_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_pci_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_pci_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
179static void
180rmi_pci_bus_space_copy_region_2(void *t,
181    bus_space_handle_t bsh1,
182    bus_size_t off1,
183    bus_space_handle_t bsh2,
184    bus_size_t off2, size_t count);
185
186u_int8_t
187rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
188    bus_size_t offset);
189
190static u_int16_t
191rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
192    bus_size_t offset);
193
194static u_int32_t
195rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
196    bus_size_t offset);
197static void
198rmi_pci_bus_space_read_multi_stream_1(void *t,
199    bus_space_handle_t handle,
200    bus_size_t offset, u_int8_t * addr,
201    size_t count);
202
203static void
204rmi_pci_bus_space_read_multi_stream_2(void *t,
205    bus_space_handle_t handle,
206    bus_size_t offset, u_int16_t * addr,
207    size_t count);
208
209static void
210rmi_pci_bus_space_read_multi_stream_4(void *t,
211    bus_space_handle_t handle,
212    bus_size_t offset, u_int32_t * addr,
213    size_t count);
214
215void
216rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
217    bus_size_t offset, u_int8_t value);
218static void
219rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
220    bus_size_t offset, u_int16_t value);
221
222static void
223rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
224    bus_size_t offset, u_int32_t value);
225
226static void
227rmi_pci_bus_space_write_multi_stream_1(void *t,
228    bus_space_handle_t handle,
229    bus_size_t offset,
230    const u_int8_t * addr,
231    size_t count);
232static void
233rmi_pci_bus_space_write_multi_stream_2(void *t,
234    bus_space_handle_t handle,
235    bus_size_t offset,
236    const u_int16_t * addr,
237    size_t count);
238
239static void
240rmi_pci_bus_space_write_multi_stream_4(void *t,
241    bus_space_handle_t handle,
242    bus_size_t offset,
243    const u_int32_t * addr,
244    size_t count);
245
246#define TODO() printf("XLR memory bus space function '%s' unimplemented\n", __func__)
247
248static struct bus_space local_rmi_pci_bus_space = {
249	/* cookie */
250	(void *)0,
251
252	/* mapping/unmapping */
253	rmi_pci_bus_space_map,
254	rmi_pci_bus_space_unmap,
255	rmi_pci_bus_space_subregion,
256
257	/* allocation/deallocation */
258	NULL,
259	NULL,
260
261	/* barrier */
262	rmi_pci_bus_space_barrier,
263
264	/* read (single) */
265	rmi_pci_bus_space_read_1,
266	rmi_pci_bus_space_read_2,
267	rmi_pci_bus_space_read_4,
268	NULL,
269
270	/* read multiple */
271	rmi_pci_bus_space_read_multi_1,
272	rmi_pci_bus_space_read_multi_2,
273	rmi_pci_bus_space_read_multi_4,
274	NULL,
275
276	/* read region */
277	rmi_pci_bus_space_read_region_1,
278	rmi_pci_bus_space_read_region_2,
279	rmi_pci_bus_space_read_region_4,
280	NULL,
281
282	/* write (single) */
283	rmi_pci_bus_space_write_1,
284	rmi_pci_bus_space_write_2,
285	rmi_pci_bus_space_write_4,
286	NULL,
287
288	/* write multiple */
289	rmi_pci_bus_space_write_multi_1,
290	rmi_pci_bus_space_write_multi_2,
291	rmi_pci_bus_space_write_multi_4,
292	NULL,
293
294	/* write region */
295	NULL,
296	rmi_pci_bus_space_write_region_2,
297	rmi_pci_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_pci_bus_space_set_region_2,
309	rmi_pci_bus_space_set_region_4,
310	NULL,
311
312	/* copy */
313	NULL,
314	rmi_pci_bus_space_copy_region_2,
315	NULL,
316	NULL,
317
318	/* read (single) stream */
319	rmi_pci_bus_space_read_stream_1,
320	rmi_pci_bus_space_read_stream_2,
321	rmi_pci_bus_space_read_stream_4,
322	NULL,
323
324	/* read multiple stream */
325	rmi_pci_bus_space_read_multi_stream_1,
326	rmi_pci_bus_space_read_multi_stream_2,
327	rmi_pci_bus_space_read_multi_stream_4,
328	NULL,
329
330	/* read region stream */
331	rmi_pci_bus_space_read_region_1,
332	rmi_pci_bus_space_read_region_2,
333	rmi_pci_bus_space_read_region_4,
334	NULL,
335
336	/* write (single) stream */
337	rmi_pci_bus_space_write_stream_1,
338	rmi_pci_bus_space_write_stream_2,
339	rmi_pci_bus_space_write_stream_4,
340	NULL,
341
342	/* write multiple stream */
343	rmi_pci_bus_space_write_multi_stream_1,
344	rmi_pci_bus_space_write_multi_stream_2,
345	rmi_pci_bus_space_write_multi_stream_4,
346	NULL,
347
348	/* write region stream */
349	NULL,
350	rmi_pci_bus_space_write_region_2,
351	rmi_pci_bus_space_write_region_4,
352	NULL,
353};
354
355/* generic bus_space tag */
356bus_space_tag_t rmi_pci_bus_space = &local_rmi_pci_bus_space;
357
358/*
359 * Map a region of device bus space into CPU virtual address space.
360 */
361static int
362rmi_pci_bus_space_map(void *t __unused, bus_addr_t addr,
363    bus_size_t size __unused, int flags __unused,
364    bus_space_handle_t * bshp)
365{
366	*bshp = addr;
367	return (0);
368}
369
370/*
371 * Unmap a region of device bus space.
372 */
373static void
374rmi_pci_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
375    bus_size_t size __unused)
376{
377}
378
379/*
380 * Get a new handle for a subregion of an already-mapped area of bus space.
381 */
382
383static int
384rmi_pci_bus_space_subregion(void *t __unused, bus_space_handle_t bsh,
385    bus_size_t offset, bus_size_t size __unused,
386    bus_space_handle_t * nbshp)
387{
388	*nbshp = bsh + offset;
389	return (0);
390}
391
392/*
393 * Read a 1, 2, 4, or 8 byte quantity from bus space
394 * described by tag/handle/offset.
395 */
396
397static u_int8_t
398rmi_pci_bus_space_read_1(void *tag, bus_space_handle_t handle,
399    bus_size_t offset)
400{
401	return (u_int8_t) (*(volatile u_int8_t *)(handle + offset));
402}
403
404static u_int16_t
405rmi_pci_bus_space_read_2(void *tag, bus_space_handle_t handle,
406    bus_size_t offset)
407{
408	return bswap16((u_int16_t) (*(volatile u_int16_t *)(handle + offset)));
409}
410
411static u_int32_t
412rmi_pci_bus_space_read_4(void *tag, bus_space_handle_t handle,
413    bus_size_t offset)
414{
415	return bswap32((*(volatile u_int32_t *)(handle + offset)));
416}
417
418
419/*
420 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
421 * described by tag/handle/offset and copy into buffer provided.
422 */
423static void
424rmi_pci_bus_space_read_multi_1(void *tag, bus_space_handle_t handle,
425    bus_size_t offset, u_int8_t * addr, size_t count)
426{
427	while (count--) {
428		*addr = (*(volatile u_int8_t *)(handle + offset));
429		addr++;
430	}
431}
432
433static void
434rmi_pci_bus_space_read_multi_2(void *tag, bus_space_handle_t handle,
435    bus_size_t offset, u_int16_t * addr, size_t count)
436{
437
438	while (count--) {
439		*addr = *(volatile u_int16_t *)(handle + offset);
440		*addr = bswap16(*addr);
441		addr++;
442	}
443}
444
445static void
446rmi_pci_bus_space_read_multi_4(void *tag, bus_space_handle_t handle,
447    bus_size_t offset, u_int32_t * addr, size_t count)
448{
449
450	while (count--) {
451		*addr = *(volatile u_int32_t *)(handle + offset);
452		*addr = bswap32(*addr);
453		addr++;
454	}
455}
456
457/*
458 * Write the 1, 2, 4, or 8 byte value `value' to bus space
459 * described by tag/handle/offset.
460 */
461
462static void
463rmi_pci_bus_space_write_1(void *tag, bus_space_handle_t handle,
464    bus_size_t offset, u_int8_t value)
465{
466	mips_sync();
467	*(volatile u_int8_t *)(handle + offset) = value;
468}
469
470static void
471rmi_pci_bus_space_write_2(void *tag, bus_space_handle_t handle,
472    bus_size_t offset, u_int16_t value)
473{
474	mips_sync();
475	*(volatile u_int16_t *)(handle + offset) = bswap16(value);
476}
477
478
479static void
480rmi_pci_bus_space_write_4(void *tag, bus_space_handle_t handle,
481    bus_size_t offset, u_int32_t value)
482{
483	mips_sync();
484	*(volatile u_int32_t *)(handle + offset) = bswap32(value);
485}
486
487/*
488 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
489 * provided to bus space described by tag/handle/offset.
490 */
491
492
493static void
494rmi_pci_bus_space_write_multi_1(void *tag, bus_space_handle_t handle,
495    bus_size_t offset, const u_int8_t * addr, size_t count)
496{
497	mips_sync();
498	while (count--) {
499		(*(volatile u_int8_t *)(handle + offset)) = *addr;
500		addr++;
501	}
502}
503
504static void
505rmi_pci_bus_space_write_multi_2(void *tag, bus_space_handle_t handle,
506    bus_size_t offset, const u_int16_t * addr, size_t count)
507{
508	mips_sync();
509	while (count--) {
510		(*(volatile u_int16_t *)(handle + offset)) = bswap16(*addr);
511		addr++;
512	}
513}
514
515static void
516rmi_pci_bus_space_write_multi_4(void *tag, bus_space_handle_t handle,
517    bus_size_t offset, const u_int32_t * addr, size_t count)
518{
519	mips_sync();
520	while (count--) {
521		(*(volatile u_int32_t *)(handle + offset)) = bswap32(*addr);
522		addr++;
523	}
524}
525
526/*
527 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
528 * by tag/handle starting at `offset'.
529 */
530
531static void
532rmi_pci_bus_space_set_region_2(void *t, bus_space_handle_t bsh,
533    bus_size_t offset, u_int16_t value, size_t count)
534{
535	bus_addr_t addr = bsh + offset;
536
537	for (; count != 0; count--, addr += 2)
538		(*(volatile u_int16_t *)(addr)) = value;
539}
540
541static void
542rmi_pci_bus_space_set_region_4(void *t, bus_space_handle_t bsh,
543    bus_size_t offset, u_int32_t value, size_t count)
544{
545	bus_addr_t addr = bsh + offset;
546
547	for (; count != 0; count--, addr += 4)
548		(*(volatile u_int32_t *)(addr)) = value;
549}
550
551
552/*
553 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
554 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
555 */
556static void
557rmi_pci_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1,
558    bus_size_t off1, bus_space_handle_t bsh2,
559    bus_size_t off2, size_t count)
560{
561	TODO();
562}
563
564/*
565 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
566 * described by tag/handle/offset and copy into buffer provided.
567 */
568
569u_int8_t
570rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
571    bus_size_t offset)
572{
573
574	return *((volatile u_int8_t *)(handle + offset));
575}
576
577
578static u_int16_t
579rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
580    bus_size_t offset)
581{
582	return *(volatile u_int16_t *)(handle + offset);
583}
584
585
586static u_int32_t
587rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
588    bus_size_t offset)
589{
590	return (*(volatile u_int32_t *)(handle + offset));
591}
592
593
594static void
595rmi_pci_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle,
596    bus_size_t offset, u_int8_t * addr, size_t count)
597{
598	while (count--) {
599		*addr = (*(volatile u_int8_t *)(handle + offset));
600		addr++;
601	}
602}
603
604static void
605rmi_pci_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle,
606    bus_size_t offset, u_int16_t * addr, size_t count)
607{
608	while (count--) {
609		*addr = (*(volatile u_int16_t *)(handle + offset));
610		addr++;
611	}
612}
613
614static void
615rmi_pci_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle,
616    bus_size_t offset, u_int32_t * addr, size_t count)
617{
618	while (count--) {
619		*addr = (*(volatile u_int32_t *)(handle + offset));
620		addr++;
621	}
622}
623
624
625
626/*
627 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
628 * described by tag/handle and starting at `offset' and copy into
629 * buffer provided.
630 */
631void
632rmi_pci_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
633    bus_size_t offset, u_int8_t * addr, size_t count)
634{
635	bus_addr_t baddr = bsh + offset;
636
637	while (count--) {
638		*addr++ = (*(volatile u_int8_t *)(baddr));
639		baddr += 1;
640	}
641}
642
643void
644rmi_pci_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
645    bus_size_t offset, u_int16_t * addr, size_t count)
646{
647	bus_addr_t baddr = bsh + offset;
648
649	while (count--) {
650		*addr++ = (*(volatile u_int16_t *)(baddr));
651		baddr += 2;
652	}
653}
654
655void
656rmi_pci_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
657    bus_size_t offset, u_int32_t * addr, size_t count)
658{
659	bus_addr_t baddr = bsh + offset;
660
661	while (count--) {
662		*addr++ = (*(volatile u_int32_t *)(baddr));
663		baddr += 4;
664	}
665}
666
667
668void
669rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
670    bus_size_t offset, u_int8_t value)
671{
672	mips_sync();
673	*(volatile u_int8_t *)(handle + offset) = value;
674}
675
676static void
677rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
678    bus_size_t offset, u_int16_t value)
679{
680	mips_sync();
681	*(volatile u_int16_t *)(handle + offset) = value;
682}
683
684
685static void
686rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
687    bus_size_t offset, u_int32_t value)
688{
689	mips_sync();
690	*(volatile u_int32_t *)(handle + offset) = value;
691}
692
693
694static void
695rmi_pci_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle,
696    bus_size_t offset, const u_int8_t * addr, size_t count)
697{
698	mips_sync();
699	while (count--) {
700		(*(volatile u_int8_t *)(handle + offset)) = *addr;
701		addr++;
702	}
703}
704
705static void
706rmi_pci_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle,
707    bus_size_t offset, const u_int16_t * addr, size_t count)
708{
709	mips_sync();
710	while (count--) {
711		(*(volatile u_int16_t *)(handle + offset)) = *addr;
712		addr++;
713	}
714}
715
716static void
717rmi_pci_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle,
718    bus_size_t offset, const u_int32_t * addr, size_t count)
719{
720	mips_sync();
721	while (count--) {
722		(*(volatile u_int32_t *)(handle + offset)) = *addr;
723		addr++;
724	}
725}
726
727void
728rmi_pci_bus_space_write_region_2(void *t,
729    bus_space_handle_t bsh,
730    bus_size_t offset,
731    const u_int16_t * addr,
732    size_t count)
733{
734	bus_addr_t baddr = (bus_addr_t) bsh + offset;
735
736	while (count--) {
737		(*(volatile u_int16_t *)(baddr)) = *addr;
738		addr++;
739		baddr += 2;
740	}
741}
742
743void
744rmi_pci_bus_space_write_region_4(void *t, bus_space_handle_t bsh,
745    bus_size_t offset, const u_int32_t * addr, size_t count)
746{
747	bus_addr_t baddr = bsh + offset;
748
749	while (count--) {
750		(*(volatile u_int32_t *)(baddr)) = *addr;
751		addr++;
752		baddr += 4;
753	}
754}
755
756static void
757rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
758    bus_size_t offset __unused, bus_size_t len __unused, int flags)
759{
760
761}
762/*-
763 * Copyright (c) 2009 RMI Corporation
764 * All rights reserved.
765 *
766 * Redistribution and use in source and binary forms, with or without
767 * modification, are permitted provided that the following conditions
768 * are met:
769 * 1. Redistributions of source code must retain the above copyright
770 *    notice, this list of conditions and the following disclaimer.
771 * 2. Redistributions in binary form must reproduce the above copyright
772 *    notice, this list of conditions and the following disclaimer in the
773 *    documentation and/or other materials provided with the distribution.
774 *
775 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
776 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
777 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
778 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
779 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
780 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
781 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
782 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
783 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
784 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
785 * SUCH DAMAGE.
786 *
787 */
788#include <sys/cdefs.h>
789__FBSDID("$FreeBSD: head/sys/mips/rmi/bus_space_rmi_pci.c 204136 2010-02-20 17:19:16Z rrs $");
790
791#include <sys/param.h>
792#include <sys/systm.h>
793#include <sys/bus.h>
794#include <sys/kernel.h>
795#include <sys/endian.h>
796#include <sys/malloc.h>
797#include <sys/ktr.h>
798
799#include <vm/vm.h>
800#include <vm/pmap.h>
801#include <vm/vm_kern.h>
802#include <vm/vm_extern.h>
803
804#include <machine/bus.h>
805#include <machine/cache.h>
806
807static int
808rmi_pci_bus_space_map(void *t, bus_addr_t addr,
809    bus_size_t size, int flags,
810    bus_space_handle_t * bshp);
811
812static void
813rmi_pci_bus_space_unmap(void *t, bus_space_handle_t bsh,
814    bus_size_t size);
815
816static int
817rmi_pci_bus_space_subregion(void *t,
818    bus_space_handle_t bsh,
819    bus_size_t offset, bus_size_t size,
820    bus_space_handle_t * nbshp);
821
822static u_int8_t
823rmi_pci_bus_space_read_1(void *t,
824    bus_space_handle_t handle,
825    bus_size_t offset);
826
827static u_int16_t
828rmi_pci_bus_space_read_2(void *t,
829    bus_space_handle_t handle,
830    bus_size_t offset);
831
832static u_int32_t
833rmi_pci_bus_space_read_4(void *t,
834    bus_space_handle_t handle,
835    bus_size_t offset);
836
837static void
838rmi_pci_bus_space_read_multi_1(void *t,
839    bus_space_handle_t handle,
840    bus_size_t offset, u_int8_t * addr,
841    size_t count);
842
843static void
844rmi_pci_bus_space_read_multi_2(void *t,
845    bus_space_handle_t handle,
846    bus_size_t offset, u_int16_t * addr,
847    size_t count);
848
849static void
850rmi_pci_bus_space_read_multi_4(void *t,
851    bus_space_handle_t handle,
852    bus_size_t offset, u_int32_t * addr,
853    size_t count);
854
855static void
856rmi_pci_bus_space_read_region_1(void *t,
857    bus_space_handle_t bsh,
858    bus_size_t offset, u_int8_t * addr,
859    size_t count);
860
861static void
862rmi_pci_bus_space_read_region_2(void *t,
863    bus_space_handle_t bsh,
864    bus_size_t offset, u_int16_t * addr,
865    size_t count);
866
867static void
868rmi_pci_bus_space_read_region_4(void *t,
869    bus_space_handle_t bsh,
870    bus_size_t offset, u_int32_t * addr,
871    size_t count);
872
873static void
874rmi_pci_bus_space_write_1(void *t,
875    bus_space_handle_t handle,
876    bus_size_t offset, u_int8_t value);
877
878static void
879rmi_pci_bus_space_write_2(void *t,
880    bus_space_handle_t handle,
881    bus_size_t offset, u_int16_t value);
882
883static void
884rmi_pci_bus_space_write_4(void *t,
885    bus_space_handle_t handle,
886    bus_size_t offset, u_int32_t value);
887
888static void
889rmi_pci_bus_space_write_multi_1(void *t,
890    bus_space_handle_t handle,
891    bus_size_t offset,
892    const u_int8_t * addr,
893    size_t count);
894
895static void
896rmi_pci_bus_space_write_multi_2(void *t,
897    bus_space_handle_t handle,
898    bus_size_t offset,
899    const u_int16_t * addr,
900    size_t count);
901
902static void
903rmi_pci_bus_space_write_multi_4(void *t,
904    bus_space_handle_t handle,
905    bus_size_t offset,
906    const u_int32_t * addr,
907    size_t count);
908
909static void
910rmi_pci_bus_space_write_region_2(void *t,
911    bus_space_handle_t bsh,
912    bus_size_t offset,
913    const u_int16_t * addr,
914    size_t count);
915
916static void
917rmi_pci_bus_space_write_region_4(void *t,
918    bus_space_handle_t bsh,
919    bus_size_t offset,
920    const u_int32_t * addr,
921    size_t count);
922
923
924static void
925rmi_pci_bus_space_set_region_2(void *t,
926    bus_space_handle_t bsh,
927    bus_size_t offset, u_int16_t value,
928    size_t count);
929static void
930rmi_pci_bus_space_set_region_4(void *t,
931    bus_space_handle_t bsh,
932    bus_size_t offset, u_int32_t value,
933    size_t count);
934
935static void
936rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
937    bus_size_t offset __unused, bus_size_t len __unused, int flags);
938
939static void
940rmi_pci_bus_space_copy_region_2(void *t,
941    bus_space_handle_t bsh1,
942    bus_size_t off1,
943    bus_space_handle_t bsh2,
944    bus_size_t off2, size_t count);
945
946u_int8_t
947rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
948    bus_size_t offset);
949
950static u_int16_t
951rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
952    bus_size_t offset);
953
954static u_int32_t
955rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
956    bus_size_t offset);
957static void
958rmi_pci_bus_space_read_multi_stream_1(void *t,
959    bus_space_handle_t handle,
960    bus_size_t offset, u_int8_t * addr,
961    size_t count);
962
963static void
964rmi_pci_bus_space_read_multi_stream_2(void *t,
965    bus_space_handle_t handle,
966    bus_size_t offset, u_int16_t * addr,
967    size_t count);
968
969static void
970rmi_pci_bus_space_read_multi_stream_4(void *t,
971    bus_space_handle_t handle,
972    bus_size_t offset, u_int32_t * addr,
973    size_t count);
974
975void
976rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
977    bus_size_t offset, u_int8_t value);
978static void
979rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
980    bus_size_t offset, u_int16_t value);
981
982static void
983rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
984    bus_size_t offset, u_int32_t value);
985
986static void
987rmi_pci_bus_space_write_multi_stream_1(void *t,
988    bus_space_handle_t handle,
989    bus_size_t offset,
990    const u_int8_t * addr,
991    size_t count);
992static void
993rmi_pci_bus_space_write_multi_stream_2(void *t,
994    bus_space_handle_t handle,
995    bus_size_t offset,
996    const u_int16_t * addr,
997    size_t count);
998
999static void
1000rmi_pci_bus_space_write_multi_stream_4(void *t,
1001    bus_space_handle_t handle,
1002    bus_size_t offset,
1003    const u_int32_t * addr,
1004    size_t count);
1005
1006#define TODO() printf("XLR memory bus space function '%s' unimplemented\n", __func__)
1007
1008static struct bus_space local_rmi_pci_bus_space = {
1009	/* cookie */
1010	(void *)0,
1011
1012	/* mapping/unmapping */
1013	rmi_pci_bus_space_map,
1014	rmi_pci_bus_space_unmap,
1015	rmi_pci_bus_space_subregion,
1016
1017	/* allocation/deallocation */
1018	NULL,
1019	NULL,
1020
1021	/* barrier */
1022	rmi_pci_bus_space_barrier,
1023
1024	/* read (single) */
1025	rmi_pci_bus_space_read_1,
1026	rmi_pci_bus_space_read_2,
1027	rmi_pci_bus_space_read_4,
1028	NULL,
1029
1030	/* read multiple */
1031	rmi_pci_bus_space_read_multi_1,
1032	rmi_pci_bus_space_read_multi_2,
1033	rmi_pci_bus_space_read_multi_4,
1034	NULL,
1035
1036	/* read region */
1037	rmi_pci_bus_space_read_region_1,
1038	rmi_pci_bus_space_read_region_2,
1039	rmi_pci_bus_space_read_region_4,
1040	NULL,
1041
1042	/* write (single) */
1043	rmi_pci_bus_space_write_1,
1044	rmi_pci_bus_space_write_2,
1045	rmi_pci_bus_space_write_4,
1046	NULL,
1047
1048	/* write multiple */
1049	rmi_pci_bus_space_write_multi_1,
1050	rmi_pci_bus_space_write_multi_2,
1051	rmi_pci_bus_space_write_multi_4,
1052	NULL,
1053
1054	/* write region */
1055	NULL,
1056	rmi_pci_bus_space_write_region_2,
1057	rmi_pci_bus_space_write_region_4,
1058	NULL,
1059
1060	/* set multiple */
1061	NULL,
1062	NULL,
1063	NULL,
1064	NULL,
1065
1066	/* set region */
1067	NULL,
1068	rmi_pci_bus_space_set_region_2,
1069	rmi_pci_bus_space_set_region_4,
1070	NULL,
1071
1072	/* copy */
1073	NULL,
1074	rmi_pci_bus_space_copy_region_2,
1075	NULL,
1076	NULL,
1077
1078	/* read (single) stream */
1079	rmi_pci_bus_space_read_stream_1,
1080	rmi_pci_bus_space_read_stream_2,
1081	rmi_pci_bus_space_read_stream_4,
1082	NULL,
1083
1084	/* read multiple stream */
1085	rmi_pci_bus_space_read_multi_stream_1,
1086	rmi_pci_bus_space_read_multi_stream_2,
1087	rmi_pci_bus_space_read_multi_stream_4,
1088	NULL,
1089
1090	/* read region stream */
1091	rmi_pci_bus_space_read_region_1,
1092	rmi_pci_bus_space_read_region_2,
1093	rmi_pci_bus_space_read_region_4,
1094	NULL,
1095
1096	/* write (single) stream */
1097	rmi_pci_bus_space_write_stream_1,
1098	rmi_pci_bus_space_write_stream_2,
1099	rmi_pci_bus_space_write_stream_4,
1100	NULL,
1101
1102	/* write multiple stream */
1103	rmi_pci_bus_space_write_multi_stream_1,
1104	rmi_pci_bus_space_write_multi_stream_2,
1105	rmi_pci_bus_space_write_multi_stream_4,
1106	NULL,
1107
1108	/* write region stream */
1109	NULL,
1110	rmi_pci_bus_space_write_region_2,
1111	rmi_pci_bus_space_write_region_4,
1112	NULL,
1113};
1114
1115/* generic bus_space tag */
1116bus_space_tag_t rmi_pci_bus_space = &local_rmi_pci_bus_space;
1117
1118/*
1119 * Map a region of device bus space into CPU virtual address space.
1120 */
1121static int
1122rmi_pci_bus_space_map(void *t __unused, bus_addr_t addr,
1123    bus_size_t size __unused, int flags __unused,
1124    bus_space_handle_t * bshp)
1125{
1126	*bshp = addr;
1127	return (0);
1128}
1129
1130/*
1131 * Unmap a region of device bus space.
1132 */
1133static void
1134rmi_pci_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
1135    bus_size_t size __unused)
1136{
1137}
1138
1139/*
1140 * Get a new handle for a subregion of an already-mapped area of bus space.
1141 */
1142
1143static int
1144rmi_pci_bus_space_subregion(void *t __unused, bus_space_handle_t bsh,
1145    bus_size_t offset, bus_size_t size __unused,
1146    bus_space_handle_t * nbshp)
1147{
1148	*nbshp = bsh + offset;
1149	return (0);
1150}
1151
1152/*
1153 * Read a 1, 2, 4, or 8 byte quantity from bus space
1154 * described by tag/handle/offset.
1155 */
1156
1157static u_int8_t
1158rmi_pci_bus_space_read_1(void *tag, bus_space_handle_t handle,
1159    bus_size_t offset)
1160{
1161	return (u_int8_t) (*(volatile u_int8_t *)(handle + offset));
1162}
1163
1164static u_int16_t
1165rmi_pci_bus_space_read_2(void *tag, bus_space_handle_t handle,
1166    bus_size_t offset)
1167{
1168	return bswap16((u_int16_t) (*(volatile u_int16_t *)(handle + offset)));
1169}
1170
1171static u_int32_t
1172rmi_pci_bus_space_read_4(void *tag, bus_space_handle_t handle,
1173    bus_size_t offset)
1174{
1175	return bswap32((*(volatile u_int32_t *)(handle + offset)));
1176}
1177
1178
1179/*
1180 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
1181 * described by tag/handle/offset and copy into buffer provided.
1182 */
1183static void
1184rmi_pci_bus_space_read_multi_1(void *tag, bus_space_handle_t handle,
1185    bus_size_t offset, u_int8_t * addr, size_t count)
1186{
1187	while (count--) {
1188		*addr = (*(volatile u_int8_t *)(handle + offset));
1189		addr++;
1190	}
1191}
1192
1193static void
1194rmi_pci_bus_space_read_multi_2(void *tag, bus_space_handle_t handle,
1195    bus_size_t offset, u_int16_t * addr, size_t count)
1196{
1197
1198	while (count--) {
1199		*addr = *(volatile u_int16_t *)(handle + offset);
1200		*addr = bswap16(*addr);
1201		addr++;
1202	}
1203}
1204
1205static void
1206rmi_pci_bus_space_read_multi_4(void *tag, bus_space_handle_t handle,
1207    bus_size_t offset, u_int32_t * addr, size_t count)
1208{
1209
1210	while (count--) {
1211		*addr = *(volatile u_int32_t *)(handle + offset);
1212		*addr = bswap32(*addr);
1213		addr++;
1214	}
1215}
1216
1217/*
1218 * Write the 1, 2, 4, or 8 byte value `value' to bus space
1219 * described by tag/handle/offset.
1220 */
1221
1222static void
1223rmi_pci_bus_space_write_1(void *tag, bus_space_handle_t handle,
1224    bus_size_t offset, u_int8_t value)
1225{
1226	mips_sync();
1227	*(volatile u_int8_t *)(handle + offset) = value;
1228}
1229
1230static void
1231rmi_pci_bus_space_write_2(void *tag, bus_space_handle_t handle,
1232    bus_size_t offset, u_int16_t value)
1233{
1234	mips_sync();
1235	*(volatile u_int16_t *)(handle + offset) = bswap16(value);
1236}
1237
1238
1239static void
1240rmi_pci_bus_space_write_4(void *tag, bus_space_handle_t handle,
1241    bus_size_t offset, u_int32_t value)
1242{
1243	mips_sync();
1244	*(volatile u_int32_t *)(handle + offset) = bswap32(value);
1245}
1246
1247/*
1248 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
1249 * provided to bus space described by tag/handle/offset.
1250 */
1251
1252
1253static void
1254rmi_pci_bus_space_write_multi_1(void *tag, bus_space_handle_t handle,
1255    bus_size_t offset, const u_int8_t * addr, size_t count)
1256{
1257	mips_sync();
1258	while (count--) {
1259		(*(volatile u_int8_t *)(handle + offset)) = *addr;
1260		addr++;
1261	}
1262}
1263
1264static void
1265rmi_pci_bus_space_write_multi_2(void *tag, bus_space_handle_t handle,
1266    bus_size_t offset, const u_int16_t * addr, size_t count)
1267{
1268	mips_sync();
1269	while (count--) {
1270		(*(volatile u_int16_t *)(handle + offset)) = bswap16(*addr);
1271		addr++;
1272	}
1273}
1274
1275static void
1276rmi_pci_bus_space_write_multi_4(void *tag, bus_space_handle_t handle,
1277    bus_size_t offset, const u_int32_t * addr, size_t count)
1278{
1279	mips_sync();
1280	while (count--) {
1281		(*(volatile u_int32_t *)(handle + offset)) = bswap32(*addr);
1282		addr++;
1283	}
1284}
1285
1286/*
1287 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
1288 * by tag/handle starting at `offset'.
1289 */
1290
1291static void
1292rmi_pci_bus_space_set_region_2(void *t, bus_space_handle_t bsh,
1293    bus_size_t offset, u_int16_t value, size_t count)
1294{
1295	bus_addr_t addr = bsh + offset;
1296
1297	for (; count != 0; count--, addr += 2)
1298		(*(volatile u_int16_t *)(addr)) = value;
1299}
1300
1301static void
1302rmi_pci_bus_space_set_region_4(void *t, bus_space_handle_t bsh,
1303    bus_size_t offset, u_int32_t value, size_t count)
1304{
1305	bus_addr_t addr = bsh + offset;
1306
1307	for (; count != 0; count--, addr += 4)
1308		(*(volatile u_int32_t *)(addr)) = value;
1309}
1310
1311
1312/*
1313 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
1314 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
1315 */
1316static void
1317rmi_pci_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1,
1318    bus_size_t off1, bus_space_handle_t bsh2,
1319    bus_size_t off2, size_t count)
1320{
1321	TODO();
1322}
1323
1324/*
1325 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
1326 * described by tag/handle/offset and copy into buffer provided.
1327 */
1328
1329u_int8_t
1330rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
1331    bus_size_t offset)
1332{
1333
1334	return *((volatile u_int8_t *)(handle + offset));
1335}
1336
1337
1338static u_int16_t
1339rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
1340    bus_size_t offset)
1341{
1342	return *(volatile u_int16_t *)(handle + offset);
1343}
1344
1345
1346static u_int32_t
1347rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
1348    bus_size_t offset)
1349{
1350	return (*(volatile u_int32_t *)(handle + offset));
1351}
1352
1353
1354static void
1355rmi_pci_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle,
1356    bus_size_t offset, u_int8_t * addr, size_t count)
1357{
1358	while (count--) {
1359		*addr = (*(volatile u_int8_t *)(handle + offset));
1360		addr++;
1361	}
1362}
1363
1364static void
1365rmi_pci_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle,
1366    bus_size_t offset, u_int16_t * addr, size_t count)
1367{
1368	while (count--) {
1369		*addr = (*(volatile u_int16_t *)(handle + offset));
1370		addr++;
1371	}
1372}
1373
1374static void
1375rmi_pci_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle,
1376    bus_size_t offset, u_int32_t * addr, size_t count)
1377{
1378	while (count--) {
1379		*addr = (*(volatile u_int32_t *)(handle + offset));
1380		addr++;
1381	}
1382}
1383
1384
1385
1386/*
1387 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
1388 * described by tag/handle and starting at `offset' and copy into
1389 * buffer provided.
1390 */
1391void
1392rmi_pci_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
1393    bus_size_t offset, u_int8_t * addr, size_t count)
1394{
1395	bus_addr_t baddr = bsh + offset;
1396
1397	while (count--) {
1398		*addr++ = (*(volatile u_int8_t *)(baddr));
1399		baddr += 1;
1400	}
1401}
1402
1403void
1404rmi_pci_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
1405    bus_size_t offset, u_int16_t * addr, size_t count)
1406{
1407	bus_addr_t baddr = bsh + offset;
1408
1409	while (count--) {
1410		*addr++ = (*(volatile u_int16_t *)(baddr));
1411		baddr += 2;
1412	}
1413}
1414
1415void
1416rmi_pci_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
1417    bus_size_t offset, u_int32_t * addr, size_t count)
1418{
1419	bus_addr_t baddr = bsh + offset;
1420
1421	while (count--) {
1422		*addr++ = (*(volatile u_int32_t *)(baddr));
1423		baddr += 4;
1424	}
1425}
1426
1427
1428void
1429rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
1430    bus_size_t offset, u_int8_t value)
1431{
1432	mips_sync();
1433	*(volatile u_int8_t *)(handle + offset) = value;
1434}
1435
1436static void
1437rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
1438    bus_size_t offset, u_int16_t value)
1439{
1440	mips_sync();
1441	*(volatile u_int16_t *)(handle + offset) = value;
1442}
1443
1444
1445static void
1446rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
1447    bus_size_t offset, u_int32_t value)
1448{
1449	mips_sync();
1450	*(volatile u_int32_t *)(handle + offset) = value;
1451}
1452
1453
1454static void
1455rmi_pci_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle,
1456    bus_size_t offset, const u_int8_t * addr, size_t count)
1457{
1458	mips_sync();
1459	while (count--) {
1460		(*(volatile u_int8_t *)(handle + offset)) = *addr;
1461		addr++;
1462	}
1463}
1464
1465static void
1466rmi_pci_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle,
1467    bus_size_t offset, const u_int16_t * addr, size_t count)
1468{
1469	mips_sync();
1470	while (count--) {
1471		(*(volatile u_int16_t *)(handle + offset)) = *addr;
1472		addr++;
1473	}
1474}
1475
1476static void
1477rmi_pci_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle,
1478    bus_size_t offset, const u_int32_t * addr, size_t count)
1479{
1480	mips_sync();
1481	while (count--) {
1482		(*(volatile u_int32_t *)(handle + offset)) = *addr;
1483		addr++;
1484	}
1485}
1486
1487void
1488rmi_pci_bus_space_write_region_2(void *t,
1489    bus_space_handle_t bsh,
1490    bus_size_t offset,
1491    const u_int16_t * addr,
1492    size_t count)
1493{
1494	bus_addr_t baddr = (bus_addr_t) bsh + offset;
1495
1496	while (count--) {
1497		(*(volatile u_int16_t *)(baddr)) = *addr;
1498		addr++;
1499		baddr += 2;
1500	}
1501}
1502
1503void
1504rmi_pci_bus_space_write_region_4(void *t, bus_space_handle_t bsh,
1505    bus_size_t offset, const u_int32_t * addr, size_t count)
1506{
1507	bus_addr_t baddr = bsh + offset;
1508
1509	while (count--) {
1510		(*(volatile u_int32_t *)(baddr)) = *addr;
1511		addr++;
1512		baddr += 4;
1513	}
1514}
1515
1516static void
1517rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
1518    bus_size_t offset __unused, bus_size_t len __unused, int flags)
1519{
1520
1521}
1522