2 * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
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
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.
30 #include <sys/cdefs.h>
31 __FBSDID("$FreeBSD$");
33 #include <sys/param.h>
34 #include <sys/systm.h>
36 #include <sys/kernel.h>
37 #include <sys/endian.h>
38 #include <sys/malloc.h>
43 #include <vm/vm_kern.h>
44 #include <vm/vm_extern.h>
46 #include <machine/bus.h>
47 #include <machine/cache.h>
50 rmi_bus_space_map(void *t, bus_addr_t addr,
51 bus_size_t size, int flags,
52 bus_space_handle_t *bshp);
55 rmi_bus_space_unmap(void *t, bus_space_handle_t bsh,
59 rmi_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);
65 rmi_bus_space_read_1(void *t,
66 bus_space_handle_t handle,
70 rmi_bus_space_read_2(void *t,
71 bus_space_handle_t handle,
75 rmi_bus_space_read_4(void *t,
76 bus_space_handle_t handle,
80 rmi_bus_space_read_multi_1(void *t,
81 bus_space_handle_t handle,
82 bus_size_t offset, u_int8_t *addr,
86 rmi_bus_space_read_multi_2(void *t,
87 bus_space_handle_t handle,
88 bus_size_t offset, u_int16_t *addr,
92 rmi_bus_space_read_multi_4(void *t,
93 bus_space_handle_t handle,
94 bus_size_t offset, u_int32_t *addr,
98 rmi_bus_space_read_region_1(void *t,
99 bus_space_handle_t bsh,
100 bus_size_t offset, u_int8_t *addr,
104 rmi_bus_space_read_region_2(void *t,
105 bus_space_handle_t bsh,
106 bus_size_t offset, u_int16_t *addr,
110 rmi_bus_space_read_region_4(void *t,
111 bus_space_handle_t bsh,
112 bus_size_t offset, u_int32_t *addr,
116 rmi_bus_space_write_1(void *t,
117 bus_space_handle_t handle,
118 bus_size_t offset, u_int8_t value);
121 rmi_bus_space_write_2(void *t,
122 bus_space_handle_t handle,
123 bus_size_t offset, u_int16_t value);
126 rmi_bus_space_write_4(void *t,
127 bus_space_handle_t handle,
128 bus_size_t offset, u_int32_t value);
131 rmi_bus_space_write_multi_1(void *t,
132 bus_space_handle_t handle,
134 const u_int8_t *addr,
138 rmi_bus_space_write_multi_2(void *t,
139 bus_space_handle_t handle,
141 const u_int16_t *addr,
145 rmi_bus_space_write_multi_4(void *t,
146 bus_space_handle_t handle,
148 const u_int32_t *addr,
152 rmi_bus_space_write_region_2(void *t,
153 bus_space_handle_t bsh,
155 const u_int16_t *addr,
159 rmi_bus_space_write_region_4(void *t,
160 bus_space_handle_t bsh,
162 const u_int32_t *addr,
167 rmi_bus_space_set_region_2(void *t,
168 bus_space_handle_t bsh,
169 bus_size_t offset, u_int16_t value,
172 rmi_bus_space_set_region_4(void *t,
173 bus_space_handle_t bsh,
174 bus_size_t offset, u_int32_t value,
178 rmi_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);
182 rmi_bus_space_copy_region_2(void *t,
183 bus_space_handle_t bsh1,
185 bus_space_handle_t bsh2,
186 bus_size_t off2, size_t count);
189 rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
193 rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
197 rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
200 rmi_bus_space_read_multi_stream_1(void *t,
201 bus_space_handle_t handle,
202 bus_size_t offset, u_int8_t *addr,
206 rmi_bus_space_read_multi_stream_2(void *t,
207 bus_space_handle_t handle,
208 bus_size_t offset, u_int16_t *addr,
212 rmi_bus_space_read_multi_stream_4(void *t,
213 bus_space_handle_t handle,
214 bus_size_t offset, u_int32_t *addr,
218 rmi_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
219 bus_size_t offset, u_int8_t value);
221 rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
222 bus_size_t offset, u_int16_t value);
225 rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
226 bus_size_t offset, u_int32_t value);
229 rmi_bus_space_write_multi_stream_1(void *t,
230 bus_space_handle_t handle,
232 const u_int8_t *addr,
235 rmi_bus_space_write_multi_stream_2(void *t,
236 bus_space_handle_t handle,
238 const u_int16_t *addr,
242 rmi_bus_space_write_multi_stream_4(void *t,
243 bus_space_handle_t handle,
245 const u_int32_t *addr,
248 #define TODO() printf("XLP bus space: '%s' unimplemented\n", __func__)
250 static struct bus_space local_rmi_bus_space = {
254 /* mapping/unmapping */
257 rmi_bus_space_subregion,
259 /* allocation/deallocation */
264 rmi_bus_space_barrier,
267 rmi_bus_space_read_1,
268 rmi_bus_space_read_2,
269 rmi_bus_space_read_4,
273 rmi_bus_space_read_multi_1,
274 rmi_bus_space_read_multi_2,
275 rmi_bus_space_read_multi_4,
279 rmi_bus_space_read_region_1,
280 rmi_bus_space_read_region_2,
281 rmi_bus_space_read_region_4,
285 rmi_bus_space_write_1,
286 rmi_bus_space_write_2,
287 rmi_bus_space_write_4,
291 rmi_bus_space_write_multi_1,
292 rmi_bus_space_write_multi_2,
293 rmi_bus_space_write_multi_4,
298 rmi_bus_space_write_region_2,
299 rmi_bus_space_write_region_4,
310 rmi_bus_space_set_region_2,
311 rmi_bus_space_set_region_4,
316 rmi_bus_space_copy_region_2,
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,
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,
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,
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,
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,
350 /* write region stream */
352 rmi_bus_space_write_region_2,
353 rmi_bus_space_write_region_4,
357 /* generic bus_space tag */
358 bus_space_tag_t rmi_bus_space = &local_rmi_bus_space;
361 * Map a region of device bus space into CPU virtual address space.
364 rmi_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)
369 *bshp = MIPS_PHYS_TO_DIRECT_UNCACHED(addr);
374 * Unmap a region of device bus space.
377 rmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
378 bus_size_t size __unused)
383 * Get a new handle for a subregion of an already-mapped area of bus space.
387 rmi_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)
391 *nbshp = bsh + offset;
396 * Read a 1, 2, 4, or 8 byte quantity from bus space
397 * described by tag/handle/offset.
401 rmi_bus_space_read_1(void *tag, bus_space_handle_t handle,
404 return (u_int8_t) (*(volatile u_int8_t *)(handle + offset));
408 rmi_bus_space_read_2(void *tag, bus_space_handle_t handle,
411 return (u_int16_t)(*(volatile u_int16_t *)(handle + offset));
415 rmi_bus_space_read_4(void *tag, bus_space_handle_t handle,
418 return (*(volatile u_int32_t *)(handle + offset));
423 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
424 * described by tag/handle/offset and copy into buffer provided.
427 rmi_bus_space_read_multi_1(void *tag, bus_space_handle_t handle,
428 bus_size_t offset, u_int8_t *addr, size_t count)
434 rmi_bus_space_read_multi_2(void *tag, bus_space_handle_t handle,
435 bus_size_t offset, u_int16_t *addr, size_t count)
441 rmi_bus_space_read_multi_4(void *tag, bus_space_handle_t handle,
442 bus_size_t offset, u_int32_t *addr, size_t count)
448 * Write the 1, 2, 4, or 8 byte value `value' to bus space
449 * described by tag/handle/offset.
453 rmi_bus_space_write_1(void *tag, bus_space_handle_t handle,
454 bus_size_t offset, u_int8_t value)
456 *(volatile u_int8_t *)(handle + offset) = value;
460 rmi_bus_space_write_2(void *tag, bus_space_handle_t handle,
461 bus_size_t offset, u_int16_t value)
463 *(volatile u_int16_t *)(handle + offset) = value;
467 rmi_bus_space_write_4(void *tag, bus_space_handle_t handle,
468 bus_size_t offset, u_int32_t value)
470 *(volatile u_int32_t *)(handle + offset) = value;
475 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
476 * provided to bus space described by tag/handle/offset.
481 rmi_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)
488 rmi_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)
495 rmi_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)
502 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
503 * by tag/handle starting at `offset'.
507 rmi_bus_space_set_region_2(void *t, bus_space_handle_t bsh,
508 bus_size_t offset, u_int16_t value, size_t count)
510 bus_addr_t addr = bsh + offset;
512 for (; count != 0; count--, addr += 2)
513 (*(volatile u_int32_t *)(addr)) = value;
517 rmi_bus_space_set_region_4(void *t, bus_space_handle_t bsh,
518 bus_size_t offset, u_int32_t value, size_t count)
520 bus_addr_t addr = bsh + offset;
522 for (; count != 0; count--, addr += 4)
523 (*(volatile u_int32_t *)(addr)) = value;
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.
532 rmi_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)
536 printf("bus_space_copy_region_2 - unimplemented\n");
540 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
541 * described by tag/handle/offset and copy into buffer provided.
545 rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
549 return *((volatile u_int8_t *)(handle + offset));
554 rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
557 return *(volatile u_int16_t *)(handle + offset);
562 rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
565 return (*(volatile u_int32_t *)(handle + offset));
570 rmi_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)
577 rmi_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)
584 rmi_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)
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
597 rmi_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
598 bus_size_t offset, u_int8_t *addr, size_t count)
604 rmi_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
605 bus_size_t offset, u_int16_t *addr, size_t count)
611 rmi_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
612 bus_size_t offset, u_int32_t *addr, size_t count)
614 bus_addr_t baddr = bsh + offset;
617 *addr++ = (*(volatile u_int32_t *)(baddr));
623 rmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
624 bus_size_t offset, u_int8_t value)
631 rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
632 bus_size_t offset, u_int16_t value)
639 rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
640 bus_size_t offset, u_int32_t value)
647 rmi_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)
654 rmi_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)
661 rmi_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)
668 rmi_bus_space_write_region_2(void *t,
669 bus_space_handle_t bsh,
671 const u_int16_t *addr,
678 rmi_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)
685 rmi_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)
691 * need a special bus space for this, because the Netlogic SoC
692 * UART allows only 32 bit access to its registers
696 rmi_uart_bus_space_read_1(void *tag, bus_space_handle_t handle,
699 return (u_int8_t)(*(volatile u_int32_t *)(handle + offset));
703 rmi_uart_bus_space_write_1(void *tag, bus_space_handle_t handle,
704 bus_size_t offset, u_int8_t value)
706 *(volatile u_int32_t *)(handle + offset) = value;
709 static struct bus_space local_rmi_uart_bus_space = {
713 /* mapping/unmapping */
716 rmi_bus_space_subregion,
718 /* allocation/deallocation */
723 rmi_bus_space_barrier,
726 rmi_uart_bus_space_read_1, NULL, NULL, NULL,
729 NULL, NULL, NULL, NULL,
732 NULL, NULL, NULL, NULL,
735 rmi_uart_bus_space_write_1, NULL, NULL, NULL,
738 NULL, NULL, NULL, NULL,
741 NULL, NULL, NULL, NULL,
744 NULL, NULL, NULL, NULL,
747 NULL, NULL, NULL, NULL,
750 NULL, NULL, NULL, NULL,
752 /* read (single) stream */
753 NULL, NULL, NULL, NULL,
755 /* read multiple stream */
756 NULL, NULL, NULL, NULL,
758 /* read region stream */
759 NULL, NULL, NULL, NULL,
761 /* write (single) stream */
762 NULL, NULL, NULL, NULL,
764 /* write multiple stream */
765 NULL, NULL, NULL, NULL,
767 /* write region stream */
768 NULL, NULL, NULL, NULL,
771 /* generic bus_space tag */
772 bus_space_tag_t rmi_uart_bus_space = &local_rmi_uart_bus_space;