xref: /freebsd/share/man/man4/ioat.4 (revision 9950fde08daf5f30631d61601cc601e6e7a64055)
1e974f91cSConrad Meyer.\" Copyright (c) 2015 EMC / Isilon Storage Division
2e974f91cSConrad Meyer.\" All rights reserved.
3e974f91cSConrad Meyer.\"
4e974f91cSConrad Meyer.\" Redistribution and use in source and binary forms, with or without
5e974f91cSConrad Meyer.\" modification, are permitted provided that the following conditions
6e974f91cSConrad Meyer.\" are met:
7e974f91cSConrad Meyer.\" 1. Redistributions of source code must retain the above copyright
8e974f91cSConrad Meyer.\"    notice, this list of conditions and the following disclaimer.
9e974f91cSConrad Meyer.\" 2. Redistributions in binary form must reproduce the above copyright
10e974f91cSConrad Meyer.\"    notice, this list of conditions and the following disclaimer in the
11e974f91cSConrad Meyer.\"    documentation and/or other materials provided with the distribution.
12e974f91cSConrad Meyer.\"
13e974f91cSConrad Meyer.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
14e974f91cSConrad Meyer.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15e974f91cSConrad Meyer.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16e974f91cSConrad Meyer.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
17e974f91cSConrad Meyer.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18e974f91cSConrad Meyer.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19e974f91cSConrad Meyer.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
20e974f91cSConrad Meyer.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21e974f91cSConrad Meyer.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22e974f91cSConrad Meyer.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23e974f91cSConrad Meyer.\" SUCH DAMAGE.
24e974f91cSConrad Meyer.\"
25e974f91cSConrad Meyer.\" $FreeBSD$
26e974f91cSConrad Meyer.\"
27*9950fde0SConrad Meyer.Dd December 9, 2015
28e974f91cSConrad Meyer.Dt IOAT 4
29e974f91cSConrad Meyer.Os
30e974f91cSConrad Meyer.Sh NAME
31e974f91cSConrad Meyer.Nm I/OAT
32e974f91cSConrad Meyer.Nd Intel I/O Acceleration Technology
33e974f91cSConrad Meyer.Sh SYNOPSIS
34faefad9cSConrad MeyerTo compile this driver into your kernel,
35faefad9cSConrad Meyerplace the following line in your kernel configuration file:
36faefad9cSConrad Meyer.Bd -ragged -offset indent
37e974f91cSConrad Meyer.Cd "device ioat"
38faefad9cSConrad Meyer.Ed
39faefad9cSConrad Meyer.Pp
40faefad9cSConrad MeyerOr, to load the driver as a module at boot, place the following line in
41faefad9cSConrad Meyer.Xr loader.conf 5 :
42faefad9cSConrad Meyer.Bd -literal -offset indent
43faefad9cSConrad Meyerioat_load="YES"
44faefad9cSConrad Meyer.Ed
45faefad9cSConrad Meyer.Pp
46e974f91cSConrad MeyerIn
47e974f91cSConrad Meyer.Xr loader.conf 5 :
48e974f91cSConrad Meyer.Pp
49e974f91cSConrad Meyer.Cd hw.ioat.force_legacy_interrupts=0
50e974f91cSConrad Meyer.Pp
51e974f91cSConrad MeyerIn
52e974f91cSConrad Meyer.Xr loader.conf 5 or
53e974f91cSConrad Meyer.Xr sysctl.conf 5 :
54e974f91cSConrad Meyer.Pp
55e974f91cSConrad Meyer.Cd hw.ioat.enable_ioat_test=0
56e974f91cSConrad Meyer.Cd hw.ioat.debug_level=0
57e974f91cSConrad Meyer(only critical errors; maximum of 3)
58e974f91cSConrad Meyer.Pp
59e974f91cSConrad Meyer.Ft typedef void
60faefad9cSConrad Meyer.Fn (*bus_dmaengine_callback_t) "void *arg" "int error"
61e974f91cSConrad Meyer.Pp
62e974f91cSConrad Meyer.Ft bus_dmaengine_t
63e974f91cSConrad Meyer.Fn ioat_get_dmaengine "uint32_t channel_index"
64e974f91cSConrad Meyer.Ft void
65faefad9cSConrad Meyer.Fn ioat_put_dmaengine "bus_dmaengine_t dmaengine"
66faefad9cSConrad Meyer.Ft void
67e974f91cSConrad Meyer.Fn ioat_acquire "bus_dmaengine_t dmaengine"
68e974f91cSConrad Meyer.Ft void
69e974f91cSConrad Meyer.Fn ioat_release "bus_dmaengine_t dmaengine"
70e974f91cSConrad Meyer.Ft struct bus_dmadesc *
71e974f91cSConrad Meyer.Fo ioat_copy
72e974f91cSConrad Meyer.Fa "bus_dmaengine_t dmaengine"
73e974f91cSConrad Meyer.Fa "bus_addr_t dst"
74e974f91cSConrad Meyer.Fa "bus_addr_t src"
75e974f91cSConrad Meyer.Fa "bus_size_t len"
76e974f91cSConrad Meyer.Fa "bus_dmaengine_callback_t callback_fn"
77e974f91cSConrad Meyer.Fa "void *callback_arg"
78e974f91cSConrad Meyer.Fa "uint32_t flags"
79e974f91cSConrad Meyer.Fc
80e974f91cSConrad Meyer.Ft struct bus_dmadesc *
81*9950fde0SConrad Meyer.Fo ioat_copy_8k_aligned
82*9950fde0SConrad Meyer.Fa "bus_dmaengine_t dmaengine"
83*9950fde0SConrad Meyer.Fa "bus_addr_t dst1"
84*9950fde0SConrad Meyer.Fa "bus_addr_t dst2"
85*9950fde0SConrad Meyer.Fa "bus_addr_t src1"
86*9950fde0SConrad Meyer.Fa "bus_addr_t src2"
87*9950fde0SConrad Meyer.Fa "bus_dmaengine_callback_t callback_fn"
88*9950fde0SConrad Meyer.Fa "void *callback_arg"
89*9950fde0SConrad Meyer.Fa "uint32_t flags"
90*9950fde0SConrad Meyer.Fc
91*9950fde0SConrad Meyer.Ft struct bus_dmadesc *
92faefad9cSConrad Meyer.Fo ioat_blockfill
93faefad9cSConrad Meyer.Fa "bus_dmaengine_t dmaengine"
94faefad9cSConrad Meyer.Fa "bus_addr_t dst"
95faefad9cSConrad Meyer.Fa "uint64_t fillpattern"
96faefad9cSConrad Meyer.Fa "bus_size_t len"
97faefad9cSConrad Meyer.Fa "bus_dmaengine_callback_t callback_fn"
98faefad9cSConrad Meyer.Fa "void *callback_arg"
99faefad9cSConrad Meyer.Fa "uint32_t flags"
100faefad9cSConrad Meyer.Fc
101faefad9cSConrad Meyer.Ft struct bus_dmadesc *
102e974f91cSConrad Meyer.Fo ioat_null
103e974f91cSConrad Meyer.Fa "bus_dmaengine_t dmaengine"
104e974f91cSConrad Meyer.Fa "bus_dmaengine_callback_t callback_fn"
105e974f91cSConrad Meyer.Fa "void *callback_arg"
106e974f91cSConrad Meyer.Fa "uint32_t flags"
107e974f91cSConrad Meyer.Fc
108e974f91cSConrad Meyer.Sh DESCRIPTION
109e974f91cSConrad MeyerThe
110e974f91cSConrad Meyer.Nm
111e974f91cSConrad Meyerdriver provides a kernel API to a variety of DMA engines on some Intel server
112e974f91cSConrad Meyerplatforms.
113e974f91cSConrad Meyer.Pp
114e974f91cSConrad MeyerThere is a number of DMA channels per CPU package.
115e974f91cSConrad Meyer(Typically 4 or 8.)
116e974f91cSConrad MeyerEach may be used independently.
117e974f91cSConrad MeyerOperations on a single channel proceed sequentially.
118e974f91cSConrad Meyer.Pp
119faefad9cSConrad MeyerBlockfill operations can be used to write a 64-bit pattern to memory.
120faefad9cSConrad Meyer.Pp
121faefad9cSConrad MeyerCopy operations can be used to offload memory copies to the DMA engines.
122e974f91cSConrad Meyer.Pp
123e974f91cSConrad MeyerNull operations do nothing, but may be used to test the interrupt and callback
124e974f91cSConrad Meyermechanism.
125e974f91cSConrad Meyer.Pp
126e974f91cSConrad MeyerAll operations can optionally trigger an interrupt at completion with the
127e974f91cSConrad Meyer.Ar DMA_EN_INT
128e974f91cSConrad Meyerflag.
129e974f91cSConrad MeyerFor example, a user might submit multiple operations to the same channel and
130e974f91cSConrad Meyeronly enable an interrupt and callback for the last operation.
131faefad9cSConrad Meyer.Pp
132faefad9cSConrad MeyerAll operations are safe to use in a non-blocking context with the
133faefad9cSConrad Meyer.Ar DMA_NO_WAIT
134faefad9cSConrad Meyerflag.
135faefad9cSConrad Meyer(Of course, allocations may fail and operations requested with
136faefad9cSConrad Meyer.Ar DMA_NO_WAIT
137faefad9cSConrad Meyermay return NULL.)
138faefad9cSConrad Meyer.Pp
139faefad9cSConrad MeyerAll operations, as well as
140faefad9cSConrad Meyer.Fn ioat_get_dmaengine ,
141faefad9cSConrad Meyercan return NULL in special circumstances.
142faefad9cSConrad MeyerFor example, if the
143faefad9cSConrad Meyer.Nm
144faefad9cSConrad Meyerdriver is being unloaded, or the administrator has induced a hardware reset, or
145faefad9cSConrad Meyera usage error has resulted in a hardware error state that needs to be recovered
146faefad9cSConrad Meyerfrom.
147faefad9cSConrad Meyer.Pp
148faefad9cSConrad MeyerIt is invalid to attempt to submit new DMA operations in a
149faefad9cSConrad Meyer.Fa bus_dmaengine_callback_t
150faefad9cSConrad Meyercontext.
151e974f91cSConrad Meyer.Sh USAGE
152e974f91cSConrad MeyerA typical user will lookup the DMA engine object for a given channel with
153e974f91cSConrad Meyer.Fn ioat_get_dmaengine .
154e974f91cSConrad MeyerWhen the user wants to offload a copy, they will first
155e974f91cSConrad Meyer.Fn ioat_acquire
156e974f91cSConrad Meyerthe
157e974f91cSConrad Meyer.Ar bus_dmaengine_t
158e974f91cSConrad Meyerobject for exclusive access to enqueue operations on that channel.
159e974f91cSConrad MeyerThen, they will submit one or more operations using
160faefad9cSConrad Meyer.Fn ioat_blockfill ,
161faefad9cSConrad Meyer.Fn ioat_copy ,
162e974f91cSConrad Meyeror
163e974f91cSConrad Meyer.Fn ioat_null .
164*9950fde0SConrad MeyerAfter queuing one or more individual DMA operations, they will
165e974f91cSConrad Meyer.Fn ioat_release
166e974f91cSConrad Meyerthe
167e974f91cSConrad Meyer.Ar bus_dmaengine_t
168e974f91cSConrad Meyerto drop their exclusive access to the channel.
169e974f91cSConrad MeyerThe routine they provided for the
170e974f91cSConrad Meyer.Fa callback_fn
171e974f91cSConrad Meyerargument will be invoked with the provided
172e974f91cSConrad Meyer.Fa callback_arg
173e974f91cSConrad Meyerwhen the operation is complete.
174faefad9cSConrad MeyerWhen they are finished with the
175faefad9cSConrad Meyer.Ar bus_dmaengine_t ,
176faefad9cSConrad Meyerthe user should
177faefad9cSConrad Meyer.Fn ioat_put_dmaengine .
178faefad9cSConrad Meyer.Pp
179faefad9cSConrad MeyerUsers MUST NOT block between
180faefad9cSConrad Meyer.Fn ioat_acquire
181faefad9cSConrad Meyerand
182faefad9cSConrad Meyer.Fn ioat_release .
183faefad9cSConrad MeyerUsers SHOULD NOT hold
184faefad9cSConrad Meyer.Ar bus_dmaengine_t
185faefad9cSConrad Meyerreferences for a very long time to enable fault recovery and kernel module
186faefad9cSConrad Meyerunload.
187e974f91cSConrad Meyer.Pp
188e974f91cSConrad MeyerFor an example of usage, see
189e974f91cSConrad Meyer.Pa src/sys/dev/ioat/ioat_test.c .
190e974f91cSConrad Meyer.Sh FILES
191e974f91cSConrad Meyer.Bl -tag -compat
192e974f91cSConrad Meyer.It Pa /dev/ioat_test
193e974f91cSConrad Meyertest device for
194e974f91cSConrad Meyer.Xr ioatcontrol 8
195e974f91cSConrad Meyer.El
196e974f91cSConrad Meyer.Sh SEE ALSO
197e974f91cSConrad Meyer.Xr ioatcontrol 8
198e974f91cSConrad Meyer.Sh HISTORY
199e974f91cSConrad MeyerThe
200e974f91cSConrad Meyer.Nm
201e974f91cSConrad Meyerdriver first appeared in
202e974f91cSConrad Meyer.Fx 11.0 .
203e974f91cSConrad Meyer.Sh AUTHORS
204e974f91cSConrad MeyerThe
205e974f91cSConrad Meyer.Nm
206e974f91cSConrad Meyerdriver was developed by
207e974f91cSConrad Meyer.An \&Jim Harris Aq Mt jimharris@FreeBSD.org ,
208faefad9cSConrad Meyer.An \&Carl Delsey Aq Mt carl.r.delsey@intel.com ,
209e974f91cSConrad Meyerand
210faefad9cSConrad Meyer.An \&Conrad Meyer Aq Mt cem@FreeBSD.org .
211e974f91cSConrad MeyerThis manual page was written by
212e974f91cSConrad Meyer.An \&Conrad Meyer Aq Mt cem@FreeBSD.org .
213e974f91cSConrad Meyer.Sh CAVEATS
214e974f91cSConrad MeyerCopy operation takes bus addresses as parameters, not virtual addresses.
215e974f91cSConrad Meyer.Pp
216faefad9cSConrad MeyerBuffers for individual copy operations must be physically contiguous.
217faefad9cSConrad Meyer.Pp
218faefad9cSConrad MeyerCopies larger than max transfer size (1MB, but may vary by hardware) are not
219faefad9cSConrad Meyersupported.
220e974f91cSConrad MeyerFuture versions will likely support this by breaking up the transfer into
221e974f91cSConrad Meyersmaller sizes.
222e974f91cSConrad Meyer.Sh BUGS
223e974f91cSConrad MeyerThe
224e974f91cSConrad Meyer.Nm
225faefad9cSConrad Meyerdriver only supports blockfill, copy, and null operations at this time.
226e974f91cSConrad MeyerThe driver does not yet support advanced DMA modes, such as XOR, that some
227e974f91cSConrad MeyerI/OAT devices support.
228