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/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