xref: /freebsd/share/man/man9/bus_dma.9 (revision 71bb1f9b0c0791a73536170155d709f01cb5f618)
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.\"
6371bb1f9bSScott Long.Dd December 5, 2005
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 ,
74824f4edfSScott Long.Nm bus_dmamap_load_mbuf_sg ,
7524503465SHiten Pandya.Nm bus_dmamap_load_uio ,
7624503465SHiten Pandya.Nm bus_dmamap_unload ,
7724503465SHiten Pandya.Nm bus_dmamap_sync ,
7824503465SHiten Pandya.Nm bus_dmamem_alloc ,
79a1bd700aSHiten Pandya.Nm bus_dmamem_free
8024503465SHiten Pandya.Nd Bus and Machine Independent DMA Mapping Interface
8124503465SHiten Pandya.Sh SYNOPSIS
8224503465SHiten Pandya.In machine/bus.h
8324503465SHiten Pandya.Ft int
8424503465SHiten Pandya.Fn bus_dma_tag_create "bus_dma_tag_t parent" "bus_size_t alignment" \
8524503465SHiten Pandya"bus_size_t boundary" "bus_addr_t lowaddr" "bus_addr_t highaddr" \
8624503465SHiten Pandya"bus_dma_filter_t *filtfunc" "void *filtfuncarg" "bus_size_t maxsize" \
870e5f9b7dSScott Long"int nsegments" "bus_size_t maxsegsz" "int flags" "bus_dma_lock_t *lockfunc" \
880e5f9b7dSScott Long"void *lockfuncarg" "bus_dma_tag_t *dmat"
8924503465SHiten Pandya.Ft int
9024503465SHiten Pandya.Fn bus_dma_tag_destroy "bus_dma_tag_t dmat"
9124503465SHiten Pandya.Ft int
9224503465SHiten Pandya.Fn bus_dmamap_create "bus_dma_tag_t dmat" "int flags" "bus_dmamap_t *mapp"
9324503465SHiten Pandya.Ft int
9424503465SHiten Pandya.Fn bus_dmamap_destroy "bus_dma_tag_t dmat" "bus_dmamap_t map"
9524503465SHiten Pandya.Ft int
9624503465SHiten Pandya.Fn bus_dmamap_load "bus_dma_tag_t dmat" "bus_dmamap_t map" "void *buf" \
9724503465SHiten Pandya"bus_size_t buflen" "bus_dmamap_callback_t *callback" "void *callback_arg" \
9824503465SHiten Pandya"int flags"
9924503465SHiten Pandya.Ft int
10024503465SHiten Pandya.Fn bus_dmamap_load_mbuf "bus_dma_tag_t dmat" "bus_dmamap_t map" \
10124503465SHiten Pandya"struct mbuf *mbuf" "bus_dmamap_callback2_t *callback" "void *callback_arg" \
10224503465SHiten Pandya"int flags"
10324503465SHiten Pandya.Ft int
104824f4edfSScott Long.Fn bus_dmamap_load_mbuf_sg "bus_dma_tag_t dmat" "bus_dmamap_t map" \
105824f4edfSScott Long"struct mbuf *mbuf" "bus_dma_segment_t *segs" "int *nsegs" "int flags"
106824f4edfSScott Long.Ft int
10724503465SHiten Pandya.Fn bus_dmamap_load_uio "bus_dma_tag_t dmat" "bus_dmamap_t map" \
10824503465SHiten Pandya"struct uio *uio" "bus_dmamap_callback2_t *callback" "void *callback_arg" \
10924503465SHiten Pandya"int flags"
11024503465SHiten Pandya.Ft void
11124503465SHiten Pandya.Fn bus_dmamap_unload "bus_dma_tag_t dmat" "bus_dmamap_t map"
11224503465SHiten Pandya.Ft void
11324503465SHiten Pandya.Fn bus_dmamap_sync "bus_dma_tag_t dmat" "bus_dmamap_t map" \
11424503465SHiten Pandya"op"
115cbfef69cSWarner Losh.Ft int
116cbfef69cSWarner Losh.Fn bus_dmamem_alloc "bus_dma_tag_t dmat" "void **vaddr" \
117cbfef69cSWarner Losh"int flags" "bus_dmamap_t *mapp"
11824503465SHiten Pandya.Ft void
11924503465SHiten Pandya.Fn bus_dmamem_free "bus_dma_tag_t dmat" "void *vaddr" \
12024503465SHiten Pandya"bus_dmamap_t map"
12124503465SHiten Pandya.Sh DESCRIPTION
12224503465SHiten PandyaDirect Memory Access (DMA) is a method of transferring data
12324503465SHiten Pandyawithout involving the CPU, thus providing higher performance.
12424503465SHiten PandyaA DMA transaction can be achieved between device to memory,
12524503465SHiten Pandyadevice to device, or memory to memory.
12624503465SHiten Pandya.Pp
12724503465SHiten PandyaThe
12824503465SHiten Pandya.Nm
12924503465SHiten PandyaAPI is a bus, device, and machine-independent (MI) interface to
13024503465SHiten PandyaDMA mechanisms.
13124503465SHiten PandyaIt provides the client with flexibility and simplicity by
13224503465SHiten Pandyaabstracting machine dependent issues like setting up
13324503465SHiten PandyaDMA mappings, handling cache issues, bus specific features
13424503465SHiten Pandyaand limitations.
13524503465SHiten Pandya.Sh STRUCTURES AND TYPES
13624503465SHiten Pandya.Bl -tag -width compact
13724503465SHiten Pandya.It Vt bus_dma_tag_t
13824503465SHiten PandyaA machine-dependent (MD) opaque type that describes the
13924503465SHiten Pandyacharacteristics of DMA transactions.
14024503465SHiten PandyaDMA tags are organized into a hierarchy, with each child
14124503465SHiten Pandyatag inheriting the restrictions of its parent.
14224503465SHiten PandyaThis allows all devices along the path of DMA transactions
14324503465SHiten Pandyato contribute to the constraints of those transactions.
14424503465SHiten Pandya.It Vt bus_dma_filter_t
14524503465SHiten PandyaClient specified address filter having the format:
14624503465SHiten Pandya.Bl -tag -width compact
14724503465SHiten Pandya.It Ft int
14824503465SHiten Pandya.Fn "client_filter" "void *filtarg" "bus_addr_t testaddr"
14924503465SHiten Pandya.El
15024503465SHiten Pandya.sp
15124503465SHiten PandyaAddress filters can be specified during tag creation to allow
15259892d33SRuslan Ermilovfor devices whose DMA address restrictions cannot be specified
15324503465SHiten Pandyaby a single window.
15424503465SHiten PandyaThe
15524503465SHiten Pandya.Fa filtarg
15624503465SHiten Pandyais client specified during tag creation to be passed to all
15724503465SHiten Pandyainvocations of the callback.
15824503465SHiten PandyaThe
15924503465SHiten Pandya.Fa testaddr
16024503465SHiten Pandyaargument contains a potential starting address of a DMA mapping.
16124503465SHiten PandyaThe filter function operates on the set of addresses from
16224503465SHiten Pandya.Fa testaddr
16324503465SHiten Pandyato
16424503465SHiten Pandya.Ql trunc_page(testaddr) + PAGE_SIZE - 1 ,
16524503465SHiten Pandyainclusive.
16624503465SHiten PandyaThe filter function should return zero for any mapping in this range
16724503465SHiten Pandyathat can be accommodated by the device and non-zero otherwise.
16824503465SHiten Pandya.It Vt bus_dma_segment_t
16924503465SHiten PandyaA machine-dependent type that describes individual
17024503465SHiten PandyaDMA segments.
17124503465SHiten Pandya.Bd -literal
17224503465SHiten Pandya	bus_addr_t	ds_addr;
17324503465SHiten Pandya	bus_size_t	ds_len;
17424503465SHiten Pandya.Ed
17524503465SHiten Pandya.sp
17624503465SHiten PandyaThe
17724503465SHiten Pandya.Fa ds_addr
17824503465SHiten Pandyafield contains the device visible address of the DMA segment, and
17924503465SHiten Pandya.Fa ds_len
18024503465SHiten Pandyacontains the length of the DMA segment.
18124503465SHiten PandyaAlthough the DMA segments returned by a mapping call will adhere to
18224503465SHiten Pandyaall restrictions necessary for a successful DMA operation, some conversion
1835203edcdSRuslan Ermilov(e.g.\& a conversion from host byte order to the device's byte order) is
18424503465SHiten Pandyaalmost always required when presenting segment information to the device.
18524503465SHiten Pandya.It Vt bus_dmamap_t
18624503465SHiten PandyaA machine-dependent opaque type describing an individual mapping.
18771bb1f9bSScott LongOne map is used for each memory allocation that will be loaded.
18871bb1f9bSScott LongMaps can be reused once they have been unloaded.
18971bb1f9bSScott LongMultiple maps can be associated with one DMA tag.
19071bb1f9bSScott LongWhile the value of the map may evaluate to NULL on some platforms under
19171bb1f9bSScott Longcertain conditions, it should never be assumed that it will be NULL in all
19271bb1f9bSScott Longcases.
19324503465SHiten Pandya.It Vt bus_dmamap_callback_t
19424503465SHiten PandyaClient specified callback for receiving mapping information resulting from
19524503465SHiten Pandyathe load of a
19624503465SHiten Pandya.Vt bus_dmamap_t
19724503465SHiten Pandyavia
19824503465SHiten Pandya.Fn bus_dmamap_load .
19924503465SHiten PandyaCallbacks are of the format:
20024503465SHiten Pandya.Bl -tag -width compact
20124503465SHiten Pandya.It Ft void
20224503465SHiten Pandya.Fn "client_callback" "void *callback_arg" "bus_dma_segment_t *segs" \
20324503465SHiten Pandya"int nseg" "int error"
20424503465SHiten Pandya.El
20524503465SHiten Pandya.sp
20624503465SHiten PandyaThe
20724503465SHiten Pandya.Fa callback_arg
20824503465SHiten Pandyais the callback argument passed to dmamap load functions.
20924503465SHiten PandyaThe
21024503465SHiten Pandya.Fa segs
21124503465SHiten Pandyaand
21224503465SHiten Pandya.Fa nseg
21324503465SHiten Pandyaparameters describe an array of
21424503465SHiten Pandya.Vt bus_dma_segment_t
21524503465SHiten Pandyastructures that represent the mapping.
21624503465SHiten PandyaThis array is only valid within the scope of the callback function.
21724503465SHiten PandyaThe success or failure of the mapping is indicated by the
21824503465SHiten Pandya.Fa error
21924503465SHiten Pandyaparameter.
22024503465SHiten PandyaMore information on the use of callbacks can be found in the
22124503465SHiten Pandyadescription of the individual dmamap load functions.
22224503465SHiten Pandya.It Vt bus_dmamap_callback2_t
22324503465SHiten PandyaClient specified callback for receiving mapping information resulting from
22424503465SHiten Pandyathe load of a
22524503465SHiten Pandya.Vt bus_dmamap_t
22624503465SHiten Pandyavia
22724503465SHiten Pandya.Fn bus_dmamap_load_uio
22824503465SHiten Pandyaor
22924503465SHiten Pandya.Fn bus_dmamap_load_mbuf .
23024503465SHiten Pandya.sp
23124503465SHiten PandyaCallback2s are of the format:
23224503465SHiten Pandya.Bl -tag -width compact
23324503465SHiten Pandya.It Ft void
23424503465SHiten Pandya.Fn "client_callback2" "void *callback_arg" "bus_dma_segment_t *segs" \
23524503465SHiten Pandya"int nseg" "bus_size_t mapsize" "int error"
23624503465SHiten Pandya.El
23724503465SHiten Pandya.sp
23824503465SHiten PandyaCallback2's behavior is the same as
23924503465SHiten Pandya.Vt bus_dmamap_callback_t
24024503465SHiten Pandyawith the addition that the length of the data mapped is provided via
24124503465SHiten Pandya.Fa mapsize .
24224503465SHiten Pandya.It Vt bus_dmasync_op_t
24324503465SHiten PandyaMemory synchronization operation specifier.
24436a142c4SRuslan ErmilovBus DMA requires explicit synchronization of memory with its device
24524503465SHiten Pandyavisible mapping in order to guarantee memory coherency.
24624503465SHiten PandyaThe
24724503465SHiten Pandya.Vt bus_dmasync_op_t
24824503465SHiten Pandyaallows the type of DMA operation that will be or has been performed
24924503465SHiten Pandyato be communicated to the system so that the correct coherency measures
25024503465SHiten Pandyaare taken.
2511cb112abSScott LongThe operations are represented as bitfield flags that can be combined together,
2521cb112abSScott Longthough it only makes sense to combine PRE flags or POST flags, not both.
2531cb112abSScott LongSee the
254e8c9966dSJohn-Mark Gurney.Fn bus_dmamap_sync
2551cb112abSScott Longdescription below for more details on how to use these operations.
2566f3d2701SScott Long.Pp
2576f3d2701SScott LongAll operations specified below are performed from the host memory point of view,
2586f3d2701SScott Longwhere a read implies data coming from the device to the host memory, and a write
2596f3d2701SScott Longimplies data going from the host memory to the device.
2606f3d2701SScott LongAlternately, the operations can be thought of in terms of driver operations,
261a79d1e83SScott Longwhere reading a network packet or storage sector corresponds to a read operation
262a79d1e83SScott Longin
263a79d1e83SScott Long.Nm .
26424503465SHiten Pandya.Bl -tag -width BUS_DMASYNC_POSTWRITE
26524503465SHiten Pandya.It Dv BUS_DMASYNC_PREREAD
2666f3d2701SScott LongPerform any synchronization required prior to an update of host memory by the
2676f3d2701SScott LongDMA read operation.
26824503465SHiten Pandya.It Dv BUS_DMASYNC_PREWRITE
2696f3d2701SScott LongPerform any synchronization required after an update of host memory by the CPU
2701cb112abSScott Longand prior to DMA write operations.
27124503465SHiten Pandya.It Dv BUS_DMASYNC_POSTREAD
2721cb112abSScott LongPerform any synchronization required after DMA read operations and prior to
2736f3d2701SScott LongCPU access to host memory.
27424503465SHiten Pandya.It Dv BUS_DMASYNC_POSTWRITE
2751cb112abSScott LongPerform any synchronization required after DMA write operations.
27624503465SHiten Pandya.El
2770e5f9b7dSScott Long.It Vt bus_dma_lock_t
278c7d3a65dSHiten PandyaClient specified lock/mutex manipulation method.
279c7d3a65dSHiten PandyaThis will be called from
2800e5f9b7dSScott Longwithin busdma whenever a client lock needs to be manipulated.
2814d855643SWarner LoshIn its current form, the function will be called immediately before
2824d855643SWarner Loshthe callback for a dma load operation that has been deferred with
2834d855643SWarner Losh.Dv BUS_DMA_LOCK
2844d855643SWarner Loshand immediately after with
2854d855643SWarner Losh.Dv BUS_DMA_UNLOCK .
2864d855643SWarner LoshIf the load operation does not need to be deferred, then it
2874d855643SWarner Loshwill not be called since the function loading the map should
2884d855643SWarner Loshbe holding the appropriate locks.
2890e5f9b7dSScott LongThis method is of the format:
2900e5f9b7dSScott Long.Bl -tag -width compact
2910e5f9b7dSScott Long.It Ft void
2920e5f9b7dSScott Long.Fn "lockfunc" "void *lockfunc_arg" "bus_dma_lock_op_t op"
29324503465SHiten Pandya.El
2940e5f9b7dSScott Long.sp
2950e5f9b7dSScott LongTwo
2960e5f9b7dSScott Long.Vt lockfunc
2970e5f9b7dSScott Longimplementations are provided for convenience.
2980e5f9b7dSScott Long.Fn busdma_lock_mutex
2990e5f9b7dSScott Longperforms standard mutex operations on the sleep mutex provided via the
3000e5f9b7dSScott Long.Fa lockfuncarg .
3010e5f9b7dSScott Longpassed into
3020e5f9b7dSScott Long.Fn bus_dma_tag_create .
3030e5f9b7dSScott Long.Fn dflt_lock
304c7d3a65dSHiten Pandyawill generate a system panic if it is called.
305c7d3a65dSHiten PandyaIt is substituted into the tag when
3060e5f9b7dSScott Long.Fa lockfunc
3070e5f9b7dSScott Longis passed as NULL to
3080e5f9b7dSScott Long.Fn bus_dma_tag_create .
3090e5f9b7dSScott Long.It Vt bus_dma_lock_op_t
3100e5f9b7dSScott LongOperations to be performed by the client-specified
3110e5f9b7dSScott Long.Fn lockfunc .
3120e5f9b7dSScott Long.Bl -tag -width BUS_DMA_UNLOCK
3130e5f9b7dSScott Long.It Dv BUS_DMA_LOCK
3142988974bSMike PritchardAcquires and/or locks the client locking primitive.
3150e5f9b7dSScott Long.It Dv BUS_DMA_UNLOCK
3160e5f9b7dSScott LongReleases and/or unlocks the client locking primitive.
3170e5f9b7dSScott Long.El
3180e5f9b7dSScott Long.El
3190e5f9b7dSScott Long.sp
32024503465SHiten Pandya.Sh FUNCTIONS
32124503465SHiten Pandya.Bl -tag -width compact
32224503465SHiten Pandya.It Fn bus_dma_tag_create "parent" "alignment" "boundary" "lowaddr" \
32324503465SHiten Pandya"highaddr" "*filtfunc" "*filtfuncarg" "maxsize" "nsegments" "maxsegsz" \
3249b5c4b66SScott Long"flags" "lockfunc" "lockfuncarg" "*dmat"
32524503465SHiten PandyaAllocates a device specific DMA tag, and initializes it according to
32624503465SHiten Pandyathe arguments provided:
32724503465SHiten Pandya.Bl -tag -width *filtfuncarg -compact
32824503465SHiten Pandya.It Fa parent
32924503465SHiten PandyaIndicates restrictions between the parent bridge, CPU memory, and the
33024503465SHiten Pandyadevice.
33124503465SHiten PandyaMay be NULL, if no DMA restrictions are to be inherited.
33224503465SHiten Pandya.It Fa alignment
33324503465SHiten PandyaAlignment constraint, in bytes, of any mappings created using this tag.
33424503465SHiten PandyaThe alignment must be a power of 2.
33524503465SHiten PandyaHardware that can DMA starting at any address would specify
33624503465SHiten Pandya.Em 1
33724503465SHiten Pandyafor byte alignment.
33824503465SHiten PandyaHardware requiring DMA transfers to start on a multiple of 4K
33924503465SHiten Pandyawould specify
34024503465SHiten Pandya.Em 4096.
34124503465SHiten Pandya.It Fa boundary
34224503465SHiten PandyaBoundary constraint, in bytes, of the target DMA memory region.
34324503465SHiten PandyaThe boundary indicates the set of addresses, all multiples of the
34424503465SHiten Pandyaboundary argument, that cannot be crossed by a single
34524503465SHiten Pandya.Vt bus_dma_segment_t .
3462d4071acSChristian BruefferThe boundary must be a power of 2 and must be no smaller than the
347ab0b83b5SScott Longmaximum segment size.
34824503465SHiten Pandya.Ql 0
34924503465SHiten Pandyaindicates that there are no boundary restrictions.
35024503465SHiten Pandya.It Fa lowaddr
35124503465SHiten Pandya.It Fa highaddr
35224503465SHiten PandyaBounds of the window of bus address space that
35324503465SHiten Pandya.Em cannot
35424503465SHiten Pandyabe directly accessed by the device.
3552d4071acSChristian BruefferThe window contains all addresses greater than lowaddr and
35624503465SHiten Pandyaless than or equal to highaddr.
35724503465SHiten PandyaFor example, a device incapable of DMA above 4GB, would specify
35824503465SHiten Pandyaa highaddr of
35924503465SHiten Pandya.Dv BUS_SPACE_MAXADDR
36024503465SHiten Pandyaand a lowaddr of
36124503465SHiten Pandya.Dv BUS_SPACE_MAXADDR_32BIT .
36224503465SHiten PandyaSimilarly a device that can only dma to addresses bellow 16MB would
36324503465SHiten Pandyaspecify a highaddr of
36424503465SHiten Pandya.Dv BUS_SPACE_MAXADDR
36524503465SHiten Pandyaand a lowaddr of
36624503465SHiten Pandya.Dv BUS_SPACE_MAXADDR_24BIT .
36724503465SHiten PandyaSome implementations requires that some region of device visible
36824503465SHiten Pandyaaddress space, overlapping available host memory, be outside the
36924503465SHiten Pandyawindow.
37024503465SHiten PandyaThis area of
37124503465SHiten Pandya.Ql safe memory
37224503465SHiten Pandyais used to bounce requests that would otherwise conflict with
37324503465SHiten Pandyathe exclusion window.
37424503465SHiten Pandya.It Fa filtfunc
37524503465SHiten PandyaOptional filter function (may be NULL) to be called for any attempt to
37624503465SHiten Pandyamap memory into the window described by
37724503465SHiten Pandya.Fa lowaddr
37824503465SHiten Pandyaand
37924503465SHiten Pandya.Fa highaddr.
38024503465SHiten PandyaA filter function is only required when the single window described
38124503465SHiten Pandyaby
38224503465SHiten Pandya.Fa lowaddr
38324503465SHiten Pandyaand
38424503465SHiten Pandya.Fa highaddr
38524503465SHiten Pandyacannot adequately describe the constraints of the device.
38624503465SHiten PandyaThe filter function will be called for every machine page
38724503465SHiten Pandyathat overlaps the exclusion window.
38824503465SHiten Pandya.It Fa filtfuncarg
38924503465SHiten PandyaArgument passed to all calls to the filter function for this tag.
39024503465SHiten PandyaMay be NULL.
39124503465SHiten Pandya.It Fa maxsize
39224503465SHiten PandyaMaximum size, in bytes, of the sum of all segment lengths in a given
39324503465SHiten PandyaDMA mapping associated with this tag.
39424503465SHiten Pandya.It Fa nsegments
39524503465SHiten PandyaNumber of discontinuities (scatter/gather segments) allowed
39624503465SHiten Pandyain a DMA mapped region.
39724503465SHiten PandyaIf there is no restriction,
39824503465SHiten Pandya.Dv BUS_SPACE_UNRESTRICTED
39924503465SHiten Pandyamay be specified.
400094dc7e3SJohn-Mark Gurney.It Fa maxsegsz
401094dc7e3SJohn-Mark GurneyMaximum size, in bytes, of a segment in any DMA mapped region associated
402094dc7e3SJohn-Mark Gurneywith
403094dc7e3SJohn-Mark Gurney.Fa dmat .
40424503465SHiten Pandya.It Fa flags
40524503465SHiten PandyaAre as follows:
40624503465SHiten Pandya.Bl -tag -width "BUS_DMA_ALLOCNOW" -compact
40724503465SHiten Pandya.It Dv BUS_DMA_ALLOCNOW
4080f3a0078SScott LongPre-allocate enough resources to handle at least one map load operation on
40971bb1f9bSScott Longthis tag.
41024503465SHiten PandyaIf sufficient resources are not available,
41124503465SHiten Pandya.Er ENOMEM
41224503465SHiten Pandyais returned.
41371bb1f9bSScott LongThis should not be used for tags that only describe buffers that will be
41471bb1f9bSScott Longallocated with
41571bb1f9bSScott Long.Fn bus_dmamem_alloc .
41671bb1f9bSScott LongAlso, due to resource sharing with other tags, this flag does not guarantee
41771bb1f9bSScott Longthat resources will be allocated or reserved exclusively for this tag.
41871bb1f9bSScott LongIt should be treated only as a minor optimization.
41924503465SHiten Pandya.El
4209b5c4b66SScott Long.It Fa lockfunc
4219b5c4b66SScott LongOptional lock manipulation function (may be NULL) to be called when busdma
422c7d3a65dSHiten Pandyaneeds to manipulate a lock on behalf of the client.
423c7d3a65dSHiten PandyaIf NULL is specified,
4249b5c4b66SScott Long.Fn dflt_lock
4259b5c4b66SScott Longis used.
4269b5c4b66SScott Long.It Fa lockfuncarg
4279b5c4b66SScott LongOptional argument to be passed to the function specified by
4289b5c4b66SScott Long.Fa lockfunc .
42924503465SHiten Pandya.It Fa dmat
43024503465SHiten PandyaPointer to a bus_dma_tag_t where the resulting DMA tag will
43124503465SHiten Pandyabe stored.
43224503465SHiten Pandya.El
43324503465SHiten Pandya.Pp
43424503465SHiten PandyaReturns
43524503465SHiten Pandya.Er ENOMEM
43624503465SHiten Pandyaif sufficient memory is not available for tag creation
43724503465SHiten Pandyaor allocating mapping resources.
43824503465SHiten Pandya.It Fn bus_dma_tag_destroy "dmat"
43924503465SHiten PandyaDeallocate the DMA tag
44024503465SHiten Pandya.Fa dmat
44124503465SHiten Pandyathat was created by
44224503465SHiten Pandya.Fn bus_dma_tag_create .
44324503465SHiten Pandya.Pp
44424503465SHiten PandyaReturns
44524503465SHiten Pandya.Er EBUSY
44624503465SHiten Pandyaif any DMA maps remain associated with
44724503465SHiten Pandya.Fa dmat
44824503465SHiten Pandyaor
44924503465SHiten Pandya.Ql 0
45024503465SHiten Pandyaon success.
45124503465SHiten Pandya.It Fn bus_dmamap_create "dmat" "flags" "*mapp"
45224503465SHiten PandyaAllocates and initializes a DMA map.
45324503465SHiten PandyaArguments are as follows:
45424503465SHiten Pandya.Bl -tag -width nsegments -compact
45524503465SHiten Pandya.It Fa dmat
45624503465SHiten PandyaDMA tag.
45724503465SHiten Pandya.It Fa flags
45824503465SHiten PandyaThe value of this argument is currently undefined and should be
45924503465SHiten Pandyaspecified as
46024503465SHiten Pandya.Ql 0 .
46124503465SHiten Pandya.It Fa mapp
46224503465SHiten PandyaPointer to a
46324503465SHiten Pandya.Vt bus_dmamap_t
46424503465SHiten Pandyawhere the resulting DMA map will be stored.
46524503465SHiten Pandya.El
46624503465SHiten Pandya.Pp
46724503465SHiten PandyaReturns
46824503465SHiten Pandya.Er ENOMEM
46924503465SHiten Pandyaif sufficient memory is not available for creating the
47024503465SHiten Pandyamap or allocating mapping resources.
47124503465SHiten Pandya.It Fn bus_dmamap_destroy "dmat" "map"
47224503465SHiten PandyaFrees all resources associated with a given DMA map.
47324503465SHiten PandyaArguments are as follows:
47424503465SHiten Pandya.Bl -tag -width dmat -compact
47524503465SHiten Pandya.It Fa dmat
47624503465SHiten PandyaDMA tag used to allocate
47724503465SHiten Pandya.Fa map .
47824503465SHiten Pandya.It Fa map
47924503465SHiten PandyaThe DMA map to destroy.
48024503465SHiten Pandya.El
48124503465SHiten Pandya.Pp
48224503465SHiten PandyaReturns
48324503465SHiten Pandya.Er EBUSY
48424503465SHiten Pandyaif a mapping is still active for
48524503465SHiten Pandya.Fa map .
48695929b66SWarner Losh.It Fn bus_dmamap_load "dmat" "map" "buf" "buflen" "*callback" \
48795929b66SWarner Losh"callback_arg" "flags"
48824503465SHiten PandyaCreates a mapping in device visible address space of
48924503465SHiten Pandya.Fa buflen
49024503465SHiten Pandyabytes of
49124503465SHiten Pandya.Fa buf ,
49224503465SHiten Pandyaassociated with the DMA map
49324503465SHiten Pandya.Fa map .
49471bb1f9bSScott LongThis call will always return immediately and will not block for any reason.
49524503465SHiten PandyaArguments are as follows:
49624503465SHiten Pandya.Bl -tag -width buflen -compact
49724503465SHiten Pandya.It Fa dmat
49824503465SHiten PandyaDMA tag used to allocate
49924503465SHiten Pandya.Fa map.
50024503465SHiten Pandya.It Fa map
50124503465SHiten PandyaA DMA map without a currently active mapping.
50224503465SHiten Pandya.It Fa buf
50324503465SHiten PandyaA kernel virtual address pointer to a contiguous (in KVA) buffer, to be
50424503465SHiten Pandyamapped into device visible address space.
50524503465SHiten Pandya.It Fa buflen
50624503465SHiten PandyaThe size of the buffer.
50724503465SHiten Pandya.It Fa callback Fa callback_arg
50824503465SHiten PandyaThe callback function, and its argument.
50971bb1f9bSScott LongThis function is called once sufficient mapping resources are available for
51071bb1f9bSScott Longthe DMA operation.
51171bb1f9bSScott LongIf resources are temporarily unavailable, this function will be deferred until
51271bb1f9bSScott Longlater, but the load operation will still return immediately to the caller.
51371bb1f9bSScott LongThus, callers should not assume that the callback will be called before the
51471bb1f9bSScott Longload returns, and code should be structured appropriately to handle this.
51571bb1f9bSScott LongSee below for specific flags and error codes that control this behavior.
51624503465SHiten Pandya.It Fa flags
51771bb1f9bSScott LongAre as follows:
51871bb1f9bSScott Long.Bl -tag -width BUS_DMA_NOWAIT -compact
51971bb1f9bSScott Long.It Er BUS_DMA_NOWAIT
52071bb1f9bSScott LongThe load should not be deferred in case of insufficient mapping resources,
52171bb1f9bSScott Longand instead should return immediately with an appropriate error.
52271bb1f9bSScott Long.El
52324503465SHiten Pandya.El
52424503465SHiten Pandya.Pp
52524503465SHiten PandyaReturn values to the caller are as follows:
52624503465SHiten Pandya.Bl -tag -width EINPROGRESS -compact
52724503465SHiten Pandya.It 0
52824503465SHiten PandyaThe callback has been called and completed.
52924503465SHiten PandyaThe status of the mapping has been delivered to the callback.
53024503465SHiten Pandya.It Er EINPROGRESS
53124503465SHiten PandyaThe mapping has been deferred for lack of resources.
53224503465SHiten PandyaThe callback will be called as soon as resources are available.
53324503465SHiten PandyaCallbacks are serviced in FIFO order.
5340f3a0078SScott LongTo ensure that ordering is guaranteed, all subsequent load requests will also
5350f3a0078SScott Longbe deferred until all callbacks have been processed.
53671bb1f9bSScott Long.It Er ENOMEM
53771bb1f9bSScott LongThe load request has failed due to insufficient resources, and the caller
53871bb1f9bSScott Longspecifically used the
53971bb1f9bSScott Long.Fa BUS_DMA_NOWAIT
54071bb1f9bSScott Longflag.
54124503465SHiten Pandya.It Er EINVAL
54224503465SHiten PandyaThe load request was invalid.
54371bb1f9bSScott LongThe callback has been called and has been provided the same error.
54424503465SHiten PandyaThis error value may indicate that
54524503465SHiten Pandya.Fa dmat ,
54624503465SHiten Pandya.Fa map ,
54724503465SHiten Pandya.Fa buf ,
54824503465SHiten Pandyaor
54924503465SHiten Pandya.Fa callback
55024503465SHiten Pandyawere invalid, or
55171bb1f9bSScott Long.Fa buflen
55224503465SHiten Pandyawas larger than the
55324503465SHiten Pandya.Fa maxsize
55424503465SHiten Pandyaargument used to create the dma tag
55524503465SHiten Pandya.Fa dmat .
55624503465SHiten Pandya.El
55724503465SHiten Pandya.Pp
55824503465SHiten PandyaWhen the callback is called, it is presented with an error value
55924503465SHiten Pandyaindicating the disposition of the mapping.
56024503465SHiten PandyaError may be one of the following:
56124503465SHiten Pandya.Bl -tag -width EINPROGRESS -compact
56224503465SHiten Pandya.It 0
56324503465SHiten PandyaThe mapping was successful and the
56424503465SHiten Pandya.Fa dm_segs
56524503465SHiten Pandyacallback argument contains an array of
56624503465SHiten Pandya.Vt bus_dma_segment_t
56724503465SHiten Pandyaelements describing the mapping.
56824503465SHiten PandyaThis array is only valid during the scope of the callback function.
56924503465SHiten Pandya.It Er EFBIG
57024503465SHiten PandyaA mapping could not be achieved within the segment constraints provided
57124503465SHiten Pandyain the tag even though the requested allocation size was less than maxsize.
57224503465SHiten Pandya.El
57324503465SHiten Pandya.It Fn bus_dmamap_load_mbuf "dmat" "map" "mbuf" "callback2" "callback_arg" \
57424503465SHiten Pandya"flags"
57524503465SHiten PandyaThis is a variation of
57624503465SHiten Pandya.Fn bus_dmamap_load
57724503465SHiten Pandyawhich maps mbuf chains
57824503465SHiten Pandyafor DMA transfers.
57924503465SHiten PandyaA
58024503465SHiten Pandya.Vt bus_size_t
58124503465SHiten Pandyaargument is also passed to the callback routine, which
58224503465SHiten Pandyacontains the mbuf chain's packet header length.
58371bb1f9bSScott LongThe
58471bb1f9bSScott Long.Fa BUS_DMA_NOWAIT
58571bb1f9bSScott Longflag is implied, thus no callback deferral will happen.
58624503465SHiten Pandya.Pp
58724503465SHiten PandyaMbuf chains are assumed to be in kernel virtual address space.
58824503465SHiten Pandya.Pp
58971bb1f9bSScott LongBeside the error values listed for
59071bb1f9bSScott Long.Fn bus_dmamap_load ,
59124503465SHiten Pandya.Er EINVAL
59271bb1f9bSScott Longwill be returned if the size of the mbuf chain exceeds the maximum limit of the
59324503465SHiten PandyaDMA tag.
594824f4edfSScott Long.It Fn bus_dmamap_load_mbuf_sg "dmat" "map" "mbuf" "segs" "nsegs" "flags"
595824f4edfSScott LongThis is just like
596824f4edfSScott Long.Fn bus_dmamap_load_mbuf
5974f068961SRuslan Ermilovexcept that it returns immediately without calling a callback function.
5984f068961SRuslan ErmilovIt is provided for efficiency.
599824f4edfSScott LongThe scatter/gather segment array
600824f4edfSScott Long.Va segs
601824f4edfSScott Longis provided by the caller and filled in directly by the function.
602824f4edfSScott LongThe
603824f4edfSScott Long.Va nsegs
604824f4edfSScott Longargument is returned with the number of segments filled in.
605824f4edfSScott LongReturns the same errors as
606824f4edfSScott Long.Fn bus_dmamap_load_mbuf .
60724503465SHiten Pandya.It Fn bus_dmamap_load_uio "dmat" "map" "uio" "callback2" "callback_arg" "flags"
60824503465SHiten PandyaThis is a variation of
60924503465SHiten Pandya.Fn bus_dmamap_load
61024503465SHiten Pandyawhich maps buffers pointed to by
61124503465SHiten Pandya.Fa uio
61224503465SHiten Pandyafor DMA transfers.
61324503465SHiten PandyaA
61424503465SHiten Pandya.Vt bus_size_t
61524503465SHiten Pandyaargument is also passed to the callback routine, which contains the size of
61624503465SHiten Pandya.Fa uio ,
61724503465SHiten Pandyai.e.
61824503465SHiten Pandya.Fa uio->uio_resid .
61971bb1f9bSScott LongThe
62071bb1f9bSScott Long.Fa BUS_DMA_NOWAIT
62171bb1f9bSScott Longflag is implied, thus no callback deferral will happen.
62271bb1f9bSScott LongReturns the same errors as
62371bb1f9bSScott Long.Fn bus_dmamap_load .
62424503465SHiten Pandya.Pp
62524503465SHiten PandyaIf
62624503465SHiten Pandya.Fa uio->uio_segflg
62724503465SHiten Pandyais
62824503465SHiten Pandya.Dv UIO_USERSPACE ,
62924503465SHiten Pandyathen it is assumed that the buffer,
63024503465SHiten Pandya.Fa uio
63124503465SHiten Pandyais in
63224503465SHiten Pandya.Fa "uio->uio_td->td_proc" Ns 's
63324503465SHiten Pandyaaddress space.
63424503465SHiten PandyaUser space memory must be in-core and wired prior to attempting a map
63524503465SHiten Pandyaload operation.
636490ec740SWarner LoshPages may be locked using
637490ec740SWarner Losh.Xr vslock 9 .
63824503465SHiten Pandya.It Fn bus_dmamap_unload "dmat" "map"
63924503465SHiten PandyaUnloads a DMA map.
64024503465SHiten PandyaArguments are as follows:
64124503465SHiten Pandya.Bl -tag -width dmam -compact
64224503465SHiten Pandya.It Fa dmat
64324503465SHiten PandyaDMA tag used to allocate
64424503465SHiten Pandya.Fa map .
64524503465SHiten Pandya.It Fa map
64624503465SHiten PandyaThe DMA map that is to be unloaded.
64724503465SHiten Pandya.El
64824503465SHiten Pandya.Pp
64924503465SHiten Pandya.Fn bus_dmamap_unload
65024503465SHiten Pandyawill not perform any implicit synchronization of DMA buffers.
65124503465SHiten PandyaThis must be done explicitly by a call to
65224503465SHiten Pandya.Fn bus_dmamap_sync
65324503465SHiten Pandyaprior to unloading the map.
65424503465SHiten Pandya.It Fn bus_dmamap_sync "dmat" "map" "op"
65524503465SHiten PandyaPerforms synchronization of a device visible mapping with the CPU visible
65624503465SHiten Pandyamemory referenced by that mapping.
65724503465SHiten PandyaArguments are as follows:
65824503465SHiten Pandya.Bl -tag -width dmat -compact
65924503465SHiten Pandya.It Fa dmat
66024503465SHiten PandyaDMA tag used to allocate
66124503465SHiten Pandya.Fa map .
66224503465SHiten Pandya.It Fa map
66324503465SHiten PandyaThe DMA mapping to be synchronized.
66424503465SHiten Pandya.It Fa op
66524503465SHiten PandyaType of synchronization operation to perform.
66624503465SHiten PandyaSee the definition of
66724503465SHiten Pandya.Vt bus_dmasync_op_t
66824503465SHiten Pandyafor a description of the acceptable values for
66924503465SHiten Pandya.Fa op .
67024503465SHiten Pandya.El
67124503465SHiten Pandya.Pp
67224503465SHiten Pandya.Fn bus_dmamap_sync
67324503465SHiten Pandyais the method used to ensure that CPU and device DMA access to shared
67424503465SHiten Pandyamemory is coherent.
67524503465SHiten PandyaFor example, the CPU might be used to setup the contents of a buffer
67624503465SHiten Pandyathat is to be DMA'ed into a device.
67724503465SHiten PandyaTo ensure that the data are visible via the device's mapping of that
67824503465SHiten Pandyamemory, the buffer must be loaded and a dma sync operation of
67924503465SHiten Pandya.Dv BUS_DMASYNC_PREREAD
68024503465SHiten Pandyamust be performed.
68124503465SHiten PandyaAdditional sync operations must be performed after every CPU write
68224503465SHiten Pandyato this memory if additional DMA reads are to be performed.
68324503465SHiten PandyaConversely, for the DMA write case, the buffer must be loaded,
68424503465SHiten Pandyaand a dma sync operation of
68524503465SHiten Pandya.Dv BUS_DMASYNC_PREWRITE
68624503465SHiten Pandyamust be performed.
68724503465SHiten PandyaThe CPU will only be able to see the results of this DMA write
68824503465SHiten Pandyaonce the DMA has completed and a
68924503465SHiten Pandya.Dv BUS_DMASYNC_POSTWRITE
69024503465SHiten Pandyaoperation has been performed.
69124503465SHiten Pandya.Pp
69224503465SHiten PandyaIf DMA read and write operations are not preceded and followed by the
69324503465SHiten Pandyaappropriate synchronization operations, behavior is undefined.
6946f3d2701SScott Long.It Fn bus_dmamem_alloc "dmat" "**vaddr" "flags" "*mapp"
69524503465SHiten PandyaAllocates memory that is mapped into KVA at the address returned
69624503465SHiten Pandyain
69724503465SHiten Pandya.Fa vaddr
69824503465SHiten Pandyathat is permanently loaded into the newly created
69924503465SHiten Pandya.Vt bus_dmamap_t
70024503465SHiten Pandyareturned via
70124503465SHiten Pandya.Fa mapp .
70224503465SHiten PandyaArguments are as follows:
70324503465SHiten Pandya.Bl -tag -width alignment -compact
70424503465SHiten Pandya.It Fa dmat
70524503465SHiten PandyaDMA tag describing the constraints of the DMA mapping.
70624503465SHiten Pandya.It Fa vaddr
70724503465SHiten PandyaPointer to a pointer that will hold the returned KVA mapping of
70824503465SHiten Pandyathe allocated region.
70924503465SHiten Pandya.It Fa flags
71024503465SHiten PandyaFlags are defined as follows:
71124503465SHiten Pandya.Bl -tag -width BUS_DMA_NOWAIT -compact
71224503465SHiten Pandya.It Dv BUS_DMA_WAITOK
71324503465SHiten PandyaThe routine can safely wait (sleep) for resources.
71424503465SHiten Pandya.It Dv BUS_DMA_NOWAIT
71524503465SHiten PandyaThe routine is not allowed to wait for resources.
71624503465SHiten PandyaIf resources are not available,
71724503465SHiten Pandya.Dv ENOMEM
71824503465SHiten Pandyais returned.
71924503465SHiten Pandya.It Dv BUS_DMA_COHERENT
72024503465SHiten PandyaAttempt to map this memory such that cache sync operations are
72124503465SHiten Pandyaas cheap as possible.
72224503465SHiten PandyaThis flag is typically set on memory that will be accessed by both
72324503465SHiten Pandyaa CPU and a DMA engine, frequently.
72424503465SHiten PandyaUse of this flag does not remove the requirement of using
72524503465SHiten Pandyabus_dmamap_sync, but it may reduce the cost of performing
72624503465SHiten Pandyathese operations.
72782d227dcSMaxime Henrion.It Dv BUS_DMA_ZERO
72882d227dcSMaxime HenrionCauses the allocated memory to be set to all zeros.
72924503465SHiten Pandya.El
73024503465SHiten Pandya.It Fa mapp
7316f3d2701SScott LongPointer to a
7326f3d2701SScott Long.Vt bus_dmamap_t
7336f3d2701SScott Longwhere the resulting DMA map will be stored.
73424503465SHiten Pandya.El
73524503465SHiten Pandya.Pp
73624503465SHiten PandyaThe size of memory to be allocated is
73724503465SHiten Pandya.Fa maxsize
73824503465SHiten Pandyaas specified in
73924503465SHiten Pandya.Fa dmat .
74024503465SHiten Pandya.Pp
74124503465SHiten PandyaThe current implementation of
74224503465SHiten Pandya.Fn bus_dmamem_alloc
74324503465SHiten Pandyawill allocate all requests as a single segment.
74424503465SHiten Pandya.Pp
7456f3d2701SScott LongAn initial load operation is required to obtain the bus address of the allocated
7466f3d2701SScott Longmemory, and an unload operation is required before freeing the memory, as
7476f3d2701SScott Longdescribed below in
7486f3d2701SScott Long.Fn bus_dmamem_free .
7496f3d2701SScott LongMaps are automatically handled by this function and should not be explicitly
7506f3d2701SScott Longallocated or destroyed.
7516f3d2701SScott Long.Pp
7526f3d2701SScott LongAlthough an explicit load is not required for each access to the memory
75324503465SHiten Pandyareferenced by the returned map, the synchronization requirements
75424503465SHiten Pandyaas described in the
75524503465SHiten Pandya.Fn bus_dmamap_sync
7566f3d2701SScott Longsection still apply and should be used to achieve portability on architecutures
7576f3d2701SScott Longwithout coherent buses.
75824503465SHiten Pandya.Pp
75924503465SHiten PandyaReturns
76024503465SHiten Pandya.Er ENOMEM
76124503465SHiten Pandyaif sufficient memory is not available for completing
76224503465SHiten Pandyathe operation.
76324503465SHiten Pandya.It Fn bus_dmamem_free "dmat" "*vaddr" "map"
76424503465SHiten PandyaFrees memory previously allocated by
76524503465SHiten Pandya.Fn bus_dmamem_alloc .
76624503465SHiten PandyaAny mappings
76724503465SHiten Pandyawill be invalidated.
76824503465SHiten PandyaArguments are as follows:
76924503465SHiten Pandya.Bl -tag -width vaddr -compact
77024503465SHiten Pandya.It Fa dmat
77124503465SHiten PandyaDMA tag.
77224503465SHiten Pandya.It Fa vaddr
77324503465SHiten PandyaKernel virtual address of the memory.
77424503465SHiten Pandya.It Fa map
77524503465SHiten PandyaDMA map to be invalidated.
77624503465SHiten Pandya.El
77724503465SHiten Pandya.El
77824503465SHiten Pandya.Sh RETURN VALUES
77924503465SHiten PandyaBehavior is undefined if invalid arguments are passed to
78024503465SHiten Pandyaany of the above functions.
78124503465SHiten PandyaIf sufficient resources cannot be allocated for a given
78224503465SHiten Pandyatransaction,
78324503465SHiten Pandya.Er ENOMEM
78424503465SHiten Pandyais returned.
78524503465SHiten PandyaAll
78624503465SHiten Pandyaroutines that are not of type,
78724503465SHiten Pandya.Vt void ,
78824503465SHiten Pandyawill return 0 on success or an error
78924503465SHiten Pandyacode, as discussed above.
79024503465SHiten Pandya.Pp
79124503465SHiten PandyaAll
79224503465SHiten Pandya.Vt void
79324503465SHiten Pandyaroutines will succeed if provided with valid arguments.
79424503465SHiten Pandya.Sh SEE ALSO
79524503465SHiten Pandya.Xr devclass 9 ,
79624503465SHiten Pandya.Xr device 9 ,
79724503465SHiten Pandya.Xr driver 9 ,
798490ec740SWarner Losh.Xr rman 9 ,
799490ec740SWarner Losh.Xr vslock 9
80024503465SHiten Pandya.Pp
80124503465SHiten Pandya.Rs
80224503465SHiten Pandya.%A "Jason R. Thorpe"
80324503465SHiten Pandya.%T "A Machine-Independent DMA Framework for NetBSD"
80424503465SHiten Pandya.%J "Proceedings of the Summer 1998 USENIX Technical Conference"
80524503465SHiten Pandya.%Q "USENIX Association"
80624503465SHiten Pandya.%D "June 1998"
80724503465SHiten Pandya.Re
80824503465SHiten Pandya.Sh HISTORY
80924503465SHiten PandyaThe
81024503465SHiten Pandya.Nm
81124503465SHiten Pandyainterface first appeared in
81224503465SHiten Pandya.Nx 1.3 .
81324503465SHiten Pandya.Pp
81424503465SHiten PandyaThe
81524503465SHiten Pandya.Nm
81624503465SHiten PandyaAPI was adopted from
81724503465SHiten Pandya.Nx
81824503465SHiten Pandyafor use in the CAM SCSI subsystem.
81924503465SHiten PandyaThe alterations to the original API were aimed to remove the need for
82024503465SHiten Pandyaa
82124503465SHiten Pandya.Vt bus_dma_segment_t
82224503465SHiten Pandyaarray stored in each
82324503465SHiten Pandya.Vt bus_dmamap_t
82424503465SHiten Pandyawhile allowing callers to queue up on scarce resources.
82524503465SHiten Pandya.Sh AUTHORS
82624503465SHiten PandyaThe
82724503465SHiten Pandya.Nm
828b9b855ddSMaxime Henrioninterface was designed and implemented by
829b9b855ddSMaxime Henrion.An Jason R. Thorpe
830b9b855ddSMaxime Henrionof the Numerical Aerospace Simulation Facility, NASA Ames Research Center.
83124503465SHiten PandyaAdditional input on the
83224503465SHiten Pandya.Nm
833b9b855ddSMaxime Henriondesign was provided by
834b9b855ddSMaxime Henrion.An -nosplit
835b9b855ddSMaxime Henrion.An Chris Demetriou ,
836b9b855ddSMaxime Henrion.An Charles Hannum ,
837b9b855ddSMaxime Henrion.An Ross Harvey ,
838b9b855ddSMaxime Henrion.An Matthew Jacob ,
839b9b855ddSMaxime Henrion.An Jonathan Stone ,
840b9b855ddSMaxime Henrionand
841b9b855ddSMaxime Henrion.An Matt Thomas .
84224503465SHiten Pandya.Pp
84324503465SHiten PandyaThe
84424503465SHiten Pandya.Nm
84524503465SHiten Pandyainterface in
84624503465SHiten Pandya.Fx
847b9b855ddSMaxime Henrionbenefits from the contributions of
848b9b855ddSMaxime Henrion.An Justin T. Gibbs ,
849b9b855ddSMaxime Henrion.An Peter Wemm ,
850b9b855ddSMaxime Henrion.An Doug Rabson ,
851b9b855ddSMaxime Henrion.An Matthew N. Dodd ,
852b9b855ddSMaxime Henrion.An Sam Leffler ,
853b9b855ddSMaxime Henrion.An Maxime Henrion ,
854b9b855ddSMaxime Henrion.An Jake Burkholder ,
855b9b855ddSMaxime Henrion.An Takahashi Yoshihiro ,
856b9b855ddSMaxime Henrion.An Scott Long
857b9b855ddSMaxime Henrionand many others.
85824503465SHiten Pandya.Pp
859b9b855ddSMaxime HenrionThis manual page was written by
860b9b855ddSMaxime Henrion.An Hiten M. Pandya
861b9b855ddSMaxime Henrionand
862b9b855ddSMaxime Henrion.An Justin T. Gibbs .
863