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