]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/mips/rmi/bus_space_rmi.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / mips / rmi / bus_space_rmi.c
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
47 static int 
48 rmi_bus_space_map(void *t, bus_addr_t addr,
49     bus_size_t size, int flags,
50     bus_space_handle_t * bshp);
51
52 static void 
53 rmi_bus_space_unmap(void *t, bus_space_handle_t bsh,
54     bus_size_t size);
55
56 static int 
57 rmi_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
62 static u_int8_t 
63 rmi_bus_space_read_1(void *t,
64     bus_space_handle_t handle,
65     bus_size_t offset);
66
67 static u_int16_t 
68 rmi_bus_space_read_2(void *t,
69     bus_space_handle_t handle,
70     bus_size_t offset);
71
72 static u_int32_t 
73 rmi_bus_space_read_4(void *t,
74     bus_space_handle_t handle,
75     bus_size_t offset);
76
77 static void 
78 rmi_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
83 static void 
84 rmi_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
89 static void 
90 rmi_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
95 static void 
96 rmi_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
101 static void 
102 rmi_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
107 static void 
108 rmi_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
113 static void 
114 rmi_bus_space_write_1(void *t,
115     bus_space_handle_t handle,
116     bus_size_t offset, u_int8_t value);
117
118 static void 
119 rmi_bus_space_write_2(void *t,
120     bus_space_handle_t handle,
121     bus_size_t offset, u_int16_t value);
122
123 static void 
124 rmi_bus_space_write_4(void *t,
125     bus_space_handle_t handle,
126     bus_size_t offset, u_int32_t value);
127
128 static void 
129 rmi_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
135 static void 
136 rmi_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
142 static void 
143 rmi_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
149 static void 
150 rmi_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
156 static void 
157 rmi_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
164 static void 
165 rmi_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);
169 static void 
170 rmi_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
175 static void 
176 rmi_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
179 static void 
180 rmi_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
186 u_int8_t 
187 rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
188     bus_size_t offset);
189
190 static u_int16_t 
191 rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
192     bus_size_t offset);
193
194 static u_int32_t 
195 rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
196     bus_size_t offset);
197 static void 
198 rmi_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
203 static void 
204 rmi_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
209 static void 
210 rmi_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
215 void 
216 rmi_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
217     bus_size_t offset, u_int8_t value);
218 static void 
219 rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
220     bus_size_t offset, u_int16_t value);
221
222 static void 
223 rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
224     bus_size_t offset, u_int32_t value);
225
226 static void 
227 rmi_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);
232 static void 
233 rmi_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
239 static void 
240 rmi_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  
248 static struct bus_space local_rmi_bus_space = {
249         /* cookie */
250         (void *)0,
251
252         /* mapping/unmapping */
253         rmi_bus_space_map,
254         rmi_bus_space_unmap,
255         rmi_bus_space_subregion,
256
257         /* allocation/deallocation */
258         NULL,
259         NULL,
260
261         /* barrier */
262         rmi_bus_space_barrier,
263
264         /* read (single) */
265         rmi_bus_space_read_1,
266         rmi_bus_space_read_2,
267         rmi_bus_space_read_4,
268         NULL,
269
270         /* read multiple */
271         rmi_bus_space_read_multi_1,
272         rmi_bus_space_read_multi_2,
273         rmi_bus_space_read_multi_4,
274         NULL,
275
276         /* read region */
277         rmi_bus_space_read_region_1,
278         rmi_bus_space_read_region_2,
279         rmi_bus_space_read_region_4,
280         NULL,
281
282         /* write (single) */
283         rmi_bus_space_write_1,
284         rmi_bus_space_write_2,
285         rmi_bus_space_write_4,
286         NULL,
287
288         /* write multiple */
289         rmi_bus_space_write_multi_1,
290         rmi_bus_space_write_multi_2,
291         rmi_bus_space_write_multi_4,
292         NULL,
293
294         /* write region */
295         NULL,
296         rmi_bus_space_write_region_2,
297         rmi_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_bus_space_set_region_2,
309         rmi_bus_space_set_region_4,
310         NULL,
311
312         /* copy */
313         NULL,
314         rmi_bus_space_copy_region_2,
315         NULL,
316         NULL,
317
318         /* read (single) stream */
319         rmi_bus_space_read_stream_1,
320         rmi_bus_space_read_stream_2,
321         rmi_bus_space_read_stream_4,
322         NULL,
323
324         /* read multiple stream */
325         rmi_bus_space_read_multi_stream_1,
326         rmi_bus_space_read_multi_stream_2,
327         rmi_bus_space_read_multi_stream_4,
328         NULL,
329
330         /* read region stream */
331         rmi_bus_space_read_region_1,
332         rmi_bus_space_read_region_2,
333         rmi_bus_space_read_region_4,
334         NULL,
335
336         /* write (single) stream */
337         rmi_bus_space_write_stream_1,
338         rmi_bus_space_write_stream_2,
339         rmi_bus_space_write_stream_4,
340         NULL,
341
342         /* write multiple stream */
343         rmi_bus_space_write_multi_stream_1,
344         rmi_bus_space_write_multi_stream_2,
345         rmi_bus_space_write_multi_stream_4,
346         NULL,
347
348         /* write region stream */
349         NULL,
350         rmi_bus_space_write_region_2,
351         rmi_bus_space_write_region_4,
352         NULL,
353 };
354
355 /* generic bus_space tag */
356 bus_space_tag_t rmi_bus_space = &local_rmi_bus_space;
357
358 /*
359  * Map a region of device bus space into CPU virtual address space.
360  */
361 static int
362 rmi_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
367         *bshp = addr;
368         return (0);
369 }
370
371 /*
372  * Unmap a region of device bus space.
373  */
374 static void
375 rmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
376     bus_size_t size __unused)
377 {
378 }
379
380 /*
381  * Get a new handle for a subregion of an already-mapped area of bus space.
382  */
383
384 static int
385 rmi_bus_space_subregion(void *t __unused, bus_space_handle_t bsh,
386     bus_size_t offset, bus_size_t size __unused,
387     bus_space_handle_t * nbshp)
388 {
389         *nbshp = bsh + offset;
390         return (0);
391 }
392
393 /*
394  * Read a 1, 2, 4, or 8 byte quantity from bus space
395  * described by tag/handle/offset.
396  */
397
398 static u_int8_t
399 rmi_bus_space_read_1(void *tag, bus_space_handle_t handle,
400     bus_size_t offset)
401 {
402         return (u_int8_t) (*(volatile u_int32_t *)(handle + offset));
403 }
404
405 static u_int16_t
406 rmi_bus_space_read_2(void *tag, bus_space_handle_t handle,
407     bus_size_t offset)
408 {
409         return (u_int16_t)(*(volatile u_int32_t *)(handle + offset));
410 }
411
412 static u_int32_t
413 rmi_bus_space_read_4(void *tag, bus_space_handle_t handle,
414     bus_size_t offset)
415 {
416         return (*(volatile u_int32_t *)(handle + offset));
417 }
418
419
420 /*
421  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
422  * described by tag/handle/offset and copy into buffer provided.
423  */
424 static void
425 rmi_bus_space_read_multi_1(void *tag, bus_space_handle_t handle,
426     bus_size_t offset, u_int8_t * addr, size_t count)
427 {
428         TODO();
429 }
430
431 static void
432 rmi_bus_space_read_multi_2(void *tag, bus_space_handle_t handle,
433     bus_size_t offset, u_int16_t * addr, size_t count)
434 {
435         TODO();
436 }
437
438 static void
439 rmi_bus_space_read_multi_4(void *tag, bus_space_handle_t handle,
440     bus_size_t offset, u_int32_t * addr, size_t count)
441 {
442         TODO();
443 }
444
445 /*
446  * Write the 1, 2, 4, or 8 byte value `value' to bus space
447  * described by tag/handle/offset.
448  */
449
450 static void
451 rmi_bus_space_write_1(void *tag, bus_space_handle_t handle,
452     bus_size_t offset, u_int8_t value)
453 {
454         *(volatile u_int32_t *)(handle + offset) =  (u_int32_t)value;
455 }
456
457 static void
458 rmi_bus_space_write_2(void *tag, bus_space_handle_t handle,
459     bus_size_t offset, u_int16_t value)
460 {
461         *(volatile u_int32_t *)(handle + offset) = (u_int32_t)value;
462 }
463
464 static void
465 rmi_bus_space_write_4(void *tag, bus_space_handle_t handle,
466     bus_size_t offset, u_int32_t value)
467 {
468         *(volatile u_int32_t *)(handle + offset) = value;
469 }
470
471
472 /*
473  * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
474  * provided to bus space described by tag/handle/offset.
475  */
476
477
478 static void
479 rmi_bus_space_write_multi_1(void *tag, bus_space_handle_t handle,
480     bus_size_t offset, const u_int8_t * addr, size_t count)
481 {
482         TODO();
483 }
484
485 static void
486 rmi_bus_space_write_multi_2(void *tag, bus_space_handle_t handle,
487     bus_size_t offset, const u_int16_t * addr, size_t count)
488 {
489         TODO();
490 }
491
492 static void
493 rmi_bus_space_write_multi_4(void *tag, bus_space_handle_t handle,
494     bus_size_t offset, const u_int32_t * addr, size_t count)
495 {
496         TODO();
497 }
498
499 /*
500  * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
501  * by tag/handle starting at `offset'.
502  */
503
504 static void
505 rmi_bus_space_set_region_2(void *t, bus_space_handle_t bsh,
506     bus_size_t offset, u_int16_t value, size_t count)
507 {
508         bus_addr_t addr = bsh + offset;
509
510         for (; count != 0; count--, addr += 2)
511                 (*(volatile u_int32_t *)(addr)) = value;
512 }
513
514 static void
515 rmi_bus_space_set_region_4(void *t, bus_space_handle_t bsh,
516     bus_size_t offset, u_int32_t value, size_t count)
517 {
518         bus_addr_t addr = bsh + offset;
519
520         for (; count != 0; count--, addr += 4)
521                 (*(volatile u_int32_t *)(addr)) = value;
522 }
523
524
525 /*
526  * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
527  * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
528  */
529 static void
530 rmi_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1,
531     bus_size_t off1, bus_space_handle_t bsh2,
532     bus_size_t off2, size_t count)
533 {
534         printf("bus_space_copy_region_2 - unimplemented\n");
535 }
536
537 /*
538  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
539  * described by tag/handle/offset and copy into buffer provided.
540  */
541
542 u_int8_t
543 rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
544     bus_size_t offset)
545 {
546
547         return *((volatile u_int8_t *)(handle + offset));
548 }
549
550
551 static u_int16_t
552 rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
553     bus_size_t offset)
554 {
555         return *(volatile u_int16_t *)(handle + offset);
556 }
557
558
559 static u_int32_t
560 rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
561     bus_size_t offset)
562 {
563         return (*(volatile u_int32_t *)(handle + offset));
564 }
565
566
567 static void
568 rmi_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle,
569     bus_size_t offset, u_int8_t * addr, size_t count)
570 {
571         TODO();
572 }
573
574 static void
575 rmi_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle,
576     bus_size_t offset, u_int16_t * addr, size_t count)
577 {
578         TODO();
579 }
580
581 static void
582 rmi_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle,
583     bus_size_t offset, u_int32_t * addr, size_t count)
584 {
585         TODO();
586 }
587
588
589 /*
590  * Read `count' 1, 2, 4, or 8 byte quantities from bus space
591  * described by tag/handle and starting at `offset' and copy into
592  * buffer provided.
593  */
594 void
595 rmi_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
596     bus_size_t offset, u_int8_t * addr, size_t count)
597 {
598         TODO();
599 }
600
601 void
602 rmi_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
603     bus_size_t offset, u_int16_t * addr, size_t count)
604 {
605         TODO();
606 }
607
608 void
609 rmi_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
610     bus_size_t offset, u_int32_t * addr, size_t count)
611 {
612         bus_addr_t baddr = bsh + offset;
613
614         while (count--) {
615                 *addr++ = (*(volatile u_int32_t *)(baddr));
616                 baddr += 4;
617         }
618 }
619
620 void
621 rmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
622     bus_size_t offset, u_int8_t value)
623 {
624         TODO();
625 }
626
627
628 static void
629 rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
630     bus_size_t offset, u_int16_t value)
631 {
632         TODO();
633 }
634
635
636 static void
637 rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
638     bus_size_t offset, u_int32_t value)
639 {
640         TODO();
641 }
642
643
644 static void
645 rmi_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle,
646     bus_size_t offset, const u_int8_t * addr, size_t count)
647 {
648         TODO();
649 }
650
651 static void
652 rmi_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle,
653     bus_size_t offset, const u_int16_t * addr, size_t count)
654 {
655         TODO();
656 }
657
658 static void
659 rmi_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle,
660     bus_size_t offset, const u_int32_t * addr, size_t count)
661 {
662         TODO();
663 }
664
665 void
666 rmi_bus_space_write_region_2(void *t,
667     bus_space_handle_t bsh,
668     bus_size_t offset,
669     const u_int16_t * addr,
670     size_t count)
671 {
672         TODO();
673 }
674
675 void
676 rmi_bus_space_write_region_4(void *t, bus_space_handle_t bsh,
677     bus_size_t offset, const u_int32_t * addr, size_t count)
678 {
679         TODO();
680 }
681
682 static void
683 rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
684     bus_size_t offset __unused, bus_size_t len __unused, int flags)
685 {
686 }