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: releng/10.4/sys/mips/rmi/bus_space_rmi.c 204131 2010-02-20 16:32:33Z rrs $
27 */
28 #include <sys/cdefs.h>
29 __FBSDID("$FreeBSD: releng/10.4/sys/mips/rmi/bus_space_rmi.c 204131 2010-02-20 16:32:33Z 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
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 }
Cache object: 38984fc00e7c4a0f4b375ef21b5b82de
|