xref: /freebsd/share/man/man9/bus_dma.9 (revision e8c9966d55d7d1e786428cf8c92781c1ea07b9ba)
124503465SHiten Pandya.\" Copyright (c) 2002, 2003 Hiten M. Pandya.
224503465SHiten Pandya.\" All rights reserved.
324503465SHiten Pandya.\"
424503465SHiten Pandya.\" Redistribution and use in source and binary forms, with or without
524503465SHiten Pandya.\" modification, are permitted provided that the following conditions
624503465SHiten Pandya.\" are met:
724503465SHiten Pandya.\" 1. Redistributions of source code must retain the above copyright
824503465SHiten Pandya.\"    notice, this list of conditions, and the following disclaimer,
924503465SHiten Pandya.\"    without modification, immediately at the beginning of the file.
1024503465SHiten Pandya.\" 2. The name of the author may not be used to endorse or promote products
1124503465SHiten Pandya.\"    derived from this software without specific prior written permission.
1224503465SHiten Pandya.\"
1324503465SHiten Pandya.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1424503465SHiten Pandya.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1524503465SHiten Pandya.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1624503465SHiten Pandya.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR, CONTRIBUTORS OR THE
1724503465SHiten Pandya.\" VOICES IN HITEN PANDYA'S HEAD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1824503465SHiten Pandya.\" SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
1924503465SHiten Pandya.\" TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2024503465SHiten Pandya.\" PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
2124503465SHiten Pandya.\" LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
2224503465SHiten Pandya.\" NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
2324503465SHiten Pandya.\" SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2424503465SHiten Pandya.\"
2524503465SHiten Pandya.\" Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc.
2624503465SHiten Pandya.\" All rights reserved.
2724503465SHiten Pandya.\"
2824503465SHiten Pandya.\" This code is derived from software contributed to The NetBSD Foundation
2924503465SHiten Pandya.\" by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
3024503465SHiten Pandya.\" NASA Ames Research Center.
3124503465SHiten Pandya.\"
3224503465SHiten Pandya.\" Redistribution and use in source and binary forms, with or without
3324503465SHiten Pandya.\" modification, are permitted provided that the following conditions
3424503465SHiten Pandya.\" are met:
3524503465SHiten Pandya.\" 1. Redistributions of source code must retain the above copyright
3624503465SHiten Pandya.\"    notice, this list of conditions and the following disclaimer.
3724503465SHiten Pandya.\" 2. Redistributions in binary form must reproduce the above copyright
3824503465SHiten Pandya.\"    notice, this list of conditions and the following disclaimer in the
3924503465SHiten Pandya.\"    documentation and/or other materials provided with the distribution.
4024503465SHiten Pandya.\" 3. All advertising materials mentioning features or use of this software
4124503465SHiten Pandya.\"    must display the following acknowledgment:
4224503465SHiten Pandya.\" 	This product includes software developed by the NetBSD
4324503465SHiten Pandya.\" 	Foundation, Inc. and its contributors.
4424503465SHiten Pandya.\" 4. Neither the name of The NetBSD Foundation nor the names of its
4524503465SHiten Pandya.\"    contributors may be used to endorse or promote products derived
4624503465SHiten Pandya.\"    from this software without specific prior written permission.
4724503465SHiten Pandya.\"
4824503465SHiten Pandya.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
4924503465SHiten Pandya.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
5024503465SHiten Pandya.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
5124503465SHiten Pandya.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
5224503465SHiten Pandya.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
5324503465SHiten Pandya.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
5424503465SHiten Pandya.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
5524503465SHiten Pandya.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
5624503465SHiten Pandya.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
5724503465SHiten Pandya.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
5824503465SHiten Pandya.\" POSSIBILITY OF SUCH DAMAGE.
5924503465SHiten Pandya.\"
6024503465SHiten Pandya.\" $FreeBSD$
6124503465SHiten Pandya.\" $NetBSD: bus_dma.9,v 1.25 2002/10/14 13:43:16 wiz Exp $
6224503465SHiten Pandya.\"
6324503465SHiten Pandya.Dd May 28, 2003
6424503465SHiten Pandya.Dt BUS_DMA 9
6524503465SHiten Pandya.Os
6624503465SHiten Pandya.Sh NAME
6724503465SHiten Pandya.Nm bus_dma ,
6824503465SHiten Pandya.Nm bus_dma_tag_create ,
6924503465SHiten Pandya.Nm bus_dma_tag_destroy ,
7024503465SHiten Pandya.Nm bus_dmamap_create ,
7124503465SHiten Pandya.Nm bus_dmamap_destroy ,
7224503465SHiten Pandya.Nm bus_dmamap_load ,
7324503465SHiten Pandya.Nm bus_dmamap_load_mbuf ,
7424503465SHiten Pandya.Nm bus_dmamap_load_uio ,
7524503465SHiten Pandya.Nm bus_dmamap_unload ,
7624503465SHiten Pandya.Nm bus_dmamap_sync ,
7724503465SHiten Pandya.Nm bus_dmamem_alloc ,
78a1bd700aSHiten Pandya.Nm bus_dmamem_free
7924503465SHiten Pandya.Nd Bus and Machine Independent DMA Mapping Interface
8024503465SHiten Pandya.Sh SYNOPSIS
8124503465SHiten Pandya.In machine/bus.h
8224503465SHiten Pandya.Ft int
8324503465SHiten Pandya.Fn bus_dma_tag_create "bus_dma_tag_t parent" "bus_size_t alignment" \
8424503465SHiten Pandya"bus_size_t boundary" "bus_addr_t lowaddr" "bus_addr_t highaddr" \
8524503465SHiten Pandya"bus_dma_filter_t *filtfunc" "void *filtfuncarg" "bus_size_t maxsize" \
860e5f9b7dSScott Long"int nsegments" "bus_size_t maxsegsz" "int flags" "bus_dma_lock_t *lockfunc" \
870e5f9b7dSScott Long"void *lockfuncarg" "bus_dma_tag_t *dmat"
8824503465SHiten Pandya.Ft int
8924503465SHiten Pandya.Fn bus_dma_tag_destroy "bus_dma_tag_t dmat"
9024503465SHiten Pandya.Ft int
9124503465SHiten Pandya.Fn bus_dmamap_create "bus_dma_tag_t dmat" "int flags" "bus_dmamap_t *mapp"
9224503465SHiten Pandya.Ft int
9324503465SHiten Pandya.Fn bus_dmamap_destroy "bus_dma_tag_t dmat" "bus_dmamap_t map"
9424503465SHiten Pandya.Ft int
9524503465SHiten Pandya.Fn bus_dmamap_load "bus_dma_tag_t dmat" "bus_dmamap_t map" "void *buf" \
9624503465SHiten Pandya"bus_size_t buflen" "bus_dmamap_callback_t *callback" "void *callback_arg" \
9724503465SHiten Pandya"int flags"
9824503465SHiten Pandya.Ft int
9924503465SHiten Pandya.Fn bus_dmamap_load_mbuf "bus_dma_tag_t dmat" "bus_dmamap_t map" \
10024503465SHiten Pandya"struct mbuf *mbuf" "bus_dmamap_callback2_t *callback" "void *callback_arg" \
10124503465SHiten Pandya"int flags"
10224503465SHiten Pandya.Ft int
10324503465SHiten Pandya.Fn bus_dmamap_load_uio "bus_dma_tag_t dmat" "bus_dmamap_t map" \
10424503465SHiten Pandya"struct uio *uio" "bus_dmamap_callback2_t *callback" "void *callback_arg" \
10524503465SHiten Pandya"int flags"
10624503465SHiten Pandya.Ft int
10724503465SHiten Pandya.Fn bus_dmamem_alloc "bus_dma_tag_t dmat" "void **vaddr" \
10824503465SHiten Pandya"int flags" "bus_dmamap_t *mapp"
10924503465SHiten Pandya.Ft void
11024503465SHiten Pandya.Fn bus_dmamap_unload "bus_dma_tag_t dmat" "bus_dmamap_t map"
11124503465SHiten Pandya.Ft void
11224503465SHiten Pandya.Fn bus_dmamap_sync "bus_dma_tag_t dmat" "bus_dmamap_t map" \
11324503465SHiten Pandya"op"
11424503465SHiten Pandya.Ft void
11524503465SHiten Pandya.Fn bus_dmamem_free "bus_dma_tag_t dmat" "void *vaddr" \
11624503465SHiten Pandya"bus_dmamap_t map"
11724503465SHiten Pandya.Sh DESCRIPTION
11824503465SHiten PandyaDirect Memory Access (DMA) is a method of transferring data
11924503465SHiten Pandyawithout involving the CPU, thus providing higher performance.
12024503465SHiten PandyaA DMA transaction can be achieved between device to memory,
12124503465SHiten Pandyadevice to device, or memory to memory.
12224503465SHiten Pandya.Pp
12324503465SHiten PandyaThe
12424503465SHiten Pandya.Nm
12524503465SHiten PandyaAPI is a bus, device, and machine-independent (MI) interface to
12624503465SHiten PandyaDMA mechanisms.
12724503465SHiten PandyaIt provides the client with flexibility and simplicity by
12824503465SHiten Pandyaabstracting machine dependent issues like setting up
12924503465SHiten PandyaDMA mappings, handling cache issues, bus specific features
13024503465SHiten Pandyaand limitations.
13124503465SHiten Pandya.Sh STRUCTURES AND TYPES
13224503465SHiten Pandya.Bl -tag -width compact
13324503465SHiten Pandya.It Vt bus_dma_tag_t
13424503465SHiten PandyaA machine-dependent (MD) opaque type that describes the
13524503465SHiten Pandyacharacteristics of DMA transactions.
13624503465SHiten PandyaDMA tags are organized into a hierarchy, with each child
13724503465SHiten Pandyatag inheriting the restrictions of its parent.
13824503465SHiten PandyaThis allows all devices along the path of DMA transactions
13924503465SHiten Pandyato contribute to the constraints of those transactions.
14024503465SHiten Pandya.It Vt bus_dma_filter_t
14124503465SHiten PandyaClient specified address filter having the format:
14224503465SHiten Pandya.Bl -tag -width compact
14324503465SHiten Pandya.It Ft int
14424503465SHiten Pandya.Fn "client_filter" "void *filtarg" "bus_addr_t testaddr"
14524503465SHiten Pandya.El
14624503465SHiten Pandya.sp
14724503465SHiten PandyaAddress filters can be specified during tag creation to allow
14824503465SHiten Pandyafor devices who's DMA address restrictions cannot be specified
14924503465SHiten Pandyaby a single window.
15024503465SHiten PandyaThe
15124503465SHiten Pandya.Fa filtarg
15224503465SHiten Pandyais client specified during tag creation to be passed to all
15324503465SHiten Pandyainvocations of the callback.
15424503465SHiten PandyaThe
15524503465SHiten Pandya.Fa testaddr
15624503465SHiten Pandyaargument contains a potential starting address of a DMA mapping.
15724503465SHiten PandyaThe filter function operates on the set of addresses from
15824503465SHiten Pandya.Fa testaddr
15924503465SHiten Pandyato
16024503465SHiten Pandya.Ql trunc_page(testaddr) + PAGE_SIZE - 1 ,
16124503465SHiten Pandyainclusive.
16224503465SHiten PandyaThe filter function should return zero for any mapping in this range
16324503465SHiten Pandyathat can be accommodated by the device and non-zero otherwise.
16424503465SHiten Pandya.It Vt bus_dma_segment_t
16524503465SHiten PandyaA machine-dependent type that describes individual
16624503465SHiten PandyaDMA segments.
16724503465SHiten Pandya.Bd -literal
16824503465SHiten Pandya	bus_addr_t	ds_addr;
16924503465SHiten Pandya	bus_size_t	ds_len;
17024503465SHiten Pandya.Ed
17124503465SHiten Pandya.sp
17224503465SHiten PandyaThe
17324503465SHiten Pandya.Fa ds_addr
17424503465SHiten Pandyafield contains the device visible address of the DMA segment, and
17524503465SHiten Pandya.Fa ds_len
17624503465SHiten Pandyacontains the length of the DMA segment.
17724503465SHiten PandyaAlthough the DMA segments returned by a mapping call will adhere to
17824503465SHiten Pandyaall restrictions necessary for a successful DMA operation, some conversion
1795203edcdSRuslan Ermilov(e.g.\& a conversion from host byte order to the device's byte order) is
18024503465SHiten Pandyaalmost always required when presenting segment information to the device.
18124503465SHiten Pandya.It Vt bus_dmamap_t
18224503465SHiten PandyaA machine-dependent opaque type describing an individual mapping.
18324503465SHiten PandyaMultiple DMA maps can be associated with one DMA tag.
18424503465SHiten Pandya.It Vt bus_dmamap_callback_t
18524503465SHiten PandyaClient specified callback for receiving mapping information resulting from
18624503465SHiten Pandyathe load of a
18724503465SHiten Pandya.Vt bus_dmamap_t
18824503465SHiten Pandyavia
18924503465SHiten Pandya.Fn bus_dmamap_load .
19024503465SHiten PandyaCallbacks are of the format:
19124503465SHiten Pandya.Bl -tag -width compact
19224503465SHiten Pandya.It Ft void
19324503465SHiten Pandya.Fn "client_callback" "void *callback_arg" "bus_dma_segment_t *segs" \
19424503465SHiten Pandya"int nseg" "int error"
19524503465SHiten Pandya.El
19624503465SHiten Pandya.sp
19724503465SHiten PandyaThe
19824503465SHiten Pandya.Fa callback_arg
19924503465SHiten Pandyais the callback argument passed to dmamap load functions.
20024503465SHiten PandyaThe
20124503465SHiten Pandya.Fa segs
20224503465SHiten Pandyaand
20324503465SHiten Pandya.Fa nseg
20424503465SHiten Pandyaparameters describe an array of
20524503465SHiten Pandya.Vt bus_dma_segment_t
20624503465SHiten Pandyastructures that represent the mapping.
20724503465SHiten PandyaThis array is only valid within the scope of the callback function.
20824503465SHiten PandyaThe success or failure of the mapping is indicated by the
20924503465SHiten Pandya.Fa error
21024503465SHiten Pandyaparameter.
21124503465SHiten PandyaMore information on the use of callbacks can be found in the
21224503465SHiten Pandyadescription of the individual dmamap load functions.
21324503465SHiten Pandya.It Vt bus_dmamap_callback2_t
21424503465SHiten PandyaClient specified callback for receiving mapping information resulting from
21524503465SHiten Pandyathe load of a
21624503465SHiten Pandya.Vt bus_dmamap_t
21724503465SHiten Pandyavia
21824503465SHiten Pandya.Fn bus_dmamap_load_uio
21924503465SHiten Pandyaor
22024503465SHiten Pandya.Fn bus_dmamap_load_mbuf .
22124503465SHiten Pandya.sp
22224503465SHiten PandyaCallback2s are of the format:
22324503465SHiten Pandya.Bl -tag -width compact
22424503465SHiten Pandya.It Ft void
22524503465SHiten Pandya.Fn "client_callback2" "void *callback_arg" "bus_dma_segment_t *segs" \
22624503465SHiten Pandya"int nseg" "bus_size_t mapsize" "int error"
22724503465SHiten Pandya.El
22824503465SHiten Pandya.sp
22924503465SHiten PandyaCallback2's behavior is the same as
23024503465SHiten Pandya.Vt bus_dmamap_callback_t
23124503465SHiten Pandyawith the addition that the length of the data mapped is provided via
23224503465SHiten Pandya.Fa mapsize .
23324503465SHiten Pandya.It Vt bus_dmasync_op_t
23424503465SHiten PandyaMemory synchronization operation specifier.
23524503465SHiten PandyaBus DMA requires explicit synchronization of memory with it's device
23624503465SHiten Pandyavisible mapping in order to guarantee memory coherency.
23724503465SHiten PandyaThe
23824503465SHiten Pandya.Vt bus_dmasync_op_t
23924503465SHiten Pandyaallows the type of DMA operation that will be or has been performed
24024503465SHiten Pandyato be communicated to the system so that the correct coherency measures
24124503465SHiten Pandyaare taken.
242e8c9966dSJohn-Mark GurneyAll operations specified below are performed from the CPU's
243e8c9966dSJohn-Mark Gurneypoint of view (for a complete description, see the
244e8c9966dSJohn-Mark Gurney.Fn bus_dmamap_sync
245e8c9966dSJohn-Mark Gurneydescription below):
24624503465SHiten Pandya.Bl -tag -width BUS_DMASYNC_POSTWRITE
24724503465SHiten Pandya.It Dv BUS_DMASYNC_PREREAD
24824503465SHiten PandyaPerform any synchronization required after an update of memory by the CPU
24924503465SHiten Pandyabut prior to DMA read operations.
25024503465SHiten Pandya.It Dv BUS_DMASYNC_PREWRITE
25124503465SHiten PandyaPerform any synchronization required after an update of memory by the CPU
25224503465SHiten Pandyabut prior to DMA write operations.
253095ee947SMaxime Henrion.It Dv BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE
254095ee947SMaxime HenrionPerform any synchronization required prior to a combination of DMA read
255095ee947SMaxime Henrionand write operations.
25624503465SHiten Pandya.It Dv BUS_DMASYNC_POSTREAD
25724503465SHiten PandyaPerform any synchronization required after DMA read operations, but prior
25824503465SHiten Pandyato CPU access of the memory.
25924503465SHiten Pandya.It Dv BUS_DMASYNC_POSTWRITE
26024503465SHiten PandyaPerform any synchronization required after DMA write operations, but prior
26124503465SHiten Pandyato CPU access of the memory.
262095ee947SMaxime Henrion.It Dv BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE
263095ee947SMaxime HenrionPerform any synchronization required after a combination of DMA read
264095ee947SMaxime Henrionand write operations.
26524503465SHiten Pandya.El
2660e5f9b7dSScott Long.It Vt bus_dma_lock_t
267c7d3a65dSHiten PandyaClient specified lock/mutex manipulation method.
268c7d3a65dSHiten PandyaThis will be called from
2690e5f9b7dSScott Longwithin busdma whenever a client lock needs to be manipulated.
2700e5f9b7dSScott LongThis method is of the format:
2710e5f9b7dSScott Long.Bl -tag -width compact
2720e5f9b7dSScott Long.It Ft void
2730e5f9b7dSScott Long.Fn "lockfunc" "void *lockfunc_arg" "bus_dma_lock_op_t op"
27424503465SHiten Pandya.El
2750e5f9b7dSScott Long.sp
2760e5f9b7dSScott LongTwo
2770e5f9b7dSScott Long.Vt lockfunc
2780e5f9b7dSScott Longimplementations are provided for convenience.
2790e5f9b7dSScott Long.Fn busdma_lock_mutex
2800e5f9b7dSScott Longperforms standard mutex operations on the sleep mutex provided via the
2810e5f9b7dSScott Long.Fa lockfuncarg .
2820e5f9b7dSScott Longpassed into
2830e5f9b7dSScott Long.Fn bus_dma_tag_create .
2840e5f9b7dSScott Long.Fn dflt_lock
285c7d3a65dSHiten Pandyawill generate a system panic if it is called.
286c7d3a65dSHiten PandyaIt is substituted into the tag when
2870e5f9b7dSScott Long.Fa lockfunc
2880e5f9b7dSScott Longis passed as NULL to
2890e5f9b7dSScott Long.Fn bus_dma_tag_create .
2900e5f9b7dSScott Long.It Vt bus_dma_lock_op_t
2910e5f9b7dSScott LongOperations to be performed by the client-specified
2920e5f9b7dSScott Long.Fn lockfunc .
2930e5f9b7dSScott Long.Bl -tag -width BUS_DMA_UNLOCK
2940e5f9b7dSScott Long.It Dv BUS_DMA_LOCK
2952988974bSMike PritchardAcquires and/or locks the client locking primitive.
2960e5f9b7dSScott Long.It Dv BUS_DMA_UNLOCK
2970e5f9b7dSScott LongReleases and/or unlocks the client locking primitive.
2980e5f9b7dSScott Long.El
2990e5f9b7dSScott Long.El
3000e5f9b7dSScott Long.sp
30124503465SHiten Pandya.Sh FUNCTIONS
30224503465SHiten Pandya.Bl -tag -width compact
30324503465SHiten Pandya.It Fn bus_dma_tag_create "parent" "alignment" "boundary" "lowaddr" \
30424503465SHiten Pandya"highaddr" "*filtfunc" "*filtfuncarg" "maxsize" "nsegments" "maxsegsz" \
3059b5c4b66SScott Long"flags" "lockfunc" "lockfuncarg" "*dmat"
30624503465SHiten PandyaAllocates a device specific DMA tag, and initializes it according to
30724503465SHiten Pandyathe arguments provided:
30824503465SHiten Pandya.Bl -tag -width *filtfuncarg -compact
30924503465SHiten Pandya.It Fa parent
31024503465SHiten PandyaIndicates restrictions between the parent bridge, CPU memory, and the
31124503465SHiten Pandyadevice.
31224503465SHiten PandyaMay be NULL, if no DMA restrictions are to be inherited.
31324503465SHiten Pandya.It Fa alignment
31424503465SHiten PandyaAlignment constraint, in bytes, of any mappings created using this tag.
31524503465SHiten PandyaThe alignment must be a power of 2.
31624503465SHiten PandyaHardware that can DMA starting at any address would specify
31724503465SHiten Pandya.Em 1
31824503465SHiten Pandyafor byte alignment.
31924503465SHiten PandyaHardware requiring DMA transfers to start on a multiple of 4K
32024503465SHiten Pandyawould specify
32124503465SHiten Pandya.Em 4096.
32224503465SHiten Pandya.It Fa boundary
32324503465SHiten PandyaBoundary constraint, in bytes, of the target DMA memory region.
32424503465SHiten PandyaThe boundary indicates the set of addresses, all multiples of the
32524503465SHiten Pandyaboundary argument, that cannot be crossed by a single
32624503465SHiten Pandya.Vt bus_dma_segment_t .
327ab0b83b5SScott LongThe boundary must be a power of 2 and must be no smaller that the
328ab0b83b5SScott Longmaximum segment size.
32924503465SHiten Pandya.Ql 0
33024503465SHiten Pandyaindicates that there are no boundary restrictions.
33124503465SHiten Pandya.It Fa lowaddr
33224503465SHiten Pandya.It Fa highaddr
33324503465SHiten PandyaBounds of the window of bus address space that
33424503465SHiten Pandya.Em cannot
33524503465SHiten Pandyabe directly accessed by the device.
33624503465SHiten PandyaThe window contains all address greater than lowaddr and
33724503465SHiten Pandyaless than or equal to highaddr.
33824503465SHiten PandyaFor example, a device incapable of DMA above 4GB, would specify
33924503465SHiten Pandyaa highaddr of
34024503465SHiten Pandya.Dv BUS_SPACE_MAXADDR
34124503465SHiten Pandyaand a lowaddr of
34224503465SHiten Pandya.Dv BUS_SPACE_MAXADDR_32BIT .
34324503465SHiten PandyaSimilarly a device that can only dma to addresses bellow 16MB would
34424503465SHiten Pandyaspecify a highaddr of
34524503465SHiten Pandya.Dv BUS_SPACE_MAXADDR
34624503465SHiten Pandyaand a lowaddr of
34724503465SHiten Pandya.Dv BUS_SPACE_MAXADDR_24BIT .
34824503465SHiten PandyaSome implementations requires that some region of device visible
34924503465SHiten Pandyaaddress space, overlapping available host memory, be outside the
35024503465SHiten Pandyawindow.
35124503465SHiten PandyaThis area of
35224503465SHiten Pandya.Ql safe memory
35324503465SHiten Pandyais used to bounce requests that would otherwise conflict with
35424503465SHiten Pandyathe exclusion window.
35524503465SHiten Pandya.It Fa filtfunc
35624503465SHiten PandyaOptional filter function (may be NULL) to be called for any attempt to
35724503465SHiten Pandyamap memory into the window described by
35824503465SHiten Pandya.Fa lowaddr
35924503465SHiten Pandyaand
36024503465SHiten Pandya.Fa highaddr.
36124503465SHiten PandyaA filter function is only required when the single window described
36224503465SHiten Pandyaby
36324503465SHiten Pandya.Fa lowaddr
36424503465SHiten Pandyaand
36524503465SHiten Pandya.Fa highaddr
36624503465SHiten Pandyacannot adequately describe the constraints of the device.
36724503465SHiten PandyaThe filter function will be called for every machine page
36824503465SHiten Pandyathat overlaps the exclusion window.
36924503465SHiten Pandya.It Fa filtfuncarg
37024503465SHiten PandyaArgument passed to all calls to the filter function for this tag.
37124503465SHiten PandyaMay be NULL.
37224503465SHiten Pandya.It Fa maxsize
37324503465SHiten PandyaMaximum size, in bytes, of the sum of all segment lengths in a given
37424503465SHiten PandyaDMA mapping associated with this tag.
37524503465SHiten Pandya.It Fa nsegments
37624503465SHiten PandyaNumber of discontinuities (scatter/gather segments) allowed
37724503465SHiten Pandyain a DMA mapped region.
37824503465SHiten PandyaIf there is no restriction,
37924503465SHiten Pandya.Dv BUS_SPACE_UNRESTRICTED
38024503465SHiten Pandyamay be specified.
381094dc7e3SJohn-Mark Gurney.It Fa maxsegsz
382094dc7e3SJohn-Mark GurneyMaximum size, in bytes, of a segment in any DMA mapped region associated
383094dc7e3SJohn-Mark Gurneywith
384094dc7e3SJohn-Mark Gurney.Fa dmat .
38524503465SHiten Pandya.It Fa flags
38624503465SHiten PandyaAre as follows:
38724503465SHiten Pandya.Bl -tag -width "BUS_DMA_ALLOCNOW" -compact
38824503465SHiten Pandya.It Dv BUS_DMA_ALLOCNOW
38924503465SHiten PandyaAllocate the resources necessary to guarantee that all map load
39024503465SHiten Pandyaoperations associated with this tag will not block.
39124503465SHiten PandyaIf sufficient resources are not available,
39224503465SHiten Pandya.Er ENOMEM
39324503465SHiten Pandyais returned.
39424503465SHiten Pandya.El
3959b5c4b66SScott Long.It Fa lockfunc
3969b5c4b66SScott LongOptional lock manipulation function (may be NULL) to be called when busdma
397c7d3a65dSHiten Pandyaneeds to manipulate a lock on behalf of the client.
398c7d3a65dSHiten PandyaIf NULL is specified,
3999b5c4b66SScott Long.Fn dflt_lock
4009b5c4b66SScott Longis used.
4019b5c4b66SScott Long.It Fa lockfuncarg
4029b5c4b66SScott LongOptional argument to be passed to the function specified by
4039b5c4b66SScott Long.Fa lockfunc .
40424503465SHiten Pandya.It Fa dmat
40524503465SHiten PandyaPointer to a bus_dma_tag_t where the resulting DMA tag will
40624503465SHiten Pandyabe stored.
40724503465SHiten Pandya.El
40824503465SHiten Pandya.Pp
40924503465SHiten PandyaReturns
41024503465SHiten Pandya.Er ENOMEM
41124503465SHiten Pandyaif sufficient memory is not available for tag creation
41224503465SHiten Pandyaor allocating mapping resources.
41324503465SHiten Pandya.It Fn bus_dma_tag_destroy "dmat"
41424503465SHiten PandyaDeallocate the DMA tag
41524503465SHiten Pandya.Fa dmat
41624503465SHiten Pandyathat was created by
41724503465SHiten Pandya.Fn bus_dma_tag_create .
41824503465SHiten Pandya.Pp
41924503465SHiten PandyaReturns
42024503465SHiten Pandya.Er EBUSY
42124503465SHiten Pandyaif any DMA maps remain associated with
42224503465SHiten Pandya.Fa dmat
42324503465SHiten Pandyaor
42424503465SHiten Pandya.Ql 0
42524503465SHiten Pandyaon success.
42624503465SHiten Pandya.It Fn bus_dmamap_create "dmat" "flags" "*mapp"
42724503465SHiten PandyaAllocates and initializes a DMA map.
42824503465SHiten PandyaArguments are as follows:
42924503465SHiten Pandya.Bl -tag -width nsegments -compact
43024503465SHiten Pandya.It Fa dmat
43124503465SHiten PandyaDMA tag.
43224503465SHiten Pandya.It Fa flags
43324503465SHiten PandyaThe value of this argument is currently undefined and should be
43424503465SHiten Pandyaspecified as
43524503465SHiten Pandya.Ql 0 .
43624503465SHiten Pandya.It Fa mapp
43724503465SHiten PandyaPointer to a
43824503465SHiten Pandya.Vt bus_dmamap_t
43924503465SHiten Pandyawhere the resulting DMA map will be stored.
44024503465SHiten Pandya.El
44124503465SHiten Pandya.Pp
44224503465SHiten PandyaReturns
44324503465SHiten Pandya.Er ENOMEM
44424503465SHiten Pandyaif sufficient memory is not available for creating the
44524503465SHiten Pandyamap or allocating mapping resources.
44624503465SHiten Pandya.It Fn bus_dmamap_destroy "dmat" "map"
44724503465SHiten PandyaFrees all resources associated with a given DMA map.
44824503465SHiten PandyaArguments are as follows:
44924503465SHiten Pandya.Bl -tag -width dmat -compact
45024503465SHiten Pandya.It Fa dmat
45124503465SHiten PandyaDMA tag used to allocate
45224503465SHiten Pandya.Fa map .
45324503465SHiten Pandya.It Fa map
45424503465SHiten PandyaThe DMA map to destroy.
45524503465SHiten Pandya.El
45624503465SHiten Pandya.Pp
45724503465SHiten PandyaReturns
45824503465SHiten Pandya.Er EBUSY
45924503465SHiten Pandyaif a mapping is still active for
46024503465SHiten Pandya.Fa map .
46124503465SHiten Pandya.It Fn bus_dmamap_load "dmat" "map" "buf" "buflen" "*callback" "..."
46224503465SHiten PandyaCreates a mapping in device visible address space of
46324503465SHiten Pandya.Fa buflen
46424503465SHiten Pandyabytes of
46524503465SHiten Pandya.Fa buf ,
46624503465SHiten Pandyaassociated with the DMA map
46724503465SHiten Pandya.Fa map.
46824503465SHiten PandyaArguments are as follows:
46924503465SHiten Pandya.Bl -tag -width buflen -compact
47024503465SHiten Pandya.It Fa dmat
47124503465SHiten PandyaDMA tag used to allocate
47224503465SHiten Pandya.Fa map.
47324503465SHiten Pandya.It Fa map
47424503465SHiten PandyaA DMA map without a currently active mapping.
47524503465SHiten Pandya.It Fa buf
47624503465SHiten PandyaA kernel virtual address pointer to a contiguous (in KVA) buffer, to be
47724503465SHiten Pandyamapped into device visible address space.
47824503465SHiten Pandya.It Fa buflen
47924503465SHiten PandyaThe size of the buffer.
48024503465SHiten Pandya.It Fa callback Fa callback_arg
48124503465SHiten PandyaThe callback function, and its argument.
48224503465SHiten Pandya.It Fa flags
48324503465SHiten PandyaThe value of this argument is currently undefined, and should be
48424503465SHiten Pandyaspecified as
48524503465SHiten Pandya.Ql 0 .
48624503465SHiten Pandya.El
48724503465SHiten Pandya.Pp
48824503465SHiten PandyaReturn values to the caller are as follows:
48924503465SHiten Pandya.Bl -tag -width EINPROGRESS -compact
49024503465SHiten Pandya.It 0
49124503465SHiten PandyaThe callback has been called and completed.
49224503465SHiten PandyaThe status of the mapping has been delivered to the callback.
49324503465SHiten Pandya.It Er EINPROGRESS
49424503465SHiten PandyaThe mapping has been deferred for lack of resources.
49524503465SHiten PandyaThe callback will be called as soon as resources are available.
49624503465SHiten PandyaCallbacks are serviced in FIFO order.
49724503465SHiten PandyaDMA maps created from DMA tags that are allocated with
49824503465SHiten Pandyathe
49924503465SHiten Pandya.Dv BUS_DMA_ALLOCNOW
50024503465SHiten Pandyaflag will never return this status for a load operation.
50124503465SHiten Pandya.It Er EINVAL
50224503465SHiten PandyaThe load request was invalid.
50324503465SHiten PandyaThe callback has not, and will not be called.
50424503465SHiten PandyaThis error value may indicate that
50524503465SHiten Pandya.Fa dmat ,
50624503465SHiten Pandya.Fa map ,
50724503465SHiten Pandya.Fa buf ,
50824503465SHiten Pandyaor
50924503465SHiten Pandya.Fa callback
51024503465SHiten Pandyawere invalid, or
51124503465SHiten Pandya.Fa buslen
51224503465SHiten Pandyawas larger than the
51324503465SHiten Pandya.Fa maxsize
51424503465SHiten Pandyaargument used to create the dma tag
51524503465SHiten Pandya.Fa dmat .
51624503465SHiten Pandya.El
51724503465SHiten Pandya.Pp
51824503465SHiten PandyaWhen the callback is called, it is presented with an error value
51924503465SHiten Pandyaindicating the disposition of the mapping.
52024503465SHiten PandyaError may be one of the following:
52124503465SHiten Pandya.Bl -tag -width EINPROGRESS -compact
52224503465SHiten Pandya.It 0
52324503465SHiten PandyaThe mapping was successful and the
52424503465SHiten Pandya.Fa dm_segs
52524503465SHiten Pandyacallback argument contains an array of
52624503465SHiten Pandya.Vt bus_dma_segment_t
52724503465SHiten Pandyaelements describing the mapping.
52824503465SHiten PandyaThis array is only valid during the scope of the callback function.
52924503465SHiten Pandya.It Er EFBIG
53024503465SHiten PandyaA mapping could not be achieved within the segment constraints provided
53124503465SHiten Pandyain the tag even though the requested allocation size was less than maxsize.
53224503465SHiten Pandya.El
53324503465SHiten Pandya.It Fn bus_dmamap_load_mbuf "dmat" "map" "mbuf" "callback2" "callback_arg" \
53424503465SHiten Pandya"flags"
53524503465SHiten PandyaThis is a variation of
53624503465SHiten Pandya.Fn bus_dmamap_load
53724503465SHiten Pandyawhich maps mbuf chains
53824503465SHiten Pandyafor DMA transfers.
53924503465SHiten PandyaA
54024503465SHiten Pandya.Vt bus_size_t
54124503465SHiten Pandyaargument is also passed to the callback routine, which
54224503465SHiten Pandyacontains the mbuf chain's packet header length.
54324503465SHiten Pandya.Pp
54424503465SHiten PandyaMbuf chains are assumed to be in kernel virtual address space.
54524503465SHiten Pandya.Pp
54624503465SHiten PandyaReturns
54724503465SHiten Pandya.Er EINVAL
54824503465SHiten Pandyaif the size of the mbuf chain exceeds the maximum limit of the
54924503465SHiten PandyaDMA tag.
55024503465SHiten Pandya.It Fn bus_dmamap_load_uio "dmat" "map" "uio" "callback2" "callback_arg" "flags"
55124503465SHiten PandyaThis is a variation of
55224503465SHiten Pandya.Fn bus_dmamap_load
55324503465SHiten Pandyawhich maps buffers pointed to by
55424503465SHiten Pandya.Fa uio
55524503465SHiten Pandyafor DMA transfers.
55624503465SHiten PandyaA
55724503465SHiten Pandya.Vt bus_size_t
55824503465SHiten Pandyaargument is also passed to the callback routine, which contains the size of
55924503465SHiten Pandya.Fa uio ,
56024503465SHiten Pandyai.e.
56124503465SHiten Pandya.Fa uio->uio_resid .
56224503465SHiten Pandya.Pp
56324503465SHiten PandyaIf
56424503465SHiten Pandya.Fa uio->uio_segflg
56524503465SHiten Pandyais
56624503465SHiten Pandya.Dv UIO_USERSPACE ,
56724503465SHiten Pandyathen it is assumed that the buffer,
56824503465SHiten Pandya.Fa uio
56924503465SHiten Pandyais in
57024503465SHiten Pandya.Fa "uio->uio_td->td_proc" Ns 's
57124503465SHiten Pandyaaddress space.
57224503465SHiten PandyaUser space memory must be in-core and wired prior to attempting a map
57324503465SHiten Pandyaload operation.
57424503465SHiten Pandya.It Fn bus_dmamap_unload "dmat" "map"
57524503465SHiten PandyaUnloads a DMA map.
57624503465SHiten PandyaArguments are as follows:
57724503465SHiten Pandya.Bl -tag -width dmam -compact
57824503465SHiten Pandya.It Fa dmat
57924503465SHiten PandyaDMA tag used to allocate
58024503465SHiten Pandya.Fa map .
58124503465SHiten Pandya.It Fa map
58224503465SHiten PandyaThe DMA map that is to be unloaded.
58324503465SHiten Pandya.El
58424503465SHiten Pandya.Pp
58524503465SHiten Pandya.Fn bus_dmamap_unload
58624503465SHiten Pandyawill not perform any implicit synchronization of DMA buffers.
58724503465SHiten PandyaThis must be done explicitly by a call to
58824503465SHiten Pandya.Fn bus_dmamap_sync
58924503465SHiten Pandyaprior to unloading the map.
59024503465SHiten Pandya.It Fn bus_dmamap_sync "dmat" "map" "op"
59124503465SHiten PandyaPerforms synchronization of a device visible mapping with the CPU visible
59224503465SHiten Pandyamemory referenced by that mapping.
59324503465SHiten PandyaArguments are as follows:
59424503465SHiten Pandya.Bl -tag -width dmat -compact
59524503465SHiten Pandya.It Fa dmat
59624503465SHiten PandyaDMA tag used to allocate
59724503465SHiten Pandya.Fa map .
59824503465SHiten Pandya.It Fa map
59924503465SHiten PandyaThe DMA mapping to be synchronized.
60024503465SHiten Pandya.It Fa op
60124503465SHiten PandyaType of synchronization operation to perform.
60224503465SHiten PandyaSee the definition of
60324503465SHiten Pandya.Vt bus_dmasync_op_t
60424503465SHiten Pandyafor a description of the acceptable values for
60524503465SHiten Pandya.Fa op .
60624503465SHiten Pandya.El
60724503465SHiten Pandya.Pp
60824503465SHiten Pandya.Fn bus_dmamap_sync
60924503465SHiten Pandyais the method used to ensure that CPU and device DMA access to shared
61024503465SHiten Pandyamemory is coherent.
61124503465SHiten PandyaFor example, the CPU might be used to setup the contents of a buffer
61224503465SHiten Pandyathat is to be DMA'ed into a device.
61324503465SHiten PandyaTo ensure that the data are visible via the device's mapping of that
61424503465SHiten Pandyamemory, the buffer must be loaded and a dma sync operation of
61524503465SHiten Pandya.Dv BUS_DMASYNC_PREREAD
61624503465SHiten Pandyamust be performed.
61724503465SHiten PandyaAdditional sync operations must be performed after every CPU write
61824503465SHiten Pandyato this memory if additional DMA reads are to be performed.
61924503465SHiten PandyaConversely, for the DMA write case, the buffer must be loaded,
62024503465SHiten Pandyaand a dma sync operation of
62124503465SHiten Pandya.Dv BUS_DMASYNC_PREWRITE
62224503465SHiten Pandyamust be performed.
62324503465SHiten PandyaThe CPU will only be able to see the results of this DMA write
62424503465SHiten Pandyaonce the DMA has completed and a
62524503465SHiten Pandya.Dv BUS_DMASYNC_POSTWRITE
62624503465SHiten Pandyaoperation has been performed.
62724503465SHiten Pandya.Pp
62824503465SHiten PandyaIf DMA read and write operations are not preceded and followed by the
62924503465SHiten Pandyaappropriate synchronization operations, behavior is undefined.
63024503465SHiten Pandya.It Fn bus_dmamem_alloc "dmat" "**vaddr" "flags" "mapp"
63124503465SHiten PandyaAllocates memory that is mapped into KVA at the address returned
63224503465SHiten Pandyain
63324503465SHiten Pandya.Fa vaddr
63424503465SHiten Pandyathat is permanently loaded into the newly created
63524503465SHiten Pandya.Vt bus_dmamap_t
63624503465SHiten Pandyareturned via
63724503465SHiten Pandya.Fa mapp .
63824503465SHiten PandyaArguments are as follows:
63924503465SHiten Pandya.Bl -tag -width alignment -compact
64024503465SHiten Pandya.It Fa dmat
64124503465SHiten PandyaDMA tag describing the constraints of the DMA mapping.
64224503465SHiten Pandya.It Fa vaddr
64324503465SHiten PandyaPointer to a pointer that will hold the returned KVA mapping of
64424503465SHiten Pandyathe allocated region.
64524503465SHiten Pandya.It Fa flags
64624503465SHiten PandyaFlags are defined as follows:
64724503465SHiten Pandya.Bl -tag -width BUS_DMA_NOWAIT -compact
64824503465SHiten Pandya.It Dv BUS_DMA_WAITOK
64924503465SHiten PandyaThe routine can safely wait (sleep) for resources.
65024503465SHiten Pandya.It Dv BUS_DMA_NOWAIT
65124503465SHiten PandyaThe routine is not allowed to wait for resources.
65224503465SHiten PandyaIf resources are not available,
65324503465SHiten Pandya.Dv ENOMEM
65424503465SHiten Pandyais returned.
65524503465SHiten Pandya.It Dv BUS_DMA_COHERENT
65624503465SHiten PandyaAttempt to map this memory such that cache sync operations are
65724503465SHiten Pandyaas cheap as possible.
65824503465SHiten PandyaThis flag is typically set on memory that will be accessed by both
65924503465SHiten Pandyaa CPU and a DMA engine, frequently.
66024503465SHiten PandyaUse of this flag does not remove the requirement of using
66124503465SHiten Pandyabus_dmamap_sync, but it may reduce the cost of performing
66224503465SHiten Pandyathese operations.
66382d227dcSMaxime Henrion.It Dv BUS_DMA_ZERO
66482d227dcSMaxime HenrionCauses the allocated memory to be set to all zeros.
66524503465SHiten Pandya.El
66624503465SHiten Pandya.It Fa mapp
66724503465SHiten PandyaPointer to storage for the returned DMA map.
66824503465SHiten Pandya.El
66924503465SHiten Pandya.Pp
67024503465SHiten PandyaThe size of memory to be allocated is
67124503465SHiten Pandya.Fa maxsize
67224503465SHiten Pandyaas specified in
67324503465SHiten Pandya.Fa dmat .
67424503465SHiten Pandya.Pp
67524503465SHiten PandyaThe current implementation of
67624503465SHiten Pandya.Fn bus_dmamem_alloc
67724503465SHiten Pandyawill allocate all requests as a single segment.
67824503465SHiten Pandya.Pp
67924503465SHiten PandyaAlthough no explicit loading is required to access the memory
68024503465SHiten Pandyareferenced by the returned map, the synchronization requirements
68124503465SHiten Pandyaas described in the
68224503465SHiten Pandya.Fn bus_dmamap_sync
68324503465SHiten Pandyasection still apply.
68424503465SHiten Pandya.Pp
68524503465SHiten PandyaReturns
68624503465SHiten Pandya.Er ENOMEM
68724503465SHiten Pandyaif sufficient memory is not available for completing
68824503465SHiten Pandyathe operation.
68924503465SHiten Pandya.It Fn bus_dmamem_free "dmat" "*vaddr" "map"
69024503465SHiten PandyaFrees memory previously allocated by
69124503465SHiten Pandya.Fn bus_dmamem_alloc .
69224503465SHiten PandyaAny mappings
69324503465SHiten Pandyawill be invalidated.
69424503465SHiten PandyaArguments are as follows:
69524503465SHiten Pandya.Bl -tag -width vaddr -compact
69624503465SHiten Pandya.It Fa dmat
69724503465SHiten PandyaDMA tag.
69824503465SHiten Pandya.It Fa vaddr
69924503465SHiten PandyaKernel virtual address of the memory.
70024503465SHiten Pandya.It Fa map
70124503465SHiten PandyaDMA map to be invalidated.
70224503465SHiten Pandya.El
70324503465SHiten Pandya.El
70424503465SHiten Pandya.Sh RETURN VALUES
70524503465SHiten PandyaBehavior is undefined if invalid arguments are passed to
70624503465SHiten Pandyaany of the above functions.
70724503465SHiten PandyaIf sufficient resources cannot be allocated for a given
70824503465SHiten Pandyatransaction,
70924503465SHiten Pandya.Er ENOMEM
71024503465SHiten Pandyais returned.
71124503465SHiten PandyaAll
71224503465SHiten Pandyaroutines that are not of type,
71324503465SHiten Pandya.Vt void ,
71424503465SHiten Pandyawill return 0 on success or an error
71524503465SHiten Pandyacode, as discussed above.
71624503465SHiten Pandya.Pp
71724503465SHiten PandyaAll
71824503465SHiten Pandya.Vt void
71924503465SHiten Pandyaroutines will succeed if provided with valid arguments.
72024503465SHiten Pandya.Sh SEE ALSO
72124503465SHiten Pandya.Xr devclass 9 ,
72224503465SHiten Pandya.Xr device 9 ,
72324503465SHiten Pandya.Xr driver 9 ,
72424503465SHiten Pandya.Xr rman 9
72524503465SHiten Pandya.Pp
72624503465SHiten Pandya.Rs
72724503465SHiten Pandya.%A "Jason R. Thorpe"
72824503465SHiten Pandya.%T "A Machine-Independent DMA Framework for NetBSD"
72924503465SHiten Pandya.%J "Proceedings of the Summer 1998 USENIX Technical Conference"
73024503465SHiten Pandya.%Q "USENIX Association"
73124503465SHiten Pandya.%D "June 1998"
73224503465SHiten Pandya.Re
73324503465SHiten Pandya.Sh HISTORY
73424503465SHiten PandyaThe
73524503465SHiten Pandya.Nm
73624503465SHiten Pandyainterface first appeared in
73724503465SHiten Pandya.Nx 1.3 .
73824503465SHiten Pandya.Pp
73924503465SHiten PandyaThe
74024503465SHiten Pandya.Nm
74124503465SHiten PandyaAPI was adopted from
74224503465SHiten Pandya.Nx
74324503465SHiten Pandyafor use in the CAM SCSI subsystem.
74424503465SHiten PandyaThe alterations to the original API were aimed to remove the need for
74524503465SHiten Pandyaa
74624503465SHiten Pandya.Vt bus_dma_segment_t
74724503465SHiten Pandyaarray stored in each
74824503465SHiten Pandya.Vt bus_dmamap_t
74924503465SHiten Pandyawhile allowing callers to queue up on scarce resources.
75024503465SHiten Pandya.Sh AUTHORS
75124503465SHiten PandyaThe
75224503465SHiten Pandya.Nm
753b9b855ddSMaxime Henrioninterface was designed and implemented by
754b9b855ddSMaxime Henrion.An Jason R. Thorpe
755b9b855ddSMaxime Henrionof the Numerical Aerospace Simulation Facility, NASA Ames Research Center.
75624503465SHiten PandyaAdditional input on the
75724503465SHiten Pandya.Nm
758b9b855ddSMaxime Henriondesign was provided by
759b9b855ddSMaxime Henrion.An -nosplit
760b9b855ddSMaxime Henrion.An Chris Demetriou ,
761b9b855ddSMaxime Henrion.An Charles Hannum ,
762b9b855ddSMaxime Henrion.An Ross Harvey ,
763b9b855ddSMaxime Henrion.An Matthew Jacob ,
764b9b855ddSMaxime Henrion.An Jonathan Stone ,
765b9b855ddSMaxime Henrionand
766b9b855ddSMaxime Henrion.An Matt Thomas .
76724503465SHiten Pandya.Pp
76824503465SHiten PandyaThe
76924503465SHiten Pandya.Nm
77024503465SHiten Pandyainterface in
77124503465SHiten Pandya.Fx
772b9b855ddSMaxime Henrionbenefits from the contributions of
773b9b855ddSMaxime Henrion.An Justin T. Gibbs ,
774b9b855ddSMaxime Henrion.An Peter Wemm ,
775b9b855ddSMaxime Henrion.An Doug Rabson ,
776b9b855ddSMaxime Henrion.An Matthew N. Dodd ,
777b9b855ddSMaxime Henrion.An Sam Leffler ,
778b9b855ddSMaxime Henrion.An Maxime Henrion ,
779b9b855ddSMaxime Henrion.An Jake Burkholder ,
780b9b855ddSMaxime Henrion.An Takahashi Yoshihiro ,
781b9b855ddSMaxime Henrion.An Scott Long
782b9b855ddSMaxime Henrionand many others.
78324503465SHiten Pandya.Pp
784b9b855ddSMaxime HenrionThis manual page was written by
785b9b855ddSMaxime Henrion.An Hiten M. Pandya
786b9b855ddSMaxime Henrionand
787b9b855ddSMaxime Henrion.An Justin T. Gibbs .
788