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*bd81fe68SConrad Meyer.Dd January 5, 2016 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" 665ca9fc2aSConrad Meyer.Ft int 6731bf2875SConrad Meyer.Fn ioat_get_hwversion "bus_dmaengine_t dmaengine" 68*bd81fe68SConrad Meyer.Ft size_t 69*bd81fe68SConrad Meyer.Fn ioat_get_max_io_size "bus_dmaengine_t dmaengine" 7031bf2875SConrad Meyer.Ft int 715ca9fc2aSConrad Meyer.Fn ioat_set_interrupt_coalesce "bus_dmaengine_t dmaengine" "uint16_t delay" 725ca9fc2aSConrad Meyer.Ft uint16_t 735ca9fc2aSConrad Meyer.Fn ioat_get_max_coalesce_period "bus_dmaengine_t dmaengine" 74faefad9cSConrad Meyer.Ft void 75e974f91cSConrad Meyer.Fn ioat_acquire "bus_dmaengine_t dmaengine" 76e974f91cSConrad Meyer.Ft void 77e974f91cSConrad Meyer.Fn ioat_release "bus_dmaengine_t dmaengine" 78e974f91cSConrad Meyer.Ft struct bus_dmadesc * 79e974f91cSConrad Meyer.Fo ioat_copy 80e974f91cSConrad Meyer.Fa "bus_dmaengine_t dmaengine" 81e974f91cSConrad Meyer.Fa "bus_addr_t dst" 82e974f91cSConrad Meyer.Fa "bus_addr_t src" 83e974f91cSConrad Meyer.Fa "bus_size_t len" 84e974f91cSConrad Meyer.Fa "bus_dmaengine_callback_t callback_fn" 85e974f91cSConrad Meyer.Fa "void *callback_arg" 86e974f91cSConrad Meyer.Fa "uint32_t flags" 87e974f91cSConrad Meyer.Fc 88e974f91cSConrad Meyer.Ft struct bus_dmadesc * 899950fde0SConrad Meyer.Fo ioat_copy_8k_aligned 909950fde0SConrad Meyer.Fa "bus_dmaengine_t dmaengine" 919950fde0SConrad Meyer.Fa "bus_addr_t dst1" 929950fde0SConrad Meyer.Fa "bus_addr_t dst2" 939950fde0SConrad Meyer.Fa "bus_addr_t src1" 949950fde0SConrad Meyer.Fa "bus_addr_t src2" 959950fde0SConrad Meyer.Fa "bus_dmaengine_callback_t callback_fn" 969950fde0SConrad Meyer.Fa "void *callback_arg" 979950fde0SConrad Meyer.Fa "uint32_t flags" 989950fde0SConrad Meyer.Fc 999950fde0SConrad Meyer.Ft struct bus_dmadesc * 100faefad9cSConrad Meyer.Fo ioat_blockfill 101faefad9cSConrad Meyer.Fa "bus_dmaengine_t dmaengine" 102faefad9cSConrad Meyer.Fa "bus_addr_t dst" 103faefad9cSConrad Meyer.Fa "uint64_t fillpattern" 104faefad9cSConrad Meyer.Fa "bus_size_t len" 105faefad9cSConrad Meyer.Fa "bus_dmaengine_callback_t callback_fn" 106faefad9cSConrad Meyer.Fa "void *callback_arg" 107faefad9cSConrad Meyer.Fa "uint32_t flags" 108faefad9cSConrad Meyer.Fc 109faefad9cSConrad Meyer.Ft struct bus_dmadesc * 110e974f91cSConrad Meyer.Fo ioat_null 111e974f91cSConrad Meyer.Fa "bus_dmaengine_t dmaengine" 112e974f91cSConrad Meyer.Fa "bus_dmaengine_callback_t callback_fn" 113e974f91cSConrad Meyer.Fa "void *callback_arg" 114e974f91cSConrad Meyer.Fa "uint32_t flags" 115e974f91cSConrad Meyer.Fc 116e974f91cSConrad Meyer.Sh DESCRIPTION 117e974f91cSConrad MeyerThe 118e974f91cSConrad Meyer.Nm 119e974f91cSConrad Meyerdriver provides a kernel API to a variety of DMA engines on some Intel server 120e974f91cSConrad Meyerplatforms. 121e974f91cSConrad Meyer.Pp 122e974f91cSConrad MeyerThere is a number of DMA channels per CPU package. 123e974f91cSConrad Meyer(Typically 4 or 8.) 124e974f91cSConrad MeyerEach may be used independently. 125e974f91cSConrad MeyerOperations on a single channel proceed sequentially. 126e974f91cSConrad Meyer.Pp 127faefad9cSConrad MeyerBlockfill operations can be used to write a 64-bit pattern to memory. 128faefad9cSConrad Meyer.Pp 129faefad9cSConrad MeyerCopy operations can be used to offload memory copies to the DMA engines. 130e974f91cSConrad Meyer.Pp 131e974f91cSConrad MeyerNull operations do nothing, but may be used to test the interrupt and callback 132e974f91cSConrad Meyermechanism. 133e974f91cSConrad Meyer.Pp 134e974f91cSConrad MeyerAll operations can optionally trigger an interrupt at completion with the 135e974f91cSConrad Meyer.Ar DMA_EN_INT 136e974f91cSConrad Meyerflag. 137e974f91cSConrad MeyerFor example, a user might submit multiple operations to the same channel and 138e974f91cSConrad Meyeronly enable an interrupt and callback for the last operation. 139faefad9cSConrad Meyer.Pp 1405ca9fc2aSConrad MeyerThe hardware can delay and coalesce interrupts on a given channel for a 1415ca9fc2aSConrad Meyerconfigurable period of time, in microseconds. 1425ca9fc2aSConrad MeyerThis may be desired to reduce the processing and interrupt overhead per 1435ca9fc2aSConrad Meyerdescriptor, especially for workflows consisting of many small operations. 1445ca9fc2aSConrad MeyerSoftware can control this on a per-channel basis with the 1455ca9fc2aSConrad Meyer.Fn ioat_set_interrupt_coalesce 1465ca9fc2aSConrad MeyerAPI. 1475ca9fc2aSConrad MeyerThe 1485ca9fc2aSConrad Meyer.Fn ioat_get_max_coalesce_period 1495ca9fc2aSConrad MeyerAPI can be used to determine the maximum coalescing period supported by the 1505ca9fc2aSConrad Meyerhardware, in microseconds. 1515ca9fc2aSConrad MeyerCurrent platforms support up to a 16.383 millisecond coalescing period. 1525ca9fc2aSConrad MeyerOptimal configuration will vary by workflow and desired operation latency. 1535ca9fc2aSConrad Meyer.Pp 154faefad9cSConrad MeyerAll operations are safe to use in a non-blocking context with the 155faefad9cSConrad Meyer.Ar DMA_NO_WAIT 156faefad9cSConrad Meyerflag. 157faefad9cSConrad Meyer(Of course, allocations may fail and operations requested with 158faefad9cSConrad Meyer.Ar DMA_NO_WAIT 159faefad9cSConrad Meyermay return NULL.) 160faefad9cSConrad Meyer.Pp 161faefad9cSConrad MeyerAll operations, as well as 162faefad9cSConrad Meyer.Fn ioat_get_dmaengine , 163faefad9cSConrad Meyercan return NULL in special circumstances. 164faefad9cSConrad MeyerFor example, if the 165faefad9cSConrad Meyer.Nm 166faefad9cSConrad Meyerdriver is being unloaded, or the administrator has induced a hardware reset, or 167faefad9cSConrad Meyera usage error has resulted in a hardware error state that needs to be recovered 168faefad9cSConrad Meyerfrom. 169faefad9cSConrad Meyer.Pp 170faefad9cSConrad MeyerIt is invalid to attempt to submit new DMA operations in a 171faefad9cSConrad Meyer.Fa bus_dmaengine_callback_t 172faefad9cSConrad Meyercontext. 173e974f91cSConrad Meyer.Sh USAGE 174e974f91cSConrad MeyerA typical user will lookup the DMA engine object for a given channel with 175e974f91cSConrad Meyer.Fn ioat_get_dmaengine . 176e974f91cSConrad MeyerWhen the user wants to offload a copy, they will first 177e974f91cSConrad Meyer.Fn ioat_acquire 178e974f91cSConrad Meyerthe 179e974f91cSConrad Meyer.Ar bus_dmaengine_t 180e974f91cSConrad Meyerobject for exclusive access to enqueue operations on that channel. 181e974f91cSConrad MeyerThen, they will submit one or more operations using 182faefad9cSConrad Meyer.Fn ioat_blockfill , 183faefad9cSConrad Meyer.Fn ioat_copy , 184e974f91cSConrad Meyeror 185e974f91cSConrad Meyer.Fn ioat_null . 1869950fde0SConrad MeyerAfter queuing one or more individual DMA operations, they will 187e974f91cSConrad Meyer.Fn ioat_release 188e974f91cSConrad Meyerthe 189e974f91cSConrad Meyer.Ar bus_dmaengine_t 190e974f91cSConrad Meyerto drop their exclusive access to the channel. 191e974f91cSConrad MeyerThe routine they provided for the 192e974f91cSConrad Meyer.Fa callback_fn 193e974f91cSConrad Meyerargument will be invoked with the provided 194e974f91cSConrad Meyer.Fa callback_arg 195e974f91cSConrad Meyerwhen the operation is complete. 196faefad9cSConrad MeyerWhen they are finished with the 197faefad9cSConrad Meyer.Ar bus_dmaengine_t , 198faefad9cSConrad Meyerthe user should 199faefad9cSConrad Meyer.Fn ioat_put_dmaengine . 200faefad9cSConrad Meyer.Pp 201faefad9cSConrad MeyerUsers MUST NOT block between 202faefad9cSConrad Meyer.Fn ioat_acquire 203faefad9cSConrad Meyerand 204faefad9cSConrad Meyer.Fn ioat_release . 205faefad9cSConrad MeyerUsers SHOULD NOT hold 206faefad9cSConrad Meyer.Ar bus_dmaengine_t 207faefad9cSConrad Meyerreferences for a very long time to enable fault recovery and kernel module 208faefad9cSConrad Meyerunload. 209e974f91cSConrad Meyer.Pp 210e974f91cSConrad MeyerFor an example of usage, see 211e974f91cSConrad Meyer.Pa src/sys/dev/ioat/ioat_test.c . 212e974f91cSConrad Meyer.Sh FILES 213280186c7SChristian Brueffer.Bl -tag 214e974f91cSConrad Meyer.It Pa /dev/ioat_test 215e974f91cSConrad Meyertest device for 216e974f91cSConrad Meyer.Xr ioatcontrol 8 217e974f91cSConrad Meyer.El 218e974f91cSConrad Meyer.Sh SEE ALSO 219e974f91cSConrad Meyer.Xr ioatcontrol 8 220e974f91cSConrad Meyer.Sh HISTORY 221e974f91cSConrad MeyerThe 222e974f91cSConrad Meyer.Nm 223e974f91cSConrad Meyerdriver first appeared in 224e974f91cSConrad Meyer.Fx 11.0 . 225e974f91cSConrad Meyer.Sh AUTHORS 226e974f91cSConrad MeyerThe 227e974f91cSConrad Meyer.Nm 228e974f91cSConrad Meyerdriver was developed by 229e974f91cSConrad Meyer.An \&Jim Harris Aq Mt jimharris@FreeBSD.org , 230faefad9cSConrad Meyer.An \&Carl Delsey Aq Mt carl.r.delsey@intel.com , 231e974f91cSConrad Meyerand 232faefad9cSConrad Meyer.An \&Conrad Meyer Aq Mt cem@FreeBSD.org . 233e974f91cSConrad MeyerThis manual page was written by 234e974f91cSConrad Meyer.An \&Conrad Meyer Aq Mt cem@FreeBSD.org . 235e974f91cSConrad Meyer.Sh CAVEATS 236e974f91cSConrad MeyerCopy operation takes bus addresses as parameters, not virtual addresses. 237e974f91cSConrad Meyer.Pp 238faefad9cSConrad MeyerBuffers for individual copy operations must be physically contiguous. 239faefad9cSConrad Meyer.Pp 240faefad9cSConrad MeyerCopies larger than max transfer size (1MB, but may vary by hardware) are not 241faefad9cSConrad Meyersupported. 242e974f91cSConrad MeyerFuture versions will likely support this by breaking up the transfer into 243e974f91cSConrad Meyersmaller sizes. 244e974f91cSConrad Meyer.Sh BUGS 245e974f91cSConrad MeyerThe 246e974f91cSConrad Meyer.Nm 247faefad9cSConrad Meyerdriver only supports blockfill, copy, and null operations at this time. 248e974f91cSConrad MeyerThe driver does not yet support advanced DMA modes, such as XOR, that some 249e974f91cSConrad MeyerI/OAT devices support. 250