summaryrefslogtreecommitdiff
path: root/static/netbsd/man9/bus_space.9 3.html
diff options
context:
space:
mode:
Diffstat (limited to 'static/netbsd/man9/bus_space.9 3.html')
-rw-r--r--static/netbsd/man9/bus_space.9 3.html2110
1 files changed, 0 insertions, 2110 deletions
diff --git a/static/netbsd/man9/bus_space.9 3.html b/static/netbsd/man9/bus_space.9 3.html
deleted file mode 100644
index 71ce652b..00000000
--- a/static/netbsd/man9/bus_space.9 3.html
+++ /dev/null
@@ -1,2110 +0,0 @@
-<table class="head">
- <tr>
- <td class="head-ltitle">BUS_SPACE(9)</td>
- <td class="head-vol">Kernel Developer's Manual</td>
- <td class="head-rtitle">BUS_SPACE(9)</td>
- </tr>
-</table>
-<div class="manual-text">
-<section class="Sh">
-<h1 class="Sh" id="NAME"><a class="permalink" href="#NAME">NAME</a></h1>
-<p class="Pp"><code class="Nm">bus_space</code>,
- <code class="Nm">bus_space_barrier</code>,
- <code class="Nm">bus_space_copy_region_1</code>,
- <code class="Nm">bus_space_copy_region_2</code>,
- <code class="Nm">bus_space_copy_region_4</code>,
- <code class="Nm">bus_space_copy_region_8</code>,
- <code class="Nm">bus_space_free</code>,
- <code class="Nm">bus_space_handle_is_equal</code>,
- <code class="Nm">bus_space_is_equal</code>,
- <code class="Nm">bus_space_map</code>,
- <code class="Nm">bus_space_mmap</code>,
- <code class="Nm">bus_space_peek_1</code>,
- <code class="Nm">bus_space_peek_2</code>,
- <code class="Nm">bus_space_peek_4</code>,
- <code class="Nm">bus_space_peek_8</code>,
- <code class="Nm">bus_space_poke_1</code>,
- <code class="Nm">bus_space_poke_2</code>,
- <code class="Nm">bus_space_poke_4</code>,
- <code class="Nm">bus_space_poke_8</code>,
- <code class="Nm">bus_space_read_1</code>,
- <code class="Nm">bus_space_read_2</code>,
- <code class="Nm">bus_space_read_4</code>,
- <code class="Nm">bus_space_read_8</code>,
- <code class="Nm">bus_space_read_multi_1</code>,
- <code class="Nm">bus_space_read_multi_2</code>,
- <code class="Nm">bus_space_read_multi_4</code>,
- <code class="Nm">bus_space_read_multi_8</code>,
- <code class="Nm">bus_space_read_multi_stream_1</code>,
- <code class="Nm">bus_space_read_multi_stream_2</code>,
- <code class="Nm">bus_space_read_multi_stream_4</code>,
- <code class="Nm">bus_space_read_multi_stream_8</code>,
- <code class="Nm">bus_space_read_region_1</code>,
- <code class="Nm">bus_space_read_region_2</code>,
- <code class="Nm">bus_space_read_region_4</code>,
- <code class="Nm">bus_space_read_region_8</code>,
- <code class="Nm">bus_space_read_region_stream_1</code>,
- <code class="Nm">bus_space_read_region_stream_2</code>,
- <code class="Nm">bus_space_read_region_stream_4</code>,
- <code class="Nm">bus_space_read_region_stream_8</code>,
- <code class="Nm">bus_space_read_stream_1</code>,
- <code class="Nm">bus_space_read_stream_2</code>,
- <code class="Nm">bus_space_read_stream_4</code>,
- <code class="Nm">bus_space_read_stream_8</code>,
- <code class="Nm">bus_space_release</code>,
- <code class="Nm">bus_space_reservation_addr</code>,
- <code class="Nm">bus_space_reservation_init</code>,
- <code class="Nm">bus_space_reservation_size</code>,
- <code class="Nm">bus_space_reservation_map</code>,
- <code class="Nm">bus_space_reservation_unmap</code>,
- <code class="Nm">bus_space_reserve</code>,
- <code class="Nm">bus_space_reserve_subregion</code>,
- <code class="Nm">bus_space_set_region_1</code>,
- <code class="Nm">bus_space_set_region_2</code>,
- <code class="Nm">bus_space_set_region_4</code>,
- <code class="Nm">bus_space_set_region_8</code>,
- <code class="Nm">bus_space_subregion</code>,
- <code class="Nm">bus_space_tag_create</code>,
- <code class="Nm">bus_space_tag_destroy</code>,
- <code class="Nm">bus_space_unmap</code>,
- <code class="Nm">bus_space_vaddr</code>,
- <code class="Nm">bus_space_write_1</code>,
- <code class="Nm">bus_space_write_2</code>,
- <code class="Nm">bus_space_write_4</code>,
- <code class="Nm">bus_space_write_8</code>,
- <code class="Nm">bus_space_write_multi_1</code>,
- <code class="Nm">bus_space_write_multi_2</code>,
- <code class="Nm">bus_space_write_multi_4</code>,
- <code class="Nm">bus_space_write_multi_8</code>,
- <code class="Nm">bus_space_write_multi_stream_1</code>,
- <code class="Nm">bus_space_write_multi_stream_2</code>,
- <code class="Nm">bus_space_write_multi_stream_4</code>,
- <code class="Nm">bus_space_write_multi_stream_8</code>,
- <code class="Nm">bus_space_write_region_1</code>,
- <code class="Nm">bus_space_write_region_2</code>,
- <code class="Nm">bus_space_write_region_4</code>,
- <code class="Nm">bus_space_write_region_8</code>,
- <code class="Nm">bus_space_write_region_stream_1</code>,
- <code class="Nm">bus_space_write_region_stream_2</code>,
- <code class="Nm">bus_space_write_region_stream_4</code>,
- <code class="Nm">bus_space_write_region_stream_8</code>,
- <code class="Nm">bus_space_write_stream_1</code>,
- <code class="Nm">bus_space_write_stream_2</code>,
- <code class="Nm">bus_space_write_stream_4</code>,
- <code class="Nm">bus_space_write_stream_8</code> &#x2014;
- <span class="Nd">bus space manipulation functions</span></p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="SYNOPSIS"><a class="permalink" href="#SYNOPSIS">SYNOPSIS</a></h1>
-<p class="Pp"><code class="In">#include
- &lt;<a class="In">sys/bus.h</a>&gt;</code></p>
-<p class="Pp"><var class="Ft">bool</var>
- <br/>
- <code class="Fn">bus_space_handle_is_equal</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle1</var>,
- <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle2</var>);</p>
-<p class="Pp"><var class="Ft">bool</var>
- <br/>
- <code class="Fn">bus_space_is_equal</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space1</var>, <var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space2</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_release</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- t</var>,
- <var class="Fa" style="white-space: nowrap;">bus_space_reservation_t
- *bsr</var>);</p>
-<p class="Pp"><var class="Ft">int</var>
- <br/>
- <code class="Fn">bus_space_reserve</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- t</var>, <var class="Fa" style="white-space: nowrap;">bus_addr_t bpa</var>,
- <var class="Fa" style="white-space: nowrap;">bus_size_t size</var>,
- <var class="Fa" style="white-space: nowrap;">int flags</var>,
- <var class="Fa" style="white-space: nowrap;">bus_space_reservation_t
- *bsrp</var>);</p>
-<p class="Pp"><var class="Ft">int</var>
- <br/>
- <code class="Fn">bus_space_reserve_subregion</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- t</var>, <var class="Fa" style="white-space: nowrap;">bus_addr_t
- reg_start</var>, <var class="Fa" style="white-space: nowrap;">bus_addr_t
- reg_end</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- size</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- alignment</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- boundary</var>, <var class="Fa" style="white-space: nowrap;">int
- flags</var>,
- <var class="Fa" style="white-space: nowrap;">bus_space_reservation_t
- *bsrp</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_reservation_init</code>(<var class="Fa" style="white-space: nowrap;">bus_space_reservation_t
- *bsr</var>, <var class="Fa" style="white-space: nowrap;">bus_addr_t
- addr</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- size</var>);</p>
-<p class="Pp"><var class="Ft">bus_size_t</var>
- <br/>
- <code class="Fn">bus_space_reservation_size</code>(<var class="Fa" style="white-space: nowrap;">bus_space_reservation_t
- *bsr</var>);</p>
-<p class="Pp"><var class="Ft">int</var>
- <br/>
- <code class="Fn">bus_space_reservation_map</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- t</var>,
- <var class="Fa" style="white-space: nowrap;">bus_space_reservation_t
- *bsr</var>, <var class="Fa" style="white-space: nowrap;">int flags</var>,
- <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- *bshp</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_reservation_unmap</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- t</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- bsh</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- size</var>);</p>
-<p class="Pp"><var class="Ft">int</var>
- <br/>
- <code class="Fn">bus_space_map</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_addr_t
- address</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- size</var>, <var class="Fa" style="white-space: nowrap;">int flags</var>,
- <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- *handlep</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_unmap</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- size</var>);</p>
-<p class="Pp"><var class="Ft">int</var>
- <br/>
- <code class="Fn">bus_space_subregion</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- size</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- *nhandlep</var>);</p>
-<p class="Pp"><var class="Ft">int</var>
- <br/>
- <code class="Fn">bus_space_alloc</code>(<var class="Fa">bus_space_tag_t
- space</var>, <var class="Fa">bus_addr_t reg_start</var>,
- <var class="Fa">bus_addr_t reg_end</var>, <var class="Fa">bus_size_t
- size</var>, <var class="Fa">bus_size_t alignment</var>,
- <var class="Fa">bus_size_t boundary</var>, <var class="Fa">int flags</var>,
- <var class="Fa">bus_addr_t *addrp</var>, <var class="Fa">bus_space_handle_t
- *handlep</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_free</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- size</var>);</p>
-<p class="Pp"><var class="Ft">void *</var>
- <br/>
- <code class="Fn">bus_space_vaddr</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>);</p>
-<p class="Pp"><var class="Ft">paddr_t</var>
- <br/>
- <code class="Fn">bus_space_mmap</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_addr_t
- addr</var>, <var class="Fa" style="white-space: nowrap;">off_t off</var>,
- <var class="Fa" style="white-space: nowrap;">int prot</var>,
- <var class="Fa" style="white-space: nowrap;">int flags</var>);</p>
-<p class="Pp"><var class="Ft">int</var>
- <br/>
- <code class="Fn">bus_space_tag_create</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- obst</var>, <var class="Fa" style="white-space: nowrap;">uint64_t
- present</var>, <var class="Fa" style="white-space: nowrap;">uint64_t
- extpresent</var>, <var class="Fa" style="white-space: nowrap;">const struct
- bus_space_overrides *ov</var>,
- <var class="Fa" style="white-space: nowrap;">void *ctx</var>,
- <var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- *bstp</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_tag_destroy</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- bst</var>);</p>
-<p class="Pp"><var class="Ft">int</var>
- <br/>
- <code class="Fn">bus_space_peek_1</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint8_t
- *datap</var>);</p>
-<p class="Pp"><var class="Ft">int</var>
- <br/>
- <code class="Fn">bus_space_peek_2</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint16_t
- *datap</var>);</p>
-<p class="Pp"><var class="Ft">int</var>
- <br/>
- <code class="Fn">bus_space_peek_4</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint32_t
- *datap</var>);</p>
-<p class="Pp"><var class="Ft">int</var>
- <br/>
- <code class="Fn">bus_space_peek_8</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint64_t
- *datap</var>);</p>
-<p class="Pp"><var class="Ft">int</var>
- <br/>
- <code class="Fn">bus_space_poke_1</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint8_t
- data</var>);</p>
-<p class="Pp"><var class="Ft">int</var>
- <br/>
- <code class="Fn">bus_space_poke_2</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint16_t
- data</var>);</p>
-<p class="Pp"><var class="Ft">int</var>
- <br/>
- <code class="Fn">bus_space_poke_4</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint32_t
- data</var>);</p>
-<p class="Pp"><var class="Ft">int</var>
- <br/>
- <code class="Fn">bus_space_poke_8</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint64_t
- data</var>);</p>
-<p class="Pp"><var class="Ft">uint8_t</var>
- <br/>
- <code class="Fn">bus_space_read_1</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>);</p>
-<p class="Pp"><var class="Ft">uint16_t</var>
- <br/>
- <code class="Fn">bus_space_read_2</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>);</p>
-<p class="Pp"><var class="Ft">uint32_t</var>
- <br/>
- <code class="Fn">bus_space_read_4</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>);</p>
-<p class="Pp"><var class="Ft">uint64_t</var>
- <br/>
- <code class="Fn">bus_space_read_8</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_1</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint8_t
- value</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_2</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint16_t
- value</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_4</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint32_t
- value</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_8</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint64_t
- value</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_barrier</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- length</var>, <var class="Fa" style="white-space: nowrap;">int
- flags</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_read_region_1</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint8_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_read_region_2</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint16_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_read_region_4</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint32_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_read_region_8</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint64_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_read_region_stream_1</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint8_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_read_region_stream_2</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint16_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_read_region_stream_4</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint32_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_read_region_stream_8</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint64_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_region_1</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">const uint8_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_region_2</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">const uint16_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_region_4</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">const uint32_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_region_8</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">const uint64_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_region_stream_1</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">const uint8_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_region_stream_2</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">const uint16_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_region_stream_4</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">const uint32_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_region_stream_8</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">const uint64_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_copy_region_1</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- srchandle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- srcoffset</var>,
- <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- dsthandle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- dstoffset</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_copy_region_2</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- srchandle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- srcoffset</var>,
- <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- dsthandle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- dstoffset</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_copy_region_4</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- srchandle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- srcoffset</var>,
- <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- dsthandle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- dstoffset</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_copy_region_8</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- srchandle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- srcoffset</var>,
- <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- dsthandle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- dstoffset</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_set_region_1</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint8_t
- value</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_set_region_2</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint16_t
- value</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_set_region_4</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint32_t
- value</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_set_region_8</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint64_t
- value</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_read_multi_1</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint8_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_read_multi_2</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint16_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_read_multi_4</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint32_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_read_multi_8</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint64_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_read_multi_stream_1</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint8_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_read_multi_stream_2</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint16_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_read_multi_stream_4</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint32_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_read_multi_stream_8</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">uint64_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_multi_1</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">const uint8_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_multi_2</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">const uint16_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_multi_4</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">const uint32_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_multi_8</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">const uint64_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_multi_stream_1</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">const uint8_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_multi_stream_2</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">const uint16_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_multi_stream_4</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">const uint32_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-<p class="Pp"><var class="Ft">void</var>
- <br/>
- <code class="Fn">bus_space_write_multi_stream_8</code>(<var class="Fa" style="white-space: nowrap;">bus_space_tag_t
- space</var>, <var class="Fa" style="white-space: nowrap;">bus_space_handle_t
- handle</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- offset</var>, <var class="Fa" style="white-space: nowrap;">const uint64_t
- *datap</var>, <var class="Fa" style="white-space: nowrap;">bus_size_t
- count</var>);</p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="DESCRIPTION"><a class="permalink" href="#DESCRIPTION">DESCRIPTION</a></h1>
-<p class="Pp">The <code class="Nm">bus_space</code> functions exist to allow
- device drivers machine-independent access to bus memory and register areas.
- All of the functions and types described in this document can be used by
- including the <code class="In">&lt;<a class="In">sys/bus.h</a>&gt;</code>
- header file.</p>
-<p class="Pp">Many common devices are used on multiple architectures, but are
- accessed differently on each because of architectural constraints. For
- instance, a device which is mapped in one system's I/O space may be mapped
- in memory space on a second system. On a third system, architectural
- limitations might change the way registers need to be accessed (e.g.,
- creating a non-linear register space). In some cases, a single driver may
- need to access the same type of device in multiple ways in a single system
- or architecture. The goal of the <code class="Nm">bus_space</code> functions
- is to allow a single driver source file to manipulate a set of devices on
- different system architectures, and to allow a single driver object file to
- manipulate a set of devices on multiple bus types on a single
- architecture.</p>
-<p class="Pp">Not all busses have to implement all functions described in this
- document, though that is encouraged if the operations are logically
- supported by the bus. Unimplemented functions should cause compile-time
- errors if possible.</p>
-<p class="Pp">All of the interface definitions described in this document are
- shown as function prototypes and discussed as if they were required to be
- functions. Implementations are encouraged to implement prototyped
- (type-checked) versions of these interfaces, but may implement them as
- macros if appropriate. Machine-dependent types, variables, and functions
- should be marked clearly in
- <code class="In">&lt;<a class="In">machine/bus_defs.h</a>&gt;</code> and in
- <code class="In">&lt;<a class="In">machine/bus_funcs.h</a>&gt;</code> to
- avoid confusion with the machine-independent types and functions, and, if
- possible, should be given names which make the machine-dependence clear.</p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="CONCEPTS_AND_GUIDELINES"><a class="permalink" href="#CONCEPTS_AND_GUIDELINES">CONCEPTS
- AND GUIDELINES</a></h1>
-<p class="Pp">Bus spaces are described by bus space tags, which can be created
- only by machine-dependent code. A given machine may have several different
- types of bus space (e.g., memory space and I/O space), and thus may provide
- multiple different bus space tags. Individual busses or devices on a machine
- may use more than one bus space tag. For instance, ISA devices are given an
- ISA memory space tag and an ISA I/O space tag. Architectures may have
- several different tags which represent the same type of space, for instance
- because of multiple different host bus interface chipsets.</p>
-<p class="Pp">A range in bus space is described by a bus address and a bus size.
- The bus address describes the start of the range in bus space. The bus size
- describes the size of the range in bytes. Busses which are not byte
- addressable may require use of bus space ranges with appropriately aligned
- addresses and properly rounded sizes.</p>
-<p class="Pp">Access to regions of bus space is facilitated by use of bus space
- handles, which are usually created by mapping a specific range of a bus
- space. Handles may also be created by allocating and mapping a range of bus
- space, the actual location of which is picked by the implementation within
- bounds specified by the caller of the allocation function.</p>
-<p class="Pp">All of the bus space access functions require one bus space tag
- argument, at least one handle argument, and at least one offset argument (a
- bus size). The bus space tag specifies the space, each handle specifies a
- region in the space, and each offset specifies the offset into the region of
- the actual location(s) to be accessed. Offsets are given in bytes, though
- busses may impose alignment constraints. The offset used to access data
- relative to a given handle must be such that all of the data being accessed
- is in the mapped region that the handle describes. Trying to access data
- outside that region is an error.</p>
-<p class="Pp" id="bus_space_barrier">Bus space I/O operations on mappings made
- with <code class="Dv">BUS_SPACE_MAP_PREFETCHABLE</code> or
- <code class="Dv">BUS_SPACE_MAP_CACHEABLE</code> may be reordered or combined
- for performance on devices that support it, such as write-combining (a.k.a.
- &#x2018;prefetchable&#x2019;) graphics framebuffers or cacheable ROM images.
- The
- <a class="permalink" href="#bus_space_barrier"><code class="Fn">bus_space_barrier</code></a>()
- function orders reads and writes in prefetchable or cacheable mappings
- relative to other reads and writes in bus spaces. Barriers are needed
- <a class="permalink" href="#only"><i class="Em" id="only">only</i></a> when
- prefetchable or cacheable mappings are involved:</p>
-<ul class="Bl-bullet">
- <li>Bus space reads and writes on non-prefetchable, non-cacheable mappings at
- a single device are totally ordered with one another.</li>
- <li>Ordering of memory operations on normal memory with bus space I/O for
- triggering DMA or being notified of DMA completion requires
- <a class="Xr">bus_dmamap_sync(9)</a>.</li>
-</ul>
-<p class="Pp">People trying to write portable drivers with the
- <code class="Nm">bus_space</code> functions should try to make minimal
- assumptions about what the system allows. In particular, they should expect
- that the system requires bus space addresses being accessed to be naturally
- aligned (i.e., base address of handle added to offset is a multiple of the
- access size), and that the system does alignment checking on pointers (i.e.,
- pointer to objects being read and written must point to properly-aligned
- data).</p>
-<p class="Pp">The descriptions of the <code class="Nm">bus_space</code>
- functions given below all assume that they are called with proper arguments.
- If called with invalid arguments or arguments that are out of range (e.g.,
- trying to access data outside of the region mapped when a given handle was
- created), undefined behaviour results. In that case, they may cause the
- system to halt, either intentionally (via panic) or unintentionally (by
- causing a fatal trap or by some other means) or may cause improper operation
- which is not immediately fatal. Functions which return void or which return
- data read from bus space (i.e., functions which don't obviously return an
- error code) do not fail. They could only fail if given invalid arguments,
- and in that case their behaviour is undefined. Functions which take a count
- of bytes have undefined results if the specified <var class="Fa">count</var>
- is zero.</p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="TYPES"><a class="permalink" href="#TYPES">TYPES</a></h1>
-<p class="Pp">Several types are defined in
- <code class="In">&lt;<a class="In">machine/bus_defs.h</a>&gt;</code> to
- facilitate use of the <code class="Nm">bus_space</code> functions by
- drivers.</p>
-<p class="Pp"></p>
-<dl class="Bl-ohang Bl-compact">
- <dt><var class="Fa">bus_addr_t</var></dt>
- <dd>
- <p class="Pp">The <var class="Fa">bus_addr_t</var> type is used to describe
- bus addresses. It must be an unsigned integral type capable of holding
- the largest bus address usable by the architecture. This type is
- primarily used when mapping and unmapping bus space.</p>
- <p class="Pp"></p>
- </dd>
- <dt><var class="Fa">bus_size_t</var></dt>
- <dd>
- <p class="Pp">The <var class="Fa">bus_size_t</var> type is used to describe
- sizes of ranges in bus space. It must be an unsigned integral type
- capable of holding the size of the largest bus address range usable on
- the architecture. This type is used by virtually all of the
- <code class="Nm">bus_space</code> functions, describing sizes when
- mapping regions and offsets into regions when performing space access
- operations.</p>
- <p class="Pp"></p>
- </dd>
- <dt><var class="Fa">bus_space_tag_t</var></dt>
- <dd>
- <p class="Pp">The <var class="Fa">bus_space_tag_t</var> type is used to
- describe a particular bus space on a machine. Its contents are
- machine-dependent and should be considered opaque by machine-independent
- code. This type is used by all <code class="Nm">bus_space</code>
- functions to name the space on which they're operating.</p>
- <p class="Pp"></p>
- </dd>
- <dt><var class="Fa">bus_space_handle_t</var></dt>
- <dd>
- <p class="Pp">The <var class="Fa">bus_space_handle_t</var> type is used to
- describe a mapping of a range of bus space. Its contents are
- machine-dependent and should be considered opaque by machine-independent
- code. This type is used when performing bus space access operations.</p>
- <p class="Pp"></p>
- </dd>
- <dt><var class="Fa">bus_space_reservation_t</var></dt>
- <dd>
- <p class="Pp" id="bus_space_reservation_init">The
- <var class="Fa">bus_space_reservation_t</var> type is used to describe a
- range of bus space. It logically consists of a
- <var class="Fa">bus_addr_t</var>, the first address in the range, and a
- <var class="Fa">bus_size_t</var>, the length in bytes of the range.
- Machine-independent code creates and interrogates a
- <var class="Fa">bus_space_reservation_t</var> using a constructor,
- <a class="permalink" href="#bus_space_reservation_init"><code class="Fn">bus_space_reservation_init</code></a>(),
- and accessor functions,
- <a class="permalink" href="#bus_space_reservation_addr"><code class="Fn" id="bus_space_reservation_addr">bus_space_reservation_addr</code></a>()
- and
- <a class="permalink" href="#bus_space_reservation_size"><code class="Fn" id="bus_space_reservation_size">bus_space_reservation_size</code></a>().</p>
- </dd>
-</dl>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="COMPARING_BUS_SPACE_TAGS"><a class="permalink" href="#COMPARING_BUS_SPACE_TAGS">COMPARING
- BUS SPACE TAGS</a></h1>
-<p class="Pp">To check whether or not one <var class="Fa">bus_space_tag_t</var>
- refers to the same space as another in machine-independent code, do not use
- either <a class="Xr">memcmp(9)</a> or the C equals (==) operator. Use
- <a class="permalink" href="#bus_space_is_equal"><code class="Fn" id="bus_space_is_equal">bus_space_is_equal</code></a>(),
- instead.</p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="MAPPING_AND_UNMAPPING_BUS_SPACE"><a class="permalink" href="#MAPPING_AND_UNMAPPING_BUS_SPACE">MAPPING
- AND UNMAPPING BUS SPACE</a></h1>
-<p class="Pp">Bus space must be mapped before it can be used, and should be
- unmapped when it is no longer needed. The
- <code class="Fn">bus_space_map</code>(),
- <code class="Fn">bus_space_reservation_map</code>(),
- <code class="Fn">bus_space_reservation_unmap</code>(), and
- <code class="Fn">bus_space_unmap</code>() functions provide these
- capabilities.</p>
-<p class="Pp" id="bus_space_subregion">Some drivers need to be able to pass a
- subregion of already-mapped bus space to another driver or module within a
- driver. The
- <a class="permalink" href="#bus_space_subregion"><code class="Fn">bus_space_subregion</code></a>()
- function allows such subregions to be created.</p>
-<p class="Pp"></p>
-<dl class="Bl-ohang Bl-compact">
- <dt id="bus_space_map"><a class="permalink" href="#bus_space_map"><code class="Fn">bus_space_map</code></a>(<var class="Fa">space</var>,
- <var class="Fa">address</var>, <var class="Fa">size</var>,
- <var class="Fa">flags</var>, <var class="Fa">handlep</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_map~2">The
- <a class="permalink" href="#bus_space_map~2"><code class="Fn">bus_space_map</code></a>()
- function exclusively reserves and maps the region of bus space named by
- the <var class="Fa">space</var>, <var class="Fa">address</var>, and
- <var class="Fa">size</var> arguments. If successful, it returns zero and
- fills in the bus space handle pointed to by
- <var class="Fa">handlep</var> with the handle that can be used to access
- the mapped region. If unsuccessful, it will return non-zero and leave
- the bus space handle pointed to by <var class="Fa">handlep</var> in an
- undefined state.</p>
- <p class="Pp">The <var class="Fa">flags</var> argument controls how the
- space is to be mapped. Supported flags include:</p>
- <div class="Bd-indent">
- <dl class="Bl-tag">
- <dt id="BUS_SPACE_MAP_CACHEABLE"><a class="permalink" href="#BUS_SPACE_MAP_CACHEABLE"><code class="Dv">BUS_SPACE_MAP_CACHEABLE</code></a></dt>
- <dd>Try to map the space so that accesses can be cached by the system
- cache. If this flag is not specified, the implementation should map
- the space so that it will not be cached. This mapping method will only
- be useful in very rare occasions.
- <p class="Pp">This flag must have a value of 1 on all implementations
- for backward compatibility.</p>
- </dd>
- <dt id="BUS_SPACE_MAP_PREFETCHABLE"><a class="permalink" href="#BUS_SPACE_MAP_PREFETCHABLE"><code class="Dv">BUS_SPACE_MAP_PREFETCHABLE</code></a></dt>
- <dd>Try to map the space so that accesses can be prefetched by the system,
- and writes can be buffered. This means, accesses should be side effect
- free (idempotent). The
- <a class="permalink" href="#bus_space_barrier~2"><code class="Fn" id="bus_space_barrier~2">bus_space_barrier</code></a>()
- methods will flush the write buffer or force actual read accesses. If
- this flag is not specified, the implementation should map the space so
- that it will not be prefetched or delayed.</dd>
- <dt id="BUS_SPACE_MAP_LINEAR"><a class="permalink" href="#BUS_SPACE_MAP_LINEAR"><code class="Dv">BUS_SPACE_MAP_LINEAR</code></a></dt>
- <dd>Try to map the space so that its contents can be accessed linearly via
- normal memory access methods (e.g., pointer dereferencing and
- structure accesses). The <code class="Fn">bus_space_vaddr</code>()
- method can be used to obtain the kernel virtual address of the mapped
- range. This is useful when software wants to do direct access to a
- memory device, e.g., a frame buffer. If this flag is specified and
- linear mapping is not possible, the
- <code class="Fn">bus_space_map</code>() call should fail. If this flag
- is not specified, the system may map the space in whatever way is most
- convenient. Use of this mapping method is not encouraged for normal
- device access; where linear access is not essential, use of the
- <a class="permalink" href="#bus_space_read/write"><code class="Fn" id="bus_space_read/write">bus_space_read/write</code></a>()
- methods is strongly recommended.</dd>
- </dl>
- </div>
- <p class="Pp">Not all combinations of flags make sense or are supported with
- all spaces. For instance,
- <code class="Dv">BUS_SPACE_MAP_CACHEABLE</code> may be meaningless when
- used on many systems' I/O port spaces, and on some systems
- <code class="Dv">BUS_SPACE_MAP_LINEAR</code> without
- <code class="Dv">BUS_SPACE_MAP_PREFETCHABLE</code> may never work. When
- the system hardware or firmware provides hints as to how spaces should
- be mapped (e.g., the PCI memory mapping registers'
- &quot;prefetchable&quot; bit), those hints should be followed for
- maximum compatibility. On some systems, requesting a mapping that cannot
- be satisfied (e.g., requesting a non-prefetchable mapping when the
- system can only provide a prefetchable one) will cause the request to
- fail.</p>
- <p class="Pp">Some implementations may keep track of use of bus space for
- some or all bus spaces and refuse to allow duplicate allocations. This
- is encouraged for bus spaces which have no notion of slot-specific space
- addressing, such as ISA and VME, and for spaces which coexist with those
- spaces (e.g., EISA and PCI memory and I/O spaces co-existing with ISA
- memory and I/O spaces).</p>
- <p class="Pp">Mapped regions may contain areas for which there is no device
- on the bus. If space in those areas is accessed, the results are
- bus-dependent.</p>
- <p class="Pp"></p>
- </dd>
- <dt id="bus_space_reservation_map"><a class="permalink" href="#bus_space_reservation_map"><code class="Fn">bus_space_reservation_map</code></a>(<var class="Fa">space</var>,
- <var class="Fa">bsr</var>, <var class="Fa">flags</var>,
- <var class="Fa">handlep</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_reservation_map~2">The
- <a class="permalink" href="#bus_space_reservation_map~2"><code class="Fn">bus_space_reservation_map</code></a>()
- function is similar to <code class="Fn">bus_space_map</code>() but it
- maps a region of bus space that was previously reserved by a call to
- <code class="Fn">bus_space_reserve</code>() or
- <code class="Fn">bus_space_reserve_subregion</code>(). The region is
- given by the <var class="Fa">space</var> and <var class="Fa">bsr</var>
- arguments. If successful, it returns zero and fills in the bus space
- handle pointed to by <var class="Fa">handlep</var> with the handle that
- can be used to access the mapped region. If unsuccessful, it will return
- non-zero and leave the bus space handle pointed to by
- <var class="Fa">handlep</var> in an undefined state.</p>
- <p class="Pp" id="bus_space_reservation_map~3">A region mapped by
- <a class="permalink" href="#bus_space_reservation_map~3"><code class="Fn">bus_space_reservation_map</code></a>()
- may only be unmapped by a call to
- <code class="Fn">bus_space_reservation_unmap</code>().</p>
- <p class="Pp" id="bus_space_map~3">For more details, see the description of
- <a class="permalink" href="#bus_space_map~3"><code class="Fn">bus_space_map</code></a>().</p>
- <p class="Pp"></p>
- </dd>
- <dt id="bus_space_unmap"><a class="permalink" href="#bus_space_unmap"><code class="Fn">bus_space_unmap</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">size</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_unmap~2">The
- <a class="permalink" href="#bus_space_unmap~2"><code class="Fn">bus_space_unmap</code></a>()
- function unmaps and relinquishes a region of bus space reserved and
- mapped with <code class="Fn">bus_space_map</code>(). When unmapping a
- region, the <var class="Fa">size</var> specified should be the same as
- the size given to <code class="Fn">bus_space_map</code>() when mapping
- that region.</p>
- <p class="Pp" id="bus_space_unmap~3">After
- <a class="permalink" href="#bus_space_unmap~3"><code class="Fn">bus_space_unmap</code></a>()
- is called on a handle, that handle is no longer valid. (If copies were
- made of the handle they are no longer valid, either.)</p>
- <p class="Pp" id="bus_space_unmap~4">This function will never fail. If it
- would fail (e.g., because of an argument error), that indicates a
- software bug which should cause a panic. In that case,
- <a class="permalink" href="#bus_space_unmap~4"><code class="Fn">bus_space_unmap</code></a>()
- will never return.</p>
- <p class="Pp"></p>
- </dd>
- <dt id="bus_space_reservation_unmap"><a class="permalink" href="#bus_space_reservation_unmap"><code class="Fn">bus_space_reservation_unmap</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">size</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_reservation_unmap~2">The
- <a class="permalink" href="#bus_space_reservation_unmap~2"><code class="Fn">bus_space_reservation_unmap</code></a>()
- function is similar to <code class="Fn">bus_space_unmap</code>() but it
- should be called on handles mapped by
- <code class="Fn">bus_space_reservation_map</code>() and only on such
- handles. Unlike <code class="Fn">bus_space_unmap</code>(),
- <code class="Fn">bus_space_reservation_unmap</code>() does not
- relinquish exclusive use of the bus space named by
- <var class="Fa">handle</var> and <var class="Fa">size</var>; that is the
- job of <code class="Fn">bus_space_release</code>().</p>
- <p class="Pp"></p>
- </dd>
- <dt id="bus_space_subregion~2"><a class="permalink" href="#bus_space_subregion~2"><code class="Fn">bus_space_subregion</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">size</var>, <var class="Fa">nhandlep</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_subregion~3">The
- <a class="permalink" href="#bus_space_subregion~3"><code class="Fn">bus_space_subregion</code></a>()
- function is a convenience function which makes a new handle to some
- subregion of an already-mapped region of bus space. The subregion
- described by the new handle starts at byte offset
- <var class="Fa">offset</var> into the region described by
- <var class="Fa">handle</var>, with the size given by
- <var class="Fa">size</var>, and must be wholly contained within the
- original region.</p>
- <p class="Pp" id="bus_space_subregion~4">If successful,
- <a class="permalink" href="#bus_space_subregion~4"><code class="Fn">bus_space_subregion</code></a>()
- returns zero and fills in the bus space handle pointed to by
- <var class="Fa">nhandlep</var>. If unsuccessful, it returns non-zero and
- leaves the bus space handle pointed to by <var class="Fa">nhandlep</var>
- in an undefined state. In either case, the handle described by
- <var class="Fa">handle</var> remains valid and is unmodified.</p>
- <p class="Pp" id="bus_space_subregion~5">When done with a handle created by
- <a class="permalink" href="#bus_space_subregion~5"><code class="Fn">bus_space_subregion</code></a>(),
- the handle should be thrown away. Under no circumstances should
- <code class="Fn">bus_space_unmap</code>() be used on the handle. Doing
- so may confuse any resource management being done on the space, and will
- result in undefined behaviour. When
- <code class="Fn">bus_space_unmap</code>() or
- <code class="Fn">bus_space_free</code>() is called on a handle, all
- subregions of that handle become invalid.</p>
- <p class="Pp"></p>
- </dd>
- <dt id="bus_space_vaddr"><a class="permalink" href="#bus_space_vaddr"><code class="Fn">bus_space_vaddr</code></a>(<var class="Fa">tag</var>,
- <var class="Fa">handle</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_barrier~3">This method returns the kernel
- virtual address of a mapped bus space if and only if it was mapped with
- the <code class="Dv">BUS_SPACE_MAP_LINEAR</code> flag. The range can be
- accessed by normal (volatile) pointer dereferences. If mapped with the
- <code class="Dv">BUS_SPACE_MAP_PREFETCHABLE</code> flag, the
- <a class="permalink" href="#bus_space_barrier~3"><code class="Fn">bus_space_barrier</code></a>()
- method must be used to force a particular access order.</p>
- <p class="Pp"></p>
- </dd>
- <dt id="bus_space_mmap"><a class="permalink" href="#bus_space_mmap"><code class="Fn">bus_space_mmap</code></a>(<var class="Fa">tag</var>,
- <var class="Fa">addr</var>, <var class="Fa">off</var>,
- <var class="Fa">prot</var>, <var class="Fa">flags</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_mmap~2">This method is used to provide support
- for memory mapping bus space into user applications. If an address space
- is addressable via volatile pointer dereferences,
- <a class="permalink" href="#bus_space_mmap~2"><code class="Fn">bus_space_mmap</code></a>()
- will return the physical address (possibly encoded as a
- machine-dependent cookie) of the bus space indicated by
- <var class="Fa">addr</var> and <var class="Fa">off</var>.
- <var class="Fa">addr</var> is the base address of the device or device
- region, and <var class="Fa">off</var> is the offset into that region
- that is being requested. If the request is made with
- <code class="Dv">BUS_SPACE_MAP_LINEAR</code> as a flag, then a linear
- region must be returned to the caller. If the region cannot be mapped
- (either the address does not exist, or the constraints can not be met),
- <code class="Fn">bus_space_mmap</code>() returns
- <code class="Dv">-1</code> to indicate failure.</p>
- <p class="Pp" id="bus_space_mmap~3">Note that it is not necessary that the
- region being requested by a
- <a class="permalink" href="#bus_space_mmap~3"><code class="Fn">bus_space_mmap</code></a>()
- call be mapped into a <var class="Fa">bus_space_handle_t</var>.</p>
- <p class="Pp" id="bus_space_mmap~4"><a class="permalink" href="#bus_space_mmap~4"><code class="Fn">bus_space_mmap</code></a>()
- is called once per <code class="Dv">PAGE_SIZE</code> page in the range.
- The <var class="Fa">prot</var> argument indicates the memory protection
- requested by the user application for the range.</p>
- <p class="Pp"></p>
- </dd>
- <dt id="bus_space_handle_is_equal"><a class="permalink" href="#bus_space_handle_is_equal"><code class="Fn">bus_space_handle_is_equal</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle1</var>, <var class="Fa">handle2</var>)</dt>
- <dd>Use <code class="Fn">bus_space_handle_is_equal</code>() to check whether
- or not <var class="Fa">handle1</var> and <var class="Fa">handle2</var>
- refer to regions starting at the same address in the bus space
- <var class="Fa">space</var>.</dd>
-</dl>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="ALLOCATING_AND_FREEING_BUS_SPACE"><a class="permalink" href="#ALLOCATING_AND_FREEING_BUS_SPACE">ALLOCATING
- AND FREEING BUS SPACE</a></h1>
-<p class="Pp">Some devices require or allow bus space to be allocated by the
- operating system for device use. When the devices no longer need the space,
- the operating system should free it for use by other devices. The
- <code class="Fn">bus_space_alloc</code>(),
- <code class="Fn">bus_space_free</code>(),
- <code class="Fn">bus_space_reserve</code>(),
- <code class="Fn">bus_space_reserve_subregion</code>(), and
- <code class="Fn">bus_space_release</code>() functions provide these
- capabilities. The functions <code class="Fn">bus_space_reserve</code>(),
- <code class="Fn">bus_space_reserve_subregion</code>(), and
- <code class="Fn">bus_space_release</code>() are not yet available on all
- architectures.</p>
-<p class="Pp"></p>
-<dl class="Bl-ohang Bl-compact">
- <dt id="bus_space_alloc"><a class="permalink" href="#bus_space_alloc"><code class="Fn">bus_space_alloc</code></a>(<var class="Fa">space</var>,
- <var class="Fa">reg_start</var>, <var class="Fa">reg_end</var>,
- <var class="Fa">size</var>, <var class="Fa">alignment</var>,
- <var class="Fa">boundary</var>, <var class="Fa">flags</var>,
- <var class="Fa">addrp</var>, <var class="Fa">handlep</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_alloc~2">The
- <a class="permalink" href="#bus_space_alloc~2"><code class="Fn">bus_space_alloc</code></a>()
- function allocates and maps a region of bus space with the size given by
- <var class="Fa">size</var>, corresponding to the given constraints. If
- successful, it returns zero, fills in the bus address pointed to by
- <var class="Fa">addrp</var> with the bus space address of the allocated
- region, and fills in the bus space handle pointed to by
- <var class="Fa">handlep</var> with the handle that can be used to access
- that region. If unsuccessful, it returns non-zero and leaves the bus
- address pointed to by <var class="Fa">addrp</var> and the bus space
- handle pointed to by <var class="Fa">handlep</var> in an undefined
- state.</p>
- <p class="Pp" id="bus_space_alloc~3">Constraints on the allocation are given
- by the <var class="Fa">reg_start</var>, <var class="Fa">reg_end</var>,
- <var class="Fa">alignment</var>, and <var class="Fa">boundary</var>
- parameters. The allocated region will start at or after
- <var class="Fa">reg_start</var> and end before or at
- <var class="Fa">reg_end</var>. The <var class="Fa">alignment</var>
- constraint must be a power of two, and the allocated region will start
- at an address that is an even multiple of that power of two. The
- <var class="Fa">boundary</var> constraint, if non-zero, ensures that the
- region is allocated so that <var class="Fa">first address in
- region</var> / <var class="Fa">boundary</var> has the same value as
- <var class="Fa">last address in region</var> /
- <var class="Fa">boundary</var>. If the constraints cannot be met,
- <a class="permalink" href="#bus_space_alloc~3"><code class="Fn">bus_space_alloc</code></a>()
- will fail. It is an error to specify a set of constraints that can never
- be met (for example, <var class="Fa">size</var> greater than
- <var class="Fa">boundary</var>).</p>
- <p class="Pp">The <var class="Fa">flags</var> parameter is the same as the
- like-named parameter to <var class="Fa">bus_space_map</var>, the same
- flag values should be used, and they have the same meanings.</p>
- <p class="Pp" id="bus_space_alloc~4">Handles created by
- <a class="permalink" href="#bus_space_alloc~4"><code class="Fn">bus_space_alloc</code></a>()
- should only be freed with <code class="Fn">bus_space_free</code>().
- Trying to use <code class="Fn">bus_space_unmap</code>() on them causes
- undefined behaviour. The <code class="Fn">bus_space_subregion</code>()
- function can be used on handles created by
- <code class="Fn">bus_space_alloc</code>().</p>
- <p class="Pp"></p>
- </dd>
- <dt id="bus_space_reserve"><a class="permalink" href="#bus_space_reserve"><code class="Fn">bus_space_reserve</code></a>(<var class="Fa">t</var>,
- <var class="Fa">bpa</var>, <var class="Fa">size</var>,
- <var class="Fa">flags</var>, <var class="Fa">bsrp</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_reserve~2">The
- <a class="permalink" href="#bus_space_reserve~2"><code class="Fn">bus_space_reserve</code></a>()
- function reserves, for the caller's exclusive use,
- <var class="Fa">size</var> bytes starting at the address
- <var class="Fa">bpa</var> in the space referenced by
- <var class="Fa">t</var>.</p>
- <p class="Pp" id="bus_space_reserve~3"><a class="permalink" href="#bus_space_reserve~3"><code class="Fn">bus_space_reserve</code></a>()
- does <a class="permalink" href="#not"><i class="Em" id="not">not</i></a>
- map the space. The caller should use
- <code class="Fn">bus_space_reservation_map</code>() to map the
- reservation. <var class="Fa">flags</var> contains a hint how the caller
- may map the reservation, later. Whenever possible, callers should pass
- the same flags to <code class="Fn">bus_space_reserve</code>() as they
- will pass to <code class="Fn">bus_space_reservation_map</code>() to map
- the reservation.</p>
- <p class="Pp" id="bus_space_reserve~4">On success,
- <a class="permalink" href="#bus_space_reserve~4"><code class="Fn">bus_space_reserve</code></a>()
- records the reservation at <var class="Fa">bsrp</var> and returns 0. On
- failure, <var class="Fa">bsrp</var> is undefined, and
- <code class="Fn">bus_space_reserve</code>() returns a non-zero error
- code. Possible error codes include</p>
- <div class="Bd-indent">
- <dl class="Bl-tag">
- <dt><code class="Er">ENOMEM</code></dt>
- <dd>There was not sufficient bus space at <var class="Fa">bpa</var> to
- satisfy the request.</dd>
- <dt><code class="Er">EOPNOTSUPP</code></dt>
- <dd><code class="Fn">bus_space_reserve</code>() is not supported on this
- architecture, or <var class="Fa">flags</var> was incompatible with the
- bus space represented by <var class="Fa">t</var>.</dd>
- </dl>
- </div>
- <p class="Pp"></p>
- </dd>
- <dt id="bus_space_reserve_subregion"><a class="permalink" href="#bus_space_reserve_subregion"><code class="Fn">bus_space_reserve_subregion</code></a>(<var class="Fa">t</var>,
- <var class="Fa">reg_start</var>, <var class="Fa">reg_end</var>,
- <var class="Fa">size</var>, <var class="Fa">alignment</var>,
- <var class="Fa">boundary</var>, <var class="Fa">flags</var>,
- <var class="Fa">bsrp</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_reserve_subregion~2">The
- <a class="permalink" href="#bus_space_reserve_subregion~2"><code class="Fn">bus_space_reserve_subregion</code></a>()
- function reserves, for the caller's exclusive use,
- <var class="Fa">size</var> bytes in the space referenced by
- <var class="Fa">t</var>. The parameters <var class="Fa">reg_start</var>,
- <var class="Fa">reg_end</var>, <var class="Fa">alignment</var>,
- <var class="Fa">boundary</var>, and <var class="Fa">flags</var> each
- work alike to the <code class="Fn">bus_space_alloc</code>() parameters
- of the same names.</p>
- <p class="Pp" id="bus_space_reserve_subregion~3">On success,
- <a class="permalink" href="#bus_space_reserve_subregion~3"><code class="Fn">bus_space_reserve_subregion</code></a>()
- records the reservation at <var class="Fa">bsrp</var> and returns 0. On
- failure, <var class="Fa">bsrp</var> is undefined, and
- <code class="Fn">bus_space_reserve_subregion</code>() returns a non-zero
- error code. Possible error codes include</p>
- <div class="Bd-indent">
- <dl class="Bl-tag">
- <dt><code class="Er">ENOMEM</code></dt>
- <dd>There was not sufficient bus space at <var class="Fa">bpa</var> to
- satisfy the request.</dd>
- <dt><code class="Er">EOPNOTSUPP</code></dt>
- <dd><code class="Fn">bus_space_reserve</code>() is not supported on this
- architecture, or <var class="Fa">flags</var> was incompatible with the
- bus space represented by <var class="Fa">t</var>.</dd>
- </dl>
- </div>
- <p class="Pp"></p>
- </dd>
- <dt id="bus_space_release"><a class="permalink" href="#bus_space_release"><code class="Fn">bus_space_release</code></a>(<var class="Fa">t</var>,
- <var class="Fa">bsr</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_release~2">The
- <a class="permalink" href="#bus_space_release~2"><code class="Fn">bus_space_release</code></a>()
- function releases the bus space <var class="Fa">bsr</var> in
- <var class="Fa">t</var> that was previously reserved by
- <code class="Fn">bus_space_reserve</code>() or
- <code class="Fn">bus_space_reserve_subregion</code>().</p>
- <p class="Pp" id="bus_space_release~3">If
- <a class="permalink" href="#bus_space_release~3"><code class="Fn">bus_space_release</code></a>()
- is called on a reservation that has been mapped by
- <code class="Fn">bus_space_reservation_map</code>() without subsequently
- being unmapped, the behavior of the system is undefined.</p>
- <p class="Pp"></p>
- </dd>
- <dt id="bus_space_free"><a class="permalink" href="#bus_space_free"><code class="Fn">bus_space_free</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">size</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_free~2">The
- <a class="permalink" href="#bus_space_free~2"><code class="Fn">bus_space_free</code></a>()
- function unmaps and frees a region of bus space mapped and allocated
- with <code class="Fn">bus_space_alloc</code>(). When unmapping a region,
- the <var class="Fa">size</var> specified should be the same as the size
- given to <code class="Fn">bus_space_alloc</code>() when allocating the
- region.</p>
- <p class="Pp" id="bus_space_free~3">After
- <a class="permalink" href="#bus_space_free~3"><code class="Fn">bus_space_free</code></a>()
- is called on a handle, that handle is no longer valid. (If copies were
- made of the handle, they are no longer valid, either.)</p>
- <p class="Pp" id="bus_space_free~4">This function will never fail. If it
- would fail (e.g., because of an argument error), that indicates a
- software bug which should cause a panic. In that case,
- <a class="permalink" href="#bus_space_free~4"><code class="Fn">bus_space_free</code></a>()
- will never return.</p>
- </dd>
-</dl>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="READING_AND_WRITING_SINGLE_DATA_ITEMS"><a class="permalink" href="#READING_AND_WRITING_SINGLE_DATA_ITEMS">READING
- AND WRITING SINGLE DATA ITEMS</a></h1>
-<p class="Pp">The simplest way to access bus space is to read or write a single
- data item. The <code class="Fn">bus_space_read_N</code>() and
- <code class="Fn">bus_space_write_N</code>() families of functions provide
- the ability to read and write 1, 2, 4, and 8 byte data items on busses which
- support those access sizes.</p>
-<p class="Pp"></p>
-<dl class="Bl-ohang Bl-compact">
- <dt id="bus_space_read_1"><a class="permalink" href="#bus_space_read_1"><code class="Fn">bus_space_read_1</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_2"><a class="permalink" href="#bus_space_read_2"><code class="Fn">bus_space_read_2</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_4"><a class="permalink" href="#bus_space_read_4"><code class="Fn">bus_space_read_4</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_8"><a class="permalink" href="#bus_space_read_8"><code class="Fn">bus_space_read_8</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_read_N">The
- <a class="permalink" href="#bus_space_read_N"><code class="Fn">bus_space_read_N</code></a>()
- family of functions reads a 1, 2, 4, or 8 byte data item from the offset
- specified by <var class="Fa">offset</var> into the region specified by
- <var class="Fa">handle</var> of the bus space specified by
- <var class="Fa">space</var>. The location being read must lie within the
- bus space region specified by <var class="Fa">handle</var>.</p>
- <p class="Pp">For portability, the starting address of the region specified
- by <var class="Fa">handle</var> plus the offset should be a multiple of
- the size of data item being read. On some systems, not obeying this
- requirement may cause incorrect data to be read, on others it may cause
- a system crash.</p>
- <p class="Pp" id="bus_space_read_N~2">Read operations done by the
- <a class="permalink" href="#bus_space_read_N~2"><code class="Fn">bus_space_read_N</code></a>()
- functions may be executed out of order with respect to other read and
- write operations if either are on prefetchable or cacheable mappings
- unless order is enforced by use of the
- <code class="Fn">bus_space_barrier</code>() function.</p>
- <p class="Pp">These functions will never fail. If they would fail (e.g.,
- because of an argument error), that indicates a software bug which
- should cause a panic. In that case, they will never return.</p>
- <p class="Pp"></p>
- </dd>
- <dt id="bus_space_write_1"><a class="permalink" href="#bus_space_write_1"><code class="Fn">bus_space_write_1</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">value</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_2"><a class="permalink" href="#bus_space_write_2"><code class="Fn">bus_space_write_2</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">value</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_4"><a class="permalink" href="#bus_space_write_4"><code class="Fn">bus_space_write_4</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">value</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_8"><a class="permalink" href="#bus_space_write_8"><code class="Fn">bus_space_write_8</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">value</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_write_N">The
- <a class="permalink" href="#bus_space_write_N"><code class="Fn">bus_space_write_N</code></a>()
- family of functions writes a 1, 2, 4, or 8 byte data item to the offset
- specified by <var class="Fa">offset</var> into the region specified by
- <var class="Fa">handle</var> of the bus space specified by
- <var class="Fa">space</var>. The location being written must lie within
- the bus space region specified by <var class="Fa">handle</var>.</p>
- <p class="Pp">For portability, the starting address of the region specified
- by <var class="Fa">handle</var> plus the offset should be a multiple of
- the size of data item being written. On some systems, not obeying this
- requirement may cause incorrect data to be written, on others it may
- cause a system crash.</p>
- <p class="Pp" id="bus_space_write_N~2">Write operations done by the
- <a class="permalink" href="#bus_space_write_N~2"><code class="Fn">bus_space_write_N</code></a>()
- functions may be executed out of order with respect to other read and
- write operations if either are on prefetchable or cacheable mappings
- unless order is enforced by use of the
- <code class="Fn">bus_space_barrier</code>() function.</p>
- <p class="Pp">These functions will never fail. If they would fail (e.g.,
- because of an argument error), that indicates a software bug which
- should cause a panic. In that case, they will never return.</p>
- </dd>
-</dl>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="PROBING_BUS_SPACE_FOR_HARDWARE_WHICH_MAY_NOT_RESPOND"><a class="permalink" href="#PROBING_BUS_SPACE_FOR_HARDWARE_WHICH_MAY_NOT_RESPOND">PROBING
- BUS SPACE FOR HARDWARE WHICH MAY NOT RESPOND</a></h1>
-<p class="Pp">One problem with the
- <a class="permalink" href="#bus_space_read_N~3"><code class="Fn" id="bus_space_read_N~3">bus_space_read_N</code></a>()
- and <code class="Fn">bus_space_write_N</code>() family of functions is that
- they provide no protection against exceptions which can occur when no
- physical hardware or device responds to the read or write cycles. In such a
- situation, the system typically would panic due to a kernel-mode bus error.
- The <code class="Fn">bus_space_peek_N</code>() and
- <code class="Fn">bus_space_poke_N</code>() family of functions provide a
- mechanism to handle these exceptions gracefully without the risk of crashing
- the system.</p>
-<p class="Pp" id="bus_space_read_N~4">As with
- <a class="permalink" href="#bus_space_read_N~4"><code class="Fn">bus_space_read_N</code></a>()
- and <code class="Fn">bus_space_write_N</code>(), the peek and poke functions
- provide the ability to read and write 1, 2, 4, and 8 byte data items on
- busses which support those access sizes. All of the constraints specified in
- the descriptions of the <code class="Fn">bus_space_read_N</code>() and
- <code class="Fn">bus_space_write_N</code>() functions also apply to
- <code class="Fn">bus_space_peek_N</code>() and
- <code class="Fn">bus_space_poke_N</code>().</p>
-<p class="Pp" id="bus_space_peek_N">The return value indicates the outcome of
- the peek or poke operation. A return value of zero implies that a hardware
- device is responding to the operation at the specified offset in the bus
- space. A non-zero return value indicates that the kernel intercepted a
- hardware exception (e.g., bus error) when the peek or poke operation was
- attempted. Note that some busses are incapable of generating exceptions when
- non-existent hardware is accessed. In such cases, these functions will
- always return zero and the value of the data read by
- <a class="permalink" href="#bus_space_peek_N"><code class="Fn">bus_space_peek_N</code></a>()
- will be unspecified.</p>
-<p class="Pp" id="bus_space_peek_N~2">Finally, it should be noted that at this
- time the
- <a class="permalink" href="#bus_space_peek_N~2"><code class="Fn">bus_space_peek_N</code></a>()
- and <code class="Fn">bus_space_poke_N</code>() functions are not re-entrant
- and should not, therefore, be used from within an interrupt service routine.
- This constraint may be removed at some point in the future.</p>
-<p class="Pp"></p>
-<dl class="Bl-ohang Bl-compact">
- <dt id="bus_space_peek_1"><a class="permalink" href="#bus_space_peek_1"><code class="Fn">bus_space_peek_1</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>)</dt>
- <dd></dd>
- <dt id="bus_space_peek_2"><a class="permalink" href="#bus_space_peek_2"><code class="Fn">bus_space_peek_2</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>)</dt>
- <dd></dd>
- <dt id="bus_space_peek_4"><a class="permalink" href="#bus_space_peek_4"><code class="Fn">bus_space_peek_4</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>)</dt>
- <dd></dd>
- <dt id="bus_space_peek_8"><a class="permalink" href="#bus_space_peek_8"><code class="Fn">bus_space_peek_8</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_peek_N~3">The
- <a class="permalink" href="#bus_space_peek_N~3"><code class="Fn">bus_space_peek_N</code></a>()
- family of functions cautiously read a 1, 2, 4, or 8 byte data item from
- the offset specified by <var class="Fa">offset</var> in the region
- specified by <var class="Fa">handle</var> of the bus space specified by
- <var class="Fa">space</var>. The data item read is stored in the
- location pointed to by <var class="Fa">datap</var>. It is permissible
- for <var class="Fa">datap</var> to be NULL, in which case the data item
- will be discarded after being read.</p>
- <p class="Pp"></p>
- </dd>
- <dt id="bus_space_poke_1"><a class="permalink" href="#bus_space_poke_1"><code class="Fn">bus_space_poke_1</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">value</var>)</dt>
- <dd></dd>
- <dt id="bus_space_poke_2"><a class="permalink" href="#bus_space_poke_2"><code class="Fn">bus_space_poke_2</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">value</var>)</dt>
- <dd></dd>
- <dt id="bus_space_poke_4"><a class="permalink" href="#bus_space_poke_4"><code class="Fn">bus_space_poke_4</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">value</var>)</dt>
- <dd></dd>
- <dt id="bus_space_poke_8"><a class="permalink" href="#bus_space_poke_8"><code class="Fn">bus_space_poke_8</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">value</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_poke_N">The
- <a class="permalink" href="#bus_space_poke_N"><code class="Fn">bus_space_poke_N</code></a>()
- family of functions cautiously write a 1, 2, 4, or 8 byte data item
- specified by <var class="Fa">value</var> to the offset specified by
- <var class="Fa">offset</var> in the region specified by
- <var class="Fa">handle</var> of the bus space specified by
- <var class="Fa">space</var>.</p>
- </dd>
-</dl>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="BARRIERS"><a class="permalink" href="#BARRIERS">BARRIERS</a></h1>
-<p class="Pp">Devices that support prefetchable (also known as
- &#x2018;write-combining&#x2019;) or cacheable I/O may be mapped with
- <code class="Dv">BUS_SPACE_MAP_PREFETCHABLE</code> or
- <code class="Dv">BUS_SPACE_MAP_CACHEABLE</code> for higher performance by
- allowing bus space read and write operations to be reordered, fused, torn,
- and/or cached by the system.</p>
-<p class="Pp" id="bus_space_barrier~4">When a driver requires ordering, e.g. to
- write to a command ring in bus space and then update the command ring
- pointer, the
- <a class="permalink" href="#bus_space_barrier~4"><code class="Fn">bus_space_barrier</code></a>()
- function enforces it.</p>
-<p class="Pp"></p>
-<dl class="Bl-ohang Bl-compact">
- <dt id="bus_space_barrier~5"><a class="permalink" href="#bus_space_barrier~5"><code class="Fn">bus_space_barrier</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">length</var>, <var class="Fa">flags</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_barrier~6">The
- <a class="permalink" href="#bus_space_barrier~6"><code class="Fn">bus_space_barrier</code></a>()
- function enforces ordering of bus space read and write operations for
- the specified subregion (described by the <var class="Fa">offset</var>
- and <var class="Fa">length</var> parameters) of the region named by
- <var class="Fa">handle</var> in the space named by
- <var class="Fa">space</var>.</p>
- <p class="Pp">The <var class="Fa">flags</var> argument controls what types
- of operations are to be ordered. Supported flags are:</p>
- <div class="Bd-indent">
- <dl class="Bl-tag">
- <dt id="BUS_SPACE_BARRIER_READ"><a class="permalink" href="#BUS_SPACE_BARRIER_READ"><code class="Dv">BUS_SPACE_BARRIER_READ</code></a></dt>
- <dd>Guarantee that any program-prior bus space read on
- <i class="Em">any</i> bus space has returned data from the device or
- memory before any program-later bus space read, bus space write, or
- memory access via
- <a class="permalink" href="#bus_space_vaddr~2"><code class="Fn" id="bus_space_vaddr~2">bus_space_vaddr</code></a>(),
- on the specified range in the given bus space.
- <p class="Pp">This functions similarly to
- <a class="Xr">membar_acquire(3)</a>, but additionally orders bus
- space I/O which <a class="Xr">membar_ops(3)</a> may not.</p>
- </dd>
- <dt id="BUS_SPACE_BARRIER_WRITE"><a class="permalink" href="#BUS_SPACE_BARRIER_WRITE"><code class="Dv">BUS_SPACE_BARRIER_WRITE</code></a></dt>
- <dd>Guarantee that any program-prior bus space read, bus space write, or
- memory access via
- <a class="permalink" href="#bus_space_vaddr~3"><code class="Fn" id="bus_space_vaddr~3">bus_space_vaddr</code></a>(),
- on the specified range in the given bus space, has completed before
- any program-later bus space write on <i class="Em">any</i> bus space.
- <p class="Pp">This functions similarly to
- <a class="Xr">membar_release(3)</a>, but additionally orders bus
- space I/O which <a class="Xr">membar_ops(3)</a> may not.</p>
- </dd>
- <dt id="BUS_SPACE_BARRIER_READ~2"><a class="permalink" href="#BUS_SPACE_BARRIER_READ~2"><code class="Dv">BUS_SPACE_BARRIER_READ</code></a>
- |
- <a class="permalink" href="#BUS_SPACE_BARRIER_WRITE~2"><code class="Dv" id="BUS_SPACE_BARRIER_WRITE~2">BUS_SPACE_BARRIER_WRITE</code></a></dt>
- <dd>Guarantee that any program-prior bus space read, bus space write, or
- memory access via
- <a class="permalink" href="#bus_space_vaddr~4"><code class="Fn" id="bus_space_vaddr~4">bus_space_vaddr</code></a>()
- on <i class="Em">any</i> bus space has completed before any
- program-later bus space read, bus space write, or memory access via
- <code class="Fn">bus_space_vaddr</code>() on <i class="Em">any</i> bus
- space.
- <p class="Pp">Note that this is independent of the specified bus space
- and range.</p>
- <p class="Pp">This functions similarly to
- <a class="Xr">membar_sync(3)</a>, but additionally orders bus space
- I/O which <a class="Xr">membar_ops(3)</a> may not. This combination
- is very unusual, and often much more expensive; most drivers do not
- need it.</p>
- </dd>
- </dl>
- </div>
- <p class="Pp">Example: Consider a command ring in bus space with a command
- ring pointer register, and a response ring in bus space with a response
- ring pointer register.</p>
- <div class="Bd Pp Li">
- <pre>error = bus_space_map(sc-&gt;sc_regt, ..., 0, &amp;sc-&gt;sc_regh);
-if (error)
- ...
-error = bus_space_map(sc-&gt;sc_memt, ..., BUS_SPACE_MAP_PREFETCHABLE,
- &amp;sc-&gt;sc_memh);
-if (error)
- ...</pre>
- </div>
- <p class="Pp">To submit a command (assuming there is space in the ring),
- first write it out and then update the pointer:</p>
- <div class="Bd Pp Li">
- <pre>i = sc-&gt;sc_nextcmdslot;
-bus_space_write_4(sc-&gt;sc_memt, sc-&gt;sc_memh, CMDSLOT(i), cmd);
-bus_space_write_4(sc-&gt;sc_memt, sc-&gt;sc_memh, CMDSLOT(i) + 4, arg1);
-bus_space_write_4(sc-&gt;sc_memt, sc-&gt;sc_memh, CMDSLOT(i) + 8, arg2);
-...
-bus_space_write_4(sc-&gt;sc_memt, sc-&gt;sc_memh, CMDSLOT(i) + 4*n, argn);
-bus_space_barrier(sc-&gt;sc_memt, sc-&gt;sc_memh, CMDSLOT(i), 4*n,
- BUS_SPACE_BARRIER_WRITE);
-bus_space_write_4(sc-&gt;sc_regt, sc-&gt;sc_regh, CMDPTR, i);
-sc-&gt;sc_nextcmdslot = (i + n + 1) % sc-&gt;sc_ncmdslots;</pre>
- </div>
- <p class="Pp">To obtain a response, read the pointer first and then the ring
- data:</p>
- <div class="Bd Pp Li">
- <pre>ptr = bus_space_read_4(sc-&gt;sc_regt, sc-&gt;sc_regh, RESPPTR);
-while ((i = sc-&gt;sc_nextrespslot) != ptr) {
- bus_space_barrier(sc-&gt;sc_memt, sc-&gt;sc_memh, RESPSLOT(i), 4,
- BUS_SPACE_BARRIER_READ);
- status = bus_space_read_4(sc-&gt;sc_memt, sc-&gt;sc_memh, RESPSLOT(i));
- handle_response(status);
- sc-&gt;sc_nextrespslot = (i + 1) % sc-&gt;sc_nrespslots;
-}</pre>
- </div>
- </dd>
-</dl>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="REGION_OPERATIONS"><a class="permalink" href="#REGION_OPERATIONS">REGION
- OPERATIONS</a></h1>
-<p class="Pp">Some devices use buffers which are mapped as regions in bus space.
- Often, drivers want to copy the contents of those buffers to or from memory,
- e.g., into mbufs which can be passed to higher levels of the system or from
- mbufs to be output to a network. In order to allow drivers to do this as
- efficiently as possible, the
- <a class="permalink" href="#bus_space_read_region_N"><code class="Fn" id="bus_space_read_region_N">bus_space_read_region_N</code></a>()
- and <code class="Fn">bus_space_write_region_N</code>() families of functions
- are provided.</p>
-<p class="Pp" id="bus_space_copy_region_N">Drivers occasionally need to copy one
- region of a bus space to another, or to set all locations in a region of bus
- space to contain a single value. The
- <a class="permalink" href="#bus_space_copy_region_N"><code class="Fn">bus_space_copy_region_N</code></a>()
- family of functions and the <code class="Fn">bus_space_set_region_N</code>()
- family of functions allow drivers to perform these operations.</p>
-<p class="Pp"></p>
-<dl class="Bl-ohang Bl-compact">
- <dt id="bus_space_read_region_1"><a class="permalink" href="#bus_space_read_region_1"><code class="Fn">bus_space_read_region_1</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_region_2"><a class="permalink" href="#bus_space_read_region_2"><code class="Fn">bus_space_read_region_2</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_region_4"><a class="permalink" href="#bus_space_read_region_4"><code class="Fn">bus_space_read_region_4</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_region_8"><a class="permalink" href="#bus_space_read_region_8"><code class="Fn">bus_space_read_region_8</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_read_region_N~2">The
- <a class="permalink" href="#bus_space_read_region_N~2"><code class="Fn">bus_space_read_region_N</code></a>()
- family of functions reads <var class="Fa">count</var> 1, 2, 4, or 8 byte
- data items from bus space starting at byte offset
- <var class="Fa">offset</var> in the region specified by
- <var class="Fa">handle</var> of the bus space specified by
- <var class="Fa">space</var> and writes them into the array specified by
- <var class="Fa">datap</var>. Each successive data item is read from an
- offset 1, 2, 4, or 8 bytes after the previous data item (depending on
- which function is used). All locations being read must lie within the
- bus space region specified by <var class="Fa">handle</var>.</p>
- <p class="Pp">For portability, the starting address of the region specified
- by <var class="Fa">handle</var> plus the offset should be a multiple of
- the size of data items being read and the data array pointer should be
- properly aligned. On some systems, not obeying these requirements may
- cause incorrect data to be read, on others it may cause a system
- crash.</p>
- <p class="Pp" id="bus_space_read_region_N~3">Read operations done by the
- <a class="permalink" href="#bus_space_read_region_N~3"><code class="Fn">bus_space_read_region_N</code></a>()
- functions may be executed in any order. They may also be executed out of
- order with respect to other read and write operations if either are on
- prefetchable or cacheable mappings unless order is enforced by use of
- the <code class="Fn">bus_space_barrier</code>() function. There is no
- way to insert barriers between reads of individual bus space locations
- executed by the <code class="Fn">bus_space_read_region_N</code>()
- functions.</p>
- <p class="Pp">These functions will never fail. If they would fail (e.g.,
- because of an argument error), that indicates a software bug which
- should cause a panic. In that case, they will never return.</p>
- <p class="Pp"></p>
- </dd>
- <dt id="bus_space_write_region_1"><a class="permalink" href="#bus_space_write_region_1"><code class="Fn">bus_space_write_region_1</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_region_2"><a class="permalink" href="#bus_space_write_region_2"><code class="Fn">bus_space_write_region_2</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_region_4"><a class="permalink" href="#bus_space_write_region_4"><code class="Fn">bus_space_write_region_4</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_region_8"><a class="permalink" href="#bus_space_write_region_8"><code class="Fn">bus_space_write_region_8</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_write_region_N">The
- <a class="permalink" href="#bus_space_write_region_N"><code class="Fn">bus_space_write_region_N</code></a>()
- family of functions reads <var class="Fa">count</var> 1, 2, 4, or 8 byte
- data items from the array specified by <var class="Fa">datap</var> and
- writes them to bus space starting at byte offset
- <var class="Fa">offset</var> in the region specified by
- <var class="Fa">handle</var> of the bus space specified by
- <var class="Fa">space</var>. Each successive data item is written to an
- offset 1, 2, 4, or 8 bytes after the previous data item (depending on
- which function is used). All locations being written must lie within the
- bus space region specified by <var class="Fa">handle</var>.</p>
- <p class="Pp">For portability, the starting address of the region specified
- by <var class="Fa">handle</var> plus the offset should be a multiple of
- the size of data items being written and the data array pointer should
- be properly aligned. On some systems, not obeying these requirements may
- cause incorrect data to be written, on others it may cause a system
- crash.</p>
- <p class="Pp" id="bus_space_write_region_N~2">Write operations done by the
- <a class="permalink" href="#bus_space_write_region_N~2"><code class="Fn">bus_space_write_region_N</code></a>()
- functions may be executed in any order. They may also be executed out of
- order with respect to other read and write operations if either are on
- prefetchable or cacheable mappings unless order is enforced by use of
- the <code class="Fn">bus_space_barrier</code>() function. There is no
- way to insert barriers between writes of individual bus space locations
- executed by the <code class="Fn">bus_space_write_region_N</code>()
- functions.</p>
- <p class="Pp">These functions will never fail. If they would fail (e.g.,
- because of an argument error), that indicates a software bug which
- should cause a panic. In that case, they will never return.</p>
- <p class="Pp"></p>
- </dd>
- <dt id="bus_space_copy_region_1"><a class="permalink" href="#bus_space_copy_region_1"><code class="Fn">bus_space_copy_region_1</code></a>(<var class="Fa">space</var>,
- <var class="Fa">srchandle</var>, <var class="Fa">srcoffset</var>,
- <var class="Fa">dsthandle</var>, <var class="Fa">dstoffset</var>,
- <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_copy_region_2"><a class="permalink" href="#bus_space_copy_region_2"><code class="Fn">bus_space_copy_region_2</code></a>(<var class="Fa">space</var>,
- <var class="Fa">srchandle</var>, <var class="Fa">srcoffset</var>,
- <var class="Fa">dsthandle</var>, <var class="Fa">dstoffset</var>,
- <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_copy_region_4"><a class="permalink" href="#bus_space_copy_region_4"><code class="Fn">bus_space_copy_region_4</code></a>(<var class="Fa">space</var>,
- <var class="Fa">srchandle</var>, <var class="Fa">srcoffset</var>,
- <var class="Fa">dsthandle</var>, <var class="Fa">dstoffset</var>,
- <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_copy_region_8"><a class="permalink" href="#bus_space_copy_region_8"><code class="Fn">bus_space_copy_region_8</code></a>(<var class="Fa">space</var>,
- <var class="Fa">srchandle</var>, <var class="Fa">srcoffset</var>,
- <var class="Fa">dsthandle</var>, <var class="Fa">dstoffset</var>,
- <var class="Fa">count</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_copy_region_N~2">The
- <a class="permalink" href="#bus_space_copy_region_N~2"><code class="Fn">bus_space_copy_region_N</code></a>()
- family of functions copies <var class="Fa">count</var> 1, 2, 4, or 8
- byte data items in bus space from the area starting at byte offset
- <var class="Fa">srcoffset</var> in the region specified by
- <var class="Fa">srchandle</var> of the bus space specified by
- <var class="Fa">space</var> to the area starting at byte offset
- <var class="Fa">dstoffset</var> in the region specified by
- <var class="Fa">dsthandle</var> in the same bus space. Each successive
- data item read or written has an offset 1, 2, 4, or 8 bytes after the
- previous data item (depending on which function is used). All locations
- being read and written must lie within the bus space region specified by
- their respective handles.</p>
- <p class="Pp">For portability, the starting addresses of the regions
- specified by each handle plus its respective offset should be a multiple
- of the size of data items being copied. On some systems, not obeying
- this requirement may cause incorrect data to be copied, on others it may
- cause a system crash.</p>
- <p class="Pp" id="bus_space_copy_region_N~3">Read and write operations done
- by the
- <a class="permalink" href="#bus_space_copy_region_N~3"><code class="Fn">bus_space_copy_region_N</code></a>()
- functions may be executed in any order. They may also be executed out of
- order with respect to other read and write operations if either are on
- prefetchable or cacheable mappings unless order is enforced by use of
- the <code class="Fn">bus_space_barrier</code>() function. There is no
- way to insert barriers between reads or writes of individual bus space
- locations executed by the
- <code class="Fn">bus_space_copy_region_N</code>() functions.</p>
- <p class="Pp" id="bus_space_copy_region_N~4">Overlapping copies between
- different subregions of a single region of bus space are handled
- correctly by the
- <a class="permalink" href="#bus_space_copy_region_N~4"><code class="Fn">bus_space_copy_region_N</code></a>()
- functions.</p>
- <p class="Pp">These functions will never fail. If they would fail (e.g.,
- because of an argument error), that indicates a software bug which
- should cause a panic. In that case, they will never return.</p>
- <p class="Pp"></p>
- </dd>
- <dt id="bus_space_set_region_1"><a class="permalink" href="#bus_space_set_region_1"><code class="Fn">bus_space_set_region_1</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">value</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_set_region_2"><a class="permalink" href="#bus_space_set_region_2"><code class="Fn">bus_space_set_region_2</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">value</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_set_region_4"><a class="permalink" href="#bus_space_set_region_4"><code class="Fn">bus_space_set_region_4</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">value</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_set_region_8"><a class="permalink" href="#bus_space_set_region_8"><code class="Fn">bus_space_set_region_8</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">value</var>, <var class="Fa">count</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_set_region_N">The
- <a class="permalink" href="#bus_space_set_region_N"><code class="Fn">bus_space_set_region_N</code></a>()
- family of functions writes the given <var class="Fa">value</var> to
- <var class="Fa">count</var> 1, 2, 4, or 8 byte data items in bus space
- starting at byte offset <var class="Fa">offset</var> in the region
- specified by <var class="Fa">handle</var> of the bus space specified by
- <var class="Fa">space</var>. Each successive data item has an offset 1,
- 2, 4, or 8 bytes after the previous data item (depending on which
- function is used). All locations being written must lie within the bus
- space region specified by <var class="Fa">handle</var>.</p>
- <p class="Pp">For portability, the starting address of the region specified
- by <var class="Fa">handle</var> plus the offset should be a multiple of
- the size of data items being written. On some systems, not obeying this
- requirement may cause incorrect data to be written, on others it may
- cause a system crash.</p>
- <p class="Pp" id="bus_space_set_region_N~2">Write operations done by the
- <a class="permalink" href="#bus_space_set_region_N~2"><code class="Fn">bus_space_set_region_N</code></a>()
- functions may be executed in any order. They may also be executed out of
- order with respect to other read and write operations if either are on
- prefetchable or cacheable mappings unless order is enforced by use of
- the <code class="Fn">bus_space_barrier</code>() function. There is no
- way to insert barriers between writes of individual bus space locations
- executed by the <code class="Fn">bus_space_set_region_N</code>()
- functions.</p>
- <p class="Pp">These functions will never fail. If they would fail (e.g.,
- because of an argument error), that indicates a software bug which
- should cause a panic. In that case, they will never return.</p>
- </dd>
-</dl>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="READING_AND_WRITING_A_SINGLE_LOCATION_MULTIPLE_TIMES"><a class="permalink" href="#READING_AND_WRITING_A_SINGLE_LOCATION_MULTIPLE_TIMES">READING
- AND WRITING A SINGLE LOCATION MULTIPLE TIMES</a></h1>
-<p class="Pp">Some devices implement single locations in bus space which are to
- be read or written multiple times to communicate data, e.g., some ethernet
- devices' packet buffer FIFOs. In order to allow drivers to manipulate these
- types of devices as efficiently as possible, the
- <a class="permalink" href="#bus_space_read_multi_N"><code class="Fn" id="bus_space_read_multi_N">bus_space_read_multi_N</code></a>()
- and <code class="Fn">bus_space_write_multi_N</code>() families of functions
- are provided.</p>
-<p class="Pp"></p>
-<dl class="Bl-ohang Bl-compact">
- <dt id="bus_space_read_multi_1"><a class="permalink" href="#bus_space_read_multi_1"><code class="Fn">bus_space_read_multi_1</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_multi_2"><a class="permalink" href="#bus_space_read_multi_2"><code class="Fn">bus_space_read_multi_2</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_multi_4"><a class="permalink" href="#bus_space_read_multi_4"><code class="Fn">bus_space_read_multi_4</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_multi_8"><a class="permalink" href="#bus_space_read_multi_8"><code class="Fn">bus_space_read_multi_8</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_read_multi_N~2">The
- <a class="permalink" href="#bus_space_read_multi_N~2"><code class="Fn">bus_space_read_multi_N</code></a>()
- family of functions reads <var class="Fa">count</var> 1, 2, 4, or 8 byte
- data items from bus space at byte offset <var class="Fa">offset</var> in
- the region specified by <var class="Fa">handle</var> of the bus space
- specified by <var class="Fa">space</var> and writes them into the array
- specified by <var class="Fa">datap</var>. Each successive data item is
- read from the same location in bus space. The location being read must
- lie within the bus space region specified by
- <var class="Fa">handle</var>.</p>
- <p class="Pp">For portability, the starting address of the region specified
- by <var class="Fa">handle</var> plus the offset should be a multiple of
- the size of data items being read and the data array pointer should be
- properly aligned. On some systems, not obeying these requirements may
- cause incorrect data to be read, on others it may cause a system
- crash.</p>
- <p class="Pp" id="bus_space_read_multi_N~3">Read operations done by the
- <a class="permalink" href="#bus_space_read_multi_N~3"><code class="Fn">bus_space_read_multi_N</code></a>()
- functions may be executed out of order with respect to other read and
- write operations if the latter are on prefetchable or cacheable mappings
- unless order is enforced by use of the
- <code class="Fn">bus_space_barrier</code>() function.
- <code class="Fn">bus_space_read_multi_N</code>() makes no sense itself
- on prefetchable or cacheable mappings.</p>
- <p class="Pp">These functions will never fail. If they would fail (e.g.,
- because of an argument error), that indicates a software bug which
- should cause a panic. In that case, they will never return.</p>
- <p class="Pp"></p>
- </dd>
- <dt id="bus_space_write_multi_1"><a class="permalink" href="#bus_space_write_multi_1"><code class="Fn">bus_space_write_multi_1</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_multi_2"><a class="permalink" href="#bus_space_write_multi_2"><code class="Fn">bus_space_write_multi_2</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_multi_4"><a class="permalink" href="#bus_space_write_multi_4"><code class="Fn">bus_space_write_multi_4</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_multi_8"><a class="permalink" href="#bus_space_write_multi_8"><code class="Fn">bus_space_write_multi_8</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd>
- <p class="Pp" id="bus_space_write_multi_N">The
- <a class="permalink" href="#bus_space_write_multi_N"><code class="Fn">bus_space_write_multi_N</code></a>()
- family of functions reads <var class="Fa">count</var> 1, 2, 4, or 8 byte
- data items from the array specified by <var class="Fa">datap</var> and
- writes them into bus space at byte offset <var class="Fa">offset</var>
- in the region specified by <var class="Fa">handle</var> of the bus space
- specified by <var class="Fa">space</var>. Each successive data item is
- written to the same location in bus space. The location being written
- must lie within the bus space region specified by
- <var class="Fa">handle</var>.</p>
- <p class="Pp">For portability, the starting address of the region specified
- by <var class="Fa">handle</var> plus the offset should be a multiple of
- the size of data items being written and the data array pointer should
- be properly aligned. On some systems, not obeying these requirements may
- cause incorrect data to be written, on others it may cause a system
- crash.</p>
- <p class="Pp" id="bus_space_write_multi_N~2">Write operations done by the
- <a class="permalink" href="#bus_space_write_multi_N~2"><code class="Fn">bus_space_write_multi_N</code></a>()
- functions may be executed out of order with respect to other read and
- write operations if the latter are on prefetchable or cacheable mappings
- unless order is enforced by use of the
- <code class="Fn">bus_space_barrier</code>() function.
- <code class="Fn">bus_space_write_multi_N</code>() makes no sense itself
- on prefetchable or cacheable mappings.</p>
- <p class="Pp">These functions will never fail. If they would fail (e.g.,
- because of an argument error), that indicates a software bug which
- should cause a panic. In that case, they will never return.</p>
- </dd>
-</dl>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="STREAM_FUNCTIONS"><a class="permalink" href="#STREAM_FUNCTIONS">STREAM
- FUNCTIONS</a></h1>
-<p class="Pp">Most of the <code class="Nm">bus_space</code> functions imply a
- host byte-order and a bus byte-order and take care of any translation for
- the caller. In some cases, however, hardware may map a FIFO or some other
- memory region for which the caller may want to use multi-word, yet
- untranslated access. Access to these types of memory regions should be with
- the
- <a class="permalink" href="#bus_space_*_stream_N"><code class="Fn" id="bus_space_*_stream_N">bus_space_*_stream_N</code></a>()
- functions.</p>
-<p class="Pp"></p>
-<dl class="Bl-ohang Bl-compact">
- <dt id="bus_space_read_stream_1"><a class="permalink" href="#bus_space_read_stream_1"><code class="Fn">bus_space_read_stream_1</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_stream_2"><a class="permalink" href="#bus_space_read_stream_2"><code class="Fn">bus_space_read_stream_2</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_stream_4"><a class="permalink" href="#bus_space_read_stream_4"><code class="Fn">bus_space_read_stream_4</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_stream_8"><a class="permalink" href="#bus_space_read_stream_8"><code class="Fn">bus_space_read_stream_8</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_multi_stream_1"><a class="permalink" href="#bus_space_read_multi_stream_1"><code class="Fn">bus_space_read_multi_stream_1</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_multi_stream_2"><a class="permalink" href="#bus_space_read_multi_stream_2"><code class="Fn">bus_space_read_multi_stream_2</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_multi_stream_4"><a class="permalink" href="#bus_space_read_multi_stream_4"><code class="Fn">bus_space_read_multi_stream_4</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_multi_stream_8"><a class="permalink" href="#bus_space_read_multi_stream_8"><code class="Fn">bus_space_read_multi_stream_8</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_region_stream_1"><a class="permalink" href="#bus_space_read_region_stream_1"><code class="Fn">bus_space_read_region_stream_1</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_region_stream_2"><a class="permalink" href="#bus_space_read_region_stream_2"><code class="Fn">bus_space_read_region_stream_2</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_region_stream_4"><a class="permalink" href="#bus_space_read_region_stream_4"><code class="Fn">bus_space_read_region_stream_4</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_read_region_stream_8"><a class="permalink" href="#bus_space_read_region_stream_8"><code class="Fn">bus_space_read_region_stream_8</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_stream_1"><a class="permalink" href="#bus_space_write_stream_1"><code class="Fn">bus_space_write_stream_1</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">value</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_stream_2"><a class="permalink" href="#bus_space_write_stream_2"><code class="Fn">bus_space_write_stream_2</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">value</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_stream_4"><a class="permalink" href="#bus_space_write_stream_4"><code class="Fn">bus_space_write_stream_4</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">value</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_stream_8"><a class="permalink" href="#bus_space_write_stream_8"><code class="Fn">bus_space_write_stream_8</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">value</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_multi_stream_1"><a class="permalink" href="#bus_space_write_multi_stream_1"><code class="Fn">bus_space_write_multi_stream_1</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_multi_stream_2"><a class="permalink" href="#bus_space_write_multi_stream_2"><code class="Fn">bus_space_write_multi_stream_2</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_multi_stream_4"><a class="permalink" href="#bus_space_write_multi_stream_4"><code class="Fn">bus_space_write_multi_stream_4</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_multi_stream_8"><a class="permalink" href="#bus_space_write_multi_stream_8"><code class="Fn">bus_space_write_multi_stream_8</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_region_stream_1"><a class="permalink" href="#bus_space_write_region_stream_1"><code class="Fn">bus_space_write_region_stream_1</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_region_stream_2"><a class="permalink" href="#bus_space_write_region_stream_2"><code class="Fn">bus_space_write_region_stream_2</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_region_stream_4"><a class="permalink" href="#bus_space_write_region_stream_4"><code class="Fn">bus_space_write_region_stream_4</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
- <dt id="bus_space_write_region_stream_8"><a class="permalink" href="#bus_space_write_region_stream_8"><code class="Fn">bus_space_write_region_stream_8</code></a>(<var class="Fa">space</var>,
- <var class="Fa">handle</var>, <var class="Fa">offset</var>,
- <var class="Fa">datap</var>, <var class="Fa">count</var>)</dt>
- <dd></dd>
-</dl>
-<p class="Pp">These functions are defined just as their non-stream counterparts,
- except that they provide no byte-order translation.</p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="IMPLEMENTING_BUS_SPACES_IN_MACHINE-INDEPENDENT_CODE"><a class="permalink" href="#IMPLEMENTING_BUS_SPACES_IN_MACHINE-INDEPENDENT_CODE">IMPLEMENTING
- BUS SPACES IN MACHINE-INDEPENDENT CODE</a></h1>
-<dl class="Bl-ohang Bl-compact">
- <dt id="bus_space_tag_create"><a class="permalink" href="#bus_space_tag_create"><code class="Fn">bus_space_tag_create</code></a>(<var class="Fa">obst</var>,
- <var class="Fa">present</var>, <var class="Fa">extpresent</var>,
- <var class="Fa">ov</var>, <var class="Fa">ctx</var>,
- <var class="Fa">bstp</var>)</dt>
- <dd>Create a copy of the tag <var class="Fa">obst</var> at
- <var class="Fa">*bstp</var>. Except for the behavior overridden by
- <var class="Fa">ov</var>, <var class="Fa">*bstp</var> inherits the
- behavior of <var class="Fa">obst</var> under
- <code class="Nm">bus_space</code> calls.
- <p class="Pp"><var class="Fa">ov</var> contains function pointers
- corresponding to <code class="Nm">bus_space</code> routines. Each
- function pointer has a corresponding bit in
- <var class="Fa">present</var> or <var class="Fa">extpresent</var>, and
- if that bit is 1, the function pointer overrides the corresponding
- <code class="Nm">bus_space</code> call for the new tag. Any combination
- of these bits may be set in <var class="Fa">present</var>:</p>
- <p class="Pp"></p>
- <dl class="Bl-tag Bl-compact">
- <dt id="BUS_SPACE_OVERRIDE_MAP"><a class="permalink" href="#BUS_SPACE_OVERRIDE_MAP"><code class="Dv">BUS_SPACE_OVERRIDE_MAP</code></a></dt>
- <dd style="width: auto;">&#x00A0;</dd>
- <dt id="BUS_SPACE_OVERRIDE_UNMAP"><a class="permalink" href="#BUS_SPACE_OVERRIDE_UNMAP"><code class="Dv">BUS_SPACE_OVERRIDE_UNMAP</code></a></dt>
- <dd style="width: auto;">&#x00A0;</dd>
- <dt id="BUS_SPACE_OVERRIDE_ALLOC"><a class="permalink" href="#BUS_SPACE_OVERRIDE_ALLOC"><code class="Dv">BUS_SPACE_OVERRIDE_ALLOC</code></a></dt>
- <dd style="width: auto;">&#x00A0;</dd>
- <dt id="BUS_SPACE_OVERRIDE_FREE"><a class="permalink" href="#BUS_SPACE_OVERRIDE_FREE"><code class="Dv">BUS_SPACE_OVERRIDE_FREE</code></a></dt>
- <dd style="width: auto;">&#x00A0;</dd>
- <dt id="BUS_SPACE_OVERRIDE_RESERVE"><a class="permalink" href="#BUS_SPACE_OVERRIDE_RESERVE"><code class="Dv">BUS_SPACE_OVERRIDE_RESERVE</code></a></dt>
- <dd style="width: auto;">&#x00A0;</dd>
- <dt id="BUS_SPACE_OVERRIDE_RELEASE"><a class="permalink" href="#BUS_SPACE_OVERRIDE_RELEASE"><code class="Dv">BUS_SPACE_OVERRIDE_RELEASE</code></a></dt>
- <dd style="width: auto;">&#x00A0;</dd>
- <dt id="BUS_SPACE_OVERRIDE_RESERVATION_MAP"><a class="permalink" href="#BUS_SPACE_OVERRIDE_RESERVATION_MAP"><code class="Dv">BUS_SPACE_OVERRIDE_RESERVATION_MAP</code></a></dt>
- <dd style="width: auto;">&#x00A0;</dd>
- <dt id="BUS_SPACE_OVERRIDE_RESERVATION_UNMAP"><a class="permalink" href="#BUS_SPACE_OVERRIDE_RESERVATION_UNMAP"><code class="Dv">BUS_SPACE_OVERRIDE_RESERVATION_UNMAP</code></a></dt>
- <dd style="width: auto;">&#x00A0;</dd>
- <dt id="BUS_SPACE_OVERRIDE_RESERVE_SUBREGION"><a class="permalink" href="#BUS_SPACE_OVERRIDE_RESERVE_SUBREGION"><code class="Dv">BUS_SPACE_OVERRIDE_RESERVE_SUBREGION</code></a></dt>
- <dd style="width: auto;">&#x00A0;</dd>
- </dl>
- <p class="Pp" id="bus_space_tag_create~2"><a class="permalink" href="#bus_space_tag_create~2"><code class="Fn">bus_space_tag_create</code></a>()
- does not copy <var class="Fa">ov</var>. After a new tag is created by
- <code class="Fn">bus_space_tag_create</code>(), <var class="Fa">ov</var>
- must not be destroyed until after the tag is destroyed by
- <code class="Fn">bus_space_tag_destroy</code>().</p>
- <p class="Pp">The first argument of every override-function is a
- <var class="Vt">void *</var>, and <var class="Fa">ctx</var> is passed in
- that argument.</p>
- <p class="Pp">Return 0 if the call succeeds. Return
- <code class="Er">EOPNOTSUPP</code> if the architecture does not support
- overrides. Return <code class="Er">EINVAL</code> if
- <var class="Fa">present</var> is 0, if <var class="Fa">ov</var> is
- <code class="Dv">NULL</code>, or if <var class="Fa">present</var>
- indicates that an override is present, but the corresponding override in
- <var class="Fa">ov</var> is <code class="Dv">NULL</code>.</p>
- <p class="Pp">If the call does not succeed, <var class="Fa">*bstp</var> is
- undefined.</p>
- </dd>
- <dt id="bus_space_tag_destroy"><a class="permalink" href="#bus_space_tag_destroy"><code class="Fn">bus_space_tag_destroy</code></a>(<var class="Fa">bst</var>)</dt>
- <dd>Destroy a tag, <var class="Fa">bst</var>, created by a prior call to
- <code class="Fn">bus_space_tag_create</code>(). If
- <var class="Fa">bst</var> was not created by
- <code class="Fn">bus_space_tag_create</code>(), results are undefined. If
- <var class="Fa">bst</var> was already destroyed, results are
- undefined.</dd>
-</dl>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="EXPECTED_CHANGES_TO_THE_BUS_SPACE_FUNCTIONS"><a class="permalink" href="#EXPECTED_CHANGES_TO_THE_BUS_SPACE_FUNCTIONS">EXPECTED
- CHANGES TO THE BUS_SPACE FUNCTIONS</a></h1>
-<p class="Pp">The definition of the <code class="Nm">bus_space</code> functions
- should not yet be considered finalized. There are several changes and
- improvements which should be explored, including:</p>
-<ul class="Bl-bullet">
- <li>Exporting the <code class="Nm">bus_space</code> functions to userland so
- that applications (such as X servers) have easier, more portable access to
- device space.</li>
- <li>Redefining bus space tags and handles so that machine-independent bus
- interface drivers (for example PCI to VME bridges) could define and
- implement bus spaces without requiring machine-dependent code. If this is
- done, it should be done in such a way that machine-dependent optimizations
- should remain possible.</li>
- <li>Converting bus spaces (such as PCI configuration space) which currently
- use space-specific access methods to use the
- <code class="Nm">bus_space</code> functions where that is
- appropriate.</li>
- <li>Redefining the way bus space is mapped and allocated, so that mapping and
- allocation are done with bus specific functions which return bus space
- tags. This would allow further optimization than is currently possible,
- and would also ease translation of the <code class="Nm">bus_space</code>
- functions into user space (since mapping in user space would look like it
- just used a different bus-specific mapping function).</li>
-</ul>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="COMPATIBILITY"><a class="permalink" href="#COMPATIBILITY">COMPATIBILITY</a></h1>
-<p class="Pp">The current version of the <code class="Nm">bus_space</code>
- interface specification differs slightly from the original specification
- that came into wide use. A few of the function names and arguments have
- changed for consistency and increased functionality. Drivers that were
- written to the old, deprecated specification can be compiled by defining the
- <code class="Dv">__BUS_SPACE_COMPAT_OLDDEFS</code> preprocessor symbol
- before including
- <code class="In">&lt;<a class="In">sys/bus.h</a>&gt;</code>.</p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="SEE_ALSO"><a class="permalink" href="#SEE_ALSO">SEE
- ALSO</a></h1>
-<p class="Pp"><a class="Xr">membar_ops(3)</a>, <a class="Xr">bus_dma(9)</a></p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="HISTORY"><a class="permalink" href="#HISTORY">HISTORY</a></h1>
-<p class="Pp">The <code class="Nm">bus_space</code> functions were introduced in
- a different form (memory and I/O spaces were accessed via different sets of
- functions) in <span class="Ux">NetBSD 1.2</span>. The functions were merged
- to work on generic &#x201C;spaces&#x201D; early in the
- <span class="Ux">NetBSD 1.3</span> development cycle, and many drivers were
- converted to use them. This document was written later during the
- <span class="Ux">NetBSD 1.3</span> development cycle and the specification
- was updated to fix some consistency problems and to add some missing
- functionality.</p>
-</section>
-<section class="Sh">
-<h1 class="Sh" id="AUTHORS"><a class="permalink" href="#AUTHORS">AUTHORS</a></h1>
-<p class="Pp">The <code class="Nm">bus_space</code> interfaces were designed and
- implemented by the <span class="Ux">NetBSD</span> developer community.
- Primary contributors and implementors were <span class="An">Chris
- Demetriou</span>, <span class="An">Jason Thorpe</span>, and
- <span class="An">Charles Hannum</span>, but the rest of the
- <span class="Ux">NetBSD</span> developers and the user community played a
- significant role in development.</p>
-<p class="Pp"><span class="An">Chris Demetriou</span> wrote this manual
- page.</p>
-</section>
-</div>
-<table class="foot">
- <tr>
- <td class="foot-date">August 12, 2022</td>
- <td class="foot-os">NetBSD 10.1</td>
- </tr>
-</table>