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*faefad9cSConrad Meyer.Dd October 31, 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 34*faefad9cSConrad MeyerTo compile this driver into your kernel, 35*faefad9cSConrad Meyerplace the following line in your kernel configuration file: 36*faefad9cSConrad Meyer.Bd -ragged -offset indent 37e974f91cSConrad Meyer.Cd "device ioat" 38*faefad9cSConrad Meyer.Ed 39*faefad9cSConrad Meyer.Pp 40*faefad9cSConrad MeyerOr, to load the driver as a module at boot, place the following line in 41*faefad9cSConrad Meyer.Xr loader.conf 5 : 42*faefad9cSConrad Meyer.Bd -literal -offset indent 43*faefad9cSConrad Meyerioat_load="YES" 44*faefad9cSConrad Meyer.Ed 45*faefad9cSConrad 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 60*faefad9cSConrad 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 65*faefad9cSConrad Meyer.Fn ioat_put_dmaengine "bus_dmaengine_t dmaengine" 66*faefad9cSConrad 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*faefad9cSConrad Meyer.Fo ioat_blockfill 82*faefad9cSConrad Meyer.Fa "bus_dmaengine_t dmaengine" 83*faefad9cSConrad Meyer.Fa "bus_addr_t dst" 84*faefad9cSConrad Meyer.Fa "uint64_t fillpattern" 85*faefad9cSConrad Meyer.Fa "bus_size_t len" 86*faefad9cSConrad Meyer.Fa "bus_dmaengine_callback_t callback_fn" 87*faefad9cSConrad Meyer.Fa "void *callback_arg" 88*faefad9cSConrad Meyer.Fa "uint32_t flags" 89*faefad9cSConrad Meyer.Fc 90*faefad9cSConrad Meyer.Ft struct bus_dmadesc * 91e974f91cSConrad Meyer.Fo ioat_null 92e974f91cSConrad Meyer.Fa "bus_dmaengine_t dmaengine" 93e974f91cSConrad Meyer.Fa "bus_dmaengine_callback_t callback_fn" 94e974f91cSConrad Meyer.Fa "void *callback_arg" 95e974f91cSConrad Meyer.Fa "uint32_t flags" 96e974f91cSConrad Meyer.Fc 97e974f91cSConrad Meyer.Sh DESCRIPTION 98e974f91cSConrad MeyerThe 99e974f91cSConrad Meyer.Nm 100e974f91cSConrad Meyerdriver provides a kernel API to a variety of DMA engines on some Intel server 101e974f91cSConrad Meyerplatforms. 102e974f91cSConrad Meyer.Pp 103e974f91cSConrad MeyerThere is a number of DMA channels per CPU package. 104e974f91cSConrad Meyer(Typically 4 or 8.) 105e974f91cSConrad MeyerEach may be used independently. 106e974f91cSConrad MeyerOperations on a single channel proceed sequentially. 107e974f91cSConrad Meyer.Pp 108*faefad9cSConrad MeyerBlockfill operations can be used to write a 64-bit pattern to memory. 109*faefad9cSConrad Meyer.Pp 110*faefad9cSConrad MeyerCopy operations can be used to offload memory copies to the DMA engines. 111e974f91cSConrad Meyer.Pp 112e974f91cSConrad MeyerNull operations do nothing, but may be used to test the interrupt and callback 113e974f91cSConrad Meyermechanism. 114e974f91cSConrad Meyer.Pp 115e974f91cSConrad MeyerAll operations can optionally trigger an interrupt at completion with the 116e974f91cSConrad Meyer.Ar DMA_EN_INT 117e974f91cSConrad Meyerflag. 118e974f91cSConrad MeyerFor example, a user might submit multiple operations to the same channel and 119e974f91cSConrad Meyeronly enable an interrupt and callback for the last operation. 120*faefad9cSConrad Meyer.Pp 121*faefad9cSConrad MeyerAll operations are safe to use in a non-blocking context with the 122*faefad9cSConrad Meyer.Ar DMA_NO_WAIT 123*faefad9cSConrad Meyerflag. 124*faefad9cSConrad Meyer(Of course, allocations may fail and operations requested with 125*faefad9cSConrad Meyer.Ar DMA_NO_WAIT 126*faefad9cSConrad Meyermay return NULL.) 127*faefad9cSConrad Meyer.Pp 128*faefad9cSConrad MeyerAll operations, as well as 129*faefad9cSConrad Meyer.Fn ioat_get_dmaengine , 130*faefad9cSConrad Meyercan return NULL in special circumstances. 131*faefad9cSConrad MeyerFor example, if the 132*faefad9cSConrad Meyer.Nm 133*faefad9cSConrad Meyerdriver is being unloaded, or the administrator has induced a hardware reset, or 134*faefad9cSConrad Meyera usage error has resulted in a hardware error state that needs to be recovered 135*faefad9cSConrad Meyerfrom. 136*faefad9cSConrad Meyer.Pp 137*faefad9cSConrad MeyerIt is invalid to attempt to submit new DMA operations in a 138*faefad9cSConrad Meyer.Fa bus_dmaengine_callback_t 139*faefad9cSConrad Meyercontext. 140e974f91cSConrad Meyer.Sh USAGE 141e974f91cSConrad MeyerA typical user will lookup the DMA engine object for a given channel with 142e974f91cSConrad Meyer.Fn ioat_get_dmaengine . 143e974f91cSConrad MeyerWhen the user wants to offload a copy, they will first 144e974f91cSConrad Meyer.Fn ioat_acquire 145e974f91cSConrad Meyerthe 146e974f91cSConrad Meyer.Ar bus_dmaengine_t 147e974f91cSConrad Meyerobject for exclusive access to enqueue operations on that channel. 148e974f91cSConrad MeyerThen, they will submit one or more operations using 149*faefad9cSConrad Meyer.Fn ioat_blockfill , 150*faefad9cSConrad Meyer.Fn ioat_copy , 151e974f91cSConrad Meyeror 152e974f91cSConrad Meyer.Fn ioat_null . 153*faefad9cSConrad MeyerAfter queueing one or more individual DMA operations, they will 154e974f91cSConrad Meyer.Fn ioat_release 155e974f91cSConrad Meyerthe 156e974f91cSConrad Meyer.Ar bus_dmaengine_t 157e974f91cSConrad Meyerto drop their exclusive access to the channel. 158e974f91cSConrad MeyerThe routine they provided for the 159e974f91cSConrad Meyer.Fa callback_fn 160e974f91cSConrad Meyerargument will be invoked with the provided 161e974f91cSConrad Meyer.Fa callback_arg 162e974f91cSConrad Meyerwhen the operation is complete. 163*faefad9cSConrad MeyerWhen they are finished with the 164*faefad9cSConrad Meyer.Ar bus_dmaengine_t , 165*faefad9cSConrad Meyerthe user should 166*faefad9cSConrad Meyer.Fn ioat_put_dmaengine . 167*faefad9cSConrad Meyer.Pp 168*faefad9cSConrad MeyerUsers MUST NOT block between 169*faefad9cSConrad Meyer.Fn ioat_acquire 170*faefad9cSConrad Meyerand 171*faefad9cSConrad Meyer.Fn ioat_release . 172*faefad9cSConrad MeyerUsers SHOULD NOT hold 173*faefad9cSConrad Meyer.Ar bus_dmaengine_t 174*faefad9cSConrad Meyerreferences for a very long time to enable fault recovery and kernel module 175*faefad9cSConrad Meyerunload. 176e974f91cSConrad Meyer.Pp 177e974f91cSConrad MeyerFor an example of usage, see 178e974f91cSConrad Meyer.Pa src/sys/dev/ioat/ioat_test.c . 179e974f91cSConrad Meyer.Sh FILES 180e974f91cSConrad Meyer.Bl -tag -compat 181e974f91cSConrad Meyer.It Pa /dev/ioat_test 182e974f91cSConrad Meyertest device for 183e974f91cSConrad Meyer.Xr ioatcontrol 8 184e974f91cSConrad Meyer.El 185e974f91cSConrad Meyer.Sh SEE ALSO 186e974f91cSConrad Meyer.Xr ioatcontrol 8 187e974f91cSConrad Meyer.Sh HISTORY 188e974f91cSConrad MeyerThe 189e974f91cSConrad Meyer.Nm 190e974f91cSConrad Meyerdriver first appeared in 191e974f91cSConrad Meyer.Fx 11.0 . 192e974f91cSConrad Meyer.Sh AUTHORS 193e974f91cSConrad MeyerThe 194e974f91cSConrad Meyer.Nm 195e974f91cSConrad Meyerdriver was developed by 196e974f91cSConrad Meyer.An \&Jim Harris Aq Mt jimharris@FreeBSD.org , 197*faefad9cSConrad Meyer.An \&Carl Delsey Aq Mt carl.r.delsey@intel.com , 198e974f91cSConrad Meyerand 199*faefad9cSConrad Meyer.An \&Conrad Meyer Aq Mt cem@FreeBSD.org . 200e974f91cSConrad MeyerThis manual page was written by 201e974f91cSConrad Meyer.An \&Conrad Meyer Aq Mt cem@FreeBSD.org . 202e974f91cSConrad Meyer.Sh CAVEATS 203e974f91cSConrad MeyerCopy operation takes bus addresses as parameters, not virtual addresses. 204e974f91cSConrad Meyer.Pp 205*faefad9cSConrad MeyerBuffers for individual copy operations must be physically contiguous. 206*faefad9cSConrad Meyer.Pp 207*faefad9cSConrad MeyerCopies larger than max transfer size (1MB, but may vary by hardware) are not 208*faefad9cSConrad Meyersupported. 209e974f91cSConrad MeyerFuture versions will likely support this by breaking up the transfer into 210e974f91cSConrad Meyersmaller sizes. 211e974f91cSConrad Meyer.Sh BUGS 212e974f91cSConrad MeyerThe 213e974f91cSConrad Meyer.Nm 214*faefad9cSConrad Meyerdriver only supports blockfill, copy, and null operations at this time. 215e974f91cSConrad MeyerThe driver does not yet support advanced DMA modes, such as XOR, that some 216e974f91cSConrad MeyerI/OAT devices support. 217