2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4 * Copyright 2003-2011 Netlogic Microsystems (Netlogic). All rights
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are
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
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.
32 #include <sys/cdefs.h>
33 __FBSDID("$FreeBSD$");
35 #include <sys/param.h>
36 #include <sys/systm.h>
38 #include <sys/kernel.h>
39 #include <sys/endian.h>
40 #include <sys/malloc.h>
45 #include <vm/vm_kern.h>
46 #include <vm/vm_extern.h>
48 #include <machine/bus.h>
49 #include <machine/cache.h>
52 rmi_bus_space_map(void *t, bus_addr_t addr,
53 bus_size_t size, int flags,
54 bus_space_handle_t *bshp);
57 rmi_bus_space_unmap(void *t, bus_space_handle_t bsh,
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);
67 rmi_bus_space_read_1(void *t,
68 bus_space_handle_t handle,
72 rmi_bus_space_read_2(void *t,
73 bus_space_handle_t handle,
77 rmi_bus_space_read_4(void *t,
78 bus_space_handle_t handle,
82 rmi_bus_space_read_multi_1(void *t,
83 bus_space_handle_t handle,
84 bus_size_t offset, u_int8_t *addr,
88 rmi_bus_space_read_multi_2(void *t,
89 bus_space_handle_t handle,
90 bus_size_t offset, u_int16_t *addr,
94 rmi_bus_space_read_multi_4(void *t,
95 bus_space_handle_t handle,
96 bus_size_t offset, u_int32_t *addr,
100 rmi_bus_space_read_region_1(void *t,
101 bus_space_handle_t bsh,
102 bus_size_t offset, u_int8_t *addr,
106 rmi_bus_space_read_region_2(void *t,
107 bus_space_handle_t bsh,
108 bus_size_t offset, u_int16_t *addr,
112 rmi_bus_space_read_region_4(void *t,
113 bus_space_handle_t bsh,
114 bus_size_t offset, u_int32_t *addr,
118 rmi_bus_space_write_1(void *t,
119 bus_space_handle_t handle,
120 bus_size_t offset, u_int8_t value);
123 rmi_bus_space_write_2(void *t,
124 bus_space_handle_t handle,
125 bus_size_t offset, u_int16_t value);
128 rmi_bus_space_write_4(void *t,
129 bus_space_handle_t handle,
130 bus_size_t offset, u_int32_t value);
133 rmi_bus_space_write_multi_1(void *t,
134 bus_space_handle_t handle,
136 const u_int8_t *addr,
140 rmi_bus_space_write_multi_2(void *t,
141 bus_space_handle_t handle,
143 const u_int16_t *addr,
147 rmi_bus_space_write_multi_4(void *t,
148 bus_space_handle_t handle,
150 const u_int32_t *addr,
154 rmi_bus_space_write_region_2(void *t,
155 bus_space_handle_t bsh,
157 const u_int16_t *addr,
161 rmi_bus_space_write_region_4(void *t,
162 bus_space_handle_t bsh,
164 const u_int32_t *addr,
168 rmi_bus_space_set_region_2(void *t,
169 bus_space_handle_t bsh,
170 bus_size_t offset, u_int16_t value,
173 rmi_bus_space_set_region_4(void *t,
174 bus_space_handle_t bsh,
175 bus_size_t offset, u_int32_t value,
179 rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
180 bus_size_t offset __unused, bus_size_t len __unused, int flags);
183 rmi_bus_space_copy_region_2(void *t,
184 bus_space_handle_t bsh1,
186 bus_space_handle_t bsh2,
187 bus_size_t off2, size_t count);
190 rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
194 rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
198 rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
201 rmi_bus_space_read_multi_stream_1(void *t,
202 bus_space_handle_t handle,
203 bus_size_t offset, u_int8_t *addr,
207 rmi_bus_space_read_multi_stream_2(void *t,
208 bus_space_handle_t handle,
209 bus_size_t offset, u_int16_t *addr,
213 rmi_bus_space_read_multi_stream_4(void *t,
214 bus_space_handle_t handle,
215 bus_size_t offset, u_int32_t *addr,
219 rmi_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
220 bus_size_t offset, u_int8_t value);
222 rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
223 bus_size_t offset, u_int16_t value);
226 rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
227 bus_size_t offset, u_int32_t value);
230 rmi_bus_space_write_multi_stream_1(void *t,
231 bus_space_handle_t handle,
233 const u_int8_t *addr,
236 rmi_bus_space_write_multi_stream_2(void *t,
237 bus_space_handle_t handle,
239 const u_int16_t *addr,
243 rmi_bus_space_write_multi_stream_4(void *t,
244 bus_space_handle_t handle,
246 const u_int32_t *addr,
249 #define TODO() printf("XLP bus space: '%s' unimplemented\n", __func__)
251 static struct bus_space local_rmi_bus_space = {
255 /* mapping/unmapping */
258 rmi_bus_space_subregion,
260 /* allocation/deallocation */
265 rmi_bus_space_barrier,
268 rmi_bus_space_read_1,
269 rmi_bus_space_read_2,
270 rmi_bus_space_read_4,
274 rmi_bus_space_read_multi_1,
275 rmi_bus_space_read_multi_2,
276 rmi_bus_space_read_multi_4,
280 rmi_bus_space_read_region_1,
281 rmi_bus_space_read_region_2,
282 rmi_bus_space_read_region_4,
286 rmi_bus_space_write_1,
287 rmi_bus_space_write_2,
288 rmi_bus_space_write_4,
292 rmi_bus_space_write_multi_1,
293 rmi_bus_space_write_multi_2,
294 rmi_bus_space_write_multi_4,
299 rmi_bus_space_write_region_2,
300 rmi_bus_space_write_region_4,
311 rmi_bus_space_set_region_2,
312 rmi_bus_space_set_region_4,
317 rmi_bus_space_copy_region_2,
321 /* read (single) stream */
322 rmi_bus_space_read_stream_1,
323 rmi_bus_space_read_stream_2,
324 rmi_bus_space_read_stream_4,
327 /* read multiple stream */
328 rmi_bus_space_read_multi_stream_1,
329 rmi_bus_space_read_multi_stream_2,
330 rmi_bus_space_read_multi_stream_4,
333 /* read region stream */
334 rmi_bus_space_read_region_1,
335 rmi_bus_space_read_region_2,
336 rmi_bus_space_read_region_4,
339 /* write (single) stream */
340 rmi_bus_space_write_stream_1,
341 rmi_bus_space_write_stream_2,
342 rmi_bus_space_write_stream_4,
345 /* write multiple stream */
346 rmi_bus_space_write_multi_stream_1,
347 rmi_bus_space_write_multi_stream_2,
348 rmi_bus_space_write_multi_stream_4,
351 /* write region stream */
353 rmi_bus_space_write_region_2,
354 rmi_bus_space_write_region_4,
358 /* generic bus_space tag */
359 bus_space_tag_t rmi_bus_space = &local_rmi_bus_space;
362 * Map a region of device bus space into CPU virtual address space.
365 rmi_bus_space_map(void *t __unused, bus_addr_t addr,
366 bus_size_t size __unused, int flags __unused,
367 bus_space_handle_t *bshp)
370 *bshp = MIPS_PHYS_TO_DIRECT_UNCACHED(addr);
375 * Unmap a region of device bus space.
378 rmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
379 bus_size_t size __unused)
384 * Get a new handle for a subregion of an already-mapped area of bus space.
388 rmi_bus_space_subregion(void *t __unused, bus_space_handle_t bsh,
389 bus_size_t offset, bus_size_t size __unused,
390 bus_space_handle_t *nbshp)
392 *nbshp = bsh + offset;
397 * Read a 1, 2, 4, or 8 byte quantity from bus space
398 * described by tag/handle/offset.
402 rmi_bus_space_read_1(void *tag, bus_space_handle_t handle,
405 return (u_int8_t) (*(volatile u_int8_t *)(handle + offset));
409 rmi_bus_space_read_2(void *tag, bus_space_handle_t handle,
412 return (u_int16_t)(*(volatile u_int16_t *)(handle + offset));
416 rmi_bus_space_read_4(void *tag, bus_space_handle_t handle,
419 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;
474 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
475 * provided to bus space described by tag/handle/offset.
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)
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)
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)
500 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
501 * by tag/handle starting at `offset'.
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)
508 bus_addr_t addr = bsh + offset;
510 for (; count != 0; count--, addr += 2)
511 (*(volatile u_int32_t *)(addr)) = value;
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)
518 bus_addr_t addr = bsh + offset;
520 for (; count != 0; count--, addr += 4)
521 (*(volatile u_int32_t *)(addr)) = value;
525 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
526 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
529 rmi_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1,
530 bus_size_t off1, bus_space_handle_t bsh2,
531 bus_size_t off2, size_t count)
533 printf("bus_space_copy_region_2 - unimplemented\n");
537 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
538 * described by tag/handle/offset and copy into buffer provided.
542 rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
546 return *((volatile u_int8_t *)(handle + offset));
550 rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
553 return *(volatile u_int16_t *)(handle + offset);
557 rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
560 return (*(volatile u_int32_t *)(handle + offset));
564 rmi_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle,
565 bus_size_t offset, u_int8_t *addr, size_t count)
571 rmi_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle,
572 bus_size_t offset, u_int16_t *addr, size_t count)
578 rmi_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle,
579 bus_size_t offset, u_int32_t *addr, size_t count)
585 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
586 * described by tag/handle and starting at `offset' and copy into
590 rmi_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
591 bus_size_t offset, u_int8_t *addr, size_t count)
597 rmi_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
598 bus_size_t offset, u_int16_t *addr, size_t count)
604 rmi_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
605 bus_size_t offset, u_int32_t *addr, size_t count)
607 bus_addr_t baddr = bsh + offset;
610 *addr++ = (*(volatile u_int32_t *)(baddr));
616 rmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
617 bus_size_t offset, u_int8_t value)
623 rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
624 bus_size_t offset, u_int16_t value)
630 rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
631 bus_size_t offset, u_int32_t value)
637 rmi_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle,
638 bus_size_t offset, const u_int8_t *addr, size_t count)
644 rmi_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle,
645 bus_size_t offset, const u_int16_t *addr, size_t count)
651 rmi_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle,
652 bus_size_t offset, const u_int32_t *addr, size_t count)
658 rmi_bus_space_write_region_2(void *t,
659 bus_space_handle_t bsh,
661 const u_int16_t *addr,
668 rmi_bus_space_write_region_4(void *t, bus_space_handle_t bsh,
669 bus_size_t offset, const u_int32_t *addr, size_t count)
675 rmi_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
676 bus_size_t offset __unused, bus_size_t len __unused, int flags)
681 * need a special bus space for this, because the Netlogic SoC
682 * UART allows only 32 bit access to its registers
686 rmi_uart_bus_space_read_1(void *tag, bus_space_handle_t handle,
689 return (u_int8_t)(*(volatile u_int32_t *)(handle + offset));
693 rmi_uart_bus_space_write_1(void *tag, bus_space_handle_t handle,
694 bus_size_t offset, u_int8_t value)
696 *(volatile u_int32_t *)(handle + offset) = value;
699 static struct bus_space local_rmi_uart_bus_space = {
703 /* mapping/unmapping */
706 rmi_bus_space_subregion,
708 /* allocation/deallocation */
713 rmi_bus_space_barrier,
716 rmi_uart_bus_space_read_1, NULL, NULL, NULL,
719 NULL, NULL, NULL, NULL,
722 NULL, NULL, NULL, NULL,
725 rmi_uart_bus_space_write_1, NULL, NULL, NULL,
728 NULL, NULL, NULL, NULL,
731 NULL, NULL, NULL, NULL,
734 NULL, NULL, NULL, NULL,
737 NULL, NULL, NULL, NULL,
740 NULL, NULL, NULL, NULL,
742 /* read (single) stream */
743 NULL, NULL, NULL, NULL,
745 /* read multiple stream */
746 NULL, NULL, NULL, NULL,
748 /* read region stream */
749 NULL, NULL, NULL, NULL,
751 /* write (single) stream */
752 NULL, NULL, NULL, NULL,
754 /* write multiple stream */
755 NULL, NULL, NULL, NULL,
757 /* write region stream */
758 NULL, NULL, NULL, NULL,
761 /* generic bus_space tag */
762 bus_space_tag_t rmi_uart_bus_space = &local_rmi_uart_bus_space;