2005-12-26 22:40:14 +03:00
|
|
|
.\" $NetBSD: bus_space.9,v 1.32 2005/12/26 19:48:12 perry Exp $
|
1997-08-13 12:34:34 +04:00
|
|
|
.\"
|
|
|
|
.\" Copyright (c) 1997 The NetBSD Foundation, Inc.
|
|
|
|
.\" All rights reserved.
|
2001-05-27 20:04:46 +04:00
|
|
|
.\"
|
1997-08-13 12:34:34 +04:00
|
|
|
.\" This code is derived from software contributed to The NetBSD Foundation
|
|
|
|
.\" by Christopher G. Demetriou.
|
2001-05-27 20:04:46 +04:00
|
|
|
.\"
|
1997-08-13 12:34:34 +04:00
|
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
|
|
.\" modification, are permitted provided that the following conditions
|
|
|
|
.\" are met:
|
|
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
|
|
.\" 3. All advertising materials mentioning features or use of this software
|
|
|
|
.\" must display the following acknowledgment:
|
|
|
|
.\" This product includes software developed by the NetBSD
|
|
|
|
.\" Foundation, Inc. and its contributors.
|
|
|
|
.\" 4. Neither the name of The NetBSD Foundation nor the names of its
|
|
|
|
.\" contributors may be used to endorse or promote products derived
|
|
|
|
.\" from this software without specific prior written permission.
|
2001-05-27 20:04:46 +04:00
|
|
|
.\"
|
1997-08-13 12:34:34 +04:00
|
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
|
|
|
|
.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
|
|
|
.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
|
|
.\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
|
|
|
|
.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
|
|
.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
|
|
.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
|
|
.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
|
|
.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
|
|
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
|
|
.\" POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
.\"
|
|
|
|
.Dd August 13, 1997
|
|
|
|
.Dt BUS_SPACE 9
|
1999-03-16 03:40:46 +03:00
|
|
|
.Os
|
1997-08-13 12:34:34 +04:00
|
|
|
.Sh NAME
|
1997-11-11 13:06:37 +03:00
|
|
|
.Nm bus_space ,
|
|
|
|
.Nm bus_space_barrier ,
|
|
|
|
.Nm bus_space_copy_region_1 ,
|
|
|
|
.Nm bus_space_copy_region_2 ,
|
|
|
|
.Nm bus_space_copy_region_4 ,
|
|
|
|
.Nm bus_space_copy_region_8 ,
|
|
|
|
.Nm bus_space_free ,
|
|
|
|
.Nm bus_space_map ,
|
2000-11-24 01:56:53 +03:00
|
|
|
.Nm bus_space_peek_1 ,
|
|
|
|
.Nm bus_space_peek_2 ,
|
|
|
|
.Nm bus_space_peek_4 ,
|
|
|
|
.Nm bus_space_peek_8 ,
|
|
|
|
.Nm bus_space_poke_1 ,
|
|
|
|
.Nm bus_space_poke_2 ,
|
|
|
|
.Nm bus_space_poke_4 ,
|
|
|
|
.Nm bus_space_poke_8 ,
|
1997-11-11 13:06:37 +03:00
|
|
|
.Nm bus_space_read_1 ,
|
|
|
|
.Nm bus_space_read_2 ,
|
|
|
|
.Nm bus_space_read_4 ,
|
|
|
|
.Nm bus_space_read_8 ,
|
|
|
|
.Nm bus_space_read_multi_1 ,
|
|
|
|
.Nm bus_space_read_multi_2 ,
|
|
|
|
.Nm bus_space_read_multi_4 ,
|
|
|
|
.Nm bus_space_read_multi_8 ,
|
2000-08-02 03:08:56 +04:00
|
|
|
.Nm bus_space_read_multi_stream_1 ,
|
|
|
|
.Nm bus_space_read_multi_stream_2 ,
|
|
|
|
.Nm bus_space_read_multi_stream_4 ,
|
|
|
|
.Nm bus_space_read_multi_stream_8 ,
|
1997-11-11 13:06:37 +03:00
|
|
|
.Nm bus_space_read_region_1 ,
|
|
|
|
.Nm bus_space_read_region_2 ,
|
|
|
|
.Nm bus_space_read_region_4 ,
|
|
|
|
.Nm bus_space_read_region_8 ,
|
2000-08-02 03:08:56 +04:00
|
|
|
.Nm bus_space_read_region_stream_1 ,
|
|
|
|
.Nm bus_space_read_region_stream_2 ,
|
|
|
|
.Nm bus_space_read_region_stream_4 ,
|
|
|
|
.Nm bus_space_read_region_stream_8 ,
|
|
|
|
.Nm bus_space_read_stream_1 ,
|
|
|
|
.Nm bus_space_read_stream_2 ,
|
|
|
|
.Nm bus_space_read_stream_4 ,
|
|
|
|
.Nm bus_space_read_stream_8 ,
|
1997-11-11 13:06:37 +03:00
|
|
|
.Nm bus_space_set_region_1 ,
|
|
|
|
.Nm bus_space_set_region_2 ,
|
|
|
|
.Nm bus_space_set_region_4 ,
|
|
|
|
.Nm bus_space_set_region_8 ,
|
|
|
|
.Nm bus_space_subregion ,
|
|
|
|
.Nm bus_space_unmap ,
|
2000-04-17 13:52:21 +04:00
|
|
|
.Nm bus_space_vaddr ,
|
2001-09-04 06:10:52 +04:00
|
|
|
.Nm bus_space_mmap ,
|
1997-11-11 13:06:37 +03:00
|
|
|
.Nm bus_space_write_1 ,
|
|
|
|
.Nm bus_space_write_2 ,
|
|
|
|
.Nm bus_space_write_4 ,
|
|
|
|
.Nm bus_space_write_8 ,
|
|
|
|
.Nm bus_space_write_multi_1 ,
|
|
|
|
.Nm bus_space_write_multi_2 ,
|
|
|
|
.Nm bus_space_write_multi_4 ,
|
|
|
|
.Nm bus_space_write_multi_8 ,
|
2000-08-02 03:08:56 +04:00
|
|
|
.Nm bus_space_write_multi_stream_1 ,
|
|
|
|
.Nm bus_space_write_multi_stream_2 ,
|
|
|
|
.Nm bus_space_write_multi_stream_4 ,
|
|
|
|
.Nm bus_space_write_multi_stream_8 ,
|
1997-11-11 13:06:37 +03:00
|
|
|
.Nm bus_space_write_region_1 ,
|
|
|
|
.Nm bus_space_write_region_2 ,
|
|
|
|
.Nm bus_space_write_region_4 ,
|
2002-10-09 23:18:44 +04:00
|
|
|
.Nm bus_space_write_region_8 ,
|
2000-08-02 03:08:56 +04:00
|
|
|
.Nm bus_space_write_region_stream_1 ,
|
|
|
|
.Nm bus_space_write_region_stream_2 ,
|
|
|
|
.Nm bus_space_write_region_stream_4 ,
|
|
|
|
.Nm bus_space_write_region_stream_8 ,
|
|
|
|
.Nm bus_space_write_stream_1 ,
|
|
|
|
.Nm bus_space_write_stream_2 ,
|
|
|
|
.Nm bus_space_write_stream_4 ,
|
2002-10-09 23:18:44 +04:00
|
|
|
.Nm bus_space_write_stream_8
|
1997-08-13 12:34:34 +04:00
|
|
|
.Nd bus space manipulation functions
|
|
|
|
.Sh SYNOPSIS
|
2003-04-16 17:34:34 +04:00
|
|
|
.In machine/bus.h
|
1997-08-13 12:34:34 +04:00
|
|
|
.Ft int
|
|
|
|
.Fn bus_space_map "bus_space_tag_t space" "bus_addr_t address" \
|
|
|
|
"bus_size_t size" "int flags" "bus_space_handle_t *handlep"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_unmap "bus_space_tag_t space" "bus_space_handle_t handle" \
|
|
|
|
"bus_size_t size"
|
|
|
|
.Ft int
|
|
|
|
.Fn bus_space_subregion "bus_space_tag_t space" "bus_space_handle_t handle" \
|
|
|
|
"bus_size_t offset" "bus_size_t size" "bus_space_handle_t *nhandlep"
|
|
|
|
.Ft int
|
|
|
|
.Fo bus_space_alloc
|
|
|
|
.Fa "bus_space_tag_t space" "bus_addr_t reg_start" "bus_addr_t reg_end"
|
|
|
|
.Fa "bus_size_t size" "bus_size_t alignment" "bus_size_t boundary"
|
|
|
|
.Fa "int flags" "bus_addr_t *addrp" "bus_space_handle_t *handlep"
|
|
|
|
.Fc
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_free "bus_space_tag_t space" "bus_space_handle_t handle" \
|
|
|
|
"bus_size_t size"
|
2000-04-17 13:52:21 +04:00
|
|
|
.Ft void *
|
|
|
|
.Fn bus_space_vaddr "bus_space_tag_t space" "bus_space_handle_t handle"
|
2001-09-04 06:10:52 +04:00
|
|
|
.Ft paddr_t
|
|
|
|
.Fn bus_space_mmap "bus_space_tag_t space" "bus_addr_t addr" "off_t off" \
|
|
|
|
"int prot" "int flags"
|
2000-11-24 01:56:53 +03:00
|
|
|
.Ft int
|
|
|
|
.Fn bus_space_peek_1 "bus_space_tag_t space" "bus_space_handle_t handle" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_size_t offset" "uint8_t *datap"
|
2000-11-24 01:56:53 +03:00
|
|
|
.Ft int
|
|
|
|
.Fn bus_space_peek_2 "bus_space_tag_t space" "bus_space_handle_t handle" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_size_t offset" "uint16_t *datap"
|
2000-11-24 01:56:53 +03:00
|
|
|
.Ft int
|
|
|
|
.Fn bus_space_peek_4 "bus_space_tag_t space" "bus_space_handle_t handle" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_size_t offset" "uint32_t *datap"
|
2000-11-24 01:56:53 +03:00
|
|
|
.Ft int
|
|
|
|
.Fn bus_space_peek_8 "bus_space_tag_t space" "bus_space_handle_t handle" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_size_t offset" "uint64_t *datap"
|
2000-11-24 01:56:53 +03:00
|
|
|
.Ft int
|
|
|
|
.Fn bus_space_poke_1 "bus_space_tag_t space" "bus_space_handle_t handle" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_size_t offset" "uint8_t data"
|
2000-11-24 01:56:53 +03:00
|
|
|
.Ft int
|
|
|
|
.Fn bus_space_poke_2 "bus_space_tag_t space" "bus_space_handle_t handle" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_size_t offset" "uint16_t data"
|
2000-11-24 01:56:53 +03:00
|
|
|
.Ft int
|
|
|
|
.Fn bus_space_poke_4 "bus_space_tag_t space" "bus_space_handle_t handle" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_size_t offset" "uint32_t data"
|
2000-11-24 01:56:53 +03:00
|
|
|
.Ft int
|
|
|
|
.Fn bus_space_poke_8 "bus_space_tag_t space" "bus_space_handle_t handle" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_size_t offset" "uint64_t data"
|
|
|
|
.Ft uint8_t
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_read_1 "bus_space_tag_t space" "bus_space_handle_t handle" \
|
|
|
|
"bus_size_t offset"
|
2005-12-26 22:40:14 +03:00
|
|
|
.Ft uint16_t
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_read_2 "bus_space_tag_t space" "bus_space_handle_t handle" \
|
|
|
|
"bus_size_t offset"
|
2005-12-26 22:40:14 +03:00
|
|
|
.Ft uint32_t
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_read_4 "bus_space_tag_t space" "bus_space_handle_t handle" \
|
|
|
|
"bus_size_t offset"
|
2005-12-26 22:40:14 +03:00
|
|
|
.Ft uint64_t
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_read_8 "bus_space_tag_t space" "bus_space_handle_t handle" \
|
|
|
|
"bus_size_t offset"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_write_1 "bus_space_tag_t space" "bus_space_handle_t handle" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_size_t offset" "uint8_t value"
|
1997-08-13 12:34:34 +04:00
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_write_2 "bus_space_tag_t space" "bus_space_handle_t handle" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_size_t offset" "uint16_t value"
|
1997-08-13 12:34:34 +04:00
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_write_4 "bus_space_tag_t space" "bus_space_handle_t handle" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_size_t offset" "uint32_t value"
|
1997-08-13 12:34:34 +04:00
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_write_8 "bus_space_tag_t space" "bus_space_handle_t handle" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_size_t offset" "uint64_t value"
|
1997-08-13 12:34:34 +04:00
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_barrier "bus_space_tag_t space" "bus_space_handle_t handle" \
|
|
|
|
"bus_size_t offset" "bus_size_t length" "int flags"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_read_region_1 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint8_t *datap" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_read_region_2 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint16_t *datap" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_read_region_4 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint32_t *datap" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_read_region_8 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint64_t *datap" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
2000-08-02 03:08:56 +04:00
|
|
|
.Fn bus_space_read_region_stream_1 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint8_t *datap" \
|
2000-08-02 03:08:56 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_read_region_stream_2 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint16_t *datap" \
|
2000-08-02 03:08:56 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_read_region_stream_4 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint32_t *datap" \
|
2000-08-02 03:08:56 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_read_region_stream_8 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint64_t *datap" \
|
2000-08-02 03:08:56 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_write_region_1 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "const uint8_t *datap" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_write_region_2 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "const uint16_t *datap" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_write_region_4 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "const uint32_t *datap" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_write_region_8 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "const uint64_t *datap" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
2000-08-02 03:08:56 +04:00
|
|
|
.Fn bus_space_write_region_stream_1 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "const uint8_t *datap" \
|
2000-08-02 03:08:56 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_write_region_stream_2 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "const uint16_t *datap" \
|
2000-08-02 03:08:56 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_write_region_stream_4 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "const uint32_t *datap" \
|
2000-08-02 03:08:56 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_write_region_stream_8 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "const uint64_t *datap" \
|
2000-08-02 03:08:56 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_copy_region_1 "bus_space_tag_t space" \
|
|
|
|
"bus_space_handle_t srchandle" "bus_size_t srcoffset" \
|
|
|
|
"bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_copy_region_2 "bus_space_tag_t space" \
|
|
|
|
"bus_space_handle_t srchandle" "bus_size_t srcoffset" \
|
|
|
|
"bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_copy_region_4 "bus_space_tag_t space" \
|
|
|
|
"bus_space_handle_t srchandle" "bus_size_t srcoffset" \
|
|
|
|
"bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_copy_region_8 "bus_space_tag_t space" \
|
|
|
|
"bus_space_handle_t srchandle" "bus_size_t srcoffset" \
|
|
|
|
"bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_set_region_1 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint8_t value" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_set_region_2 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint16_t value" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_set_region_4 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint32_t value" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_set_region_8 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint64_t value" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_read_multi_1 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint8_t *datap" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_read_multi_2 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint16_t *datap" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_read_multi_4 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint32_t *datap" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_read_multi_8 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint64_t *datap" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
2000-08-02 03:08:56 +04:00
|
|
|
.Fn bus_space_read_multi_stream_1 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint8_t *datap" \
|
2000-08-02 03:08:56 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_read_multi_stream_2 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint16_t *datap" \
|
2000-08-02 03:08:56 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_read_multi_stream_4 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint32_t *datap" \
|
2000-08-02 03:08:56 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_read_multi_stream_8 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "uint64_t *datap" \
|
2000-08-02 03:08:56 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_write_multi_1 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "const uint8_t *datap" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_write_multi_2 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "const uint16_t *datap" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_write_multi_4 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "const uint32_t *datap" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_write_multi_8 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "const uint64_t *datap" \
|
1997-08-13 12:34:34 +04:00
|
|
|
"bus_size_t count"
|
2000-08-02 03:08:56 +04:00
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_write_multi_stream_1 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "const uint8_t *datap" \
|
2000-08-02 03:08:56 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_write_multi_stream_2 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "const uint16_t *datap" \
|
2000-08-02 03:08:56 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_write_multi_stream_4 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "const uint32_t *datap" \
|
2000-08-02 03:08:56 +04:00
|
|
|
"bus_size_t count"
|
|
|
|
.Ft void
|
|
|
|
.Fn bus_space_write_multi_stream_8 "bus_space_tag_t space" \
|
2005-12-26 22:40:14 +03:00
|
|
|
"bus_space_handle_t handle" "bus_size_t offset" "const uint64_t *datap" \
|
2000-08-02 03:08:56 +04:00
|
|
|
"bus_size_t count"
|
1998-01-27 19:04:53 +03:00
|
|
|
.Sh DESCRIPTION
|
1997-08-13 12:34:34 +04:00
|
|
|
The
|
|
|
|
.Nm
|
|
|
|
functions exist to allow device drivers
|
2002-10-14 17:43:14 +04:00
|
|
|
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
|
2003-06-30 16:10:40 +04:00
|
|
|
.Aq Pa machine/bus.h
|
1997-08-13 12:34:34 +04:00
|
|
|
header file.
|
|
|
|
.Pp
|
|
|
|
Many common devices are used on multiple architectures, but are accessed
|
|
|
|
differently on each because of architectural constraints.
|
2001-06-21 15:59:00 +04:00
|
|
|
For instance, a device which is mapped in one system's I/O space may be
|
2002-10-14 17:43:14 +04:00
|
|
|
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).
|
1997-08-13 12:34:34 +04:00
|
|
|
In some cases, a single
|
|
|
|
driver may need to access the same type of device in multiple ways in a
|
2002-10-14 17:43:14 +04:00
|
|
|
single system or architecture.
|
|
|
|
The goal of the
|
1997-08-13 12:34:34 +04:00
|
|
|
.Nm
|
|
|
|
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.
|
|
|
|
.Pp
|
|
|
|
Not all busses have to implement all functions described in this
|
|
|
|
document, though that is encouraged if the operations are logically
|
2002-10-14 17:43:14 +04:00
|
|
|
supported by the bus.
|
|
|
|
Unimplemented functions should cause compile-time errors if possible.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
All of the interface definitions described in this document are shown as
|
|
|
|
function prototypes and discussed as if they were required to be
|
2002-10-14 17:43:14 +04:00
|
|
|
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
|
2003-06-30 16:10:40 +04:00
|
|
|
.Aq Pa machine/bus.h
|
1997-08-13 12:34:34 +04:00
|
|
|
to avoid confusion with the
|
|
|
|
machine-independent types and functions, and, if possible, should be
|
|
|
|
given names which make the machine-dependence clear.
|
|
|
|
.Sh CONCEPTS AND GUIDELINES
|
|
|
|
Bus spaces are described by bus space tags, which can be created only by
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
Individual busses or devices on a machine may use more than one bus space
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
|
|
|
.Pp
|
|
|
|
A range in bus space is described by a bus address and a bus size.
|
|
|
|
The bus address describes the start of the range in bus space.
|
|
|
|
The bus size describes the size of the range in bytes.
|
|
|
|
Busses which are not byte addressable may require use of bus space ranges
|
|
|
|
with appropriately aligned addresses and properly rounded sizes.
|
1997-08-13 12:34:34 +04:00
|
|
|
.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.
|
|
|
|
.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
|
2002-10-14 17:43:14 +04:00
|
|
|
actual location(s) to be accessed.
|
|
|
|
Offsets are given in bytes, though busses may impose alignment constraints.
|
|
|
|
The offset used to access data relative to a given handle must be such
|
|
|
|
that all of the data being accessed is in the mapped region that the
|
|
|
|
handle describes.
|
|
|
|
Trying to access data outside that region is an error.
|
1997-08-13 12:34:34 +04:00
|
|
|
.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
|
|
|
|
.Dq barriers
|
2002-02-12 01:09:18 +03:00
|
|
|
in the bus space read and write stream.
|
|
|
|
.Pp
|
|
|
|
There are two types of barriers: ordering barriers and completion
|
|
|
|
barriers.
|
|
|
|
.Pp
|
|
|
|
Ordering barriers prevent some operations from bypassing other
|
2002-10-14 17:43:14 +04:00
|
|
|
operations.
|
|
|
|
They are relatively light weight and described in terms of the
|
|
|
|
operations they are intended to order.
|
|
|
|
The important thing to note is that they create specific ordering
|
|
|
|
constraint surrounding bus accesses but do not necessarily force any
|
|
|
|
synchronization themselves.
|
2002-02-12 01:09:18 +03:00
|
|
|
So, if there is enough distance between the memory operations being
|
2003-01-02 00:58:39 +03:00
|
|
|
ordered, the preceding ones could complete by themselves resulting
|
2002-02-12 01:05:13 +03:00
|
|
|
in no performance penalty.
|
|
|
|
.Pp
|
2002-02-12 01:09:18 +03:00
|
|
|
For instance, a write before read barrier will force any writes
|
|
|
|
issued before the barrier instruction to complete before any reads
|
2002-10-14 17:43:14 +04:00
|
|
|
after the barrier are issued.
|
|
|
|
This forces processors with write buffers to read data from memory rather
|
|
|
|
than from the pending write in the write buffer.
|
2002-02-12 01:05:13 +03:00
|
|
|
.Pp
|
2002-02-12 01:09:18 +03:00
|
|
|
Ordering barriers are usually sufficient for most circumstances,
|
2002-10-14 17:43:14 +04:00
|
|
|
and can be combined together.
|
|
|
|
For instance a read before write barrier can be combined with a write
|
|
|
|
before write barrier to force all memory operations to complete before
|
|
|
|
the next write is started.
|
2002-02-12 01:05:13 +03:00
|
|
|
.Pp
|
2002-02-12 01:09:18 +03:00
|
|
|
Completion barriers force all memory operations and any pending
|
2002-02-12 01:05:13 +03:00
|
|
|
exceptions to be completed before any instructions after the
|
2002-10-14 17:43:14 +04:00
|
|
|
barrier may be issued.
|
|
|
|
Completion barriers are extremely expensive and almost never required
|
|
|
|
in device driver code.
|
|
|
|
A single completion barrier can force the processor to stall on memory
|
|
|
|
for hundreds of cycles on some machines.
|
2002-02-12 01:05:13 +03:00
|
|
|
.Pp
|
2002-02-12 01:09:18 +03:00
|
|
|
Correctly-written drivers will include all appropriate barriers,
|
|
|
|
and assume only the read/write ordering imposed by the barrier
|
2002-02-12 01:05:13 +03:00
|
|
|
operations.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
People trying to write portable drivers with the
|
|
|
|
.Nm
|
|
|
|
functions should
|
2002-10-14 17:43:14 +04:00
|
|
|
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).
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
The descriptions of the
|
|
|
|
.Nm
|
|
|
|
functions given below all assume that
|
2002-10-14 17:43:14 +04:00
|
|
|
they are called with proper arguments.
|
|
|
|
If called with invalid arguments or arguments that are out of range
|
|
|
|
(e.g., trying to access data outside of the region mapped when a given
|
|
|
|
handle was created), undefined behaviour results.
|
|
|
|
In that case, they may cause the system to halt, either intentionally
|
|
|
|
(via panic) or unintentionally (by causing a fatal trap or by some other
|
|
|
|
means) or may cause improper operation which is not immediately fatal.
|
|
|
|
Functions which return void or which return data read from bus space
|
|
|
|
(i.e., functions which don't obviously return an error code) do not fail.
|
|
|
|
They could only fail if given invalid arguments, and in that case their
|
|
|
|
behaviour is undefined.
|
2000-08-02 03:08:56 +04:00
|
|
|
Functions which take a count of bytes have undefined results if the specified
|
2000-08-03 19:30:52 +04:00
|
|
|
.Fa count
|
|
|
|
is zero.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Sh TYPES
|
|
|
|
Several types are defined in
|
2003-06-30 16:10:40 +04:00
|
|
|
.Aq Pa machine/bus.h
|
1997-08-13 12:34:34 +04:00
|
|
|
to facilitate use of the
|
|
|
|
.Nm
|
|
|
|
functions by drivers.
|
|
|
|
.Pp
|
|
|
|
.Bl -ohang -compact
|
|
|
|
.It Fa bus_addr_t
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fa bus_addr_t
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
.It Fa bus_size_t
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fa bus_size_t
|
2002-10-14 17:43:14 +04:00
|
|
|
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
|
1997-08-13 12:34:34 +04:00
|
|
|
.Nm
|
|
|
|
functions, describing sizes when mapping regions and
|
|
|
|
offsets into regions when performing space access operations.
|
|
|
|
.Pp
|
|
|
|
.It Fa bus_space_tag_t
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fa bus_space_tag_t
|
2002-10-14 17:43:14 +04:00
|
|
|
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
|
1997-08-13 12:34:34 +04:00
|
|
|
.Nm
|
|
|
|
functions to name the space on which they're operating.
|
|
|
|
.Pp
|
|
|
|
.It Fa bus_space_handle_t
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fa bus_space_handle_t
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.El
|
|
|
|
.Sh MAPPING AND UNMAPPING BUS SPACE
|
|
|
|
Bus space must be mapped before it can be used, and should be
|
2002-10-14 17:43:14 +04:00
|
|
|
unmapped when it is no longer needed.
|
|
|
|
The
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_map
|
|
|
|
and
|
|
|
|
.Fn bus_space_unmap
|
|
|
|
functions provide these capabilities.
|
|
|
|
.Pp
|
|
|
|
Some drivers need to be able to pass a subregion of already-mapped bus
|
2002-10-14 17:43:14 +04:00
|
|
|
space to another driver or module within a driver.
|
|
|
|
The
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_subregion
|
|
|
|
function allows such subregions to be created.
|
|
|
|
.Pp
|
|
|
|
.Bl -ohang -compact
|
|
|
|
.It Fn bus_space_map "space" "address" "size" "flags" "handlep"
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn bus_space_map
|
|
|
|
function maps the region of bus space named by the
|
|
|
|
.Fa space ,
|
|
|
|
.Fa address ,
|
|
|
|
and
|
|
|
|
.Fa size
|
2002-10-14 17:43:14 +04:00
|
|
|
arguments.
|
|
|
|
If successful, it returns zero and fills in the bus space handle pointed
|
|
|
|
to by
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa handlep
|
|
|
|
with the handle
|
2002-10-14 17:43:14 +04:00
|
|
|
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
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa handlep
|
|
|
|
in an undefined state.
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fa flags
|
2002-10-14 17:43:14 +04:00
|
|
|
argument controls how the space is to be mapped.
|
|
|
|
Supported flags include:
|
1997-08-13 12:34:34 +04:00
|
|
|
.Bl -tag -width BUS_SPACE_MAP_CACHEABLE -offset indent
|
|
|
|
.It Dv BUS_SPACE_MAP_CACHEABLE
|
2000-04-17 13:52:21 +04:00
|
|
|
Try to map the space so that accesses can be cached
|
2002-10-14 17:43:14 +04:00
|
|
|
by the system cache.
|
|
|
|
If this flag is not specified, the implementation should map the space so
|
|
|
|
that it will not be cached.
|
2000-04-17 13:52:21 +04:00
|
|
|
This mapping method will only be useful in very rare occasions.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
This flag must have a value of 1 on all implementations for backward
|
|
|
|
compatibility.
|
2000-04-17 13:52:21 +04:00
|
|
|
.It Dv BUS_SPACE_MAP_PREFETCHABLE
|
|
|
|
Try to map the space so that accesses can be prefetched by the system,
|
|
|
|
and writes can be buffered.
|
2002-10-14 17:43:14 +04:00
|
|
|
This means, accesses should be side effect free (idempotent).
|
|
|
|
The
|
2000-04-17 13:52:21 +04:00
|
|
|
.Fn bus_space_barrier
|
|
|
|
methods will flush the write buffer or force actual read accesses.
|
|
|
|
If this flag is not specified, the
|
|
|
|
implementation should map the space so that it will not be prefetched
|
|
|
|
or delayed.
|
1997-08-13 12:34:34 +04:00
|
|
|
.It Dv BUS_SPACE_MAP_LINEAR
|
|
|
|
Try to map the space so that its contents can be accessed linearly via
|
2002-10-14 17:43:14 +04:00
|
|
|
normal memory access methods (e.g., pointer dereferencing and structure
|
|
|
|
accesses).
|
|
|
|
The
|
2000-04-17 13:52:21 +04:00
|
|
|
.Fn bus_space_vaddr
|
|
|
|
method can be used to obtain the kernel virtual address of the mapped range.
|
1997-08-13 12:34:34 +04:00
|
|
|
This is useful when software wants to do direct access to a memory
|
2002-10-14 17:43:14 +04:00
|
|
|
device, e.g., a frame buffer.
|
|
|
|
If this flag is specified and linear mapping is not possible, the
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_map
|
2002-10-14 17:43:14 +04:00
|
|
|
call should fail.
|
|
|
|
If this flag is not specified, the system may map the space in whatever
|
|
|
|
way is most convenient.
|
2000-04-17 13:52:21 +04:00
|
|
|
Use of this mapping method is not encouraged for normal device access;
|
|
|
|
where linear access is not essential, use of the
|
|
|
|
.Fn bus_space_read/write
|
|
|
|
methods is strongly recommended.
|
1997-08-13 12:34:34 +04:00
|
|
|
.El
|
|
|
|
.Pp
|
|
|
|
Not all combinations of flags make sense or are supported with all
|
2002-10-14 17:43:14 +04:00
|
|
|
spaces.
|
|
|
|
For instance,
|
1997-08-13 12:34:34 +04:00
|
|
|
.Dv BUS_SPACE_MAP_CACHEABLE
|
|
|
|
may be meaningless when
|
|
|
|
used on many systems' I/O port spaces, and on some systems
|
|
|
|
.Dv BUS_SPACE_MAP_LINEAR
|
|
|
|
without
|
2000-04-17 13:52:21 +04:00
|
|
|
.Dv BUS_SPACE_MAP_PREFETCHABLE
|
1999-03-07 01:09:29 +03:00
|
|
|
may never work.
|
|
|
|
When the system hardware or firmware provides hints as to how spaces should be
|
2002-10-14 17:43:14 +04:00
|
|
|
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-prefetchable mapping when the system can only provide
|
|
|
|
a prefetchable one) will cause the request to fail.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
Some implementations may keep track of use of bus space for some or all
|
2002-10-14 17:43:14 +04:00
|
|
|
bus spaces and refuse to allow duplicate allocations.
|
|
|
|
This is encouraged for bus spaces which have no notion of slot-specific
|
|
|
|
space addressing, such as ISA and VME, and for spaces which coexist with
|
|
|
|
those spaces (e.g., EISA and PCI memory and I/O spaces co-existing with
|
|
|
|
ISA memory and I/O spaces).
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
.It Fn bus_space_unmap "space" "handle" "size"
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn bus_space_unmap
|
|
|
|
function unmaps a region of bus space mapped with
|
|
|
|
.Fn bus_space_map .
|
2001-05-27 20:04:46 +04:00
|
|
|
When unmapping a region, the
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa size
|
|
|
|
specified should be
|
|
|
|
the same as the size given to
|
|
|
|
.Fn bus_space_map
|
|
|
|
when mapping that region.
|
|
|
|
.Pp
|
|
|
|
After
|
|
|
|
.Fn bus_space_unmap
|
2002-10-14 17:43:14 +04:00
|
|
|
is called on a handle, that handle is no longer valid.
|
|
|
|
(If copies were made of the handle they are no longer valid, either.)
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
2002-10-14 17:43:14 +04:00
|
|
|
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,
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_unmap
|
|
|
|
will never return.
|
|
|
|
.Pp
|
|
|
|
.It Fn bus_space_subregion "space" "handle" "offset" "size" "nhandlep"
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn bus_space_subregion
|
|
|
|
function is a convenience function which makes a
|
|
|
|
new handle to some subregion of an already-mapped region of bus space.
|
2001-05-27 20:04:46 +04:00
|
|
|
The subregion described by the new handle starts at byte offset
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa offset
|
2001-05-27 20:04:46 +04:00
|
|
|
into the region described by
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa handle ,
|
2001-05-27 20:04:46 +04:00
|
|
|
with the size given by
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa size ,
|
|
|
|
and must be wholly contained within the original region.
|
|
|
|
.Pp
|
|
|
|
If successful,
|
|
|
|
.Fn bus_space_subregion
|
|
|
|
returns zero and fills in the bus
|
|
|
|
space handle pointed to by
|
|
|
|
.Fa nhandlep .
|
|
|
|
If unsuccessful, it returns non-zero and leaves the bus space handle
|
|
|
|
pointed to by
|
|
|
|
.Fa nhandlep
|
|
|
|
in an
|
2002-10-14 17:43:14 +04:00
|
|
|
undefined state.
|
|
|
|
In either case, the handle described by
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa handle
|
|
|
|
remains valid and is unmodified.
|
|
|
|
.Pp
|
2001-05-27 20:04:46 +04:00
|
|
|
When done with a handle created by
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_subregion ,
|
|
|
|
the handle should
|
2002-10-14 17:43:14 +04:00
|
|
|
be thrown away.
|
|
|
|
Under no circumstances should
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_unmap
|
2002-10-14 17:43:14 +04:00
|
|
|
be used on the handle.
|
|
|
|
Doing so may confuse any resource management being done on the space,
|
|
|
|
and will result in undefined behaviour.
|
|
|
|
When
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_unmap
|
|
|
|
or
|
|
|
|
.Fn bus_space_free
|
|
|
|
is called on a handle, all subregions of that handle become invalid.
|
2000-04-17 13:52:21 +04:00
|
|
|
.Pp
|
|
|
|
.It Fn bus_space_vaddr "tag" "handle"
|
|
|
|
.Pp
|
|
|
|
This method returns the kernel virtual address of a mapped bus space if and
|
|
|
|
only if it was mapped with the
|
|
|
|
.Dv BUS_SPACE_MAP_LINEAR
|
2002-10-14 17:43:14 +04:00
|
|
|
flag.
|
|
|
|
The range can be accessed by normal (volatile) pointer dereferences.
|
2000-04-17 13:52:21 +04:00
|
|
|
If mapped with the
|
|
|
|
.Dv BUS_SPACE_MAP_PREFETCHABLE
|
|
|
|
flag, the
|
|
|
|
.Fn bus_space_barrier
|
|
|
|
method must be used to force a particular access order.
|
2001-09-04 06:10:52 +04:00
|
|
|
.Pp
|
|
|
|
.It Fn bus_space_mmap "tag" "addr" "off" "prot" "flags"
|
|
|
|
.Pp
|
|
|
|
This method is used to provide support for memory mapping bus space
|
2002-10-14 17:43:14 +04:00
|
|
|
into user applications.
|
|
|
|
If an address space is addressable via volatile pointer dereferences,
|
2001-09-04 06:10:52 +04:00
|
|
|
.Fn bus_space_mmap
|
|
|
|
will return the physical address (possibly encoded as a machine-dependent
|
|
|
|
cookie) of the bus space indicated by
|
|
|
|
.Fa addr
|
|
|
|
and
|
|
|
|
.Fa off .
|
|
|
|
.Fa addr
|
|
|
|
is the base address of the device or device region, and
|
|
|
|
.Fa off
|
|
|
|
is the offset into that region that is being requested.
|
|
|
|
If the request is made with
|
|
|
|
.Dv BUS_SPACE_MAP_LINEAR
|
|
|
|
as a flag, then a linear region must be returned to the caller.
|
|
|
|
If the region cannot be mapped (either the address does not exist,
|
|
|
|
or the constraints can not be met),
|
|
|
|
.Fn bus_space_mmap
|
|
|
|
returns
|
|
|
|
.Dv -1
|
|
|
|
to indicate failure.
|
|
|
|
.Pp
|
|
|
|
Note that it is not necessary that the region being requested by a
|
|
|
|
.Fn bus_space_mmap
|
|
|
|
call be mapped into a
|
|
|
|
.Fa bus_space_handle_t .
|
|
|
|
.Pp
|
|
|
|
.Fn bus_space_mmap
|
|
|
|
is called once per
|
|
|
|
.Dv PAGE_SIZE
|
2002-10-14 17:43:14 +04:00
|
|
|
page in the range.
|
|
|
|
The
|
2001-09-04 06:10:52 +04:00
|
|
|
.Fa prot
|
|
|
|
argument indicates the memory protection requested by the user application
|
|
|
|
for the range.
|
1997-08-13 12:34:34 +04:00
|
|
|
.El
|
|
|
|
.Sh ALLOCATING AND FREEING BUS SPACE
|
|
|
|
Some devices require or allow bus space to be allocated by the operating
|
2002-10-14 17:43:14 +04:00
|
|
|
system for device use.
|
|
|
|
When the devices no longer need the space, the
|
|
|
|
operating system should free it for use by other devices.
|
|
|
|
The
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_alloc
|
|
|
|
and
|
|
|
|
.Fn bus_space_free
|
|
|
|
functions provide these capabilities.
|
|
|
|
.Pp
|
|
|
|
.Bl -ohang -compact
|
|
|
|
.It Xo
|
|
|
|
.Fo bus_space_alloc
|
|
|
|
.Fa "space" "reg_start" "reg_end" "size"
|
|
|
|
.Fa "alignment" "boundary" "flags" "addrp" "handlep"
|
|
|
|
.Fc
|
|
|
|
.Xc
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn bus_space_alloc
|
|
|
|
function allocates and maps a region of bus space with the size given by
|
|
|
|
.Fa size ,
|
2002-10-14 17:43:14 +04:00
|
|
|
corresponding to the given constraints.
|
|
|
|
If successful, it returns zero, fills in the bus address pointed to by
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa addrp
|
|
|
|
with the bus space address of the allocated region, and fills in
|
2001-05-27 20:04:46 +04:00
|
|
|
the bus space handle pointed to by
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa handlep
|
1999-03-07 01:09:29 +03:00
|
|
|
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
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa addrp
|
2001-05-27 20:04:46 +04:00
|
|
|
and the bus space handle pointed to by
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa handlep
|
|
|
|
in an undefined state.
|
|
|
|
.Pp
|
2001-05-27 20:04:46 +04:00
|
|
|
Constraints on the allocation are given by the
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa reg_start ,
|
|
|
|
.Fa reg_end ,
|
|
|
|
.Fa alignment ,
|
|
|
|
and
|
|
|
|
.Fa boundary
|
2002-10-14 17:43:14 +04:00
|
|
|
parameters.
|
|
|
|
The allocated region will start at or after
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa reg_start
|
|
|
|
and end before or at
|
|
|
|
.Fa reg_end .
|
|
|
|
The
|
|
|
|
.Fa alignment
|
|
|
|
constraint must be a power of two, and the allocated region will start at
|
2002-10-14 17:43:14 +04:00
|
|
|
an address that is an even multiple of that power of two.
|
|
|
|
The
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa boundary
|
|
|
|
constraint, if non-zero, ensures that the region is allocated so that
|
|
|
|
.Fa "first address in region"
|
|
|
|
/
|
|
|
|
.Fa boundary
|
|
|
|
has the same value as
|
|
|
|
.Fa "last address in region"
|
|
|
|
/
|
|
|
|
.Fa boundary .
|
|
|
|
If the constraints cannot be met,
|
|
|
|
.Fn bus_space_alloc
|
2002-10-14 17:43:14 +04:00
|
|
|
will fail.
|
|
|
|
It is an error to specify a set of constraints that can never be met
|
1997-08-13 12:34:34 +04:00
|
|
|
.Po
|
|
|
|
for example,
|
|
|
|
.Fa size
|
|
|
|
greater than
|
|
|
|
.Fa boundary
|
|
|
|
.Pc .
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fa flags
|
|
|
|
parameter is the same as the like-named parameter to
|
|
|
|
.Fa bus_space_map ,
|
|
|
|
the same flag values should be used, and they have the
|
|
|
|
same meanings.
|
|
|
|
.Pp
|
|
|
|
Handles created by
|
|
|
|
.Fn bus_space_alloc
|
|
|
|
should only be freed with
|
|
|
|
.Fn bus_space_free .
|
|
|
|
Trying to use
|
|
|
|
.Fn bus_space_unmap
|
2002-10-14 17:43:14 +04:00
|
|
|
on them causes undefined behaviour.
|
|
|
|
The
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_subregion
|
2002-10-14 17:43:14 +04:00
|
|
|
function can be used on handles created by
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_alloc .
|
|
|
|
.Pp
|
|
|
|
.It Fn bus_space_free "space" "handle" "size"
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn bus_space_free
|
|
|
|
function unmaps and frees a region of bus space mapped
|
|
|
|
and allocated with
|
|
|
|
.Fn bus_space_alloc .
|
|
|
|
When unmapping a region, the
|
|
|
|
.Fa size
|
|
|
|
specified should be the same as the size given to
|
|
|
|
.Fn bus_space_alloc
|
|
|
|
when allocating the region.
|
|
|
|
.Pp
|
|
|
|
After
|
|
|
|
.Fn bus_space_free
|
2002-10-14 17:43:14 +04:00
|
|
|
is called on a handle, that handle is no longer valid.
|
|
|
|
(If copies were made of the handle, they are no longer valid, either.)
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
2002-10-14 17:43:14 +04:00
|
|
|
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,
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_free
|
|
|
|
will never return.
|
|
|
|
.El
|
|
|
|
.Sh READING AND WRITING SINGLE DATA ITEMS
|
|
|
|
The simplest way to access bus space is to read or write a single data
|
2002-10-14 17:43:14 +04:00
|
|
|
item.
|
|
|
|
The
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_read_N
|
|
|
|
and
|
|
|
|
.Fn bus_space_write_N
|
|
|
|
families of functions provide
|
|
|
|
the ability to read and write 1, 2, 4, and 8 byte data items on busses
|
|
|
|
which support those access sizes.
|
|
|
|
.Pp
|
|
|
|
.Bl -ohang -compact
|
|
|
|
.It Fn bus_space_read_1 "space" "handle" "offset"
|
|
|
|
.It Fn bus_space_read_2 "space" "handle" "offset"
|
|
|
|
.It Fn bus_space_read_4 "space" "handle" "offset"
|
|
|
|
.It Fn bus_space_read_8 "space" "handle" "offset"
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn bus_space_read_N
|
|
|
|
family of functions reads a 1, 2, 4, or 8 byte data item from
|
|
|
|
the offset specified by
|
|
|
|
.Fa offset
|
2001-05-27 20:04:46 +04:00
|
|
|
into the region specified by
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa handle
|
2001-05-27 20:04:46 +04:00
|
|
|
of the bus space specified by
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa space .
|
|
|
|
The location being read must lie within the bus space region specified by
|
|
|
|
.Fa handle .
|
|
|
|
.Pp
|
|
|
|
For portability, the starting address of the region specified by
|
|
|
|
.Fa handle
|
|
|
|
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.
|
|
|
|
.Pp
|
2001-05-27 20:04:46 +04:00
|
|
|
Read operations done by the
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_read_N
|
|
|
|
functions may be executed out
|
|
|
|
of order with respect to other pending read and write operations unless
|
|
|
|
order is enforced by use of the
|
|
|
|
.Fn bus_space_barrier
|
|
|
|
function.
|
|
|
|
.Pp
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
.It Fn bus_space_write_1 "space" "handle" "offset" "value"
|
|
|
|
.It Fn bus_space_write_2 "space" "handle" "offset" "value"
|
|
|
|
.It Fn bus_space_write_4 "space" "handle" "offset" "value"
|
|
|
|
.It Fn bus_space_write_8 "space" "handle" "offset" "value"
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn bus_space_write_N
|
|
|
|
family of functions writes a 1, 2, 4, or 8 byte data item to the offset
|
|
|
|
specified by
|
|
|
|
.Fa offset
|
|
|
|
into the region specified by
|
|
|
|
.Fa handle
|
2001-05-27 20:04:46 +04:00
|
|
|
of the bus space specified by
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa space .
|
|
|
|
The location being written must lie within
|
|
|
|
the bus space region specified by
|
|
|
|
.Fa handle .
|
|
|
|
.Pp
|
|
|
|
For portability, the starting address of the region specified by
|
|
|
|
.Fa handle
|
|
|
|
plus the offset should be a multiple of the size of data item being
|
2002-10-14 17:43:14 +04:00
|
|
|
written.
|
|
|
|
On some systems, not obeying this requirement may cause incorrect data
|
|
|
|
to be written, on others it may cause a system crash.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
Write operations done by the
|
|
|
|
.Fn bus_space_write_N
|
|
|
|
functions may be executed
|
|
|
|
out of order with respect to other pending read and write operations
|
|
|
|
unless order is enforced by use of the
|
|
|
|
.Fn bus_space_barrier
|
|
|
|
function.
|
|
|
|
.Pp
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.El
|
2000-11-24 01:56:53 +03:00
|
|
|
.Sh PROBING BUS SPACE FOR HARDWARE WHICH MAY NOT RESPOND
|
|
|
|
One problem with the
|
|
|
|
.Fn bus_space_read_N
|
|
|
|
and
|
|
|
|
.Fn bus_space_write_N
|
|
|
|
family of functions is that they provide no protection against
|
|
|
|
exceptions which can occur when no physical hardware or
|
2002-10-14 17:43:14 +04:00
|
|
|
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
|
2000-11-24 01:56:53 +03:00
|
|
|
.Fn bus_space_peek_N
|
|
|
|
and
|
|
|
|
.Fn bus_space_poke_N
|
|
|
|
family of functions provide a mechanism to handle these exceptions
|
|
|
|
gracefully without the risk of crashing the system.
|
|
|
|
.Pp
|
|
|
|
As with
|
|
|
|
.Fn bus_space_read_N
|
|
|
|
and
|
|
|
|
.Fn bus_space_write_N ,
|
|
|
|
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
|
2002-10-14 17:43:14 +04:00
|
|
|
access sizes.
|
|
|
|
All of the constraints specified in the descriptions of the
|
2000-11-24 01:56:53 +03:00
|
|
|
.Fn bus_space_read_N
|
|
|
|
and
|
|
|
|
.Fn bus_space_write_N
|
|
|
|
functions also apply to
|
|
|
|
.Fn bus_space_peek_N
|
|
|
|
and
|
|
|
|
.Fn bus_space_poke_N .
|
|
|
|
.Pp
|
|
|
|
In addition, explicit calls to the
|
|
|
|
.Fn bus_space_barrier
|
|
|
|
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.
|
|
|
|
.Pp
|
|
|
|
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
|
2002-10-14 17:43:14 +04:00
|
|
|
hardware exception (e.g., bus error) when the peek or poke operation
|
2000-11-24 01:56:53 +03:00
|
|
|
was attempted.
|
|
|
|
Note that some busses are incapable of generating exceptions when
|
2002-10-14 17:43:14 +04:00
|
|
|
non-existent hardware is accessed.
|
|
|
|
In such cases, these functions will always return zero and the value of
|
|
|
|
the data read by
|
2000-11-24 01:56:53 +03:00
|
|
|
.Fn bus_space_peek_N
|
|
|
|
will be unspecified.
|
|
|
|
.Pp
|
|
|
|
Finally, it should be noted that at this time the
|
|
|
|
.Fn bus_space_peek_N
|
|
|
|
and
|
|
|
|
.Fn bus_space_poke_N
|
|
|
|
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.
|
|
|
|
.Pp
|
|
|
|
.Bl -ohang -compact
|
|
|
|
.It Fn bus_space_peek_1 "space" "handle" "offset" "datap"
|
|
|
|
.It Fn bus_space_peek_2 "space" "handle" "offset" "datap"
|
|
|
|
.It Fn bus_space_peek_4 "space" "handle" "offset" "datap"
|
|
|
|
.It Fn bus_space_peek_8 "space" "handle" "offset" "datap"
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn bus_space_peek_N
|
|
|
|
family of functions cautiously read a 1, 2, 4, or 8 byte data item from
|
|
|
|
the offset specified by
|
|
|
|
.Fa offset
|
2001-05-27 20:04:46 +04:00
|
|
|
in the region specified by
|
2000-11-24 01:56:53 +03:00
|
|
|
.Fa handle
|
2001-05-27 20:04:46 +04:00
|
|
|
of the bus space specified by
|
2000-11-24 01:56:53 +03:00
|
|
|
.Fa space .
|
|
|
|
The data item read is stored in the location pointed to by
|
|
|
|
.Fa datap .
|
|
|
|
It is permissible for
|
|
|
|
.Fa datap
|
2001-05-27 20:04:46 +04:00
|
|
|
to be NULL, in which case the data item will be discarded after being read.
|
2000-11-24 01:56:53 +03:00
|
|
|
.Pp
|
|
|
|
.It Fn bus_space_poke_1 "space" "handle" "offset" "value"
|
|
|
|
.It Fn bus_space_poke_2 "space" "handle" "offset" "value"
|
|
|
|
.It Fn bus_space_poke_4 "space" "handle" "offset" "value"
|
|
|
|
.It Fn bus_space_poke_8 "space" "handle" "offset" "value"
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn bus_space_poke_N
|
|
|
|
family of functions cautiously write a 1, 2, 4, or 8 byte data item
|
|
|
|
specified by
|
|
|
|
.Fa value
|
|
|
|
to the offset specified by
|
|
|
|
.Fa offset
|
|
|
|
in the region specified by
|
|
|
|
.Fa handle
|
2001-05-27 20:04:46 +04:00
|
|
|
of the bus space specified by
|
2000-11-24 01:56:53 +03:00
|
|
|
.Fa space .
|
|
|
|
.El
|
1997-08-13 12:34:34 +04:00
|
|
|
.Sh BARRIERS
|
|
|
|
In order to allow high-performance buffering implementations to avoid bus
|
|
|
|
activity on every operation, read and write ordering should be specified
|
2002-10-14 17:43:14 +04:00
|
|
|
explicitly by drivers when necessary.
|
|
|
|
The
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_barrier
|
|
|
|
function provides that ability.
|
|
|
|
.Pp
|
|
|
|
.Bl -ohang -compact
|
1998-07-07 10:40:34 +04:00
|
|
|
.It Fn bus_space_barrier "space" "handle" "offset" "length" "flags"
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn bus_space_barrier
|
|
|
|
function enforces ordering of bus space read and write operations
|
|
|
|
for the specified subregion (described by the
|
|
|
|
.Fa offset
|
2001-05-27 20:04:46 +04:00
|
|
|
and
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa length
|
|
|
|
parameters) of the region named by
|
|
|
|
.Fa handle
|
|
|
|
in the space named by
|
|
|
|
.Fa space .
|
|
|
|
.Pp
|
2001-05-27 20:04:46 +04:00
|
|
|
The
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa flags
|
|
|
|
argument controls what types of operations are to be ordered.
|
|
|
|
Supported flags are:
|
2002-02-12 01:05:13 +03:00
|
|
|
.Bl -tag -width BUS_SPACE_BARRIER_WRITE_BEFORE_WRITE -offset indent
|
|
|
|
.It Dv BUS_SPACE_BARRIER_READ_BEFORE_READ
|
2002-02-12 01:09:18 +03:00
|
|
|
Force all reads before the barrier to complete before any reads
|
2002-02-12 01:05:13 +03:00
|
|
|
after the barrier may be issued.
|
|
|
|
.It Dv BUS_SPACE_BARRIER_READ_BEFORE_WRITE
|
|
|
|
Force all reads before the barrier to complete before any writes
|
|
|
|
after the barrier may be issued.
|
|
|
|
.It Dv BUS_SPACE_BARRIER_WRITE_BEFORE_READ
|
|
|
|
Force all writes before the barrier to complete before any reads
|
|
|
|
after the barrier may be issued.
|
|
|
|
.It Dv BUS_SPACE_BARRIER_WRITE_BEFORE_WRITE
|
|
|
|
Force all writes before the barrier to complete before any writes
|
|
|
|
after the barrier may be issued.
|
|
|
|
.It Dv BUS_SPACE_BARRIER_SYNC
|
2002-02-12 01:09:18 +03:00
|
|
|
Force all memory operations and any pending exceptions to be
|
2002-02-12 01:05:13 +03:00
|
|
|
completed before any instructions after the barrier may be issued.
|
1997-08-13 12:34:34 +04:00
|
|
|
.El
|
|
|
|
.Pp
|
2002-02-12 01:09:18 +03:00
|
|
|
Those flags can be combined (or-ed together) to enforce ordering on
|
2002-02-12 01:05:13 +03:00
|
|
|
different combinations of read and write operations.
|
1997-08-13 12:34:34 +04:00
|
|
|
.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.
|
|
|
|
.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
|
2002-10-14 17:43:14 +04:00
|
|
|
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:
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
.Bd -literal
|
|
|
|
/*
|
|
|
|
* t and h are the tag and handle for the mapped device's
|
|
|
|
* space.
|
|
|
|
*/
|
|
|
|
bus_space_write_1(t, h, 0, data0);
|
2002-02-12 01:05:13 +03:00
|
|
|
bus_space_barrier(t, h, 0, 1, BUS_SPACE_BARRIER_WRITE_BEFORE_WRITE); /* 1 */
|
1997-08-13 12:34:34 +04:00
|
|
|
bus_space_write_1(t, h, 0, data1);
|
2002-02-12 01:05:13 +03:00
|
|
|
bus_space_barrier(t, h, 0, 2, BUS_SPACE_BARRIER_WRITE_BEFORE_READ); /* 2 */
|
1997-08-13 12:34:34 +04:00
|
|
|
ndata1 = bus_space_read_1(t, h, 1);
|
2002-02-12 01:05:13 +03:00
|
|
|
bus_space_barrier(t, h, 1, 1, BUS_SPACE_BARRIER_READ_BEFORE_READ); /* 3 */
|
1997-08-13 12:34:34 +04:00
|
|
|
ndata0 = bus_space_read_1(t, h, 1);
|
|
|
|
/* data0 == ndata0, data1 == ndata1 */
|
|
|
|
.Ed
|
|
|
|
.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
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
2002-02-12 01:09:18 +03:00
|
|
|
The second barrier forces the writes to the output port finish before
|
2002-02-12 01:05:13 +03:00
|
|
|
any of the reads to the input port are issued, thereby making sure
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.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.
|
|
|
|
.Pp
|
|
|
|
The barriers in the example above are specified to cover the absolute
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
2002-02-12 01:05:13 +03:00
|
|
|
.Pp
|
2002-02-12 01:09:18 +03:00
|
|
|
The following barrier operations are obsolete and should be removed
|
2002-02-12 01:05:13 +03:00
|
|
|
from existing code:
|
|
|
|
.Bl -tag -width BUS_SPACE_BARRIER_WRITE -offset indent
|
|
|
|
.It Dv BUS_SPACE_BARRIER_READ
|
|
|
|
Synchronize read operations.
|
|
|
|
.It Dv BUS_SPACE_BARRIER_WRITE
|
|
|
|
Synchronize write operations.
|
|
|
|
.El
|
1997-08-13 12:34:34 +04:00
|
|
|
.El
|
|
|
|
.Sh REGION OPERATIONS
|
|
|
|
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
|
2002-10-14 17:43:14 +04:00
|
|
|
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
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_read_region_N
|
|
|
|
and
|
|
|
|
.Fn bus_space_write_region_N
|
|
|
|
families of functions are provided.
|
|
|
|
.Pp
|
|
|
|
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
|
2002-10-14 17:43:14 +04:00
|
|
|
value.
|
|
|
|
The
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_copy_region_N
|
|
|
|
family of functions and the
|
|
|
|
.Fn bus_space_set_region_N
|
|
|
|
family of functions allow drivers to perform these operations.
|
|
|
|
.Pp
|
|
|
|
.Bl -ohang -compact
|
|
|
|
.It Fn bus_space_read_region_1 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_read_region_2 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_read_region_4 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_read_region_8 "space" "handle" "offset" "datap" "count"
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn bus_space_read_region_N
|
|
|
|
family of functions reads
|
|
|
|
.Fa count
|
|
|
|
1, 2, 4, or 8 byte data items from bus space
|
|
|
|
starting at byte offset
|
|
|
|
.Fa offset
|
|
|
|
in the region specified by
|
|
|
|
.Fa handle
|
|
|
|
of the bus space specified by
|
|
|
|
.Fa space
|
|
|
|
and writes them into the array specified by
|
|
|
|
.Fa datap .
|
|
|
|
Each successive data item is read from an offset
|
|
|
|
1, 2, 4, or 8 bytes after the previous data item (depending on which
|
2002-10-14 17:43:14 +04:00
|
|
|
function is used).
|
|
|
|
All locations being read must lie within the bus space region specified by
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa handle .
|
|
|
|
.Pp
|
|
|
|
For portability, the starting address of the region specified by
|
|
|
|
.Fa handle
|
|
|
|
plus the offset should be a multiple of the size of data items being
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
Read operations done by the
|
|
|
|
.Fn bus_space_read_region_N
|
2002-10-14 17:43:14 +04:00
|
|
|
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
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_barrier
|
2002-10-14 17:43:14 +04:00
|
|
|
function.
|
|
|
|
There is no way to insert barriers between reads of individual bus
|
|
|
|
space locations executed by the
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_read_region_N
|
|
|
|
functions.
|
|
|
|
.Pp
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
.It Fn bus_space_write_region_1 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_write_region_2 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_write_region_4 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_write_region_8 "space" "handle" "offset" "datap" "count"
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn bus_space_write_region_N
|
|
|
|
family of functions reads
|
|
|
|
.Fa count
|
|
|
|
1, 2, 4, or 8 byte data items from the array
|
|
|
|
specified by
|
|
|
|
.Fa datap
|
|
|
|
and writes them to bus space starting at byte offset
|
|
|
|
.Fa offset
|
|
|
|
in the region specified by
|
|
|
|
.Fa handle
|
|
|
|
of the bus space specified
|
|
|
|
by
|
2001-05-27 20:04:46 +04:00
|
|
|
.Fa space .
|
1997-08-13 12:34:34 +04:00
|
|
|
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
|
2002-10-14 17:43:14 +04:00
|
|
|
used).
|
|
|
|
All locations being written must lie within the bus space region specified by
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa handle .
|
|
|
|
.Pp
|
|
|
|
For portability, the starting address of the region specified by
|
|
|
|
.Fa handle
|
|
|
|
plus the offset should be a multiple of the size of data items being
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
Write operations done by the
|
|
|
|
.Fn bus_space_write_region_N
|
|
|
|
functions may be
|
2002-10-14 17:43:14 +04:00
|
|
|
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
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_barrier
|
2002-10-14 17:43:14 +04:00
|
|
|
function.
|
|
|
|
There is no way to insert barriers between writes of individual bus
|
|
|
|
space locations executed by the
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_write_region_N
|
|
|
|
functions.
|
|
|
|
.Pp
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
.It Fn bus_space_copy_region_1 "space" "srchandle" "srcoffset" "dsthandle" \
|
|
|
|
"dstoffset" "count"
|
|
|
|
.It Fn bus_space_copy_region_2 "space" "srchandle" "srcoffset" "dsthandle" \
|
|
|
|
"dstoffset" "count"
|
|
|
|
.It Fn bus_space_copy_region_4 "space" "srchandle" "srcoffset" "dsthandle" \
|
|
|
|
"dstoffset" "count"
|
|
|
|
.It Fn bus_space_copy_region_8 "space" "srchandle" "srcoffset" "dsthandle" \
|
|
|
|
"dstoffset" "count"
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn bus_space_copy_region_N
|
|
|
|
family of functions copies
|
|
|
|
.Fa count
|
|
|
|
1, 2, 4, or 8 byte data items in bus space
|
|
|
|
from the area starting at byte offset
|
|
|
|
.Fa srcoffset
|
|
|
|
in the region specified by
|
|
|
|
.Fa srchandle
|
|
|
|
of the bus space specified by
|
|
|
|
.Fa space
|
|
|
|
to the area starting at byte offset
|
|
|
|
.Fa dstoffset
|
|
|
|
in the region specified by
|
|
|
|
.Fa dsthandle
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
2001-05-27 20:04:46 +04:00
|
|
|
For portability, the starting addresses of the regions specified by
|
1997-08-13 12:34:34 +04:00
|
|
|
each handle plus its respective offset should be a multiple of the size
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
Read and write operations done by the
|
|
|
|
.Fn bus_space_copy_region_N
|
2002-10-14 17:43:14 +04:00
|
|
|
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
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_barrier function .
|
|
|
|
There is no way to insert barriers between reads or writes of
|
|
|
|
individual bus space locations executed by the
|
|
|
|
.Fn bus_space_copy_region_N
|
|
|
|
functions.
|
|
|
|
.Pp
|
1997-08-14 04:57:40 +04:00
|
|
|
Overlapping copies between different subregions of a single region
|
|
|
|
of bus space are handled correctly by the
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_copy_region_N
|
|
|
|
functions.
|
|
|
|
.Pp
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
.It Fn bus_space_set_region_1 "space" "handle" "offset" "value" "count"
|
|
|
|
.It Fn bus_space_set_region_2 "space" "handle" "offset" "value" "count"
|
|
|
|
.It Fn bus_space_set_region_4 "space" "handle" "offset" "value" "count"
|
|
|
|
.It Fn bus_space_set_region_8 "space" "handle" "offset" "value" "count"
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn bus_space_set_region_N
|
|
|
|
family of functions writes the given
|
|
|
|
.Fa value
|
|
|
|
to
|
|
|
|
.Fa count
|
|
|
|
1, 2, 4, or 8 byte
|
|
|
|
data items in bus space starting at byte offset
|
|
|
|
.Fa offset
|
|
|
|
in the region specified by
|
|
|
|
.Fa handle
|
2001-05-27 20:04:46 +04:00
|
|
|
of the bus space specified by
|
|
|
|
.Fa space .
|
1997-08-13 12:34:34 +04:00
|
|
|
Each successive data item has an offset 1, 2, 4, or 8 bytes after the
|
2002-10-14 17:43:14 +04:00
|
|
|
previous data item (depending on which function is used).
|
|
|
|
All locations being written must lie within the bus space region
|
|
|
|
specified by
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa handle .
|
|
|
|
.Pp
|
|
|
|
For portability, the starting address of the region specified by
|
|
|
|
.Fa handle
|
|
|
|
plus the offset should be a multiple of the size of data items being
|
2002-10-14 17:43:14 +04:00
|
|
|
written.
|
|
|
|
On some systems, not obeying this requirement may cause incorrect data
|
|
|
|
to be written, on others it may cause a system crash.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
Write operations done by the
|
|
|
|
.Fn bus_space_set_region_N
|
|
|
|
functions may be
|
2002-10-14 17:43:14 +04:00
|
|
|
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
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_barrier
|
2002-10-14 17:43:14 +04:00
|
|
|
function.
|
|
|
|
There is no way to insert barriers between writes of
|
1997-08-13 12:34:34 +04:00
|
|
|
individual bus space locations executed by the
|
|
|
|
.Fn bus_space_set_region_N
|
|
|
|
functions.
|
|
|
|
.Pp
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.El
|
|
|
|
.Sh READING AND WRITING A SINGLE LOCATION MULTIPLE TIMES
|
|
|
|
Some devices implement single locations in bus space which are to be read
|
2002-10-14 17:43:14 +04:00
|
|
|
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
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_read_multi_N
|
|
|
|
and
|
|
|
|
.Fn bus_space_write_multi_N
|
|
|
|
families of functions are provided.
|
|
|
|
.Pp
|
|
|
|
.Bl -ohang -compact
|
|
|
|
.It Fn bus_space_read_multi_1 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_read_multi_2 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_read_multi_4 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_read_multi_8 "space" "handle" "offset" "datap" "count"
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn bus_space_read_multi_N
|
|
|
|
family of functions reads
|
|
|
|
.Fa count
|
|
|
|
1, 2, 4, or 8 byte data items from bus space
|
|
|
|
at byte offset
|
|
|
|
.Fa offset
|
|
|
|
in the region specified by
|
|
|
|
.Fa handle
|
|
|
|
of the bus space specified by
|
|
|
|
.Fa space
|
|
|
|
and writes them into the array specified by
|
|
|
|
.Fa datap .
|
|
|
|
Each successive data item is read from the same location in bus
|
2002-10-14 17:43:14 +04:00
|
|
|
space.
|
|
|
|
The location being read must lie within the bus space region specified by
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa handle .
|
|
|
|
.Pp
|
|
|
|
For portability, the starting address of the region specified by
|
|
|
|
.Fa handle
|
|
|
|
plus the offset should be a multiple of the size of data items being
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
Read operations done by the
|
|
|
|
.Fn bus_space_read_multi_N
|
|
|
|
functions may be
|
|
|
|
executed out of order with respect to other pending read and write
|
|
|
|
operations unless order is enforced by use of the
|
|
|
|
.Fn bus_space_barrier
|
2002-10-14 17:43:14 +04:00
|
|
|
function.
|
|
|
|
Because the
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_read_multi_N
|
|
|
|
functions read the same bus space location multiple times, they
|
|
|
|
place an implicit read barrier between each successive read of that bus
|
|
|
|
space location.
|
|
|
|
.Pp
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
.It Fn bus_space_write_multi_1 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_write_multi_2 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_write_multi_4 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_write_multi_8 "space" "handle" "offset" "datap" "count"
|
|
|
|
.Pp
|
|
|
|
The
|
|
|
|
.Fn bus_space_write_multi_N
|
|
|
|
family of functions reads
|
|
|
|
.Fa count
|
|
|
|
1, 2, 4, or 8 byte data items from the array
|
|
|
|
specified by
|
|
|
|
.Fa datap
|
|
|
|
and writes them into bus space at byte offset
|
|
|
|
.Fa offset
|
|
|
|
in the region specified by
|
|
|
|
.Fa handle
|
|
|
|
of the bus space specified by
|
|
|
|
.Fa space .
|
|
|
|
Each successive data item is written to the same location in
|
2002-10-14 17:43:14 +04:00
|
|
|
bus space.
|
|
|
|
The location being written must lie within the bus space region specified by
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fa handle .
|
|
|
|
.Pp
|
|
|
|
For portability, the starting address of the region specified by
|
|
|
|
.Fa handle
|
|
|
|
plus the offset should be a multiple of the size of data items being
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
Write operations done by the
|
|
|
|
.Fn bus_space_write_multi_N
|
|
|
|
functions may be executed out of order with respect to other pending
|
|
|
|
read and write operations unless order is enforced by use of the
|
|
|
|
.Fn bus_space_barrier
|
2002-10-14 17:43:14 +04:00
|
|
|
function.
|
|
|
|
Because the
|
1997-08-13 12:34:34 +04:00
|
|
|
.Fn bus_space_write_multi_N
|
|
|
|
functions write the same bus space location multiple times, they
|
|
|
|
place an implicit write barrier between each successive write of that
|
|
|
|
bus space location.
|
|
|
|
.Pp
|
2002-10-14 17:43:14 +04:00
|
|
|
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.
|
1997-08-13 12:34:34 +04:00
|
|
|
.El
|
2000-08-02 03:08:56 +04:00
|
|
|
.Sh STREAM FUNCTIONS
|
2001-05-27 20:04:46 +04:00
|
|
|
Most of the
|
2000-08-02 03:08:56 +04:00
|
|
|
.Nm
|
|
|
|
functions imply a host byte-order and a bus byte-order and take care of
|
2002-10-14 17:43:14 +04:00
|
|
|
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
|
2000-08-02 03:08:56 +04:00
|
|
|
.Fn bus_space_*_stream_N
|
|
|
|
functions.
|
|
|
|
.Pp
|
|
|
|
.Bl -ohang -compact
|
|
|
|
.It Fn bus_space_read_stream_1 "space" "handle" "offset"
|
|
|
|
.It Fn bus_space_read_stream_2 "space" "handle" "offset"
|
|
|
|
.It Fn bus_space_read_stream_4 "space" "handle" "offset"
|
|
|
|
.It Fn bus_space_read_stream_8 "space" "handle" "offset"
|
|
|
|
.It Fn bus_space_read_multi_stream_1 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_read_multi_stream_2 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_read_multi_stream_4 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_read_multi_stream_8 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_read_region_stream_1 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_read_region_stream_2 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_read_region_stream_4 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_read_region_stream_8 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_write_stream_1 "space" "handle" "offset" "value"
|
|
|
|
.It Fn bus_space_write_stream_2 "space" "handle" "offset" "value"
|
|
|
|
.It Fn bus_space_write_stream_4 "space" "handle" "offset" "value"
|
|
|
|
.It Fn bus_space_write_stream_8 "space" "handle" "offset" "value"
|
|
|
|
.It Fn bus_space_write_multi_stream_1 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_write_multi_stream_2 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_write_multi_stream_4 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_write_multi_stream_8 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_write_region_stream_1 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_write_region_stream_2 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_write_region_stream_4 "space" "handle" "offset" "datap" "count"
|
|
|
|
.It Fn bus_space_write_region_stream_8 "space" "handle" "offset" "datap" "count"
|
2000-08-09 07:11:00 +04:00
|
|
|
.El
|
2000-08-02 03:08:56 +04:00
|
|
|
.Pp
|
|
|
|
These functions are defined just as their non-stream counterparts,
|
|
|
|
except that they provide no byte-order translation.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Sh EXPECTED CHANGES TO THE BUS_SPACE FUNCTIONS
|
|
|
|
The definition of the
|
|
|
|
.Nm
|
2002-10-14 17:43:14 +04:00
|
|
|
functions should not yet be considered finalized.
|
|
|
|
There are several changes and improvements which should be explored,
|
|
|
|
including:
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
.Bl -bullet
|
|
|
|
.It
|
|
|
|
Providing a mechanism by which incorrectly-written drivers will be
|
|
|
|
automatically given barriers and properly-written drivers won't be forced
|
2002-10-14 17:43:14 +04:00
|
|
|
to use more barriers than they need.
|
|
|
|
This should probably be done via a
|
1997-08-13 12:34:34 +04:00
|
|
|
.Li #define
|
|
|
|
in the incorrectly-written drivers.
|
|
|
|
Unfortunately, at this time, few drivers actually use barriers correctly
|
2002-10-14 17:43:14 +04:00
|
|
|
(or at all).
|
|
|
|
Because of that,
|
1997-08-13 12:34:34 +04:00
|
|
|
.Nm
|
|
|
|
implementations on architectures which do buffering must always
|
|
|
|
do the barriers inside the
|
|
|
|
.Nm
|
2002-10-14 17:43:14 +04:00
|
|
|
calls, to be safe.
|
|
|
|
That has a potentially significant performance impact.
|
1997-08-13 12:34:34 +04:00
|
|
|
.It
|
|
|
|
Exporting the
|
|
|
|
.Nm
|
|
|
|
functions to user-land so that applications
|
|
|
|
(such as X servers) have easier, more portable access to device space.
|
|
|
|
.It
|
|
|
|
Redefining bus space tags and handles so that machine-independent bus
|
|
|
|
interface drivers (for example PCI to VME bridges) could define and
|
2002-10-14 17:43:14 +04:00
|
|
|
implement bus spaces without requiring machine-dependent code.
|
|
|
|
If this is done, it should be done in such a way that machine-dependent
|
1997-08-13 12:34:34 +04:00
|
|
|
optimizations should remain possible.
|
|
|
|
.It
|
|
|
|
Converting bus spaces (such as PCI configuration space) which currently
|
|
|
|
use space-specific access methods to use the
|
|
|
|
.Nm
|
|
|
|
functions where that is appropriate.
|
|
|
|
.It
|
|
|
|
Redefining the way bus space is mapped and allocated, so that mapping
|
|
|
|
and allocation are done with bus specific functions which return bus
|
2002-10-14 17:43:14 +04:00
|
|
|
space tags.
|
|
|
|
This would allow further optimization than is currently possible, and
|
|
|
|
would also ease translation of the
|
1997-08-13 12:34:34 +04:00
|
|
|
.Nm
|
2002-10-14 17:43:14 +04:00
|
|
|
functions into user space (since mapping in user space would look like
|
|
|
|
it just used a different bus-specific mapping function).
|
1997-08-13 12:34:34 +04:00
|
|
|
.El
|
|
|
|
.Sh COMPATIBILITY
|
|
|
|
The current version of the
|
|
|
|
.Nm
|
|
|
|
interface specification differs slightly from the original
|
|
|
|
specification that came into wide use.
|
|
|
|
A few of the function names and arguments have changed
|
|
|
|
for consistency and increased functionality.
|
|
|
|
Drivers that were written to the
|
|
|
|
old, deprecated specification can be compiled by defining the
|
|
|
|
.Dv __BUS_SPACE_COMPAT_OLDDEFS
|
|
|
|
preprocessor symbol before including
|
2003-06-30 16:10:40 +04:00
|
|
|
.Aq Pa machine/bus.h .
|
2001-12-26 04:02:01 +03:00
|
|
|
.Sh SEE ALSO
|
|
|
|
.Xr bus_dma 9
|
1997-08-13 12:34:34 +04:00
|
|
|
.Sh HISTORY
|
|
|
|
The
|
|
|
|
.Nm
|
|
|
|
functions were introduced in a different form (memory and I/O spaces
|
|
|
|
were accessed via different sets of functions) in
|
|
|
|
.Nx 1.2 .
|
|
|
|
The functions were merged to work on generic
|
|
|
|
.Dq spaces
|
|
|
|
early in the
|
|
|
|
.Nx 1.3
|
|
|
|
development cycle, and many drivers were converted to use them.
|
|
|
|
This document was written later during the
|
|
|
|
.Nx 1.3
|
|
|
|
development cycle and the specification was updated to fix some
|
|
|
|
consistency problems and to add some missing functionality.
|
|
|
|
.Sh AUTHORS
|
|
|
|
The
|
|
|
|
.Nm
|
1998-02-06 08:54:12 +03:00
|
|
|
interfaces were designed and implemented by the
|
|
|
|
.Nx
|
|
|
|
developer
|
2002-10-14 17:43:14 +04:00
|
|
|
community.
|
|
|
|
Primary contributors and implementors were Chris Demetriou,
|
1998-02-06 08:54:12 +03:00
|
|
|
Jason Thorpe, and Charles Hannum, but the rest of the
|
|
|
|
.Nx
|
|
|
|
developers and the user community played a significant role in development.
|
1997-08-13 12:34:34 +04:00
|
|
|
.Pp
|
|
|
|
Chris Demetriou wrote this manual page.
|