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,
169 rmi_bus_space_set_region_2(void *t,
170 bus_space_handle_t bsh,
171 bus_size_t offset, u_int16_t value,
174 rmi_bus_space_set_region_4(void *t,
175 bus_space_handle_t bsh,
176 bus_size_t offset, u_int32_t value,
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);
184 rmi_bus_space_copy_region_2(void *t,
185 bus_space_handle_t bsh1,
187 bus_space_handle_t bsh2,
188 bus_size_t off2, size_t count);
191 rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
195 rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
199 rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
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,
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,
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,
220 rmi_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
221 bus_size_t offset, u_int8_t value);
223 rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
224 bus_size_t offset, u_int16_t value);
227 rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
228 bus_size_t offset, u_int32_t value);
231 rmi_bus_space_write_multi_stream_1(void *t,
232 bus_space_handle_t handle,
234 const u_int8_t *addr,
237 rmi_bus_space_write_multi_stream_2(void *t,
238 bus_space_handle_t handle,
240 const u_int16_t *addr,
244 rmi_bus_space_write_multi_stream_4(void *t,
245 bus_space_handle_t handle,
247 const u_int32_t *addr,
250 #define TODO() printf("XLP bus space: '%s' unimplemented\n", __func__)
252 static struct bus_space local_rmi_bus_space = {
256 /* mapping/unmapping */
259 rmi_bus_space_subregion,
261 /* allocation/deallocation */
266 rmi_bus_space_barrier,
269 rmi_bus_space_read_1,
270 rmi_bus_space_read_2,
271 rmi_bus_space_read_4,
275 rmi_bus_space_read_multi_1,
276 rmi_bus_space_read_multi_2,
277 rmi_bus_space_read_multi_4,
281 rmi_bus_space_read_region_1,
282 rmi_bus_space_read_region_2,
283 rmi_bus_space_read_region_4,
287 rmi_bus_space_write_1,
288 rmi_bus_space_write_2,
289 rmi_bus_space_write_4,
293 rmi_bus_space_write_multi_1,
294 rmi_bus_space_write_multi_2,
295 rmi_bus_space_write_multi_4,
300 rmi_bus_space_write_region_2,
301 rmi_bus_space_write_region_4,
312 rmi_bus_space_set_region_2,
313 rmi_bus_space_set_region_4,
318 rmi_bus_space_copy_region_2,
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,
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,
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,
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,
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,
352 /* write region stream */
354 rmi_bus_space_write_region_2,
355 rmi_bus_space_write_region_4,
359 /* generic bus_space tag */
360 bus_space_tag_t rmi_bus_space = &local_rmi_bus_space;
363 * Map a region of device bus space into CPU virtual address space.
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)
371 *bshp = MIPS_PHYS_TO_DIRECT_UNCACHED(addr);
376 * Unmap a region of device bus space.
379 rmi_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
380 bus_size_t size __unused)
385 * Get a new handle for a subregion of an already-mapped area of bus space.
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)
393 *nbshp = bsh + offset;
398 * Read a 1, 2, 4, or 8 byte quantity from bus space
399 * described by tag/handle/offset.
403 rmi_bus_space_read_1(void *tag, bus_space_handle_t handle,
406 return (u_int8_t) (*(volatile u_int8_t *)(handle + offset));
410 rmi_bus_space_read_2(void *tag, bus_space_handle_t handle,
413 return (u_int16_t)(*(volatile u_int16_t *)(handle + offset));
417 rmi_bus_space_read_4(void *tag, bus_space_handle_t handle,
420 return (*(volatile u_int32_t *)(handle + offset));
425 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
426 * described by tag/handle/offset and copy into buffer provided.
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)
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)
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)
450 * Write the 1, 2, 4, or 8 byte value `value' to bus space
451 * described by tag/handle/offset.
455 rmi_bus_space_write_1(void *tag, bus_space_handle_t handle,
456 bus_size_t offset, u_int8_t value)
458 *(volatile u_int8_t *)(handle + offset) = value;
462 rmi_bus_space_write_2(void *tag, bus_space_handle_t handle,
463 bus_size_t offset, u_int16_t value)
465 *(volatile u_int16_t *)(handle + offset) = value;
469 rmi_bus_space_write_4(void *tag, bus_space_handle_t handle,
470 bus_size_t offset, u_int32_t value)
472 *(volatile u_int32_t *)(handle + offset) = value;
477 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
478 * provided to bus space described by tag/handle/offset.
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)
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)
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)
504 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
505 * by tag/handle starting at `offset'.
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)
512 bus_addr_t addr = bsh + offset;
514 for (; count != 0; count--, addr += 2)
515 (*(volatile u_int32_t *)(addr)) = value;
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)
522 bus_addr_t addr = bsh + offset;
524 for (; count != 0; count--, addr += 4)
525 (*(volatile u_int32_t *)(addr)) = value;
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.
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)
538 printf("bus_space_copy_region_2 - unimplemented\n");
542 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
543 * described by tag/handle/offset and copy into buffer provided.
547 rmi_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
551 return *((volatile u_int8_t *)(handle + offset));
556 rmi_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
559 return *(volatile u_int16_t *)(handle + offset);
564 rmi_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
567 return (*(volatile u_int32_t *)(handle + offset));
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)
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)
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)
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
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)
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)
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)
616 bus_addr_t baddr = bsh + offset;
619 *addr++ = (*(volatile u_int32_t *)(baddr));
625 rmi_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
626 bus_size_t offset, u_int8_t value)
633 rmi_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
634 bus_size_t offset, u_int16_t value)
641 rmi_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
642 bus_size_t offset, u_int32_t value)
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)
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)
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)
670 rmi_bus_space_write_region_2(void *t,
671 bus_space_handle_t bsh,
673 const u_int16_t *addr,
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)
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)
693 * need a special bus space for this, because the Netlogic SoC
694 * UART allows only 32 bit access to its registers
698 rmi_uart_bus_space_read_1(void *tag, bus_space_handle_t handle,
701 return (u_int8_t)(*(volatile u_int32_t *)(handle + offset));
705 rmi_uart_bus_space_write_1(void *tag, bus_space_handle_t handle,
706 bus_size_t offset, u_int8_t value)
708 *(volatile u_int32_t *)(handle + offset) = value;
711 static struct bus_space local_rmi_uart_bus_space = {
715 /* mapping/unmapping */
718 rmi_bus_space_subregion,
720 /* allocation/deallocation */
725 rmi_bus_space_barrier,
728 rmi_uart_bus_space_read_1, NULL, NULL, NULL,
731 NULL, NULL, NULL, NULL,
734 NULL, NULL, NULL, NULL,
737 rmi_uart_bus_space_write_1, NULL, NULL, NULL,
740 NULL, NULL, NULL, NULL,
743 NULL, NULL, NULL, NULL,
746 NULL, NULL, NULL, NULL,
749 NULL, NULL, NULL, NULL,
752 NULL, NULL, NULL, NULL,
754 /* read (single) stream */
755 NULL, NULL, NULL, NULL,
757 /* read multiple stream */
758 NULL, NULL, NULL, NULL,
760 /* read region stream */
761 NULL, NULL, NULL, NULL,
763 /* write (single) stream */
764 NULL, NULL, NULL, NULL,
766 /* write multiple stream */
767 NULL, NULL, NULL, NULL,
769 /* write region stream */
770 NULL, NULL, NULL, NULL,
773 /* generic bus_space tag */
774 bus_space_tag_t rmi_uart_bus_space = &local_rmi_uart_bus_space;