1 .\" $NetBSD: bus_space.9,v 1.9 1999/03/06 22:09:29 mycroft Exp $
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
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.
25 .\" Copyright (c) 1997 The NetBSD Foundation, Inc.
26 .\" All rights reserved.
28 .\" This code is derived from software contributed to The NetBSD Foundation
29 .\" by Christopher G. Demetriou.
31 .\" Redistribution and use in source and binary forms, with or without
32 .\" modification, are permitted provided that the following conditions
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.
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.
59 .\" $FreeBSD: src/share/man/man9/bus_space.9,v 1.5 2008/03/07 17:02:34 rwatson Exp $
60 .\" $DragonFly: src/share/man/man9/bus_space.9,v 1.2 2008/04/20 22:24:53 swildner Exp $
67 .Nm bus_space_barrier ,
68 .Nm bus_space_copy_region_1 ,
69 .Nm bus_space_copy_region_2 ,
70 .Nm bus_space_copy_region_4 ,
71 .Nm bus_space_copy_region_stream_1 ,
72 .Nm bus_space_copy_region_stream_2 ,
73 .Nm bus_space_copy_region_stream_4 ,
76 .Nm bus_space_read_1 ,
77 .Nm bus_space_read_2 ,
78 .Nm bus_space_read_4 ,
79 .Nm bus_space_read_multi_1 ,
80 .Nm bus_space_read_multi_2 ,
81 .Nm bus_space_read_multi_4 ,
82 .Nm bus_space_read_multi_stream_1 ,
83 .Nm bus_space_read_multi_stream_2 ,
84 .Nm bus_space_read_multi_stream_4 ,
85 .Nm bus_space_read_region_1 ,
86 .Nm bus_space_read_region_2 ,
87 .Nm bus_space_read_region_4 ,
88 .Nm bus_space_read_region_stream_1 ,
89 .Nm bus_space_read_region_stream_2 ,
90 .Nm bus_space_read_region_stream_4 ,
91 .Nm bus_space_read_stream_1 ,
92 .Nm bus_space_read_stream_2 ,
93 .Nm bus_space_read_stream_4 ,
94 .Nm bus_space_set_multi_1 ,
95 .Nm bus_space_set_multi_2 ,
96 .Nm bus_space_set_multi_4 ,
97 .Nm bus_space_set_multi_stream_1 ,
98 .Nm bus_space_set_multi_stream_2 ,
99 .Nm bus_space_set_multi_stream_4 ,
100 .Nm bus_space_set_region_1 ,
101 .Nm bus_space_set_region_2 ,
102 .Nm bus_space_set_region_4 ,
103 .Nm bus_space_set_region_stream_1 ,
104 .Nm bus_space_set_region_stream_2 ,
105 .Nm bus_space_set_region_stream_4 ,
106 .Nm bus_space_subregion ,
107 .Nm bus_space_unmap ,
108 .Nm bus_space_write_1 ,
109 .Nm bus_space_write_2 ,
110 .Nm bus_space_write_4 ,
111 .Nm bus_space_write_multi_1 ,
112 .Nm bus_space_write_multi_2 ,
113 .Nm bus_space_write_multi_4 ,
114 .Nm bus_space_write_multi_stream_1 ,
115 .Nm bus_space_write_multi_stream_2 ,
116 .Nm bus_space_write_multi_stream_4 ,
117 .Nm bus_space_write_region_1 ,
118 .Nm bus_space_write_region_2 ,
119 .Nm bus_space_write_region_4 ,
120 .Nm bus_space_write_region_stream_1 ,
121 .Nm bus_space_write_region_stream_2 ,
122 .Nm bus_space_write_region_stream_4 ,
123 .Nm bus_space_write_stream_1 ,
124 .Nm bus_space_write_stream_2 ,
125 .Nm bus_space_write_stream_4
126 .Nd "bus space manipulation functions"
131 .Fa "bus_space_tag_t space" "bus_addr_t address"
132 .Fa "bus_size_t size" "int flags" "bus_space_handle_t *handlep"
136 .Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t size"
139 .Fo bus_space_subregion
140 .Fa "bus_space_tag_t space" "bus_space_handle_t handle"
141 .Fa "bus_size_t offset" "bus_size_t size" "bus_space_handle_t *nhandlep"
145 .Fa "bus_space_tag_t space" "bus_addr_t reg_start" "bus_addr_t reg_end"
146 .Fa "bus_size_t size" "bus_size_t alignment" "bus_size_t boundary"
147 .Fa "int flags" "bus_addr_t *addrp" "bus_space_handle_t *handlep"
151 .Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t size"
155 .Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t offset"
159 .Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t offset"
163 .Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t offset"
166 .Fo bus_space_read_stream_1
167 .Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t offset"
170 .Fo bus_space_read_stream_2
171 .Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t offset"
174 .Fo bus_space_read_stream_4
175 .Fa "bus_space_tag_t space" "bus_space_handle_t handle" "bus_size_t offset"
178 .Fo bus_space_write_1
179 .Fa "bus_space_tag_t space" "bus_space_handle_t handle"
180 .Fa "bus_size_t offset" "u_int8_t value"
183 .Fo bus_space_write_2
184 .Fa "bus_space_tag_t space" "bus_space_handle_t handle"
185 .Fa "bus_size_t offset" "u_int16_t value"
188 .Fo bus_space_write_4
189 .Fa "bus_space_tag_t space" "bus_space_handle_t handle"
190 .Fa "bus_size_t offset" "u_int32_t value"
193 .Fo bus_space_write_stream_1
194 .Fa "bus_space_tag_t space" "bus_space_handle_t handle"
195 .Fa "bus_size_t offset" "u_int8_t value"
198 .Fo bus_space_write_stream_2
199 .Fa "bus_space_tag_t space" "bus_space_handle_t handle"
200 .Fa "bus_size_t offset" "u_int16_t value"
203 .Fo bus_space_write_stream_4
204 .Fa "bus_space_tag_t space" "bus_space_handle_t handle"
205 .Fa "bus_size_t offset" "u_int32_t value"
208 .Fo bus_space_barrier
209 .Fa "bus_space_tag_t space" "bus_space_handle_t handle"
210 .Fa "bus_size_t offset" "bus_size_t length" "int flags"
213 .Fo bus_space_read_region_1
214 .Fa "bus_space_tag_t space"
215 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t *datap"
216 .Fa "bus_size_t count"
219 .Fo bus_space_read_region_2
220 .Fa "bus_space_tag_t space"
221 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t *datap"
222 .Fa "bus_size_t count"
225 .Fo bus_space_read_region_4
226 .Fa "bus_space_tag_t space"
227 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t *datap"
228 .Fa "bus_size_t count"
231 .Fo bus_space_read_region_stream_1
232 .Fa "bus_space_tag_t space"
233 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t *datap"
234 .Fa "bus_size_t count"
237 .Fo bus_space_read_region_stream_2
238 .Fa "bus_space_tag_t space"
239 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t *datap"
240 .Fa "bus_size_t count"
243 .Fo bus_space_read_region_stream_4
244 .Fa "bus_space_tag_t space"
245 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t *datap"
246 .Fa "bus_size_t count"
249 .Fo bus_space_write_region_1
250 .Fa "bus_space_tag_t space"
251 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t *datap"
252 .Fa "bus_size_t count"
255 .Fo bus_space_write_region_2
256 .Fa "bus_space_tag_t space"
257 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t *datap"
258 .Fa "bus_size_t count"
261 .Fo bus_space_write_region_4
262 .Fa "bus_space_tag_t space"
263 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t *datap"
264 .Fa "bus_size_t count"
267 .Fo bus_space_write_region_stream_1
268 .Fa "bus_space_tag_t space"
269 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t *datap"
270 .Fa "bus_size_t count"
273 .Fo bus_space_write_region_stream_2
274 .Fa "bus_space_tag_t space"
275 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t *datap"
276 .Fa "bus_size_t count"
279 .Fo bus_space_write_region_stream_4
280 .Fa "bus_space_tag_t space"
281 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t *datap"
282 .Fa "bus_size_t count"
285 .Fo bus_space_copy_region_1
286 .Fa "bus_space_tag_t space"
287 .Fa "bus_space_handle_t srchandle" "bus_size_t srcoffset"
288 .Fa "bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count"
291 .Fo bus_space_copy_region_2
292 .Fa "bus_space_tag_t space"
293 .Fa "bus_space_handle_t srchandle" "bus_size_t srcoffset"
294 .Fa "bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count"
297 .Fo bus_space_copy_region_4
298 .Fa "bus_space_tag_t space"
299 .Fa "bus_space_handle_t srchandle" "bus_size_t srcoffset"
300 .Fa "bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count"
303 .Fo bus_space_copy_region_stream_1
304 .Fa "bus_space_tag_t space"
305 .Fa "bus_space_handle_t srchandle" "bus_size_t srcoffset"
306 .Fa "bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count"
309 .Fo bus_space_copy_region_stream_2
310 .Fa "bus_space_tag_t space"
311 .Fa "bus_space_handle_t srchandle" "bus_size_t srcoffset"
312 .Fa "bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count"
315 .Fo bus_space_copy_region_stream_4
316 .Fa "bus_space_tag_t space"
317 .Fa "bus_space_handle_t srchandle" "bus_size_t srcoffset"
318 .Fa "bus_space_handle_t dsthandle" "bus_size_t dstoffset" "bus_size_t count"
321 .Fo bus_space_set_region_1
322 .Fa "bus_space_tag_t space"
323 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t value"
324 .Fa "bus_size_t count"
327 .Fo bus_space_set_region_2
328 .Fa "bus_space_tag_t space"
329 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t value"
330 .Fa "bus_size_t count"
333 .Fo bus_space_set_region_4
334 .Fa "bus_space_tag_t space"
335 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t value"
336 .Fa "bus_size_t count"
339 .Fo bus_space_set_region_stream_1
340 .Fa "bus_space_tag_t space"
341 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t value"
342 .Fa "bus_size_t count"
345 .Fo bus_space_set_region_stream_2
346 .Fa "bus_space_tag_t space"
347 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t value"
348 .Fa "bus_size_t count"
351 .Fo bus_space_set_region_stream_4
352 .Fa "bus_space_tag_t space"
353 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t value"
354 .Fa "bus_size_t count"
357 .Fo bus_space_read_multi_1
358 .Fa "bus_space_tag_t space"
359 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t *datap"
360 .Fa "bus_size_t count"
363 .Fo bus_space_read_multi_2
364 .Fa "bus_space_tag_t space"
365 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t *datap"
366 .Fa "bus_size_t count"
369 .Fo bus_space_read_multi_4
370 .Fa "bus_space_tag_t space"
371 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t *datap"
372 .Fa "bus_size_t count"
375 .Fo bus_space_read_multi_stream_1
376 .Fa "bus_space_tag_t space"
377 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t *datap"
378 .Fa "bus_size_t count"
381 .Fo bus_space_read_multi_stream_2
382 .Fa "bus_space_tag_t space"
383 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t *datap"
384 .Fa "bus_size_t count"
387 .Fo bus_space_read_multi_stream_4
388 .Fa "bus_space_tag_t space"
389 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t *datap"
390 .Fa "bus_size_t count"
393 .Fo bus_space_write_multi_1
394 .Fa "bus_space_tag_t space"
395 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t *datap"
396 .Fa "bus_size_t count"
399 .Fo bus_space_write_multi_2
400 .Fa "bus_space_tag_t space"
401 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t *datap"
402 .Fa "bus_size_t count"
405 .Fo bus_space_write_multi_4
406 .Fa "bus_space_tag_t space"
407 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t *datap"
408 .Fa "bus_size_t count"
411 .Fo bus_space_write_multi_stream_1
412 .Fa "bus_space_tag_t space"
413 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t *datap"
414 .Fa "bus_size_t count"
417 .Fo bus_space_write_multi_stream_2
418 .Fa "bus_space_tag_t space"
419 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t *datap"
420 .Fa "bus_size_t count"
423 .Fo bus_space_write_multi_stream_4
424 .Fa "bus_space_tag_t space"
425 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t *datap"
426 .Fa "bus_size_t count"
429 .Fo bus_space_set_multi_1
430 .Fa "bus_space_tag_t space"
431 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t value"
432 .Fa "bus_size_t count"
435 .Fo bus_space_set_multi_2
436 .Fa "bus_space_tag_t space"
437 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t value"
438 .Fa "bus_size_t count"
441 .Fo bus_space_set_multi_4
442 .Fa "bus_space_tag_t space"
443 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t value"
444 .Fa "bus_size_t count"
447 .Fo bus_space_set_multi_stream_1
448 .Fa "bus_space_tag_t space"
449 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int8_t value"
450 .Fa "bus_size_t count"
453 .Fo bus_space_set_multi_stream_2
454 .Fa "bus_space_tag_t space"
455 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int16_t value"
456 .Fa "bus_size_t count"
459 .Fo bus_space_set_multi_stream_4
460 .Fa "bus_space_tag_t space"
461 .Fa "bus_space_handle_t handle" "bus_size_t offset" "u_int32_t value"
462 .Fa "bus_size_t count"
467 functions exist to allow device drivers
468 machine-independent access to bus memory and register areas.
470 functions and types described in this document can be used by including
475 Many common devices are used on multiple architectures, but are accessed
476 differently on each because of architectural constraints.
477 For instance, a device which is mapped in one system's I/O space may be
478 mapped in memory space on a second system.
479 On a third system, architectural
480 limitations might change the way registers need to be accessed (e.g.\&
481 creating a non-linear register space).
482 In some cases, a single
483 driver may need to access the same type of device in multiple ways in a
484 single system or architecture.
487 functions is to allow a single driver source file to manipulate a set
488 of devices on different system architectures, and to allow a single driver
489 object file to manipulate a set of devices on multiple bus types on a
492 Not all busses have to implement all functions described in this
493 document, though that is encouraged if the operations are logically
494 supported by the bus.
495 Unimplemented functions should cause
496 compile-time errors if possible.
498 All of the interface definitions described in this document are shown as
499 function prototypes and discussed as if they were required to be
501 Implementations are encouraged to implement prototyped
502 (type-checked) versions of these interfaces, but may implement them as
503 macros if appropriate.
504 Machine-dependent types, variables, and functions
505 should be marked clearly
506 to avoid confusion with the
507 machine-independent types and functions, and, if possible, should be
508 given names which make the machine-dependence clear.
509 .Sh CONCEPTS AND GUIDELINES
510 Bus spaces are described by bus space tags, which can be created only by
511 machine-dependent code.
512 A given machine may have several different types
513 of bus space (e.g.\& memory space and I/O space), and thus may provide
514 multiple different bus space tags.
515 Individual busses or devices on a machine may use more than one bus space
517 For instance, ISA devices are
518 given an ISA memory space tag and an ISA I/O space tag.
520 may have several different tags which represent the same type of
521 space, for instance because of multiple different host bus interface
524 A range in bus space is described by a bus address and a bus size.
526 bus address describes the start of the range in bus space.
528 size describes the size of the range in bytes.
529 Busses which are not byte
530 addressable may require use of bus space ranges with appropriately
531 aligned addresses and properly rounded sizes.
533 Access to regions of bus space is facilitated by use of bus space handles,
534 which are usually created by mapping a specific range of a bus space.
535 Handles may also be created by allocating
536 and mapping a range of bus space, the actual location of which is picked
537 by the implementation within bounds specified by the caller of the
540 All of the bus space access functions require one bus space tag
541 argument, at least one handle argument, and at least one offset argument
543 The bus space tag specifies the space, each handle specifies a region in
544 the space, and each offset specifies the offset into the region of the
545 actual location(s) to be accessed.
546 Offsets are given in bytes, though busses
547 may impose alignment constraints.
548 The offset used to access data
549 relative to a given handle must be such that all of the data being
550 accessed is in the mapped region that the handle describes.
552 access data outside that region is an error.
554 Because some architectures' memory systems use buffering to improve
555 memory and device access performance, there is a mechanism which can be
558 in the bus space read and write stream.
560 are three types of barriers: read, write, and read/write.
562 started to the region before a read barrier must complete before any reads
563 after the read barrier are started.
564 (The analogous requirement is true for
566 Read/write barriers force all reads and writes started
567 before the barrier to complete before any reads or writes after the
569 Correctly-written drivers will include all
570 appropriate barriers, and assume only the read/write ordering imposed by
571 the barrier operations.
573 People trying to write portable drivers with the
576 try to make minimal assumptions about what the system allows.
578 they should expect that the system requires bus space addresses being
579 accessed to be naturally aligned (i.e., base address of handle added to
580 offset is a multiple of the access size), and that the system does
581 alignment checking on pointers (i.e., pointer to objects being read and
582 written must point to properly-aligned data).
584 The descriptions of the
586 functions given below all assume that
587 they are called with proper arguments.
588 If called with invalid arguments
589 or arguments that are out of range (e.g.\& trying to access data outside of
590 the region mapped when a given handle was created), undefined behaviour
592 In that case, they may cause the
593 system to halt, either intentionally (via panic) or unintentionally (by
594 causing a fatal trap of by some other means) or may cause improper
595 operation which is not immediately fatal.
596 Functions which return
598 or which return data read from bus space (i.e., functions which
599 do not obviously return an error code) do not fail.
601 if given invalid arguments, and in that case their behaviour is undefined.
603 Several types are defined
604 to facilitate use of the
606 functions by drivers.
610 type is used to describe bus addresses.
612 unsigned integral type
613 capable of holding the largest bus address usable by the architecture.
615 type is primarily used when mapping and unmapping bus space.
619 type is used to describe sizes of ranges in bus space.
621 unsigned integral type capable of holding the size of the largest bus
622 address range usable on the architecture.
623 This type is used by virtually all
626 functions, describing sizes when mapping regions and
627 offsets into regions when performing space access operations.
628 .Ss Vt bus_space_tag_t
631 type is used to describe a particular bus space on a machine.
633 contents are machine-dependent and should be considered opaque by
634 machine-independent code.
635 This type is used by all
637 functions to name the space on which they are operating.
638 .Ss Vt bus_space_handle_t
640 .Vt bus_space_handle_t
641 type is used to describe a mapping of a range of bus space.
643 contents are machine-dependent and should be considered opaque by
644 machine-independent code.
645 This type is used when performing bus space
647 .Sh MAPPING AND UNMAPPING BUS SPACE
648 This section is specific to the
650 version of these functions and may or may not apply to the
654 Bus space must be mapped before it can be used, and should be
655 unmapped when it is no longer needed.
660 functions provide these capabilities.
662 Some drivers need to be able to pass a subregion of already-mapped bus
663 space to another driver or module within a driver.
665 .Fn bus_space_subregion
666 function allows such subregions to be created.
667 .Ss Fn bus_space_map space address size flags handlep
670 function maps the region of bus space named by the
671 .Fa space , address ,
675 If successful, it returns zero
676 and fills in the bus space handle pointed to by
679 that can be used to access the mapped region.
681 it will return non-zero and leave the bus space handle pointed
684 in an undefined state.
688 argument controls how the space is to be mapped.
689 Supported flags include:
690 .Bl -tag -width ".Dv BUS_SPACE_MAP_CACHEABLE"
691 .It Dv BUS_SPACE_MAP_CACHEABLE
692 Try to map the space so that accesses can be cached and/or
693 prefetched by the system.
694 If this flag is not specified, the
695 implementation should map the space so that it will not be cached or
698 This flag must have a value of 1 on all implementations for backward
700 .It Dv BUS_SPACE_MAP_LINEAR
701 Try to map the space so that its contents can be accessed linearly via
702 normal memory access methods (e.g.\& pointer dereferencing and structure
704 This is useful when software wants to do direct access to a memory
705 device, e.g.\& a frame buffer.
706 If this flag is specified and linear
707 mapping is not possible, the
711 flag is not specified, the system may map the space in whatever way is
715 Not all combinations of flags make sense or are supported with all
718 .Dv BUS_SPACE_MAP_CACHEABLE
719 may be meaningless when
720 used on many systems' I/O port spaces, and on some systems
721 .Dv BUS_SPACE_MAP_LINEAR
723 .Dv BUS_SPACE_MAP_CACHEABLE
725 When the system hardware or firmware provides hints as to how spaces should be
726 mapped (e.g.\& the PCI memory mapping registers'
729 hints should be followed for maximum compatibility.
731 requesting a mapping that cannot be satisfied (e.g.\& requesting a
732 non-cacheable mapping when the system can only provide a cacheable one)
733 will cause the request to fail.
735 Some implementations may keep track of use of bus space for some or all
736 bus spaces and refuse to allow duplicate allocations.
738 for bus spaces which have no notion of slot-specific space addressing,
739 such as ISA and VME, and for spaces which coexist with those spaces
740 (e.g.\& EISA and PCI memory and I/O spaces co-existing with ISA memory and
743 Mapped regions may contain areas for which there is no device on the
745 If space in those areas is accessed, the results are
747 .Ss Fn bus_space_unmap space handle size
750 function unmaps a region of bus space mapped with
752 When unmapping a region, the
755 the same as the size given to
757 when mapping that region.
761 is called on a handle, that handle is no longer
763 (If copies were made of the handle they are no longer valid,
766 This function will never fail.
767 If it would fail (e.g.\& because of an
768 argument error), that indicates a software bug which should cause a
773 .Ss Fn bus_space_subregion space handle offset size nhandlep
775 .Fn bus_space_subregion
776 function is a convenience function which makes a
777 new handle to some subregion of an already-mapped region of bus space.
778 The subregion described by the new handle starts at byte offset
780 into the region described by
782 with the size give by
784 and must be wholly contained within the original region.
787 .Fn bus_space_subregion
788 returns zero and fills in the bus
789 space handle pointed to by
791 If unsuccessful, it returns non-zero and leaves the bus space handle
796 In either case, the handle described by
798 remains valid and is unmodified.
800 When done with a handle created by
801 .Fn bus_space_subregion ,
804 Under no circumstances should
806 be used on the handle.
807 Doing so may confuse any resource management
808 being done on the space, and will result in undefined behaviour.
813 is called on a handle, all subregions of that handle become invalid.
814 .Sh ALLOCATING AND FREEING BUS SPACE
815 This section is specific to the
817 version of these functions and may or may not apply to the
821 Some devices require or allow bus space to be allocated by the operating
822 system for device use.
823 When the devices no longer need the space, the
824 operating system should free it for use by other devices.
829 functions provide these capabilities.
830 .Ss Fn bus_space_alloc space reg_start reg_end size alignment boundary \
834 function allocates and maps a region of bus space with the size given by
836 corresponding to the given constraints.
837 If successful, it returns
838 zero, fills in the bus address pointed to by
840 with the bus space address of the allocated region, and fills in
841 the bus space handle pointed to by
843 with the handle that can be used to access that region.
844 If unsuccessful, it returns non-zero and leaves the bus address pointed to by
846 and the bus space handle pointed to by
848 in an undefined state.
850 Constraints on the allocation are given by the
851 .Fa reg_start , reg_end , alignment ,
855 The allocated region will start at or after
861 constraint must be a power of two, and the allocated region will start at
862 an address that is an even multiple of that power of two.
865 constraint, if non-zero, ensures that the region is allocated so that
866 .Fa "first address in region"
869 has the same value as
870 .Fa "last address in region"
873 If the constraints cannot be met,
876 It is an error to specify a set of
877 constraints that can never be met
885 parameter is the same as the like-named parameter to
887 the same flag values should be used, and they have the
892 should only be freed with
896 on them causes undefined behaviour.
898 .Fn bus_space_subregion
899 function can be used on
901 .Fn bus_space_alloc .
902 .Ss Fn bus_space_free space handle size
905 function unmaps and frees a region of bus space mapped
907 .Fn bus_space_alloc .
908 When unmapping a region, the
910 specified should be the same as the size given to
912 when allocating the region.
916 is called on a handle, that handle is no longer valid.
918 made of the handle, they are no longer valid, either.)
920 This function will never fail.
921 If it would fail (e.g.\& because of an
922 argument error), that indicates a software bug which should cause a
927 .Sh READING AND WRITING SINGLE DATA ITEMS
928 The simplest way to access bus space is to read or write a single data
933 .Fn bus_space_write_N
934 families of functions provide
935 the ability to read and write 1, 2, and 4 byte data items on busses
936 which support those access sizes.
937 .Ss Fn bus_space_read_1 space handle offset
938 .Ss Fn bus_space_read_2 space handle offset
939 .Ss Fn bus_space_read_4 space handle offset
942 family of functions reads a 1, 2, or 4 byte data item from
943 the offset specified by
945 into the region specified by
947 of the bus space specified by
949 The location being read must lie within the bus space region specified by
952 For portability, the starting address of the region specified by
954 plus the offset should be a multiple of the size of data item being read.
955 On some systems, not obeying this requirement may cause incorrect data to
956 be read, on others it may cause a system crash.
958 Read operations done by the
960 functions may be executed out
961 of order with respect to other pending read and write operations unless
962 order is enforced by use of the
963 .Fn bus_space_barrier
966 These functions will never fail.
967 If they would fail (e.g.\& because of an
968 argument error), that indicates a software bug which should cause a
970 In that case, they will never return.
971 .Ss Fn bus_space_write_1 space handle offset value
972 .Ss Fn bus_space_write_2 space handle offset value
973 .Ss Fn bus_space_write_4 space handle offset value
975 .Fn bus_space_write_N
976 family of functions writes a 1, 2, or 4 byte data item to the offset
979 into the region specified by
981 of the bus space specified by
983 The location being written must lie within
984 the bus space region specified by
987 For portability, the starting address of the region specified by
989 plus the offset should be a multiple of the size of data item being
991 On some systems, not obeying this requirement may cause
992 incorrect data to be written, on others it may cause a system crash.
994 Write operations done by the
995 .Fn bus_space_write_N
996 functions may be executed
997 out of order with respect to other pending read and write operations
998 unless order is enforced by use of the
999 .Fn bus_space_barrier
1002 These functions will never fail.
1003 If they would fail (e.g.\& because of an
1004 argument error), that indicates a software bug which should cause a
1006 In that case, they will never return.
1008 In order to allow high-performance buffering implementations to avoid bus
1009 activity on every operation, read and write ordering should be specified
1010 explicitly by drivers when necessary.
1012 .Fn bus_space_barrier
1013 function provides that ability.
1014 .Ss Fn bus_space_barrier space handle offset length flags
1016 .Fn bus_space_barrier
1017 function enforces ordering of bus space read and write operations
1018 for the specified subregion (described by the
1022 parameters) of the region named by
1024 in the space named by
1029 argument controls what types of operations are to be ordered.
1030 Supported flags are:
1031 .Bl -tag -width ".Dv BUS_SPACE_BARRIER_WRITE"
1032 .It Dv BUS_SPACE_BARRIER_READ
1033 Synchronize read operations.
1034 .It Dv BUS_SPACE_BARRIER_WRITE
1035 Synchronize write operations.
1038 Those flags can be combined (or-ed together) to enforce ordering on both
1039 read and write operations.
1041 All of the specified type(s) of operation which are done to the region
1042 before the barrier operation are guaranteed to complete before any of the
1043 specified type(s) of operation done after the barrier.
1045 Example: Consider a hypothetical device with two single-byte ports, one
1046 write-only input port (at offset 0) and a read-only output port (at
1048 Operation of the device is as follows: data bytes are written
1049 to the input port, and are placed by the device on a stack, the top of
1050 which is read by reading from the output port.
1051 The sequence to correctly
1052 write two data bytes to the device then read those two data bytes back
1056 * t and h are the tag and handle for the mapped device's
1059 bus_space_write_1(t, h, 0, data0);
1060 bus_space_barrier(t, h, 0, 1, BUS_SPACE_BARRIER_WRITE); /* 1 */
1061 bus_space_write_1(t, h, 0, data1);
1062 bus_space_barrier(t, h, 0, 2,
1063 BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE); /* 2 */
1064 ndata1 = bus_space_read_1(t, h, 1);
1065 bus_space_barrier(t, h, 1, 1, BUS_SPACE_BARRIER_READ); /* 3 */
1066 ndata0 = bus_space_read_1(t, h, 1);
1067 /* data0 == ndata0, data1 == ndata1 */
1070 The first barrier makes sure that the first write finishes before the
1071 second write is issued, so that two writes to the input port are done
1072 in order and are not collapsed into a single write.
1074 the data bytes are written to the device correctly and in order.
1076 The second barrier makes sure that the writes to the output port finish
1077 before any of the reads to the input port are issued, thereby making sure
1078 that all of the writes are finished before data is read.
1080 that the first byte read from the device really is the last one that was
1083 The third barrier makes sure that the first read finishes before the
1084 second read is issued, ensuring that data is read correctly and in order.
1086 The barriers in the example above are specified to cover the absolute
1087 minimum number of bus space locations.
1088 It is correct (and often
1089 easier) to make barrier operations cover the device's whole range of bus
1090 space, that is, to specify an offset of zero and the size of the
1092 .Sh REGION OPERATIONS
1093 Some devices use buffers which are mapped as regions in bus space.
1094 Often, drivers want to copy the contents of those buffers to or from
1095 memory, e.g.\& into mbufs which can be passed to higher levels of the
1096 system or from mbufs to be output to a network.
1098 drivers to do this as efficiently as possible, the
1099 .Fn bus_space_read_region_N
1101 .Fn bus_space_write_region_N
1102 families of functions are provided.
1104 Drivers occasionally need to copy one region of a bus space to another,
1105 or to set all locations in a region of bus space to contain a single
1108 .Fn bus_space_copy_region_N
1109 family of functions and the
1110 .Fn bus_space_set_region_N
1111 family of functions allow drivers to perform these operations.
1112 .Ss Fn bus_space_read_region_1 space handle offset datap count
1113 .Ss Fn bus_space_read_region_2 space handle offset datap count
1114 .Ss Fn bus_space_read_region_4 space handle offset datap count
1116 .Fn bus_space_read_region_N
1117 family of functions reads
1119 1, 2, or 4 byte data items from bus space
1120 starting at byte offset
1122 in the region specified by
1124 of the bus space specified by
1126 and writes them into the array specified by
1128 Each successive data item is read from an offset
1129 1, 2, or 4 bytes after the previous data item (depending on which
1131 All locations being read must lie within the bus
1132 space region specified by
1135 For portability, the starting address of the region specified by
1137 plus the offset should be a multiple of the size of data items being
1138 read and the data array pointer should be properly aligned.
1140 systems, not obeying these requirements may cause incorrect data to be
1141 read, on others it may cause a system crash.
1143 Read operations done by the
1144 .Fn bus_space_read_region_N
1145 functions may be executed in any order.
1146 They may also be executed out
1147 of order with respect to other pending read and write operations unless
1148 order is enforced by use of the
1149 .Fn bus_space_barrier
1151 There is no way to insert barriers between reads of
1152 individual bus space locations executed by the
1153 .Fn bus_space_read_region_N
1156 These functions will never fail.
1157 If they would fail (e.g.\& because of an
1158 argument error), that indicates a software bug which should cause a
1160 In that case, they will never return.
1161 .Ss Fn bus_space_write_region_1 space handle offset datap count
1162 .Ss Fn bus_space_write_region_2 space handle offset datap count
1163 .Ss Fn bus_space_write_region_4 space handle offset datap count
1165 .Fn bus_space_write_region_N
1166 family of functions reads
1168 1, 2, or 4 byte data items from the array
1171 and writes them to bus space starting at byte offset
1173 in the region specified by
1175 of the bus space specified
1178 Each successive data item is written to an offset 1, 2, or 4
1179 bytes after the previous data item (depending on which function is
1181 All locations being written must lie within the bus space region
1185 For portability, the starting address of the region specified by
1187 plus the offset should be a multiple of the size of data items being
1188 written and the data array pointer should be properly aligned.
1190 systems, not obeying these requirements may cause incorrect data to be
1191 written, on others it may cause a system crash.
1193 Write operations done by the
1194 .Fn bus_space_write_region_N
1196 executed in any order.
1197 They may also be executed out of order with
1198 respect to other pending read and write operations unless order is
1199 enforced by use of the
1200 .Fn bus_space_barrier
1202 There is no way to insert barriers between writes of
1203 individual bus space locations executed by the
1204 .Fn bus_space_write_region_N
1207 These functions will never fail.
1208 If they would fail (e.g.\& because of an
1209 argument error), that indicates a software bug which should cause a
1211 In that case, they will never return.
1212 .Ss Fn bus_space_copy_region_1 space srchandle srcoffset dsthandle \
1214 .Ss Fn bus_space_copy_region_2 space srchandle srcoffset dsthandle \
1216 .Ss Fn bus_space_copy_region_4 space srchandle srcoffset dsthandle \
1219 .Fn bus_space_copy_region_N
1220 family of functions copies
1222 1, 2, or 4 byte data items in bus space
1223 from the area starting at byte offset
1225 in the region specified by
1227 of the bus space specified by
1229 to the area starting at byte offset
1231 in the region specified by
1233 in the same bus space.
1234 Each successive data item read or written has
1235 an offset 1, 2, or 4 bytes after the previous data item (depending
1236 on which function is used).
1237 All locations being read and written must
1238 lie within the bus space region specified by their respective handles.
1240 For portability, the starting addresses of the regions specified by the
1241 each handle plus its respective offset should be a multiple of the size
1242 of data items being copied.
1243 On some systems, not obeying this
1244 requirement may cause incorrect data to be copied, on others it may cause
1247 Read and write operations done by the
1248 .Fn bus_space_copy_region_N
1249 functions may be executed in any order.
1250 They may also be executed out
1251 of order with respect to other pending read and write operations unless
1252 order is enforced by use of the
1253 .Fn bus_space_barrier
1255 There is no way to insert barriers between reads or writes of
1256 individual bus space locations executed by the
1257 .Fn bus_space_copy_region_N
1260 Overlapping copies between different subregions of a single region
1261 of bus space are handled correctly by the
1262 .Fn bus_space_copy_region_N
1265 These functions will never fail.
1266 If they would fail (e.g.\& because of an
1267 argument error), that indicates a software bug which should cause a
1269 In that case, they will never return.
1270 .Ss Fn bus_space_set_region_1 space handle offset value count
1271 .Ss Fn bus_space_set_region_2 space handle offset value count
1272 .Ss Fn bus_space_set_region_4 space handle offset value count
1274 .Fn bus_space_set_region_N
1275 family of functions writes the given
1280 data items in bus space starting at byte offset
1282 in the region specified by
1284 of the bus space specified by
1286 Each successive data item has an offset 1, 2, or 4 bytes after the
1287 previous data item (depending on which function is used).
1289 locations being written must lie within the bus space region specified
1293 For portability, the starting address of the region specified by
1295 plus the offset should be a multiple of the size of data items being
1297 On some systems, not obeying this requirement may cause
1298 incorrect data to be written, on others it may cause a system crash.
1300 Write operations done by the
1301 .Fn bus_space_set_region_N
1303 executed in any order.
1304 They may also be executed out of order with
1305 respect to other pending read and write operations unless order is
1306 enforced by use of the
1307 .Fn bus_space_barrier
1309 There is no way to insert barriers between writes of
1310 individual bus space locations executed by the
1311 .Fn bus_space_set_region_N
1314 These functions will never fail.
1315 If they would fail (e.g.\& because of an
1316 argument error), that indicates a software bug which should cause a
1318 In that case, they will never return.
1319 .Sh READING AND WRITING A SINGLE LOCATION MULTIPLE TIMES
1320 Some devices implement single locations in bus space which are to be read
1321 or written multiple times to communicate data, e.g.\& some ethernet
1322 devices' packet buffer FIFOs.
1323 In order to allow drivers to manipulate
1324 these types of devices as efficiently as possible, the
1325 .Fn bus_space_read_multi_N ,
1326 .Fn bus_space_set_multi_N ,
1328 .Fn bus_space_write_multi_N
1329 families of functions are provided.
1330 .Ss Fn bus_space_read_multi_1 space handle offset datap count
1331 .Ss Fn bus_space_read_multi_2 space handle offset datap count
1332 .Ss Fn bus_space_read_multi_4 space handle offset datap count
1334 .Fn bus_space_read_multi_N
1335 family of functions reads
1337 1, 2, or 4 byte data items from bus space
1340 in the region specified by
1342 of the bus space specified by
1344 and writes them into the array specified by
1346 Each successive data item is read from the same location in bus
1348 The location being read must lie within the bus space region
1352 For portability, the starting address of the region specified by
1354 plus the offset should be a multiple of the size of data items being
1355 read and the data array pointer should be properly aligned.
1357 systems, not obeying these requirements may cause incorrect data to be
1358 read, on others it may cause a system crash.
1360 Read operations done by the
1361 .Fn bus_space_read_multi_N
1363 executed out of order with respect to other pending read and write
1364 operations unless order is enforced by use of the
1365 .Fn bus_space_barrier
1368 .Fn bus_space_read_multi_N
1369 functions read the same bus space location multiple times, they
1370 place an implicit read barrier between each successive read of that bus
1373 These functions will never fail.
1374 If they would fail (e.g.\& because of an
1375 argument error), that indicates a software bug which should cause a
1377 In that case, they will never return.
1378 .Ss Fn bus_space_write_multi_1 space handle offset datap count
1379 .Ss Fn bus_space_write_multi_2 space handle offset datap count
1380 .Ss Fn bus_space_write_multi_4 space handle offset datap count
1382 .Fn bus_space_write_multi_N
1383 family of functions reads
1385 1, 2, or 4 byte data items from the array
1388 and writes them into bus space at byte offset
1390 in the region specified by
1392 of the bus space specified by
1394 Each successive data item is written to the same location in
1396 The location being written must lie within the bus space
1400 For portability, the starting address of the region specified by
1402 plus the offset should be a multiple of the size of data items being
1403 written and the data array pointer should be properly aligned.
1405 systems, not obeying these requirements may cause incorrect data to be
1406 written, on others it may cause a system crash.
1408 Write operations done by the
1409 .Fn bus_space_write_multi_N
1410 functions may be executed out of order with respect to other pending
1411 read and write operations unless order is enforced by use of the
1412 .Fn bus_space_barrier
1415 .Fn bus_space_write_multi_N
1416 functions write the same bus space location multiple times, they
1417 place an implicit write barrier between each successive write of that
1420 These functions will never fail.
1421 If they would fail (e.g.\& because of an
1422 argument error), that indicates a software bug which should cause a
1424 In that case, they will never return.
1425 .Ss Fn bus_space_set_multi_1 space handle offset value count
1426 .Ss Fn bus_space_set_multi_2 space handle offset value count
1427 .Ss Fn bus_space_set_multi_4 space handle offset value count
1429 .Fn bus_space_set_multi_N
1432 into bus space at byte offset
1434 in the region specified by
1436 of the bus space specified by
1440 The location being written must lie within the bus space
1444 For portability, the starting address of the region specified by
1446 plus the offset should be a multiple of the size of data items being
1447 written and the data array pointer should be properly aligned.
1449 systems, not obeying these requirements may cause incorrect data to be
1450 written, on others it may cause a system crash.
1452 Write operations done by the
1453 .Fn bus_space_set_multi_N
1454 functions may be executed out of order with respect to other pending
1455 read and write operations unless order is enforced by use of the
1456 .Fn bus_space_barrier
1459 .Fn bus_space_set_multi_N
1460 functions write the same bus space location multiple times, they
1461 place an implicit write barrier between each successive write of that
1464 These functions will never fail.
1465 If they would fail (e.g.\& because of an
1466 argument error), that indicates a software bug which should cause a
1468 In that case, they will never return.
1469 .Sh STREAM FUNCTIONS
1472 functions imply a host byte-order and a bus byte-order and take care of
1473 any translation for the caller.
1474 In some cases, however, hardware may map a FIFO or some other memory region
1475 for which the caller may want to use multi-word, yet untranslated access.
1476 Access to these types of memory regions should be with the
1477 .Fn bus_space_*_stream_N
1481 .It Fn bus_space_read_stream_1
1482 .It Fn bus_space_read_stream_2
1483 .It Fn bus_space_read_stream_4
1484 .It Fn bus_space_read_multi_stream_1
1485 .It Fn bus_space_read_multi_stream_2
1486 .It Fn bus_space_read_multi_stream_4
1487 .It Fn bus_space_read_region_stream_1
1488 .It Fn bus_space_read_region_stream_2
1489 .It Fn bus_space_read_region_stream_4
1490 .It Fn bus_space_write_stream_1
1491 .It Fn bus_space_write_stream_2
1492 .It Fn bus_space_write_stream_4
1493 .It Fn bus_space_write_multi_stream_1
1494 .It Fn bus_space_write_multi_stream_2
1495 .It Fn bus_space_write_multi_stream_4
1496 .It Fn bus_space_write_region_stream_1
1497 .It Fn bus_space_write_region_stream_2
1498 .It Fn bus_space_write_region_stream_4
1499 .It Fn bus_space_copy_region_stream_1
1500 .It Fn bus_space_copy_region_stream_2
1501 .It Fn bus_space_copy_region_stream_4
1502 .It Fn bus_space_set_multi_stream_1
1503 .It Fn bus_space_set_multi_stream_2
1504 .It Fn bus_space_set_multi_stream_4
1505 .It Fn bus_space_set_region_stream_1
1506 .It Fn bus_space_set_region_stream_2
1507 .It Fn bus_space_set_region_stream_4
1510 These functions are defined just as their non-stream counterparts,
1511 except that they provide no byte-order translation.
1517 interface specification differs slightly from the original
1518 specification that came into wide use and
1521 A few of the function names and arguments have changed
1522 for consistency and increased functionality.
1528 functions were introduced in a different form (memory and I/O spaces
1529 were accessed via different sets of functions) in
1531 The functions were merged to work on generic
1535 development cycle, and many drivers were converted to use them.
1536 This document was written later during the
1538 development cycle, and the specification was updated to fix some
1539 consistency problems and to add some missing functionality.
1541 The manual page was then adapted to the version of the interface that
1543 imported for the CAM SCSI drivers, plus subsequent evolution.
1547 version was imported in
1553 interfaces were designed and implemented by the
1557 Primary contributors and implementors were
1558 .An Chris Demetriou ,
1561 .An Charles Hannum ,
1564 developers and the user community played a significant role in development.
1567 ported these interfaces to
1571 wrote this manual page.
1578 This manual may not completely and accurately document the interface,
1579 and many parts of the interface are unspecified.