1.\" $NetBSD: bus_space.9,v 1.9 1999/03/06 22:09:29 mycroft Exp $ 2.\" 3.\" Copyright (c) 2005 M. Warner Losh. All Rights Reserved. 4.\" Redistribution and use in source and binary forms, with or without 5.\" modification, are permitted provided that the following conditions 6.\" are met: 7.\" 1. Redistributions of source code must retain the above copyright 8.\" notice, this list of conditions and the following disclaimer. 9.\" 2. Redistributions in binary form must reproduce the above copyright 10.\" notice, this list of conditions and the following disclaimer in the 11.\" documentation and/or other materials provided with the distribution. 12.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 13.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 14.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 15.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 16.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 17.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 18.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 19.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 20.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 21.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 22.\" POSSIBILITY OF SUCH DAMAGE. 23.\" 24.\" 25.\" Copyright (c) 1997 The NetBSD Foundation, Inc. 26.\" All rights reserved. 27.\" 28.\" This code is derived from software contributed to The NetBSD Foundation 29.\" by Christopher G. Demetriou. 30.\" 31.\" Redistribution and use in source and binary forms, with or without 32.\" modification, are permitted provided that the following conditions 33.\" are met: 34.\" 1. Redistributions of source code must retain the above copyright 35.\" notice, this list of conditions and the following disclaimer. 36.\" 2. Redistributions in binary form must reproduce the above copyright 37.\" notice, this list of conditions and the following disclaimer in the 38.\" documentation and/or other materials provided with the distribution. 39.\" 3. All advertising materials mentioning features or use of this software 40.\" must display the following acknowledgment: 41.\" This product includes software developed by the NetBSD 42.\" Foundation, Inc. and its contributors. 43.\" 4. Neither the name of The NetBSD Foundation nor the names of its 44.\" contributors may be used to endorse or promote products derived 45.\" from this software without specific prior written permission. 46.\" 47.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 48.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 49.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 50.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 51.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 52.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 53.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 54.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 55.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 56.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 57.\" POSSIBILITY OF SUCH DAMAGE. 58.\" 59.\" $FreeBSD$ 60.\" 61.Dd June 13, 2005 62.Dt BUS_SPACE 9 63.Os 64.Sh NAME 65.Nm bus_space , 66.Nm bus_space_barrier , 67.Nm bus_space_copy_region_1 , 68.Nm bus_space_copy_region_2 , 69.Nm bus_space_copy_region_4 , 70.Nm bus_space_copy_region_8 , 71.Nm bus_space_copy_region_stream_1 , 72.Nm bus_space_copy_region_stream_2 , 73.Nm bus_space_copy_region_stream_4 , 74.Nm bus_space_copy_region_stream_8 , 75.Nm bus_space_free , 76.Nm bus_space_map , 77.Nm bus_space_read_1 , 78.Nm bus_space_read_2 , 79.Nm bus_space_read_4 , 80.Nm bus_space_read_8 , 81.Nm bus_space_read_multi_1 , 82.Nm bus_space_read_multi_2 , 83.Nm bus_space_read_multi_4 , 84.Nm bus_space_read_multi_8 , 85.Nm bus_space_read_multi_stream_1 , 86.Nm bus_space_read_multi_stream_2 , 87.Nm bus_space_read_multi_stream_4 , 88.Nm bus_space_read_multi_stream_8 , 89.Nm bus_space_read_region_1 , 90.Nm bus_space_read_region_2 , 91.Nm bus_space_read_region_4 , 92.Nm bus_space_read_region_8 , 93.Nm bus_space_read_region_stream_1 , 94.Nm bus_space_read_region_stream_2 , 95.Nm bus_space_read_region_stream_4 , 96.Nm bus_space_read_region_stream_8 , 97.Nm bus_space_read_stream_1 , 98.Nm bus_space_read_stream_2 , 99.Nm bus_space_read_stream_4 , 100.Nm bus_space_read_stream_8 , 101.Nm bus_space_set_multi_1 , 102.Nm bus_space_set_multi_2 , 103.Nm bus_space_set_multi_4 , 104.Nm bus_space_set_multi_8 , 105.Nm bus_space_set_multi_stream_1 , 106.Nm bus_space_set_multi_stream_2 , 107.Nm bus_space_set_multi_stream_4 , 108.Nm bus_space_set_multi_stream_8 , 109.Nm bus_space_set_region_1 , 110.Nm bus_space_set_region_2 , 111.Nm bus_space_set_region_4 , 112.Nm bus_space_set_region_8 , 113.Nm bus_space_set_region_stream_1 , 114.Nm bus_space_set_region_stream_2 , 115.Nm bus_space_set_region_stream_4 , 116.Nm bus_space_set_region_stream_8 , 117.Nm bus_space_subregion , 118.Nm bus_space_unmap , 119.Nm bus_space_write_1 , 120.Nm bus_space_write_2 , 121.Nm bus_space_write_4 , 122.Nm bus_space_write_8 , 123.Nm bus_space_write_multi_1 , 124.Nm bus_space_write_multi_2 , 125.Nm bus_space_write_multi_4 , 126.Nm bus_space_write_multi_8 , 127.Nm bus_space_write_multi_stream_1 , 128.Nm bus_space_write_multi_stream_2 , 129.Nm bus_space_write_multi_stream_4 , 130.Nm bus_space_write_multi_stream_8 , 131.Nm bus_space_write_region_1 , 132.Nm bus_space_write_region_2 , 133.Nm bus_space_write_region_4 , 134.Nm bus_space_write_region_8 , 135.Nm bus_space_write_region_stream_1 , 136.Nm bus_space_write_region_stream_2 , 137.Nm bus_space_write_region_stream_4 , 138.Nm bus_space_write_region_stream_8 , 139.Nm bus_space_write_stream_1 , 140.Nm bus_space_write_stream_2 , 141.Nm bus_space_write_stream_4 , 142.Nm bus_space_write_stream_8 143.Nd "bus space manipulation functions" 144.Sh SYNOPSIS 145.In machine/bus.h 146.Ft int 147.Fo bus_space_map 148.Fa "bus_space_tag_t space" "bus_addr_t address" 149.Fa "bus_size_t size" "int flags" "bus_space_handle_t *handlep" 150.Fc 151.Ft void 152.Fo bus_space_unmap 153.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t size" 154.Fc 155.Ft int 156.Fo bus_space_subregion 157.Fa "bus_space_tag_t space" "bus_space_handle_t handle" 158.Fa "bus_size_t offset" "bus_size_t size" "bus_space_handle_t *nhandlep" 159.Fc 160.Ft int 161.Fo bus_space_alloc 162.Fa "bus_space_tag_t space" "bus_addr_t reg_start" "bus_addr_t reg_end" 163.Fa "bus_size_t size" "bus_size_t alignment" "bus_size_t boundary" 164.Fa "int flags" "bus_addr_t *addrp" "bus_space_handle_t *handlep" 165.Fc 166.Ft void 167.Fo bus_space_free 168.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t size" 169.Fc 170.Ft u_int8_t 171.Fo bus_space_read_1 172.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t offset" 173.Fc 174.Ft u_int16_t 175.Fo bus_space_read_2 176.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t offset" 177.Fc 178.Ft u_int32_t 179.Fo bus_space_read_4 180.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t offset" 181.Fc 182.Ft u_int64_t 183.Fo bus_space_read_8 184.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t offset" 185.Fc 186.Ft u_int8_t 187.Fo bus_space_read_stream_1 188.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t offset" 189.Fc 190.Ft u_int16_t 191.Fo bus_space_read_stream_2 192.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t offset" 193.Fc 194.Ft u_int32_t 195.Fo bus_space_read_stream_4 196.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t offset" 197.Fc 198.Ft u_int64_t 199.Fo bus_space_read_stream_8 200.Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t offset" 201.Fc 202.Ft void 203.Fo bus_space_write_1 204.Fa "bus_space_tag_t space" "bus_space_handle_t handle" 205.Fa "bus_size_t offset" "u_int8_t value" 206.Fc 207.Ft void 208.Fo bus_space_write_2 209.Fa "bus_space_tag_t space" "bus_space_handle_t handle" 210.Fa "bus_size_t offset" "u_int16_t value" 211.Fc 212.Ft void 213.Fo bus_space_write_4 214.Fa "bus_space_tag_t space" "bus_space_handle_t handle" 215.Fa "bus_size_t offset" "u_int32_t value" 216.Fc 217.Ft void 218.Fo bus_space_write_8 219.Fa "bus_space_tag_t space" "bus_space_handle_t handle" 220.Fa "bus_size_t offset" "u_int64_t value" 221.Fc 222.Ft void 223.Fo bus_space_write_stream_1 224.Fa "bus_space_tag_t space" "bus_space_handle_t handle" 225.Fa "bus_size_t offset" "u_int8_t value" 226.Fc 227.Ft void 228.Fo bus_space_write_stream_2 229.Fa "bus_space_tag_t space" "bus_space_handle_t handle" 230.Fa "bus_size_t offset" "u_int16_t value" 231.Fc 232.Ft void 233.Fo bus_space_write_stream_4 234.Fa "bus_space_tag_t space" "bus_space_handle_t handle" 235.Fa "bus_size_t offset" "u_int32_t value" 236.Fc 237.Ft void 238.Fo bus_space_write_stream_8 239.Fa "bus_space_tag_t space" "bus_space_handle_t handle" 240.Fa "bus_size_t offset" "u_int64_t value" 241.Fc 242.Ft void 243.Fo bus_space_barrier 244.Fa "bus_space_tag_t space" "bus_space_handle_t handle" 245.Fa "bus_size_t offset" "bus_size_t length" "int flags" 246.Fc 247.Ft void 248.Fo bus_space_read_region_1 249.Fa "bus_space_tag_t space" 250.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t *datap" 251.Fa "bus_size_t count" 252.Fc 253.Ft void 254.Fo bus_space_read_region_2 255.Fa "bus_space_tag_t space" 256.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t *datap" 257.Fa "bus_size_t count" 258.Fc 259.Ft void 260.Fo bus_space_read_region_4 261.Fa "bus_space_tag_t space" 262.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t *datap" 263.Fa "bus_size_t count" 264.Fc 265.Ft void 266.Fo bus_space_read_region_8 267.Fa "bus_space_tag_t space" 268.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int64_t *datap" 269.Fa "bus_size_t count" 270.Fc 271.Ft void 272.Fo bus_space_read_region_stream_1 273.Fa "bus_space_tag_t space" 274.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t *datap" 275.Fa "bus_size_t count" 276.Fc 277.Ft void 278.Fo bus_space_read_region_stream_2 279.Fa "bus_space_tag_t space" 280.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t *datap" 281.Fa "bus_size_t count" 282.Fc 283.Ft void 284.Fo bus_space_read_region_stream_4 285.Fa "bus_space_tag_t space" 286.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t *datap" 287.Fa "bus_size_t count" 288.Fc 289.Ft void 290.Fo bus_space_read_region_stream_8 291.Fa "bus_space_tag_t space" 292.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int64_t *datap" 293.Fa "bus_size_t count" 294.Fc 295.Ft void 296.Fo bus_space_write_region_1 297.Fa "bus_space_tag_t space" 298.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t *datap" 299.Fa "bus_size_t count" 300.Fc 301.Ft void 302.Fo bus_space_write_region_2 303.Fa "bus_space_tag_t space" 304.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t *datap" 305.Fa "bus_size_t count" 306.Fc 307.Ft void 308.Fo bus_space_write_region_4 309.Fa "bus_space_tag_t space" 310.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t *datap" 311.Fa "bus_size_t count" 312.Fc 313.Ft void 314.Fo bus_space_write_region_8 315.Fa "bus_space_tag_t space" 316.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int64_t *datap" 317.Fa "bus_size_t count" 318.Fc 319.Ft void 320.Fo bus_space_write_region_stream_1 321.Fa "bus_space_tag_t space" 322.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t *datap" 323.Fa "bus_size_t count" 324.Fc 325.Ft void 326.Fo bus_space_write_region_stream_2 327.Fa "bus_space_tag_t space" 328.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t *datap" 329.Fa "bus_size_t count" 330.Fc 331.Ft void 332.Fo bus_space_write_region_stream_4 333.Fa "bus_space_tag_t space" 334.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t *datap" 335.Fa "bus_size_t count" 336.Fc 337.Ft void 338.Fo bus_space_write_region_stream_8 339.Fa "bus_space_tag_t space" 340.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int64_t *datap" 341.Fa "bus_size_t count" 342.Fc 343.Ft void 344.Fo bus_space_copy_region_1 345.Fa "bus_space_tag_t space" 346.Fa "bus_space_handle_t srchandle" "bus_size_t srcoffset" 347.Fa "bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count" 348.Fc 349.Ft void 350.Fo bus_space_copy_region_2 351.Fa "bus_space_tag_t space" 352.Fa "bus_space_handle_t srchandle" "bus_size_t srcoffset" 353.Fa "bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count" 354.Fc 355.Ft void 356.Fo bus_space_copy_region_4 357.Fa "bus_space_tag_t space" 358.Fa "bus_space_handle_t srchandle" "bus_size_t srcoffset" 359.Fa "bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count" 360.Fc 361.Ft void 362.Fo bus_space_copy_region_8 363.Fa "bus_space_tag_t space" 364.Fa "bus_space_handle_t srchandle" "bus_size_t srcoffset" 365.Fa "bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count" 366.Fc 367.Ft void 368.Fo bus_space_copy_region_stream_1 369.Fa "bus_space_tag_t space" 370.Fa "bus_space_handle_t srchandle" "bus_size_t srcoffset" 371.Fa "bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count" 372.Fc 373.Ft void 374.Fo bus_space_copy_region_stream_2 375.Fa "bus_space_tag_t space" 376.Fa "bus_space_handle_t srchandle" "bus_size_t srcoffset" 377.Fa "bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count" 378.Fc 379.Ft void 380.Fo bus_space_copy_region_stream_4 381.Fa "bus_space_tag_t space" 382.Fa "bus_space_handle_t srchandle" "bus_size_t srcoffset" 383.Fa "bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count" 384.Fc 385.Ft void 386.Fo bus_space_copy_region_stream_8 387.Fa "bus_space_tag_t space" 388.Fa "bus_space_handle_t srchandle" "bus_size_t srcoffset" 389.Fa "bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count" 390.Fc 391.Ft void 392.Fo bus_space_set_region_1 393.Fa "bus_space_tag_t space" 394.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t value" 395.Fa "bus_size_t count" 396.Fc 397.Ft void 398.Fo bus_space_set_region_2 399.Fa "bus_space_tag_t space" 400.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t value" 401.Fa "bus_size_t count" 402.Fc 403.Ft void 404.Fo bus_space_set_region_4 405.Fa "bus_space_tag_t space" 406.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t value" 407.Fa "bus_size_t count" 408.Fc 409.Ft void 410.Fo bus_space_set_region_8 411.Fa "bus_space_tag_t space" 412.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int64_t value" 413.Fa "bus_size_t count" 414.Fc 415.Ft void 416.Fo bus_space_set_region_stream_1 417.Fa "bus_space_tag_t space" 418.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t value" 419.Fa "bus_size_t count" 420.Fc 421.Ft void 422.Fo bus_space_set_region_stream_2 423.Fa "bus_space_tag_t space" 424.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t value" 425.Fa "bus_size_t count" 426.Fc 427.Ft void 428.Fo bus_space_set_region_stream_4 429.Fa "bus_space_tag_t space" 430.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t value" 431.Fa "bus_size_t count" 432.Fc 433.Ft void 434.Fo bus_space_set_region_stream_8 435.Fa "bus_space_tag_t space" 436.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int64_t value" 437.Fa "bus_size_t count" 438.Fc 439.Ft void 440.Fo bus_space_read_multi_1 441.Fa "bus_space_tag_t space" 442.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t *datap" 443.Fa "bus_size_t count" 444.Fc 445.Ft void 446.Fo bus_space_read_multi_2 447.Fa "bus_space_tag_t space" 448.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t *datap" 449.Fa "bus_size_t count" 450.Fc 451.Ft void 452.Fo bus_space_read_multi_4 453.Fa "bus_space_tag_t space" 454.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t *datap" 455.Fa "bus_size_t count" 456.Fc 457.Ft void 458.Fo bus_space_read_multi_8 459.Fa "bus_space_tag_t space" 460.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int64_t *datap" 461.Fa "bus_size_t count" 462.Fc 463.Ft void 464.Fo bus_space_read_multi_stream_1 465.Fa "bus_space_tag_t space" 466.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t *datap" 467.Fa "bus_size_t count" 468.Fc 469.Ft void 470.Fo bus_space_read_multi_stream_2 471.Fa "bus_space_tag_t space" 472.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t *datap" 473.Fa "bus_size_t count" 474.Fc 475.Ft void 476.Fo bus_space_read_multi_stream_4 477.Fa "bus_space_tag_t space" 478.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t *datap" 479.Fa "bus_size_t count" 480.Fc 481.Ft void 482.Fo bus_space_read_multi_stream_8 483.Fa "bus_space_tag_t space" 484.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int64_t *datap" 485.Fa "bus_size_t count" 486.Fc 487.Ft void 488.Fo bus_space_write_multi_1 489.Fa "bus_space_tag_t space" 490.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t *datap" 491.Fa "bus_size_t count" 492.Fc 493.Ft void 494.Fo bus_space_write_multi_2 495.Fa "bus_space_tag_t space" 496.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t *datap" 497.Fa "bus_size_t count" 498.Fc 499.Ft void 500.Fo bus_space_write_multi_4 501.Fa "bus_space_tag_t space" 502.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t *datap" 503.Fa "bus_size_t count" 504.Fc 505.Ft void 506.Fo bus_space_write_multi_8 507.Fa "bus_space_tag_t space" 508.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int64_t *datap" 509.Fa "bus_size_t count" 510.Fc 511.Ft void 512.Fo bus_space_write_multi_stream_1 513.Fa "bus_space_tag_t space" 514.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t *datap" 515.Fa "bus_size_t count" 516.Fc 517.Ft void 518.Fo bus_space_write_multi_stream_2 519.Fa "bus_space_tag_t space" 520.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t *datap" 521.Fa "bus_size_t count" 522.Fc 523.Ft void 524.Fo bus_space_write_multi_stream_4 525.Fa "bus_space_tag_t space" 526.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t *datap" 527.Fa "bus_size_t count" 528.Fc 529.Ft void 530.Fo bus_space_write_multi_stream_8 531.Fa "bus_space_tag_t space" 532.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int64_t *datap" 533.Fa "bus_size_t count" 534.Fc 535.Ft void 536.Fo bus_space_set_multi_1 537.Fa "bus_space_tag_t space" 538.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t value" 539.Fa "bus_size_t count" 540.Fc 541.Ft void 542.Fo bus_space_set_multi_2 543.Fa "bus_space_tag_t space" 544.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t value" 545.Fa "bus_size_t count" 546.Fc 547.Ft void 548.Fo bus_space_set_multi_4 549.Fa "bus_space_tag_t space" 550.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t value" 551.Fa "bus_size_t count" 552.Fc 553.Ft void 554.Fo bus_space_set_multi_8 555.Fa "bus_space_tag_t space" 556.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int64_t value" 557.Fa "bus_size_t count" 558.Fc 559.Ft void 560.Fo bus_space_set_multi_stream_1 561.Fa "bus_space_tag_t space" 562.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t value" 563.Fa "bus_size_t count" 564.Fc 565.Ft void 566.Fo bus_space_set_multi_stream_2 567.Fa "bus_space_tag_t space" 568.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t value" 569.Fa "bus_size_t count" 570.Fc 571.Ft void 572.Fo bus_space_set_multi_stream_4 573.Fa "bus_space_tag_t space" 574.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t value" 575.Fa "bus_size_t count" 576.Fc 577.Ft void 578.Fo bus_space_set_multi_stream_8 579.Fa "bus_space_tag_t space" 580.Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int64_t value" 581.Fa "bus_size_t count" 582.Fc 583.Sh DESCRIPTION 584The 585.Nm 586functions exist to allow device drivers 587machine-independent access to bus memory and register areas. 588All of the 589functions and types described in this document can be used by including 590the 591.In machine/bus.h 592header file. 593.Pp 594Many common devices are used on multiple architectures, but are accessed 595differently on each because of architectural constraints. 596For instance, a device which is mapped in one system's I/O space may be 597mapped in memory space on a second system. 598On a third system, architectural 599limitations might change the way registers need to be accessed (e.g.\& 600creating a non-linear register space). 601In some cases, a single 602driver may need to access the same type of device in multiple ways in a 603single system or architecture. 604The goal of the 605.Nm 606functions is to allow a single driver source file to manipulate a set 607of devices on different system architectures, and to allow a single driver 608object file to manipulate a set of devices on multiple bus types on a 609single architecture. 610.Pp 611Not all busses have to implement all functions described in this 612document, though that is encouraged if the operations are logically 613supported by the bus. 614Unimplemented functions should cause 615compile-time errors if possible. 616.Pp 617All of the interface definitions described in this document are shown as 618function prototypes and discussed as if they were required to be 619functions. 620Implementations are encouraged to implement prototyped 621(type-checked) versions of these interfaces, but may implement them as 622macros if appropriate. 623Machine-dependent types, variables, and functions 624should be marked clearly in 625.In machine/bus.h 626to avoid confusion with the 627machine-independent types and functions, and, if possible, should be 628given names which make the machine-dependence clear. 629.Sh CONCEPTS AND GUIDELINES 630Bus spaces are described by bus space tags, which can be created only by 631machine-dependent code. 632A given machine may have several different types 633of bus space (e.g.\& memory space and I/O space), and thus may provide 634multiple different bus space tags. 635Individual busses or devices on a machine may use more than one bus space 636tag. 637For instance, ISA devices are 638given an ISA memory space tag and an ISA I/O space tag. 639Architectures 640may have several different tags which represent the same type of 641space, for instance because of multiple different host bus interface 642chipsets. 643.Pp 644A range in bus space is described by a bus address and a bus size. 645The 646bus address describes the start of the range in bus space. 647The bus 648size describes the size of the range in bytes. 649Busses which are not byte 650addressable may require use of bus space ranges with appropriately 651aligned addresses and properly rounded sizes. 652.Pp 653Access to regions of bus space is facilitated by use of bus space handles, 654which are usually created by mapping a specific range of a bus space. 655Handles may also be created by allocating 656and mapping a range of bus space, the actual location of which is picked 657by the implementation within bounds specified by the caller of the 658allocation function. 659.Pp 660All of the bus space access functions require one bus space tag 661argument, at least one handle argument, and at least one offset argument 662(a bus size). 663The bus space tag specifies the space, each handle specifies a region in 664the space, and each offset specifies the offset into the region of the 665actual location(s) to be accessed. 666Offsets are given in bytes, though busses 667may impose alignment constraints. 668The offset used to access data 669relative to a given handle must be such that all of the data being 670accessed is in the mapped region that the handle describes. 671Trying to 672access data outside that region is an error. 673.Pp 674Because some architectures' memory systems use buffering to improve 675memory and device access performance, there is a mechanism which can be 676used to create 677.Dq barriers 678in the bus space read and write stream. 679There 680are three types of barriers: read, write, and read/write. 681All reads 682started to the region before a read barrier must complete before any reads 683after the read barrier are started. 684(The analogous requirement is true for 685write barriers.) 686Read/write barriers force all reads and writes started 687before the barrier to complete before any reads or writes after the 688barrier are started. 689Correctly-written drivers will include all 690appropriate barriers, and assume only the read/write ordering imposed by 691the barrier operations. 692.Pp 693People trying to write portable drivers with the 694.Nm 695functions should 696try to make minimal assumptions about what the system allows. 697In particular, 698they should expect that the system requires bus space addresses being 699accessed to be naturally aligned (i.e., base address of handle added to 700offset is a multiple of the access size), and that the system does 701alignment checking on pointers (i.e., pointer to objects being read and 702written must point to properly-aligned data). 703.Pp 704The descriptions of the 705.Nm 706functions given below all assume that 707they are called with proper arguments. 708If called with invalid arguments 709or arguments that are out of range (e.g.\& trying to access data outside of 710the region mapped when a given handle was created), undefined behaviour 711results. 712In that case, they may cause the 713system to halt, either intentionally (via panic) or unintentionally (by 714causing a fatal trap of by some other means) or may cause improper 715operation which is not immediately fatal. 716Functions which return 717.Ft void 718or which return data read from bus space (i.e., functions which 719do not obviously return an error code) do not fail. 720They could only fail 721if given invalid arguments, and in that case their behaviour is undefined. 722.Sh TYPES 723Several types are defined in 724.In machine/bus.h 725to facilitate use of the 726.Nm 727functions by drivers. 728.Ss Vt bus_addr_t 729The 730.Vt bus_addr_t 731type is used to describe bus addresses. 732It must be an 733unsigned integral type 734capable of holding the largest bus address usable by the architecture. 735This 736type is primarily used when mapping and unmapping bus space. 737.Ss Vt bus_size_t 738The 739.Vt bus_size_t 740type is used to describe sizes of ranges in bus space. 741It must be an 742unsigned integral type capable of holding the size of the largest bus 743address range usable on the architecture. 744This type is used by virtually all 745of the 746.Nm 747functions, describing sizes when mapping regions and 748offsets into regions when performing space access operations. 749.Ss Vt bus_space_tag_t 750The 751.Vt bus_space_tag_t 752type is used to describe a particular bus space on a machine. 753Its 754contents are machine-dependent and should be considered opaque by 755machine-independent code. 756This type is used by all 757.Nm 758functions to name the space on which they are operating. 759.Ss Vt bus_space_handle_t 760The 761.Vt bus_space_handle_t 762type is used to describe a mapping of a range of bus space. 763Its 764contents are machine-dependent and should be considered opaque by 765machine-independent code. 766This type is used when performing bus space 767access operations. 768.Sh MAPPING AND UNMAPPING BUS SPACE 769This section is specific to the 770.Nx 771version of these functions and may or may not apply to the 772.Fx 773version. 774.Pp 775Bus space must be mapped before it can be used, and should be 776unmapped when it is no longer needed. 777The 778.Fn bus_space_map 779and 780.Fn bus_space_unmap 781functions provide these capabilities. 782.Pp 783Some drivers need to be able to pass a subregion of already-mapped bus 784space to another driver or module within a driver. 785The 786.Fn bus_space_subregion 787function allows such subregions to be created. 788.Ss Fn bus_space_map space address size flags handlep 789The 790.Fn bus_space_map 791function maps the region of bus space named by the 792.Fa space , address , 793and 794.Fa size 795arguments. 796If successful, it returns zero 797and fills in the bus space handle pointed to by 798.Fa handlep 799with the handle 800that can be used to access the mapped region. 801If unsuccessful, 802it will return non-zero and leave the bus space handle pointed 803to by 804.Fa handlep 805in an undefined state. 806.Pp 807The 808.Fa flags 809argument controls how the space is to be mapped. 810Supported flags include: 811.Bl -tag -width ".Dv BUS_SPACE_MAP_CACHEABLE" 812.It Dv BUS_SPACE_MAP_CACHEABLE 813Try to map the space so that accesses can be cached and/or 814prefetched by the system. 815If this flag is not specified, the 816implementation should map the space so that it will not be cached or 817prefetched. 818.Pp 819This flag must have a value of 1 on all implementations for backward 820compatibility. 821.It Dv BUS_SPACE_MAP_LINEAR 822Try to map the space so that its contents can be accessed linearly via 823normal memory access methods (e.g.\& pointer dereferencing and structure 824accesses). 825This is useful when software wants to do direct access to a memory 826device, e.g.\& a frame buffer. 827If this flag is specified and linear 828mapping is not possible, the 829.Fn bus_space_map 830call should fail. 831If this 832flag is not specified, the system may map the space in whatever way is 833most convenient. 834.El 835.Pp 836Not all combinations of flags make sense or are supported with all 837spaces. 838For instance, 839.Dv BUS_SPACE_MAP_CACHEABLE 840may be meaningless when 841used on many systems' I/O port spaces, and on some systems 842.Dv BUS_SPACE_MAP_LINEAR 843without 844.Dv BUS_SPACE_MAP_CACHEABLE 845may never work. 846When the system hardware or firmware provides hints as to how spaces should be 847mapped (e.g.\& the PCI memory mapping registers' 848.Dq prefetchable 849bit), those 850hints should be followed for maximum compatibility. 851On some systems, 852requesting a mapping that cannot be satisfied (e.g.\& requesting a 853non-cacheable mapping when the system can only provide a cacheable one) 854will cause the request to fail. 855.Pp 856Some implementations may keep track of use of bus space for some or all 857bus spaces and refuse to allow duplicate allocations. 858This is encouraged 859for bus spaces which have no notion of slot-specific space addressing, 860such as ISA and VME, and for spaces which coexist with those spaces 861(e.g.\& EISA and PCI memory and I/O spaces co-existing with ISA memory and 862I/O spaces). 863.Pp 864Mapped regions may contain areas for which no there is no device on the 865bus. 866If space in those areas is accessed, the results are 867bus-dependent. 868.Ss Fn bus_space_unmap space handle size 869The 870.Fn bus_space_unmap 871function unmaps a region of bus space mapped with 872.Fn bus_space_map . 873When unmapping a region, the 874.Fa size 875specified should be 876the same as the size given to 877.Fn bus_space_map 878when mapping that region. 879.Pp 880After 881.Fn bus_space_unmap 882is called on a handle, that handle is no longer 883valid. 884(If copies were made of the handle they are no longer valid, 885either.) 886.Pp 887This function will never fail. 888If it would fail (e.g.\& because of an 889argument error), that indicates a software bug which should cause a 890panic. 891In that case, 892.Fn bus_space_unmap 893will never return. 894.Ss Fn bus_space_subregion space handle offset size nhandlep 895The 896.Fn bus_space_subregion 897function is a convenience function which makes a 898new handle to some subregion of an already-mapped region of bus space. 899The subregion described by the new handle starts at byte offset 900.Fa offset 901into the region described by 902.Fa handle , 903with the size give by 904.Fa size , 905and must be wholly contained within the original region. 906.Pp 907If successful, 908.Fn bus_space_subregion 909returns zero and fills in the bus 910space handle pointed to by 911.Fa nhandlep . 912If unsuccessful, it returns non-zero and leaves the bus space handle 913pointed to by 914.Fa nhandlep 915in an 916undefined state. 917In either case, the handle described by 918.Fa handle 919remains valid and is unmodified. 920.Pp 921When done with a handle created by 922.Fn bus_space_subregion , 923the handle should 924be thrown away. 925Under no circumstances should 926.Fn bus_space_unmap 927be used on the handle. 928Doing so may confuse any resource management 929being done on the space, and will result in undefined behaviour. 930When 931.Fn bus_space_unmap 932or 933.Fn bus_space_free 934is called on a handle, all subregions of that handle become invalid. 935.Sh ALLOCATING AND FREEING BUS SPACE 936This section is specific to the 937.Nx 938version of these functions and may or may not apply to the 939.Fx 940version. 941.Pp 942Some devices require or allow bus space to be allocated by the operating 943system for device use. 944When the devices no longer need the space, the 945operating system should free it for use by other devices. 946The 947.Fn bus_space_alloc 948and 949.Fn bus_space_free 950functions provide these capabilities. 951.Ss Fn bus_space_alloc space reg_start reg_end size alignment boundary \ 952flags addrp handlep 953The 954.Fn bus_space_alloc 955function allocates and maps a region of bus space with the size given by 956.Fa size , 957corresponding to the given constraints. 958If successful, it returns 959zero, fills in the bus address pointed to by 960.Fa addrp 961with the bus space address of the allocated region, and fills in 962the bus space handle pointed to by 963.Fa handlep 964with the handle that can be used to access that region. 965If unsuccessful, it returns non-zero and leaves the bus address pointed to by 966.Fa addrp 967and the bus space handle pointed to by 968.Fa handlep 969in an undefined state. 970.Pp 971Constraints on the allocation are given by the 972.Fa reg_start , reg_end , alignment , 973and 974.Fa boundary 975parameters. 976The allocated region will start at or after 977.Fa reg_start 978and end before or at 979.Fa reg_end . 980The 981.Fa alignment 982constraint must be a power of two, and the allocated region will start at 983an address that is an even multiple of that power of two. 984The 985.Fa boundary 986constraint, if non-zero, ensures that the region is allocated so that 987.Fa "first address in region" 988/ 989.Fa boundary 990has the same value as 991.Fa "last address in region" 992/ 993.Fa boundary . 994If the constraints cannot be met, 995.Fn bus_space_alloc 996will fail. 997It is an error to specify a set of 998constraints that can never be met 999(for example, 1000.Fa size 1001greater than 1002.Fa boundary ) . 1003.Pp 1004The 1005.Fa flags 1006parameter is the same as the like-named parameter to 1007.Fn bus_space_map , 1008the same flag values should be used, and they have the 1009same meanings. 1010.Pp 1011Handles created by 1012.Fn bus_space_alloc 1013should only be freed with 1014.Fn bus_space_free . 1015Trying to use 1016.Fn bus_space_unmap 1017on them causes undefined behaviour. 1018The 1019.Fn bus_space_subregion 1020function can be used on 1021handles created by 1022.Fn bus_space_alloc . 1023.Ss Fn bus_space_free space handle size 1024The 1025.Fn bus_space_free 1026function unmaps and frees a region of bus space mapped 1027and allocated with 1028.Fn bus_space_alloc . 1029When unmapping a region, the 1030.Fa size 1031specified should be the same as the size given to 1032.Fn bus_space_alloc 1033when allocating the region. 1034.Pp 1035After 1036.Fn bus_space_free 1037is called on a handle, that handle is no longer valid. 1038(If copies were 1039made of the handle, they are no longer valid, either.) 1040.Pp 1041This function will never fail. 1042If it would fail (e.g.\& because of an 1043argument error), that indicates a software bug which should cause a 1044panic. 1045In that case, 1046.Fn bus_space_free 1047will never return. 1048.Sh READING AND WRITING SINGLE DATA ITEMS 1049The simplest way to access bus space is to read or write a single data 1050item. 1051The 1052.Fn bus_space_read_N 1053and 1054.Fn bus_space_write_N 1055families of functions provide 1056the ability to read and write 1, 2, 4, and 8 byte data items on busses 1057which support those access sizes. 1058.Ss Fn bus_space_read_1 space handle offset 1059.Ss Fn bus_space_read_2 space handle offset 1060.Ss Fn bus_space_read_4 space handle offset 1061.Ss Fn bus_space_read_8 space handle offset 1062The 1063.Fn bus_space_read_N 1064family of functions reads a 1, 2, 4, or 8 byte data item from 1065the offset specified by 1066.Fa offset 1067into the region specified by 1068.Fa handle 1069of the bus space specified by 1070.Fa space . 1071The location being read must lie within the bus space region specified by 1072.Fa handle . 1073.Pp 1074For portability, the starting address of the region specified by 1075.Fa handle 1076plus the offset should be a multiple of the size of data item being read. 1077On some systems, not obeying this requirement may cause incorrect data to 1078be read, on others it may cause a system crash. 1079.Pp 1080Read operations done by the 1081.Fn bus_space_read_N 1082functions may be executed out 1083of order with respect to other pending read and write operations unless 1084order is enforced by use of the 1085.Fn bus_space_barrier 1086function. 1087.Pp 1088These functions will never fail. 1089If they would fail (e.g.\& because of an 1090argument error), that indicates a software bug which should cause a 1091panic. 1092In that case, they will never return. 1093.Ss Fn bus_space_write_1 space handle offset value 1094.Ss Fn bus_space_write_2 space handle offset value 1095.Ss Fn bus_space_write_4 space handle offset value 1096.Ss Fn bus_space_write_8 space handle offset value 1097The 1098.Fn bus_space_write_N 1099family of functions writes a 1, 2, 4, or 8 byte data item to the offset 1100specified by 1101.Fa offset 1102into the region specified by 1103.Fa handle 1104of the bus space specified by 1105.Fa space . 1106The location being written must lie within 1107the bus space region specified by 1108.Fa handle . 1109.Pp 1110For portability, the starting address of the region specified by 1111.Fa handle 1112plus the offset should be a multiple of the size of data item being 1113written. 1114On some systems, not obeying this requirement may cause 1115incorrect data to be written, on others it may cause a system crash. 1116.Pp 1117Write operations done by the 1118.Fn bus_space_write_N 1119functions may be executed 1120out of order with respect to other pending read and write operations 1121unless order is enforced by use of the 1122.Fn bus_space_barrier 1123function. 1124.Pp 1125These functions will never fail. 1126If they would fail (e.g.\& because of an 1127argument error), that indicates a software bug which should cause a 1128panic. 1129In that case, they will never return. 1130.Sh BARRIERS 1131In order to allow high-performance buffering implementations to avoid bus 1132activity on every operation, read and write ordering should be specified 1133explicitly by drivers when necessary. 1134The 1135.Fn bus_space_barrier 1136function provides that ability. 1137.Ss Fn bus_space_barrier space handle offset length flags 1138The 1139.Fn bus_space_barrier 1140function enforces ordering of bus space read and write operations 1141for the specified subregion (described by the 1142.Fa offset 1143and 1144.Fa length 1145parameters) of the region named by 1146.Fa handle 1147in the space named by 1148.Fa space . 1149.Pp 1150The 1151.Fa flags 1152argument controls what types of operations are to be ordered. 1153Supported flags are: 1154.Bl -tag -width ".Dv BUS_SPACE_BARRIER_WRITE" 1155.It Dv BUS_SPACE_BARRIER_READ 1156Synchronize read operations. 1157.It Dv BUS_SPACE_BARRIER_WRITE 1158Synchronize write operations. 1159.El 1160.Pp 1161Those flags can be combined (or-ed together) to enforce ordering on both 1162read and write operations. 1163.Pp 1164All of the specified type(s) of operation which are done to the region 1165before the barrier operation are guaranteed to complete before any of the 1166specified type(s) of operation done after the barrier. 1167.Pp 1168Example: Consider a hypothetical device with two single-byte ports, one 1169write-only input port (at offset 0) and a read-only output port (at 1170offset 1). 1171Operation of the device is as follows: data bytes are written 1172to the input port, and are placed by the device on a stack, the top of 1173which is read by reading from the output port. 1174The sequence to correctly 1175write two data bytes to the device then read those two data bytes back 1176would be: 1177.Bd -literal 1178/* 1179 * t and h are the tag and handle for the mapped device's 1180 * space. 1181 */ 1182bus_space_write_1(t, h, 0, data0); 1183bus_space_barrier(t, h, 0, 1, BUS_SPACE_BARRIER_WRITE); /* 1 */ 1184bus_space_write_1(t, h, 0, data1); 1185bus_space_barrier(t, h, 0, 2, 1186 BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE); /* 2 */ 1187ndata1 = bus_space_read_1(t, h, 1); 1188bus_space_barrier(t, h, 1, 1, BUS_SPACE_BARRIER_READ); /* 3 */ 1189ndata0 = bus_space_read_1(t, h, 1); 1190/* data0 == ndata0, data1 == ndata1 */ 1191.Ed 1192.Pp 1193The first barrier makes sure that the first write finishes before the 1194second write is issued, so that two writes to the input port are done 1195in order and are not collapsed into a single write. 1196This ensures that 1197the data bytes are written to the device correctly and in order. 1198.Pp 1199The second barrier makes sure that the writes to the output port finish 1200before any of the reads to the input port are issued, thereby making sure 1201that all of the writes are finished before data is read. 1202This ensures 1203that the first byte read from the device really is the last one that was 1204written. 1205.Pp 1206The third barrier makes sure that the first read finishes before the 1207second read is issued, ensuring that data is read correctly and in order. 1208.Pp 1209The barriers in the example above are specified to cover the absolute 1210minimum number of bus space locations. 1211It is correct (and often 1212easier) to make barrier operations cover the device's whole range of bus 1213space, that is, to specify an offset of zero and the size of the 1214whole region. 1215.Sh REGION OPERATIONS 1216Some devices use buffers which are mapped as regions in bus space. 1217Often, drivers want to copy the contents of those buffers to or from 1218memory, e.g.\& into mbufs which can be passed to higher levels of the 1219system or from mbufs to be output to a network. 1220In order to allow 1221drivers to do this as efficiently as possible, the 1222.Fn bus_space_read_region_N 1223and 1224.Fn bus_space_write_region_N 1225families of functions are provided. 1226.Pp 1227Drivers occasionally need to copy one region of a bus space to another, 1228or to set all locations in a region of bus space to contain a single 1229value. 1230The 1231.Fn bus_space_copy_region_N 1232family of functions and the 1233.Fn bus_space_set_region_N 1234family of functions allow drivers to perform these operations. 1235.Ss Fn bus_space_read_region_1 space handle offset datap count 1236.Ss Fn bus_space_read_region_2 space handle offset datap count 1237.Ss Fn bus_space_read_region_4 space handle offset datap count 1238.Ss Fn bus_space_read_region_8 space handle offset datap count 1239The 1240.Fn bus_space_read_region_N 1241family of functions reads 1242.Fa count 12431, 2, 4, or 8 byte data items from bus space 1244starting at byte offset 1245.Fa offset 1246in the region specified by 1247.Fa handle 1248of the bus space specified by 1249.Fa space 1250and writes them into the array specified by 1251.Fa datap . 1252Each successive data item is read from an offset 12531, 2, 4, or 8 bytes after the previous data item (depending on which 1254function is used). 1255All locations being read must lie within the bus 1256space region specified by 1257.Fa handle . 1258.Pp 1259For portability, the starting address of the region specified by 1260.Fa handle 1261plus the offset should be a multiple of the size of data items being 1262read and the data array pointer should be properly aligned. 1263On some 1264systems, not obeying these requirements may cause incorrect data to be 1265read, on others it may cause a system crash. 1266.Pp 1267Read operations done by the 1268.Fn bus_space_read_region_N 1269functions may be executed in any order. 1270They may also be executed out 1271of order with respect to other pending read and write operations unless 1272order is enforced by use of the 1273.Fn bus_space_barrier 1274function. 1275There is no way to insert barriers between reads of 1276individual bus space locations executed by the 1277.Fn bus_space_read_region_N 1278functions. 1279.Pp 1280These functions will never fail. 1281If they would fail (e.g.\& because of an 1282argument error), that indicates a software bug which should cause a 1283panic. 1284In that case, they will never return. 1285.Ss Fn bus_space_write_region_1 space handle offset datap count 1286.Ss Fn bus_space_write_region_2 space handle offset datap count 1287.Ss Fn bus_space_write_region_4 space handle offset datap count 1288.Ss Fn bus_space_write_region_8 space handle offset datap count 1289The 1290.Fn bus_space_write_region_N 1291family of functions reads 1292.Fa count 12931, 2, 4, or 8 byte data items from the array 1294specified by 1295.Fa datap 1296and writes them to bus space starting at byte offset 1297.Fa offset 1298in the region specified by 1299.Fa handle 1300of the bus space specified 1301by 1302.Fa space . 1303Each successive data item is written to an offset 1, 2, 4, 1304or 8 bytes after the previous data item (depending on which function is 1305used). 1306All locations being written must lie within the bus space region 1307specified by 1308.Fa handle . 1309.Pp 1310For portability, the starting address of the region specified by 1311.Fa handle 1312plus the offset should be a multiple of the size of data items being 1313written and the data array pointer should be properly aligned. 1314On some 1315systems, not obeying these requirements may cause incorrect data to be 1316written, on others it may cause a system crash. 1317.Pp 1318Write operations done by the 1319.Fn bus_space_write_region_N 1320functions may be 1321executed in any order. 1322They may also be executed out of order with 1323respect to other pending read and write operations unless order is 1324enforced by use of the 1325.Fn bus_space_barrier 1326function. 1327There is no way to insert barriers between writes of 1328individual bus space locations executed by the 1329.Fn bus_space_write_region_N 1330functions. 1331.Pp 1332These functions will never fail. 1333If they would fail (e.g.\& because of an 1334argument error), that indicates a software bug which should cause a 1335panic. 1336In that case, they will never return. 1337.Ss Fn bus_space_copy_region_1 space srchandle srcoffset dsthandle \ 1338dstoffset count 1339.Ss Fn bus_space_copy_region_2 space srchandle srcoffset dsthandle \ 1340dstoffset count 1341.Ss Fn bus_space_copy_region_4 space srchandle srcoffset dsthandle \ 1342dstoffset count 1343.Ss Fn bus_space_copy_region_8 space srchandle srcoffset dsthandle \ 1344dstoffset count 1345The 1346.Fn bus_space_copy_region_N 1347family of functions copies 1348.Fa count 13491, 2, 4, or 8 byte data items in bus space 1350from the area starting at byte offset 1351.Fa srcoffset 1352in the region specified by 1353.Fa srchandle 1354of the bus space specified by 1355.Fa space 1356to the area starting at byte offset 1357.Fa dstoffset 1358in the region specified by 1359.Fa dsthandle 1360in the same bus space. 1361Each successive data item read or written has 1362an offset 1, 2, 4, or 8 bytes after the previous data item (depending 1363on which function is used). 1364All locations being read and written must 1365lie within the bus space region specified by their respective handles. 1366.Pp 1367For portability, the starting addresses of the regions specified by the 1368each handle plus its respective offset should be a multiple of the size 1369of data items being copied. 1370On some systems, not obeying this 1371requirement may cause incorrect data to be copied, on others it may cause 1372a system crash. 1373.Pp 1374Read and write operations done by the 1375.Fn bus_space_copy_region_N 1376functions may be executed in any order. 1377They may also be executed out 1378of order with respect to other pending read and write operations unless 1379order is enforced by use of the 1380.Fn bus_space_barrier function . 1381There is no way to insert barriers between reads or writes of 1382individual bus space locations executed by the 1383.Fn bus_space_copy_region_N 1384functions. 1385.Pp 1386Overlapping copies between different subregions of a single region 1387of bus space are handled correctly by the 1388.Fn bus_space_copy_region_N 1389functions. 1390.Pp 1391These functions will never fail. 1392If they would fail (e.g.\& because of an 1393argument error), that indicates a software bug which should cause a 1394panic. 1395In that case, they will never return. 1396.Ss Fn bus_space_set_region_1 space handle offset value count 1397.Ss Fn bus_space_set_region_2 space handle offset value count 1398.Ss Fn bus_space_set_region_4 space handle offset value count 1399.Ss Fn bus_space_set_region_8 space handle offset value count 1400The 1401.Fn bus_space_set_region_N 1402family of functions writes the given 1403.Fa value 1404to 1405.Fa count 14061, 2, 4, or 8 byte 1407data items in bus space starting at byte offset 1408.Fa offset 1409in the region specified by 1410.Fa handle 1411of the bus space specified by 1412.Fa space . 1413Each successive data item has an offset 1, 2, 4, or 8 bytes after the 1414previous data item (depending on which function is used). 1415All 1416locations being written must lie within the bus space region specified 1417by 1418.Fa handle . 1419.Pp 1420For portability, the starting address of the region specified by 1421.Fa handle 1422plus the offset should be a multiple of the size of data items being 1423written. 1424On some systems, not obeying this requirement may cause 1425incorrect data to be written, on others it may cause a system crash. 1426.Pp 1427Write operations done by the 1428.Fn bus_space_set_region_N 1429functions may be 1430executed in any order. 1431They may also be executed out of order with 1432respect to other pending read and write operations unless order is 1433enforced by use of the 1434.Fn bus_space_barrier 1435function. 1436There is no way to insert barriers between writes of 1437individual bus space locations executed by the 1438.Fn bus_space_set_region_N 1439functions. 1440.Pp 1441These functions will never fail. 1442If they would fail (e.g.\& because of an 1443argument error), that indicates a software bug which should cause a 1444panic. 1445In that case, they will never return. 1446.Sh READING AND WRITING A SINGLE LOCATION MULTIPLE TIMES 1447Some devices implement single locations in bus space which are to be read 1448or written multiple times to communicate data, e.g.\& some ethernet 1449devices' packet buffer FIFOs. 1450In order to allow drivers to manipulate 1451these types of devices as efficiently as possible, the 1452.Fn bus_space_read_multi_N , 1453.Fn bus_space_set_multi_N , 1454and 1455.Fn bus_space_write_multi_N 1456families of functions are provided. 1457.Ss Fn bus_space_read_multi_1 space handle offset datap count 1458.Ss Fn bus_space_read_multi_2 space handle offset datap count 1459.Ss Fn bus_space_read_multi_4 space handle offset datap count 1460.Ss Fn bus_space_read_multi_8 space handle offset datap count 1461The 1462.Fn bus_space_read_multi_N 1463family of functions reads 1464.Fa count 14651, 2, 4, or 8 byte data items from bus space 1466at byte offset 1467.Fa offset 1468in the region specified by 1469.Fa handle 1470of the bus space specified by 1471.Fa space 1472and writes them into the array specified by 1473.Fa datap . 1474Each successive data item is read from the same location in bus 1475space. 1476The location being read must lie within the bus space region 1477specified by 1478.Fa handle . 1479.Pp 1480For portability, the starting address of the region specified by 1481.Fa handle 1482plus the offset should be a multiple of the size of data items being 1483read and the data array pointer should be properly aligned. 1484On some 1485systems, not obeying these requirements may cause incorrect data to be 1486read, on others it may cause a system crash. 1487.Pp 1488Read operations done by the 1489.Fn bus_space_read_multi_N 1490functions may be 1491executed out of order with respect to other pending read and write 1492operations unless order is enforced by use of the 1493.Fn bus_space_barrier 1494function. 1495Because the 1496.Fn bus_space_read_multi_N 1497functions read the same bus space location multiple times, they 1498place an implicit read barrier between each successive read of that bus 1499space location. 1500.Pp 1501These functions will never fail. 1502If they would fail (e.g.\& because of an 1503argument error), that indicates a software bug which should cause a 1504panic. 1505In that case, they will never return. 1506.Ss Fn bus_space_write_multi_1 space handle offset datap count 1507.Ss Fn bus_space_write_multi_2 space handle offset datap count 1508.Ss Fn bus_space_write_multi_4 space handle offset datap count 1509.Ss Fn bus_space_write_multi_8 space handle offset datap count 1510The 1511.Fn bus_space_write_multi_N 1512family of functions reads 1513.Fa count 15141, 2, 4, or 8 byte data items from the array 1515specified by 1516.Fa datap 1517and writes them into bus space at byte offset 1518.Fa offset 1519in the region specified by 1520.Fa handle 1521of the bus space specified by 1522.Fa space . 1523Each successive data item is written to the same location in 1524bus space. 1525The location being written must lie within the bus space 1526region specified by 1527.Fa handle . 1528.Pp 1529For portability, the starting address of the region specified by 1530.Fa handle 1531plus the offset should be a multiple of the size of data items being 1532written and the data array pointer should be properly aligned. 1533On some 1534systems, not obeying these requirements may cause incorrect data to be 1535written, on others it may cause a system crash. 1536.Pp 1537Write operations done by the 1538.Fn bus_space_write_multi_N 1539functions may be executed out of order with respect to other pending 1540read and write operations unless order is enforced by use of the 1541.Fn bus_space_barrier 1542function. 1543Because the 1544.Fn bus_space_write_multi_N 1545functions write the same bus space location multiple times, they 1546place an implicit write barrier between each successive write of that 1547bus space location. 1548.Pp 1549These functions will never fail. 1550If they would fail (e.g.\& because of an 1551argument error), that indicates a software bug which should cause a 1552panic. 1553In that case, they will never return. 1554.Ss Fn bus_space_set_multi_1 space handle offset value count 1555.Ss Fn bus_space_set_multi_2 space handle offset value count 1556.Ss Fn bus_space_set_multi_4 space handle offset value count 1557.Ss Fn bus_space_set_multi_8 space handle offset value count 1558The 1559.Fn bus_space_set_multi_N 1560writes 1561.Fa value 1562into bus space at byte offset 1563.Fa offset 1564in the region specified by 1565.Fa handle 1566of the bus space specified by 1567.Fa space , 1568.Fa count 1569times. 1570The location being written must lie within the bus space 1571region specified by 1572.Fa handle . 1573.Pp 1574For portability, the starting address of the region specified by 1575.Fa handle 1576plus the offset should be a multiple of the size of data items being 1577written and the data array pointer should be properly aligned. 1578On some 1579systems, not obeying these requirements may cause incorrect data to be 1580written, on others it may cause a system crash. 1581.Pp 1582Write operations done by the 1583.Fn bus_space_set_multi_N 1584functions may be executed out of order with respect to other pending 1585read and write operations unless order is enforced by use of the 1586.Fn bus_space_barrier 1587function. 1588Because the 1589.Fn bus_space_set_multi_N 1590functions write the same bus space location multiple times, they 1591place an implicit write barrier between each successive write of that 1592bus space location. 1593.Pp 1594These functions will never fail. 1595If they would fail (e.g.\& because of an 1596argument error), that indicates a software bug which should cause a 1597panic. 1598In that case, they will never return. 1599.Sh STREAM FUNCTIONS 1600Most of the 1601.Nm 1602functions imply a host byte-order and a bus byte-order and take care of 1603any translation for the caller. 1604In some cases, however, hardware may map a FIFO or some other memory region 1605for which the caller may want to use multi-word, yet untranslated access. 1606Access to these types of memory regions should be with the 1607.Fn bus_space_*_stream_N 1608functions. 1609.Pp 1610.Bl -ohang -compact 1611.Nm bus_space_set_multi_stream_1 , 1612.Nm bus_space_set_region_stream_1 , 1613.It Fn bus_space_copy_region_1 "space" "handle" "srcoffset" "dsthandle" "dstoffset" "count" 1614.It Fn bus_space_copy_region_2 "space" "handle" "srcoffset" "dsthandle" "dstoffset" "count" 1615.It Fn bus_space_copy_region_4 "space" "handle" "srcoffset" "dsthandle" "dstoffset" "count" 1616.It Fn bus_space_copy_region_8 "space" "handle" "srcoffset" "dsthandle" "dstoffset" "count" 1617.It Fn bus_space_read_stream_1 "space" "handle" "offset" 1618.It Fn bus_space_read_stream_2 "space" "handle" "offset" 1619.It Fn bus_space_read_stream_4 "space" "handle" "offset" 1620.It Fn bus_space_read_stream_8 "space" "handle" "offset" 1621.It Fn bus_space_read_multi_stream_1 "space" "handle" "offset" "datap" "count" 1622.It Fn bus_space_read_multi_stream_2 "space" "handle" "offset" "datap" "count" 1623.It Fn bus_space_read_multi_stream_4 "space" "handle" "offset" "datap" "count" 1624.It Fn bus_space_read_multi_stream_8 "space" "handle" "offset" "datap" "count" 1625.It Fn bus_space_read_region_stream_1 "space" "handle" "offset" "datap" "count" 1626.It Fn bus_space_read_region_stream_2 "space" "handle" "offset" "datap" "count" 1627.It Fn bus_space_read_region_stream_4 "space" "handle" "offset" "datap" "count" 1628.It Fn bus_space_read_region_stream_8 "space" "handle" "offset" "datap" "count" 1629.It Fn bus_space_set_multi_1 "space" "handle" "offset" "value" "count" 1630.It Fn bus_space_set_multi_2 "space" "handle" "offset" "value" "count" 1631.It Fn bus_space_set_multi_4 "space" "handle" "offset" "value" "count" 1632.It Fn bus_space_set_multi_8 "space" "handle" "offset" "value" "count" 1633.It Fn bus_space_set_region_1 "space" "handle" "offset" "value" "count" 1634.It Fn bus_space_set_region_2 "space" "handle" "offset" "value" "count" 1635.It Fn bus_space_set_region_4 "space" "handle" "offset" "value" "count" 1636.It Fn bus_space_set_region_8 "space" "handle" "offset" "value" "count" 1637.It Fn bus_space_write_stream_1 "space" "handle" "offset" "value" 1638.It Fn bus_space_write_stream_2 "space" "handle" "offset" "value" 1639.It Fn bus_space_write_stream_4 "space" "handle" "offset" "value" 1640.It Fn bus_space_write_stream_8 "space" "handle" "offset" "value" 1641.It Fn bus_space_write_multi_stream_1 "space" "handle" "offset" "datap" "count" 1642.It Fn bus_space_write_multi_stream_2 "space" "handle" "offset" "datap" "count" 1643.It Fn bus_space_write_multi_stream_4 "space" "handle" "offset" "datap" "count" 1644.It Fn bus_space_write_multi_stream_8 "space" "handle" "offset" "datap" "count" 1645.It Fn bus_space_write_region_stream_1 "space" "handle" "offset" "datap" "count" 1646.It Fn bus_space_write_region_stream_2 "space" "handle" "offset" "datap" "count" 1647.It Fn bus_space_write_region_stream_4 "space" "handle" "offset" "datap" "count" 1648.It Fn bus_space_write_region_stream_8 "space" "handle" "offset" "datap" "count" 1649.El 1650.Pp 1651These functions are defined just as their non-stream counterparts, 1652except that they provide no byte-order translation. 1653.Sh COMPATIBILITY 1654The current 1655.Nx 1656version of the 1657.Nm 1658interface specification differs slightly from the original 1659specification that came into wide use and 1660.Fx 1661adopted. 1662A few of the function names and arguments have changed 1663for consistency and increased functionality. 1664.Sh SEE ALSO 1665.Xr bus_dma 9 1666.Sh HISTORY 1667The 1668.Nm 1669functions were introduced in a different form (memory and I/O spaces 1670were accessed via different sets of functions) in 1671.Nx 1.2 . 1672The functions were merged to work on generic 1673.Dq spaces 1674early in the 1675.Nx 1.3 1676development cycle, and many drivers were converted to use them. 1677This document was written later during the 1678.Nx 1.3 1679development cycle, and the specification was updated to fix some 1680consistency problems and to add some missing functionality. 1681.Pp 1682The manual page was then adopted to the version of the interface that 1683.Fx 1684imported for the CAM SCSI drivers, plus subsequent evolution. 1685The 1686.Fx 1687.Nm 1688version was imported in 1689.Fx 3.0 . 1690.Sh AUTHORS 1691.An -nosplit 1692The 1693.Nm 1694interfaces were designed and implemented by the 1695.Nx 1696developer 1697community. 1698Primary contributors and implementors were 1699.An Chris Demetriou , 1700.An Jason Thorpe , 1701and 1702.An Charles Hannum , 1703but the rest of the 1704.Nx 1705developers and the user community played a significant role in development. 1706.Pp 1707.An Justin Gibbs 1708ported these interfaces to 1709.Fx . 1710.Pp 1711.An Chris Demetriou 1712wrote this manual page. 1713.Pp 1714.An Warner Losh 1715modified it for the 1716.Fx 1717implementation. 1718.Sh BUGS 1719This manual may not completely and accurately document the interface, 1720and many parts of the interface are unspecified. 1721