• Dan Williams's avatar
    dmaengine: driver for the iop32x, iop33x, and iop13xx raid engines · c2110923
    Dan Williams authored
    The Intel(R) IOP series of i/o processors integrate an Xscale core with
    raid acceleration engines.  The capabilities per platform are:
    
    iop219:
     (2) copy engines
    iop321:
     (2) copy engines
     (1) xor and block fill engine
    iop33x:
     (2) copy and crc32c engines
     (1) xor, xor zero sum, pq, pq zero sum, and block fill engine
    iop34x (iop13xx):
     (2) copy, crc32c, xor, xor zero sum, and block fill engines
     (1) copy, crc32c, xor, xor zero sum, pq, pq zero sum, and block fill engine
    
    The driver supports the features of the async_tx api:
    * asynchronous notification of operation completion
    * implicit (interupt triggered) handling of inter-channel transaction
      dependencies
    
    The driver adapts to the platform it is running by two methods.
    1/ #include <asm/arch/adma.h> which defines the hardware specific
       iop_chan_* and iop_desc_* routines as a series of static inline
       functions
    2/ The private platform data attached to the platform_device defines the
       capabilities of the channels
    
    20070626: Callbacks are run in a tasklet.  Given the recent discussion on
    LKML about killing tasklets in favor of workqueues I did a quick conversion
    of the driver.  Raid5 resync performance dropped from 50MB/s to 30MB/s, so
    the tasklet implementation remains until a generic softirq interface is
    available.
    
    Changelog:
    * fixed a slot allocation bug in do_iop13xx_adma_xor that caused too few
    slots to be requested eventually leading to data corruption
    * enabled the slot allocation routine to attempt to free slots before
    returning -ENOMEM
    * switched the cleanup routine to solely use the software chain and the
    status register to determine if a descriptor is complete.  This is
    necessary to support other IOP engines that do not have status writeback
    capability
    * make the driver iop generic
    * modified the allocation routines to understand allocating a group of
    slots for a single operation
    * added a null xor initialization operation for the xor only channel on
    iop3xx
    * support xor operations on buffers larger than the hardware maximum
    * split the do_* routines into separate prep, src/dest set, submit stages
    * added async_tx support (dependent operations initiation at cleanup time)
    * simplified group handling
    * added interrupt support (callbacks via tasklets)
    * brought the pending depth inline with ioat (i.e. 4 descriptors)
    * drop dma mapping methods, suggested by Chris Leech
    * don't use inline in C files, Adrian Bunk
    * remove static tasklet declarations
    * make iop_adma_alloc_slots easier to read and remove chances for a
      corrupted descriptor chain
    * fix locking bug in iop_adma_alloc_chan_resources, Benjamin Herrenschmidt
    * convert capabilities over to dma_cap_mask_t
    * fixup sparse warnings
    * add descriptor flush before iop_chan_enable
    * checkpatch.pl fixes
    * gpl v2 only correction
    * move set_src, set_dest, submit to async_tx methods
    * move group_list and phys to async_tx
    
    Cc: Russell King <rmk@arm.linux.org.uk>
    Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
    c2110923
iop_adma.h 3.9 KB