2 * Copyright (c) 2009 RMI Corporation
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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
28 #include <sys/cdefs.h>
29 __FBSDID("$FreeBSD$");
31 #include <sys/param.h>
32 #include <sys/systm.h>
34 #include <sys/kernel.h>
35 #include <sys/endian.h>
36 #include <sys/malloc.h>
41 #include <vm/vm_kern.h>
42 #include <vm/vm_extern.h>
44 #include <machine/bus.h>
45 #include <machine/cache.h>
48 rmi_pci_bus_space_map(void *t, bus_addr_t addr,
49 bus_size_t size, int flags,
50 bus_space_handle_t * bshp);
53 rmi_pci_bus_space_unmap(void *t, bus_space_handle_t bsh,
57 rmi_pci_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);
63 rmi_pci_bus_space_read_1(void *t,
64 bus_space_handle_t handle,
68 rmi_pci_bus_space_read_2(void *t,
69 bus_space_handle_t handle,
73 rmi_pci_bus_space_read_4(void *t,
74 bus_space_handle_t handle,
78 rmi_pci_bus_space_read_multi_1(void *t,
79 bus_space_handle_t handle,
80 bus_size_t offset, u_int8_t * addr,
84 rmi_pci_bus_space_read_multi_2(void *t,
85 bus_space_handle_t handle,
86 bus_size_t offset, u_int16_t * addr,
90 rmi_pci_bus_space_read_multi_4(void *t,
91 bus_space_handle_t handle,
92 bus_size_t offset, u_int32_t * addr,
96 rmi_pci_bus_space_read_region_1(void *t,
97 bus_space_handle_t bsh,
98 bus_size_t offset, u_int8_t * addr,
102 rmi_pci_bus_space_read_region_2(void *t,
103 bus_space_handle_t bsh,
104 bus_size_t offset, u_int16_t * addr,
108 rmi_pci_bus_space_read_region_4(void *t,
109 bus_space_handle_t bsh,
110 bus_size_t offset, u_int32_t * addr,
114 rmi_pci_bus_space_write_1(void *t,
115 bus_space_handle_t handle,
116 bus_size_t offset, u_int8_t value);
119 rmi_pci_bus_space_write_2(void *t,
120 bus_space_handle_t handle,
121 bus_size_t offset, u_int16_t value);
124 rmi_pci_bus_space_write_4(void *t,
125 bus_space_handle_t handle,
126 bus_size_t offset, u_int32_t value);
129 rmi_pci_bus_space_write_multi_1(void *t,
130 bus_space_handle_t handle,
132 const u_int8_t * addr,
136 rmi_pci_bus_space_write_multi_2(void *t,
137 bus_space_handle_t handle,
139 const u_int16_t * addr,
143 rmi_pci_bus_space_write_multi_4(void *t,
144 bus_space_handle_t handle,
146 const u_int32_t * addr,
150 rmi_pci_bus_space_write_region_2(void *t,
151 bus_space_handle_t bsh,
153 const u_int16_t * addr,
157 rmi_pci_bus_space_write_region_4(void *t,
158 bus_space_handle_t bsh,
160 const u_int32_t * addr,
165 rmi_pci_bus_space_set_region_2(void *t,
166 bus_space_handle_t bsh,
167 bus_size_t offset, u_int16_t value,
170 rmi_pci_bus_space_set_region_4(void *t,
171 bus_space_handle_t bsh,
172 bus_size_t offset, u_int32_t value,
176 rmi_pci_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);
180 rmi_pci_bus_space_copy_region_2(void *t,
181 bus_space_handle_t bsh1,
183 bus_space_handle_t bsh2,
184 bus_size_t off2, size_t count);
187 rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
191 rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
195 rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
198 rmi_pci_bus_space_read_multi_stream_1(void *t,
199 bus_space_handle_t handle,
200 bus_size_t offset, u_int8_t * addr,
204 rmi_pci_bus_space_read_multi_stream_2(void *t,
205 bus_space_handle_t handle,
206 bus_size_t offset, u_int16_t * addr,
210 rmi_pci_bus_space_read_multi_stream_4(void *t,
211 bus_space_handle_t handle,
212 bus_size_t offset, u_int32_t * addr,
216 rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t bsh,
217 bus_size_t offset, u_int8_t value);
219 rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
220 bus_size_t offset, u_int16_t value);
223 rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
224 bus_size_t offset, u_int32_t value);
227 rmi_pci_bus_space_write_multi_stream_1(void *t,
228 bus_space_handle_t handle,
230 const u_int8_t * addr,
233 rmi_pci_bus_space_write_multi_stream_2(void *t,
234 bus_space_handle_t handle,
236 const u_int16_t * addr,
240 rmi_pci_bus_space_write_multi_stream_4(void *t,
241 bus_space_handle_t handle,
243 const u_int32_t * addr,
246 #define TODO() printf("XLR memory bus space function '%s' unimplemented\n", __func__)
248 static struct bus_space local_rmi_pci_bus_space = {
252 /* mapping/unmapping */
253 rmi_pci_bus_space_map,
254 rmi_pci_bus_space_unmap,
255 rmi_pci_bus_space_subregion,
257 /* allocation/deallocation */
262 rmi_pci_bus_space_barrier,
265 rmi_pci_bus_space_read_1,
266 rmi_pci_bus_space_read_2,
267 rmi_pci_bus_space_read_4,
271 rmi_pci_bus_space_read_multi_1,
272 rmi_pci_bus_space_read_multi_2,
273 rmi_pci_bus_space_read_multi_4,
277 rmi_pci_bus_space_read_region_1,
278 rmi_pci_bus_space_read_region_2,
279 rmi_pci_bus_space_read_region_4,
283 rmi_pci_bus_space_write_1,
284 rmi_pci_bus_space_write_2,
285 rmi_pci_bus_space_write_4,
289 rmi_pci_bus_space_write_multi_1,
290 rmi_pci_bus_space_write_multi_2,
291 rmi_pci_bus_space_write_multi_4,
296 rmi_pci_bus_space_write_region_2,
297 rmi_pci_bus_space_write_region_4,
308 rmi_pci_bus_space_set_region_2,
309 rmi_pci_bus_space_set_region_4,
314 rmi_pci_bus_space_copy_region_2,
318 /* read (single) stream */
319 rmi_pci_bus_space_read_stream_1,
320 rmi_pci_bus_space_read_stream_2,
321 rmi_pci_bus_space_read_stream_4,
324 /* read multiple stream */
325 rmi_pci_bus_space_read_multi_stream_1,
326 rmi_pci_bus_space_read_multi_stream_2,
327 rmi_pci_bus_space_read_multi_stream_4,
330 /* read region stream */
331 rmi_pci_bus_space_read_region_1,
332 rmi_pci_bus_space_read_region_2,
333 rmi_pci_bus_space_read_region_4,
336 /* write (single) stream */
337 rmi_pci_bus_space_write_stream_1,
338 rmi_pci_bus_space_write_stream_2,
339 rmi_pci_bus_space_write_stream_4,
342 /* write multiple stream */
343 rmi_pci_bus_space_write_multi_stream_1,
344 rmi_pci_bus_space_write_multi_stream_2,
345 rmi_pci_bus_space_write_multi_stream_4,
348 /* write region stream */
350 rmi_pci_bus_space_write_region_2,
351 rmi_pci_bus_space_write_region_4,
355 /* generic bus_space tag */
356 bus_space_tag_t rmi_pci_bus_space = &local_rmi_pci_bus_space;
359 * Map a region of device bus space into CPU virtual address space.
362 rmi_pci_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)
371 * Unmap a region of device bus space.
374 rmi_pci_bus_space_unmap(void *t __unused, bus_space_handle_t bsh __unused,
375 bus_size_t size __unused)
380 * Get a new handle for a subregion of an already-mapped area of bus space.
384 rmi_pci_bus_space_subregion(void *t __unused, bus_space_handle_t bsh,
385 bus_size_t offset, bus_size_t size __unused,
386 bus_space_handle_t * nbshp)
388 *nbshp = bsh + offset;
393 * Read a 1, 2, 4, or 8 byte quantity from bus space
394 * described by tag/handle/offset.
398 rmi_pci_bus_space_read_1(void *tag, bus_space_handle_t handle,
401 return (u_int8_t) (*(volatile u_int8_t *)(handle + offset));
405 rmi_pci_bus_space_read_2(void *tag, bus_space_handle_t handle,
408 return bswap16((u_int16_t) (*(volatile u_int16_t *)(handle + offset)));
412 rmi_pci_bus_space_read_4(void *tag, bus_space_handle_t handle,
415 return bswap32((*(volatile u_int32_t *)(handle + offset)));
420 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
421 * described by tag/handle/offset and copy into buffer provided.
424 rmi_pci_bus_space_read_multi_1(void *tag, bus_space_handle_t handle,
425 bus_size_t offset, u_int8_t * addr, size_t count)
428 *addr = (*(volatile u_int8_t *)(handle + offset));
434 rmi_pci_bus_space_read_multi_2(void *tag, bus_space_handle_t handle,
435 bus_size_t offset, u_int16_t * addr, size_t count)
439 *addr = *(volatile u_int16_t *)(handle + offset);
440 *addr = bswap16(*addr);
446 rmi_pci_bus_space_read_multi_4(void *tag, bus_space_handle_t handle,
447 bus_size_t offset, u_int32_t * addr, size_t count)
451 *addr = *(volatile u_int32_t *)(handle + offset);
452 *addr = bswap32(*addr);
458 * Write the 1, 2, 4, or 8 byte value `value' to bus space
459 * described by tag/handle/offset.
463 rmi_pci_bus_space_write_1(void *tag, bus_space_handle_t handle,
464 bus_size_t offset, u_int8_t value)
467 *(volatile u_int8_t *)(handle + offset) = value;
471 rmi_pci_bus_space_write_2(void *tag, bus_space_handle_t handle,
472 bus_size_t offset, u_int16_t value)
475 *(volatile u_int16_t *)(handle + offset) = bswap16(value);
480 rmi_pci_bus_space_write_4(void *tag, bus_space_handle_t handle,
481 bus_size_t offset, u_int32_t value)
484 *(volatile u_int32_t *)(handle + offset) = bswap32(value);
488 * Write `count' 1, 2, 4, or 8 byte quantities from the buffer
489 * provided to bus space described by tag/handle/offset.
494 rmi_pci_bus_space_write_multi_1(void *tag, bus_space_handle_t handle,
495 bus_size_t offset, const u_int8_t * addr, size_t count)
499 (*(volatile u_int8_t *)(handle + offset)) = *addr;
505 rmi_pci_bus_space_write_multi_2(void *tag, bus_space_handle_t handle,
506 bus_size_t offset, const u_int16_t * addr, size_t count)
510 (*(volatile u_int16_t *)(handle + offset)) = bswap16(*addr);
516 rmi_pci_bus_space_write_multi_4(void *tag, bus_space_handle_t handle,
517 bus_size_t offset, const u_int32_t * addr, size_t count)
521 (*(volatile u_int32_t *)(handle + offset)) = bswap32(*addr);
527 * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described
528 * by tag/handle starting at `offset'.
532 rmi_pci_bus_space_set_region_2(void *t, bus_space_handle_t bsh,
533 bus_size_t offset, u_int16_t value, size_t count)
535 bus_addr_t addr = bsh + offset;
537 for (; count != 0; count--, addr += 2)
538 (*(volatile u_int16_t *)(addr)) = value;
542 rmi_pci_bus_space_set_region_4(void *t, bus_space_handle_t bsh,
543 bus_size_t offset, u_int32_t value, size_t count)
545 bus_addr_t addr = bsh + offset;
547 for (; count != 0; count--, addr += 4)
548 (*(volatile u_int32_t *)(addr)) = value;
553 * Copy `count' 1, 2, 4, or 8 byte values from bus space starting
554 * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2.
557 rmi_pci_bus_space_copy_region_2(void *t, bus_space_handle_t bsh1,
558 bus_size_t off1, bus_space_handle_t bsh2,
559 bus_size_t off2, size_t count)
565 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
566 * described by tag/handle/offset and copy into buffer provided.
570 rmi_pci_bus_space_read_stream_1(void *t, bus_space_handle_t handle,
574 return *((volatile u_int8_t *)(handle + offset));
579 rmi_pci_bus_space_read_stream_2(void *t, bus_space_handle_t handle,
582 return *(volatile u_int16_t *)(handle + offset);
587 rmi_pci_bus_space_read_stream_4(void *t, bus_space_handle_t handle,
590 return (*(volatile u_int32_t *)(handle + offset));
595 rmi_pci_bus_space_read_multi_stream_1(void *tag, bus_space_handle_t handle,
596 bus_size_t offset, u_int8_t * addr, size_t count)
599 *addr = (*(volatile u_int8_t *)(handle + offset));
605 rmi_pci_bus_space_read_multi_stream_2(void *tag, bus_space_handle_t handle,
606 bus_size_t offset, u_int16_t * addr, size_t count)
609 *addr = (*(volatile u_int16_t *)(handle + offset));
615 rmi_pci_bus_space_read_multi_stream_4(void *tag, bus_space_handle_t handle,
616 bus_size_t offset, u_int32_t * addr, size_t count)
619 *addr = (*(volatile u_int32_t *)(handle + offset));
627 * Read `count' 1, 2, 4, or 8 byte quantities from bus space
628 * described by tag/handle and starting at `offset' and copy into
632 rmi_pci_bus_space_read_region_1(void *t, bus_space_handle_t bsh,
633 bus_size_t offset, u_int8_t * addr, size_t count)
635 bus_addr_t baddr = bsh + offset;
638 *addr++ = (*(volatile u_int8_t *)(baddr));
644 rmi_pci_bus_space_read_region_2(void *t, bus_space_handle_t bsh,
645 bus_size_t offset, u_int16_t * addr, size_t count)
647 bus_addr_t baddr = bsh + offset;
650 *addr++ = (*(volatile u_int16_t *)(baddr));
656 rmi_pci_bus_space_read_region_4(void *t, bus_space_handle_t bsh,
657 bus_size_t offset, u_int32_t * addr, size_t count)
659 bus_addr_t baddr = bsh + offset;
662 *addr++ = (*(volatile u_int32_t *)(baddr));
669 rmi_pci_bus_space_write_stream_1(void *t, bus_space_handle_t handle,
670 bus_size_t offset, u_int8_t value)
673 *(volatile u_int8_t *)(handle + offset) = value;
677 rmi_pci_bus_space_write_stream_2(void *t, bus_space_handle_t handle,
678 bus_size_t offset, u_int16_t value)
681 *(volatile u_int16_t *)(handle + offset) = value;
686 rmi_pci_bus_space_write_stream_4(void *t, bus_space_handle_t handle,
687 bus_size_t offset, u_int32_t value)
690 *(volatile u_int32_t *)(handle + offset) = value;
695 rmi_pci_bus_space_write_multi_stream_1(void *tag, bus_space_handle_t handle,
696 bus_size_t offset, const u_int8_t * addr, size_t count)
700 (*(volatile u_int8_t *)(handle + offset)) = *addr;
706 rmi_pci_bus_space_write_multi_stream_2(void *tag, bus_space_handle_t handle,
707 bus_size_t offset, const u_int16_t * addr, size_t count)
711 (*(volatile u_int16_t *)(handle + offset)) = *addr;
717 rmi_pci_bus_space_write_multi_stream_4(void *tag, bus_space_handle_t handle,
718 bus_size_t offset, const u_int32_t * addr, size_t count)
722 (*(volatile u_int32_t *)(handle + offset)) = *addr;
728 rmi_pci_bus_space_write_region_2(void *t,
729 bus_space_handle_t bsh,
731 const u_int16_t * addr,
734 bus_addr_t baddr = (bus_addr_t) bsh + offset;
737 (*(volatile u_int16_t *)(baddr)) = *addr;
744 rmi_pci_bus_space_write_region_4(void *t, bus_space_handle_t bsh,
745 bus_size_t offset, const u_int32_t * addr, size_t count)
747 bus_addr_t baddr = bsh + offset;
750 (*(volatile u_int32_t *)(baddr)) = *addr;
757 rmi_pci_bus_space_barrier(void *tag __unused, bus_space_handle_t bsh __unused,
758 bus_size_t offset __unused, bus_size_t len __unused, int flags)