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_pci_bus_space_map(void *t, bus_addr_t addr,
53 bus_size_t size, int flags,
54 bus_space_handle_t * bshp);
57 rmi_pci_bus_space_unmap(void *t, bus_space_handle_t bsh,
61 rmi_pci_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_pci_bus_space_read_1(void *t,
68 bus_space_handle_t handle,
72 rmi_pci_bus_space_read_2(void *t,
73 bus_space_handle_t handle,
77 rmi_pci_bus_space_read_4(void *t,
78 bus_space_handle_t handle,
82 rmi_pci_bus_space_read_multi_1(void *t,
83 bus_space_handle_t handle,
84 bus_size_t offset, u_int8_t * addr,
88 rmi_pci_bus_space_read_multi_2(void *t,
89 bus_space_handle_t handle,
90 bus_size_t offset, u_int16_t * addr,
94 rmi_pci_bus_space_read_multi_4(void *t,
95 bus_space_handle_t handle,
96 bus_size_t offset, u_int32_t * addr,
100 rmi_pci_bus_space_read_region_1(void *t,
101 bus_space_handle_t bsh,
102 bus_size_t offset, u_int8_t * addr,
106 rmi_pci_bus_space_read_region_2(void *t,
107 bus_space_handle_t bsh,
108 bus_size_t offset, u_int16_t * addr,
112 rmi_pci_bus_space_read_region_4(void *t,
113 bus_space_handle_t bsh,
114 bus_size_t offset, u_int32_t * addr,
118 rmi_pci_bus_space_write_1(void *t,
119 bus_space_handle_t handle,
120 bus_size_t offset, u_int8_t value);
123 rmi_pci_bus_space_write_2(void *t,
124 bus_space_handle_t handle,
125 bus_size_t offset, u_int16_t value);
128 rmi_pci_bus_space_write_4(void *t,
129 bus_space_handle_t handle,
130 bus_size_t offset, u_int32_t value);
133 rmi_pci_bus_space_write_multi_1(void *t,
134 bus_space_handle_t handle,
136 const u_int8_t * addr,
140 rmi_pci_bus_space_write_multi_2(void *t,
141 bus_space_handle_t handle,
143 const u_int16_t * addr,
147 rmi_pci_bus_space_write_multi_4(void *t,
148 bus_space_handle_t handle,
150 const u_int32_t * addr,
154 rmi_pci_bus_space_write_region_2(void *t,
155 bus_space_handle_t bsh,
157 const u_int16_t * addr,
161 rmi_pci_bus_space_write_region_4(void *t,
162 bus_space_handle_t bsh,
164 const u_int32_t * addr,
168 rmi_pci_bus_space_set_region_2(void *t,
169 bus_space_handle_t bsh,
170 bus_size_t offset, u_int16_t value,
174 rmi_pci_bus_space_set_region_4(void *t,
175 bus_space_handle_t bsh,
176 bus_size_t offset, u_int32_t value,
180 rmi_pci_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_pci_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_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
195 rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
199 rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
203 rmi_pci_bus_space_read_multi_stream_1(void *t,
204 bus_space_handle_t handle,
205 bus_size_t offset, u_int8_t * addr,
209 rmi_pci_bus_space_read_multi_stream_2(void *t,
210 bus_space_handle_t handle,
211 bus_size_t offset, u_int16_t * addr,
215 rmi_pci_bus_space_read_multi_stream_4(void *t,
216 bus_space_handle_t handle,
217 bus_size_t offset, u_int32_t * addr,
221 rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
222 bus_size_t offset, u_int8_t value);
225 rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
226 bus_size_t offset, u_int16_t value);
229 rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
230 bus_size_t offset, u_int32_t value);
233 rmi_pci_bus_space_write_multi_stream_1(void *t,
234 bus_space_handle_t handle,
236 const u_int8_t * addr,
240 rmi_pci_bus_space_write_multi_stream_2(void *t,
241 bus_space_handle_t handle,
243 const u_int16_t * addr,
247 rmi_pci_bus_space_write_multi_stream_4(void *t,
248 bus_space_handle_t handle,
250 const u_int32_t * addr,
253 #define TODO() printf("XLR memory bus space function '%s' unimplemented\n", __func__)
255 static struct bus_space local_rmi_pci_bus_space = {
259 /* mapping/unmapping */
260 rmi_pci_bus_space_map,
261 rmi_pci_bus_space_unmap,
262 rmi_pci_bus_space_subregion,
264 /* allocation/deallocation */
269 rmi_pci_bus_space_barrier,
272 rmi_pci_bus_space_read_1,
273 rmi_pci_bus_space_read_2,
274 rmi_pci_bus_space_read_4,
278 rmi_pci_bus_space_read_multi_1,
279 rmi_pci_bus_space_read_multi_2,
280 rmi_pci_bus_space_read_multi_4,
284 rmi_pci_bus_space_read_region_1,
285 rmi_pci_bus_space_read_region_2,
286 rmi_pci_bus_space_read_region_4,
290 rmi_pci_bus_space_write_1,
291 rmi_pci_bus_space_write_2,
292 rmi_pci_bus_space_write_4,
296 rmi_pci_bus_space_write_multi_1,
297 rmi_pci_bus_space_write_multi_2,
298 rmi_pci_bus_space_write_multi_4,
303 rmi_pci_bus_space_write_region_2,
304 rmi_pci_bus_space_write_region_4,
315 rmi_pci_bus_space_set_region_2,
316 rmi_pci_bus_space_set_region_4,
321 rmi_pci_bus_space_copy_region_2,
325 /* read (single) stream */
326 rmi_pci_bus_space_read_stream_1,
327 rmi_pci_bus_space_read_stream_2,
328 rmi_pci_bus_space_read_stream_4,
331 /* read multiple stream */
332 rmi_pci_bus_space_read_multi_stream_1,
333 rmi_pci_bus_space_read_multi_stream_2,
334 rmi_pci_bus_space_read_multi_stream_4,
337 /* read region stream */
338 rmi_pci_bus_space_read_region_1,
339 rmi_pci_bus_space_read_region_2,
340 rmi_pci_bus_space_read_region_4,
343 /* write (single) stream */
344 rmi_pci_bus_space_write_stream_1,
345 rmi_pci_bus_space_write_stream_2,
346 rmi_pci_bus_space_write_stream_4,
349 /* write multiple stream */
350 rmi_pci_bus_space_write_multi_stream_1,
351 rmi_pci_bus_space_write_multi_stream_2,
352 rmi_pci_bus_space_write_multi_stream_4,
355 /* write region stream */
357 rmi_pci_bus_space_write_region_2,
358 rmi_pci_bus_space_write_region_4,
362 /* generic bus_space tag */
363 bus_space_tag_t rmi_pci_bus_space = &local_rmi_pci_bus_space;
366 * Map a region of device bus space into CPU virtual address space.
369 rmi_pci_bus_space_map(void *t __unused, bus_addr_t addr,
370 bus_size_t size __unused, int flags __unused,
371 bus_space_handle_t * bshp)
378 * Unmap a region of device bus space.
381 rmi_pci_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
382 bus_size_t size __unused)
387 * Get a new handle for a subregion of an already-mapped area of bus space.
391 rmi_pci_bus_space_subregion(void *t __unused, bus_space_handle_t bsh,
392 bus_size_t offset, bus_size_t size __unused,
393 bus_space_handle_t * nbshp)
395 *nbshp = bsh + offset;
400 * Read a 1, 2, 4, or 8 byte quantity from bus space
401 * described by tag/handle/offset.
405 rmi_pci_bus_space_read_1(void *tag, bus_space_handle_t handle,
408 return (u_int8_t) (*(volatile u_int8_t *)(handle + offset));
412 rmi_pci_bus_space_read_2(void *tag, bus_space_handle_t handle,
417 value = *(volatile u_int16_t *)(handle + offset);
418 return bswap16(value);
422 rmi_pci_bus_space_read_4(void *tag, bus_space_handle_t handle,
427 value = *(volatile u_int32_t *)(handle + offset);
428 return bswap32(value);
432 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
433 * described by tag/handle/offset and copy into buffer provided.
436 rmi_pci_bus_space_read_multi_1(void *tag, bus_space_handle_t handle,
437 bus_size_t offset, u_int8_t * addr, size_t count)
440 *addr = *(volatile u_int8_t *)(handle + offset);
446 rmi_pci_bus_space_read_multi_2(void *tag, bus_space_handle_t handle,
447 bus_size_t offset, u_int16_t * addr, size_t count)
451 *addr = *(volatile u_int16_t *)(handle + offset);
452 *addr = bswap16(*addr);
458 rmi_pci_bus_space_read_multi_4(void *tag, bus_space_handle_t handle,
459 bus_size_t offset, u_int32_t * addr, size_t count)
463 *addr = *(volatile u_int32_t *)(handle + offset);
464 *addr = bswap32(*addr);
470 * Write the 1, 2, 4, or 8 byte value `value' to bus space
471 * described by tag/handle/offset.
475 rmi_pci_bus_space_write_1(void *tag, bus_space_handle_t handle,
476 bus_size_t offset, u_int8_t value)
479 *(volatile u_int8_t *)(handle + offset) = value;
483 rmi_pci_bus_space_write_2(void *tag, bus_space_handle_t handle,
484 bus_size_t offset, u_int16_t value)
487 *(volatile u_int16_t *)(handle + offset) = bswap16(value);
491 rmi_pci_bus_space_write_4(void *tag, bus_space_handle_t handle,
492 bus_size_t offset, u_int32_t value)
495 *(volatile u_int32_t *)(handle + offset) = bswap32(value);
499 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
500 * provided to bus space described by tag/handle/offset.
504 rmi_pci_bus_space_write_multi_1(void *tag, bus_space_handle_t handle,
505 bus_size_t offset, const u_int8_t * addr, size_t count)
509 (*(volatile u_int8_t *)(handle + offset)) = *addr;
515 rmi_pci_bus_space_write_multi_2(void *tag, bus_space_handle_t handle,
516 bus_size_t offset, const u_int16_t * addr, size_t count)
520 (*(volatile u_int16_t *)(handle + offset)) = bswap16(*addr);
526 rmi_pci_bus_space_write_multi_4(void *tag, bus_space_handle_t handle,
527 bus_size_t offset, const u_int32_t * addr, size_t count)
531 (*(volatile u_int32_t *)(handle + offset)) = bswap32(*addr);
537 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
538 * by tag/handle starting at `offset'.
542 rmi_pci_bus_space_set_region_2(void *t, bus_space_handle_t bsh,
543 bus_size_t offset, u_int16_t value, size_t count)
545 bus_addr_t addr = bsh + offset;
547 for (; count != 0; count--, addr += 2)
548 (*(volatile u_int16_t *)(addr)) = value;
552 rmi_pci_bus_space_set_region_4(void *t, bus_space_handle_t bsh,
553 bus_size_t offset, u_int32_t value, size_t count)
555 bus_addr_t addr = bsh + offset;
557 for (; count != 0; count--, addr += 4)
558 (*(volatile u_int32_t *)(addr)) = value;
562 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
563 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
566 rmi_pci_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1,
567 bus_size_t off1, bus_space_handle_t bsh2,
568 bus_size_t off2, size_t count)
574 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
575 * described by tag/handle/offset and copy into buffer provided.
579 rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
583 return *((volatile u_int8_t *)(handle + offset));
587 rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
590 return *(volatile u_int16_t *)(handle + offset);
594 rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
597 return (*(volatile u_int32_t *)(handle + offset));
601 rmi_pci_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle,
602 bus_size_t offset, u_int8_t * addr, size_t count)
605 *addr = (*(volatile u_int8_t *)(handle + offset));
611 rmi_pci_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle,
612 bus_size_t offset, u_int16_t * addr, size_t count)
615 *addr = (*(volatile u_int16_t *)(handle + offset));
621 rmi_pci_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle,
622 bus_size_t offset, u_int32_t * addr, size_t count)
625 *addr = (*(volatile u_int32_t *)(handle + offset));
631 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
632 * described by tag/handle and starting at `offset' and copy into
636 rmi_pci_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
637 bus_size_t offset, u_int8_t * addr, size_t count)
639 bus_addr_t baddr = bsh + offset;
642 *addr++ = (*(volatile u_int8_t *)(baddr));
648 rmi_pci_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
649 bus_size_t offset, u_int16_t * addr, size_t count)
651 bus_addr_t baddr = bsh + offset;
654 *addr++ = (*(volatile u_int16_t *)(baddr));
660 rmi_pci_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
661 bus_size_t offset, u_int32_t * addr, size_t count)
663 bus_addr_t baddr = bsh + offset;
666 *addr++ = (*(volatile u_int32_t *)(baddr));
672 rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
673 bus_size_t offset, u_int8_t value)
676 *(volatile u_int8_t *)(handle + offset) = value;
680 rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
681 bus_size_t offset, u_int16_t value)
684 *(volatile u_int16_t *)(handle + offset) = value;
688 rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
689 bus_size_t offset, u_int32_t value)
692 *(volatile u_int32_t *)(handle + offset) = value;
696 rmi_pci_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle,
697 bus_size_t offset, const u_int8_t * addr, size_t count)
701 (*(volatile u_int8_t *)(handle + offset)) = *addr;
707 rmi_pci_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle,
708 bus_size_t offset, const u_int16_t * addr, size_t count)
712 (*(volatile u_int16_t *)(handle + offset)) = *addr;
718 rmi_pci_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle,
719 bus_size_t offset, const u_int32_t * addr, size_t count)
723 (*(volatile u_int32_t *)(handle + offset)) = *addr;
729 rmi_pci_bus_space_write_region_2(void *t,
730 bus_space_handle_t bsh,
732 const u_int16_t * addr,
735 bus_addr_t baddr = (bus_addr_t) bsh + offset;
738 (*(volatile u_int16_t *)(baddr)) = *addr;
745 rmi_pci_bus_space_write_region_4(void *t, bus_space_handle_t bsh,
746 bus_size_t offset, const u_int32_t * addr, size_t count)
748 bus_addr_t baddr = bsh + offset;
751 (*(volatile u_int32_t *)(baddr)) = *addr;
758 rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
759 bus_size_t offset __unused, bus_size_t len __unused, int flags)