diff options
Diffstat (limited to 'static/freebsd/man9/bus_space.9 3.html')
| -rw-r--r-- | static/freebsd/man9/bus_space.9 3.html | 1712 |
1 files changed, 0 insertions, 1712 deletions
diff --git a/static/freebsd/man9/bus_space.9 3.html b/static/freebsd/man9/bus_space.9 3.html deleted file mode 100644 index e2f00da9..00000000 --- a/static/freebsd/man9/bus_space.9 3.html +++ /dev/null @@ -1,1712 +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_copy_region_stream_1</code>, - <code class="Nm">bus_space_copy_region_stream_2</code>, - <code class="Nm">bus_space_copy_region_stream_4</code>, - <code class="Nm">bus_space_copy_region_stream_8</code>, - <code class="Nm">bus_space_free</code>, - <code class="Nm">bus_space_map</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_set_multi_1</code>, - <code class="Nm">bus_space_set_multi_2</code>, - <code class="Nm">bus_space_set_multi_4</code>, - <code class="Nm">bus_space_set_multi_8</code>, - <code class="Nm">bus_space_set_multi_stream_1</code>, - <code class="Nm">bus_space_set_multi_stream_2</code>, - <code class="Nm">bus_space_set_multi_stream_4</code>, - <code class="Nm">bus_space_set_multi_stream_8</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_set_region_stream_1</code>, - <code class="Nm">bus_space_set_region_stream_2</code>, - <code class="Nm">bus_space_set_region_stream_4</code>, - <code class="Nm">bus_space_set_region_stream_8</code>, - <code class="Nm">bus_space_subregion</code>, - <code class="Nm">bus_space_unmap</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> — - <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 - <<a class="In">machine/bus.h</a>></code></p> -<p class="Pp"><var class="Ft">int</var> - <br/> - <code class="Fn">bus_space_map</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_addr_t address</var>, - <var class="Fa">bus_size_t size</var>, <var class="Fa">int flags</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_unmap</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">bus_size_t - size</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t size</var>);</p> -<p class="Pp"><var class="Ft">int</var> - <br/> - <code class="Fn">bus_space_peek_1</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - *datap</var>);</p> -<p class="Pp"><var class="Ft">int</var> - <br/> - <code class="Fn">bus_space_peek_4</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - *datap</var>);</p> -<p class="Pp"><var class="Ft">int</var> - <br/> - <code class="Fn">bus_space_peek_8</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - *datap</var>);</p> -<p class="Pp"><var class="Ft">int</var> - <br/> - <code class="Fn">bus_space_poke_1</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - *datap</var>);</p> -<p class="Pp"><var class="Ft">int</var> - <br/> - <code class="Fn">bus_space_poke_2</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - *datap</var>);</p> -<p class="Pp"><var class="Ft">int</var> - <br/> - <code class="Fn">bus_space_poke_4</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - *datap</var>);</p> -<p class="Pp"><var class="Ft">int</var> - <br/> - <code class="Fn">bus_space_poke_8</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - *datap</var>);</p> -<p class="Pp"><var class="Ft">uint8_t</var> - <br/> - <code class="Fn">bus_space_read_1</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>);</p> -<p class="Pp"><var class="Ft">uint8_t</var> - <br/> - <code class="Fn">bus_space_read_stream_1</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>);</p> -<p class="Pp"><var class="Ft">uint16_t</var> - <br/> - <code class="Fn">bus_space_read_stream_2</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>);</p> -<p class="Pp"><var class="Ft">uint32_t</var> - <br/> - <code class="Fn">bus_space_read_stream_4</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>);</p> -<p class="Pp"><var class="Ft">uint64_t</var> - <br/> - <code class="Fn">bus_space_read_stream_8</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint64_t - value</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_write_stream_1</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - value</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_write_stream_2</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint16_t - value</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_write_stream_4</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint32_t - value</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_write_stream_8</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint64_t - value</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_barrier</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">bus_size_t - length</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint16_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint32_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint64_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint16_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint32_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint64_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint16_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint32_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint64_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint16_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint32_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint64_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t srchandle</var>, - <var class="Fa">bus_size_t srcoffset</var>, - <var class="Fa">bus_space_handle_t dsthandle</var>, - <var class="Fa">bus_size_t dstoffset</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t srchandle</var>, - <var class="Fa">bus_size_t srcoffset</var>, - <var class="Fa">bus_space_handle_t dsthandle</var>, - <var class="Fa">bus_size_t dstoffset</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t srchandle</var>, - <var class="Fa">bus_size_t srcoffset</var>, - <var class="Fa">bus_space_handle_t dsthandle</var>, - <var class="Fa">bus_size_t dstoffset</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t srchandle</var>, - <var class="Fa">bus_size_t srcoffset</var>, - <var class="Fa">bus_space_handle_t dsthandle</var>, - <var class="Fa">bus_size_t dstoffset</var>, <var class="Fa">bus_size_t - count</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_copy_region_stream_1</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t srchandle</var>, - <var class="Fa">bus_size_t srcoffset</var>, - <var class="Fa">bus_space_handle_t dsthandle</var>, - <var class="Fa">bus_size_t dstoffset</var>, <var class="Fa">bus_size_t - count</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_copy_region_stream_2</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t srchandle</var>, - <var class="Fa">bus_size_t srcoffset</var>, - <var class="Fa">bus_space_handle_t dsthandle</var>, - <var class="Fa">bus_size_t dstoffset</var>, <var class="Fa">bus_size_t - count</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_copy_region_stream_4</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t srchandle</var>, - <var class="Fa">bus_size_t srcoffset</var>, - <var class="Fa">bus_space_handle_t dsthandle</var>, - <var class="Fa">bus_size_t dstoffset</var>, <var class="Fa">bus_size_t - count</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_copy_region_stream_8</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t srchandle</var>, - <var class="Fa">bus_size_t srcoffset</var>, - <var class="Fa">bus_space_handle_t dsthandle</var>, - <var class="Fa">bus_size_t dstoffset</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - value</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint16_t - value</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint32_t - value</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint64_t - value</var>, <var class="Fa">bus_size_t count</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_set_region_stream_1</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - value</var>, <var class="Fa">bus_size_t count</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_set_region_stream_2</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint16_t - value</var>, <var class="Fa">bus_size_t count</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_set_region_stream_4</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint32_t - value</var>, <var class="Fa">bus_size_t count</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_set_region_stream_8</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint64_t - value</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint16_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint32_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint64_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint16_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint32_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint64_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint16_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint32_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint64_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint16_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint32_t - *datap</var>, <var class="Fa">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">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint64_t - *datap</var>, <var class="Fa">bus_size_t count</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_set_multi_1</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - value</var>, <var class="Fa">bus_size_t count</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_set_multi_2</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint16_t - value</var>, <var class="Fa">bus_size_t count</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_set_multi_4</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint32_t - value</var>, <var class="Fa">bus_size_t count</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_set_multi_8</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint64_t - value</var>, <var class="Fa">bus_size_t count</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_set_multi_stream_1</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint8_t - value</var>, <var class="Fa">bus_size_t count</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_set_multi_stream_2</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint16_t - value</var>, <var class="Fa">bus_size_t count</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_set_multi_stream_4</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint32_t - value</var>, <var class="Fa">bus_size_t count</var>);</p> -<p class="Pp"><var class="Ft">void</var> - <br/> - <code class="Fn">bus_space_set_multi_stream_8</code>(<var class="Fa">bus_space_tag_t - space</var>, <var class="Fa">bus_space_handle_t handle</var>, - <var class="Fa">bus_size_t offset</var>, <var class="Fa">uint64_t - value</var>, <var class="Fa">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"><<a class="In">machine/bus.h</a>></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 buses 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"><<a class="In">machine/bus.h</a>></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 buses 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. Buses 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 - buses 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">Because some architectures' memory systems use buffering to - improve memory and device access performance, there is a mechanism which can - be used to create “barriers” in the bus space read and write - stream. There are three types of barriers: read, write, and read/write. All - reads started to the region before a read barrier must complete before any - reads after the read barrier are started. (The analogous requirement is true - for write barriers.) Read/write barriers force all reads and writes started - before the barrier to complete before any reads or writes after the barrier - are started. Correctly-written drivers will include all appropriate - barriers, and assume only the read/write ordering imposed by the barrier - operations.</p> -<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 of by some other means) or may cause improper operation - which is not immediately fatal. Functions which return - <var class="Ft">void</var> or which return data read from bus space (i.e., - functions which do not 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"><<a class="In">machine/bus.h</a>></code> to - facilitate use of the <code class="Nm">bus_space</code> functions by - drivers.</p> -<section class="Ss"> -<h2 class="Ss" id="bus_addr_t"><a class="permalink" href="#bus_addr_t"><var class="Vt">bus_addr_t</var></a></h2> -<p class="Pp">The <var class="Vt">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> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_size_t"><a class="permalink" href="#bus_size_t"><var class="Vt">bus_size_t</var></a></h2> -<p class="Pp">The <var class="Vt">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> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_tag_t"><a class="permalink" href="#bus_space_tag_t"><var class="Vt">bus_space_tag_t</var></a></h2> -<p class="Pp">The <var class="Vt">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 are operating.</p> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_handle_t"><a class="permalink" href="#bus_space_handle_t"><var class="Vt">bus_space_handle_t</var></a></h2> -<p class="Pp">The <var class="Vt">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> -</section> -</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">This section is specific to the <span class="Ux">NetBSD</span> - version of these functions and may or may not apply to the - <span class="Ux">FreeBSD</span> version.</p> -<p class="Pp" id="bus_space_map">Bus space must be mapped before it can be used, - and should be unmapped when it is no longer needed. The - <a class="permalink" href="#bus_space_map"><code class="Fn">bus_space_map</code></a>() - 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> -<section class="Ss"> -<h2 class="Ss" id="bus_space_map_space_address_size_flags_handlep"><a class="permalink" href="#bus_space_map_space_address_size_flags_handlep"><code class="Fn">bus_space_map</code>(<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>)</a></h2> -<p class="Pp">The <code class="Fn">bus_space_map</code>() function 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> -<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 and/or prefetched by - the system. If this flag is not specified, the implementation should map - the space so that it will not be cached or prefetched. - <p class="Pp">This flag must have a value of 1 on all implementations for - backward compatibility.</p> - </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). 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 - <a class="permalink" href="#bus_space_map~2"><code class="Fn" id="bus_space_map~2">bus_space_map</code></a>() - call should fail. If this flag is not specified, the system may map the - space in whatever way is most convenient.</dd> - <dt id="BUS_SPACE_MAP_NONPOSTED"><a class="permalink" href="#BUS_SPACE_MAP_NONPOSTED"><code class="Dv">BUS_SPACE_MAP_NONPOSTED</code></a></dt> - <dd>Try to map the space using non-posted device memory. This is to support - buses and devices where mapping with posted device memory is unsupported - or broken. This flag is currently only available on arm64.</dd> -</dl> -<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_CACHEABLE</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' “prefetchable” bit), - those hints should be followed for maximum compatibility. On some systems, - requesting a mapping that cannot be satisfied (e.g. requesting a - non-cacheable mapping when the system can only provide a cacheable 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 for spaces which coexist with those spaces - (e.g. 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> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_unmap_space_handle_size"><a class="permalink" href="#bus_space_unmap_space_handle_size"><a class="permalink" href="#bus_space_unmap"><code class="Fn" id="bus_space_unmap">bus_space_unmap</code></a>(<var class="Fa">space</var>, - <var class="Fa">handle</var>, <var class="Fa">size</var>)</a></h2> -<p class="Pp">The <code class="Fn">bus_space_unmap</code>() function unmaps a - region of bus space 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~2">After - <a class="permalink" href="#bus_space_unmap~2"><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~3">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~3"><code class="Fn">bus_space_unmap</code></a>() - will never return.</p> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_subregion_space_handle_offset_size_nhandlep"><a class="permalink" href="#bus_space_subregion_space_handle_offset_size_nhandlep"><code class="Fn">bus_space_subregion</code>(<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>)</a></h2> -<p class="Pp">The <code class="Fn">bus_space_subregion</code>() 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 give by - <var class="Fa">size</var>, and must be wholly contained within the original - region.</p> -<p class="Pp" id="bus_space_subregion~2">If successful, - <a class="permalink" href="#bus_space_subregion~2"><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~3">When done with a handle created by - <a class="permalink" href="#bus_space_subregion~3"><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> -</section> -</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">This section is specific to the <span class="Ux">NetBSD</span> - version of these functions and may or may not apply to the - <span class="Ux">FreeBSD</span> version.</p> -<p class="Pp" id="bus_space_alloc">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 - <a class="permalink" href="#bus_space_alloc"><code class="Fn">bus_space_alloc</code></a>() - and <code class="Fn">bus_space_free</code>() functions provide these - capabilities.</p> -<section class="Ss"> -<h2 class="Ss" id="bus_space_alloc_space_reg_start_reg_end_size_alignment_boundary_flags_addrp_handlep"><a class="permalink" href="#bus_space_alloc_space_reg_start_reg_end_size_alignment_boundary_flags_addrp_handlep"><code class="Fn">bus_space_alloc</code>(<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>)</a></h2> -<p class="Pp">The <code class="Fn">bus_space_alloc</code>() 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~2">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~2"><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" id="bus_space_map~3">The <var class="Fa">flags</var> parameter is - the same as the like-named parameter to - <a class="permalink" href="#bus_space_map~3"><code class="Fn">bus_space_map</code></a>(), - the same flag values should be used, and they have the same meanings.</p> -<p class="Pp" id="bus_space_alloc~3">Handles created by - <a class="permalink" href="#bus_space_alloc~3"><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> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_free_space_handle_size"><a class="permalink" href="#bus_space_free_space_handle_size"><code class="Fn">bus_space_free</code>(<var class="Fa">space</var>, - <var class="Fa">handle</var>, <var class="Fa">size</var>)</a></h2> -<p class="Pp">The <code class="Fn">bus_space_free</code>() 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">After - <a class="permalink" href="#bus_space_free"><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~2">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~2"><code class="Fn">bus_space_free</code></a>() - will never return.</p> -</section> -</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 buses which - support those access sizes.</p> -<section class="Ss"> -<h2 class="Ss" id="bus_space_read_1_space_handle_offset"><a class="permalink" href="#bus_space_read_1_space_handle_offset"><a class="permalink" href="#bus_space_read_1"><code class="Fn" id="bus_space_read_1">bus_space_read_1</code></a>(<var class="Fa">space</var>, - <var class="Fa">handle</var>, <var class="Fa">offset</var>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_read_2_space_handle_offset"><a class="permalink" href="#bus_space_read_2_space_handle_offset"><a class="permalink" href="#bus_space_read_2"><code class="Fn" id="bus_space_read_2">bus_space_read_2</code></a>(<var class="Fa">space</var>, - <var class="Fa">handle</var>, <var class="Fa">offset</var>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_read_4_space_handle_offset"><a class="permalink" href="#bus_space_read_4_space_handle_offset"><a class="permalink" href="#bus_space_read_4"><code class="Fn" id="bus_space_read_4">bus_space_read_4</code></a>(<var class="Fa">space</var>, - <var class="Fa">handle</var>, <var class="Fa">offset</var>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_read_8_space_handle_offset"><a class="permalink" href="#bus_space_read_8_space_handle_offset"><a class="permalink" href="#bus_space_read_8"><code class="Fn" id="bus_space_read_8">bus_space_read_8</code></a>(<var class="Fa">space</var>, - <var class="Fa">handle</var>, <var class="Fa">offset</var>)</a></h2> -<p class="Pp">The <code class="Fn">bus_space_read_N</code>() 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">Read operations done by the - <a class="permalink" href="#bus_space_read_N"><code class="Fn">bus_space_read_N</code></a>() - functions may be executed out of order with respect to other pending read - and write operations 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> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_write_1_space_handle_offset_value"><a class="permalink" href="#bus_space_write_1_space_handle_offset_value"><a class="permalink" href="#bus_space_write_1"><code class="Fn" id="bus_space_write_1">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_write_2_space_handle_offset_value"><a class="permalink" href="#bus_space_write_2_space_handle_offset_value"><a class="permalink" href="#bus_space_write_2"><code class="Fn" id="bus_space_write_2">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_write_4_space_handle_offset_value"><a class="permalink" href="#bus_space_write_4_space_handle_offset_value"><a class="permalink" href="#bus_space_write_4"><code class="Fn" id="bus_space_write_4">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_write_8_space_handle_offset_value"><a class="permalink" href="#bus_space_write_8_space_handle_offset_value"><a class="permalink" href="#bus_space_write_8"><code class="Fn" id="bus_space_write_8">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>)</a></h2> -<p class="Pp">The <code class="Fn">bus_space_write_N</code>() 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">Write operations done by the - <a class="permalink" href="#bus_space_write_N"><code class="Fn">bus_space_write_N</code></a>() - functions may be executed out of order with respect to other pending read - and write operations 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> -</section> -</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~2"><code class="Fn" id="bus_space_read_N~2">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~3">As with - <a class="permalink" href="#bus_space_read_N~3"><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_barrier">In addition, explicit calls to the - <a class="permalink" href="#bus_space_barrier"><code class="Fn">bus_space_barrier</code></a>() - function are not required as the implementation will ensure all pending - operations complete before the peek or poke operation starts. The - implementation will also ensure that the peek or poke operations complete - before returning.</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">In order to allow high-performance buffering implementations to - avoid bus activity on every operation, read and write ordering should be - specified explicitly by drivers when necessary. The - <code class="Fn">bus_space_barrier</code>() function provides that - ability.</p> -<section class="Ss"> -<h2 class="Ss" id="bus_space_barrier_space_handle_offset_length_flags"><a class="permalink" href="#bus_space_barrier_space_handle_offset_length_flags"><code class="Fn">bus_space_barrier</code>(<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>)</a></h2> -<p class="Pp">The <code class="Fn">bus_space_barrier</code>() 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> -<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>Synchronize read operations.</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>Synchronize write operations.</dd> -</dl> -<p class="Pp">Those flags can be combined (or-ed together) to enforce ordering - on both read and write operations.</p> -<p class="Pp">All of the specified type(s) of operation which are done to the - region before the barrier operation are guaranteed to complete before any of - the specified type(s) of operation done after the barrier.</p> -<p class="Pp">Example: Consider a hypothetical device with two single-byte - ports, one write-only input port (at offset 0) and a read-only output port - (at offset 1). Operation of the device is as follows: data bytes are written - to the input port, and are placed by the device on a stack, the top of which - is read by reading from the output port. The sequence to correctly write two - data bytes to the device then read those two data bytes back would be:</p> -<div class="Bd Pp Li"> -<pre>/* - * t and h are the tag and handle for the mapped device's - * space. - */ -bus_space_write_1(t, h, 0, data0); -bus_space_barrier(t, h, 0, 1, BUS_SPACE_BARRIER_WRITE); /* 1 */ -bus_space_write_1(t, h, 0, data1); -bus_space_barrier(t, h, 0, 2, - BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE); /* 2 */ -ndata1 = bus_space_read_1(t, h, 1); -bus_space_barrier(t, h, 1, 1, BUS_SPACE_BARRIER_READ); /* 3 */ -ndata0 = bus_space_read_1(t, h, 1); -/* data0 == ndata0, data1 == ndata1 */</pre> -</div> -<p class="Pp">The first barrier makes sure that the first write finishes before - the second write is issued, so that two writes to the input port are done in - order and are not collapsed into a single write. This ensures that the data - bytes are written to the device correctly and in order.</p> -<p class="Pp">The second barrier makes sure that the writes to the output port - finish before any of the reads to the input port are issued, thereby making - sure that all of the writes are finished before data is read. This ensures - that the first byte read from the device really is the last one that was - written.</p> -<p class="Pp">The third barrier makes sure that the first read finishes before - the second read is issued, ensuring that data is read correctly and in - order.</p> -<p class="Pp">The barriers in the example above are specified to cover the - absolute minimum number of bus space locations. It is correct (and often - easier) to make barrier operations cover the device's whole range of bus - space, that is, to specify an offset of zero and the size of the whole - region.</p> -</section> -</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> -<section class="Ss"> -<h2 class="Ss" id="bus_space_read_region_1_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_read_region_1_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_read_region_1"><code class="Fn" id="bus_space_read_region_1">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_read_region_2_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_read_region_2_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_read_region_2"><code class="Fn" id="bus_space_read_region_2">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_read_region_4_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_read_region_4_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_read_region_4"><code class="Fn" id="bus_space_read_region_4">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_read_region_8_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_read_region_8_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_read_region_8"><code class="Fn" id="bus_space_read_region_8">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>)</a></h2> -<p class="Pp">The <code class="Fn">bus_space_read_region_N</code>() 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~2">Read operations done by the - <a class="permalink" href="#bus_space_read_region_N~2"><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 pending read and write operations 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> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_write_region_1_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_write_region_1_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_write_region_1"><code class="Fn" id="bus_space_write_region_1">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_write_region_2_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_write_region_2_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_write_region_2"><code class="Fn" id="bus_space_write_region_2">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_write_region_4_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_write_region_4_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_write_region_4"><code class="Fn" id="bus_space_write_region_4">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_write_region_8_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_write_region_8_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_write_region_8"><code class="Fn" id="bus_space_write_region_8">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>)</a></h2> -<p class="Pp">The <code class="Fn">bus_space_write_region_N</code>() 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">Write operations done by the - <a class="permalink" href="#bus_space_write_region_N"><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 pending read and write operations 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> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_copy_region_1_space_srchandle_srcoffset_dsthandle_dstoffset_count"><a class="permalink" href="#bus_space_copy_region_1_space_srchandle_srcoffset_dsthandle_dstoffset_count"><a class="permalink" href="#bus_space_copy_region_1"><code class="Fn" id="bus_space_copy_region_1">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_copy_region_2_space_srchandle_srcoffset_dsthandle_dstoffset_count"><a class="permalink" href="#bus_space_copy_region_2_space_srchandle_srcoffset_dsthandle_dstoffset_count"><a class="permalink" href="#bus_space_copy_region_2"><code class="Fn" id="bus_space_copy_region_2">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_copy_region_4_space_srchandle_srcoffset_dsthandle_dstoffset_count"><a class="permalink" href="#bus_space_copy_region_4_space_srchandle_srcoffset_dsthandle_dstoffset_count"><a class="permalink" href="#bus_space_copy_region_4"><code class="Fn" id="bus_space_copy_region_4">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_copy_region_8_space_srchandle_srcoffset_dsthandle_dstoffset_count"><a class="permalink" href="#bus_space_copy_region_8_space_srchandle_srcoffset_dsthandle_dstoffset_count"><a class="permalink" href="#bus_space_copy_region_8"><code class="Fn" id="bus_space_copy_region_8">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>)</a></h2> -<p class="Pp">The <code class="Fn">bus_space_copy_region_N</code>() 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 the 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~2">Read and write operations done by - the - <a class="permalink" href="#bus_space_copy_region_N~2"><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 pending read and write operations 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~3">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~3"><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> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_set_region_1_space_handle_offset_value_count"><a class="permalink" href="#bus_space_set_region_1_space_handle_offset_value_count"><a class="permalink" href="#bus_space_set_region_1"><code class="Fn" id="bus_space_set_region_1">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_set_region_2_space_handle_offset_value_count"><a class="permalink" href="#bus_space_set_region_2_space_handle_offset_value_count"><a class="permalink" href="#bus_space_set_region_2"><code class="Fn" id="bus_space_set_region_2">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_set_region_4_space_handle_offset_value_count"><a class="permalink" href="#bus_space_set_region_4_space_handle_offset_value_count"><a class="permalink" href="#bus_space_set_region_4"><code class="Fn" id="bus_space_set_region_4">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_set_region_8_space_handle_offset_value_count"><a class="permalink" href="#bus_space_set_region_8_space_handle_offset_value_count"><a class="permalink" href="#bus_space_set_region_8"><code class="Fn" id="bus_space_set_region_8">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>)</a></h2> -<p class="Pp">The <code class="Fn">bus_space_set_region_N</code>() 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">Write operations done by the - <a class="permalink" href="#bus_space_set_region_N"><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 pending read and write operations 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> -</section> -</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>(), - <code class="Fn">bus_space_set_multi_N</code>(), and - <code class="Fn">bus_space_write_multi_N</code>() families of functions are - provided.</p> -<section class="Ss"> -<h2 class="Ss" id="bus_space_read_multi_1_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_read_multi_1_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_read_multi_1"><code class="Fn" id="bus_space_read_multi_1">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_read_multi_2_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_read_multi_2_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_read_multi_2"><code class="Fn" id="bus_space_read_multi_2">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_read_multi_4_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_read_multi_4_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_read_multi_4"><code class="Fn" id="bus_space_read_multi_4">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_read_multi_8_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_read_multi_8_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_read_multi_8"><code class="Fn" id="bus_space_read_multi_8">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>)</a></h2> -<p class="Pp">The <code class="Fn">bus_space_read_multi_N</code>() 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~2">Read operations done by the - <a class="permalink" href="#bus_space_read_multi_N~2"><code class="Fn">bus_space_read_multi_N</code></a>() - functions may be executed out of order with respect to other pending read - and write operations unless order is enforced by use of the - <code class="Fn">bus_space_barrier</code>() function. Because the - <code class="Fn">bus_space_read_multi_N</code>() functions read the same bus - space location multiple times, they place an implicit read barrier between - each successive read of that bus space location.</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> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_write_multi_1_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_write_multi_1_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_write_multi_1"><code class="Fn" id="bus_space_write_multi_1">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_write_multi_2_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_write_multi_2_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_write_multi_2"><code class="Fn" id="bus_space_write_multi_2">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_write_multi_4_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_write_multi_4_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_write_multi_4"><code class="Fn" id="bus_space_write_multi_4">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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_write_multi_8_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_write_multi_8_space_handle_offset_datap_count"><a class="permalink" href="#bus_space_write_multi_8"><code class="Fn" id="bus_space_write_multi_8">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>)</a></h2> -<p class="Pp">The <code class="Fn">bus_space_write_multi_N</code>() 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">Write operations done by the - <a class="permalink" href="#bus_space_write_multi_N"><code class="Fn">bus_space_write_multi_N</code></a>() - functions may be executed out of order with respect to other pending read - and write operations unless order is enforced by use of the - <code class="Fn">bus_space_barrier</code>() function. Because the - <code class="Fn">bus_space_write_multi_N</code>() functions write the same - bus space location multiple times, they place an implicit write barrier - between each successive write of that bus space location.</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> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_set_multi_1_space_handle_offset_value_count"><a class="permalink" href="#bus_space_set_multi_1_space_handle_offset_value_count"><a class="permalink" href="#bus_space_set_multi_1"><code class="Fn" id="bus_space_set_multi_1">bus_space_set_multi_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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_set_multi_2_space_handle_offset_value_count"><a class="permalink" href="#bus_space_set_multi_2_space_handle_offset_value_count"><a class="permalink" href="#bus_space_set_multi_2"><code class="Fn" id="bus_space_set_multi_2">bus_space_set_multi_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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_set_multi_4_space_handle_offset_value_count"><a class="permalink" href="#bus_space_set_multi_4_space_handle_offset_value_count"><a class="permalink" href="#bus_space_set_multi_4"><code class="Fn" id="bus_space_set_multi_4">bus_space_set_multi_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>)</a></h2> -</section> -<section class="Ss"> -<h2 class="Ss" id="bus_space_set_multi_8_space_handle_offset_value_count"><a class="permalink" href="#bus_space_set_multi_8_space_handle_offset_value_count"><a class="permalink" href="#bus_space_set_multi_8"><code class="Fn" id="bus_space_set_multi_8">bus_space_set_multi_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>)</a></h2> -<p class="Pp">The <code class="Fn">bus_space_set_multi_N</code>() writes - <var class="Fa">value</var> 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>, <var class="Fa">count</var> times. 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_set_multi_N">Write operations done by the - <a class="permalink" href="#bus_space_set_multi_N"><code class="Fn">bus_space_set_multi_N</code></a>() - functions may be executed out of order with respect to other pending read - and write operations unless order is enforced by use of the - <code class="Fn">bus_space_barrier</code>() function. Because the - <code class="Fn">bus_space_set_multi_N</code>() functions write the same bus - space location multiple times, they place an implicit write barrier between - each successive write of that bus space location.</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> -</section> -</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-tag 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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </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>()</dt> - <dd style="width: auto;"> </dd> - <dt id="bus_space_copy_region_stream_1"><a class="permalink" href="#bus_space_copy_region_stream_1"><code class="Fn">bus_space_copy_region_stream_1</code></a>()</dt> - <dd style="width: auto;"> </dd> - <dt id="bus_space_copy_region_stream_2"><a class="permalink" href="#bus_space_copy_region_stream_2"><code class="Fn">bus_space_copy_region_stream_2</code></a>()</dt> - <dd style="width: auto;"> </dd> - <dt id="bus_space_copy_region_stream_4"><a class="permalink" href="#bus_space_copy_region_stream_4"><code class="Fn">bus_space_copy_region_stream_4</code></a>()</dt> - <dd style="width: auto;"> </dd> - <dt id="bus_space_copy_region_stream_8"><a class="permalink" href="#bus_space_copy_region_stream_8"><code class="Fn">bus_space_copy_region_stream_8</code></a>()</dt> - <dd style="width: auto;"> </dd> - <dt id="bus_space_set_multi_stream_1"><a class="permalink" href="#bus_space_set_multi_stream_1"><code class="Fn">bus_space_set_multi_stream_1</code></a>()</dt> - <dd style="width: auto;"> </dd> - <dt id="bus_space_set_multi_stream_2"><a class="permalink" href="#bus_space_set_multi_stream_2"><code class="Fn">bus_space_set_multi_stream_2</code></a>()</dt> - <dd style="width: auto;"> </dd> - <dt id="bus_space_set_multi_stream_4"><a class="permalink" href="#bus_space_set_multi_stream_4"><code class="Fn">bus_space_set_multi_stream_4</code></a>()</dt> - <dd style="width: auto;"> </dd> - <dt id="bus_space_set_multi_stream_8"><a class="permalink" href="#bus_space_set_multi_stream_8"><code class="Fn">bus_space_set_multi_stream_8</code></a>()</dt> - <dd style="width: auto;"> </dd> - <dt id="bus_space_set_region_stream_1"><a class="permalink" href="#bus_space_set_region_stream_1"><code class="Fn">bus_space_set_region_stream_1</code></a>()</dt> - <dd style="width: auto;"> </dd> - <dt id="bus_space_set_region_stream_2"><a class="permalink" href="#bus_space_set_region_stream_2"><code class="Fn">bus_space_set_region_stream_2</code></a>()</dt> - <dd style="width: auto;"> </dd> - <dt id="bus_space_set_region_stream_4"><a class="permalink" href="#bus_space_set_region_stream_4"><code class="Fn">bus_space_set_region_stream_4</code></a>()</dt> - <dd style="width: auto;"> </dd> - <dt id="bus_space_set_region_stream_8"><a class="permalink" href="#bus_space_set_region_stream_8"><code class="Fn">bus_space_set_region_stream_8</code></a>()</dt> - <dd style="width: auto;"> </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="COMPATIBILITY"><a class="permalink" href="#COMPATIBILITY">COMPATIBILITY</a></h1> -<p class="Pp">The current <span class="Ux">NetBSD</span> version of the - <code class="Nm">bus_space</code> interface specification differs slightly - from the original specification that came into wide use and - <span class="Ux">FreeBSD</span> adopted. A few of the function names and - arguments have changed for consistency and increased functionality.</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">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 “spaces” 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> -<p class="Pp">The manual page was then adapted to the version of the interface - that <span class="Ux">FreeBSD</span> imported for the CAM SCSI drivers, plus - subsequent evolution. The <span class="Ux">FreeBSD</span> - <code class="Nm">bus_space</code> version was imported in - <span class="Ux">FreeBSD 3.0</span>.</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">Justin Gibbs</span> ported these interfaces to - <span class="Ux">FreeBSD</span>.</p> -<p class="Pp"><span class="An">Chris Demetriou</span> wrote this manual - page.</p> -<p class="Pp"><span class="An">Warner Losh</span> modified it for the - <span class="Ux">FreeBSD</span> implementation.</p> -</section> -<section class="Sh"> -<h1 class="Sh" id="BUGS"><a class="permalink" href="#BUGS">BUGS</a></h1> -<p class="Pp">This manual may not completely and accurately document the - interface, and many parts of the interface are unspecified.</p> -</section> -</div> -<table class="foot"> - <tr> - <td class="foot-date">May 1, 2021</td> - <td class="foot-os">FreeBSD 15.0</td> - </tr> -</table> |
