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