1. 09 9月, 2009 28 次提交
  2. 30 8月, 2009 3 次提交
    • D
      dmatest: add pq support · 58691d64
      Dan Williams 提交于
      Test raid6 p+q operations with a simple "always multiply by 1" q
      calculation to fit into dmatest's current destination verification
      scheme.
      Reviewed-by: NAndre Noll <maan@systemlinux.org>
      Acked-by: NMaciej Sosnowski <maciej.sosnowski@intel.com>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      
      58691d64
    • D
      async_tx: add support for asynchronous GF multiplication · b2f46fd8
      Dan Williams 提交于
      [ Based on an original patch by Yuri Tikhonov ]
      
      This adds support for doing asynchronous GF multiplication by adding
      two additional functions to the async_tx API:
      
       async_gen_syndrome() does simultaneous XOR and Galois field
          multiplication of sources.
      
       async_syndrome_val() validates the given source buffers against known P
          and Q values.
      
      When a request is made to run async_pq against more than the hardware
      maximum number of supported sources we need to reuse the previous
      generated P and Q values as sources into the next operation.  Care must
      be taken to remove Q from P' and P from Q'.  For example to perform a 5
      source pq op with hardware that only supports 4 sources at a time the
      following approach is taken:
      
      p, q = PQ(src0, src1, src2, src3, COEF({01}, {02}, {04}, {08}))
      p', q' = PQ(p, q, q, src4, COEF({00}, {01}, {00}, {10}))
      
      p' = p + q + q + src4 = p + src4
      q' = {00}*p + {01}*q + {00}*q + {10}*src4 = q + {10}*src4
      
      Note: 4 is the minimum acceptable maxpq otherwise we punt to
      synchronous-software path.
      
      The DMA_PREP_CONTINUE flag indicates to the driver to reuse p and q as
      sources (in the above manner) and fill the remaining slots up to maxpq
      with the new sources/coefficients.
      
      Note1: Some devices have native support for P+Q continuation and can skip
      this extra work.  Devices with this capability can advertise it with
      dma_set_maxpq.  It is up to each driver how to handle the
      DMA_PREP_CONTINUE flag.
      
      Note2: The api supports disabling the generation of P when generating Q,
      this is ignored by the synchronous path but is implemented by some dma
      devices to save unnecessary writes.  In this case the continuation
      algorithm is simplified to only reuse Q as a source.
      
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: David Woodhouse <David.Woodhouse@intel.com>
      Signed-off-by: NYuri Tikhonov <yur@emcraft.com>
      Signed-off-by: NIlya Yanok <yanok@emcraft.com>
      Reviewed-by: NAndre Noll <maan@systemlinux.org>
      Acked-by: NMaciej Sosnowski <maciej.sosnowski@intel.com>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      b2f46fd8
    • D
      async_tx: remove walk of tx->parent chain in dma_wait_for_async_tx · 95475e57
      Dan Williams 提交于
      We currently walk the parent chain when waiting for a given tx to
      complete however this walk may race with the driver cleanup routine.
      The routines in async_raid6_recov.c may fall back to the synchronous
      path at any point so we need to be prepared to call async_tx_quiesce()
      (which calls  dma_wait_for_async_tx).  To remove the ->parent walk we
      guarantee that every time a dependency is attached ->issue_pending() is
      invoked, then we can simply poll the initial descriptor until
      completion.
      
      This also allows for a lighter weight 'issue pending' implementation as
      there is no longer a requirement to iterate through all the channels'
      ->issue_pending() routines as long as operations have been submitted in
      an ordered chain.  async_tx_issue_pending() is added for this case.
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      95475e57
  3. 29 7月, 2009 1 次提交
  4. 04 6月, 2009 1 次提交
  5. 29 5月, 2009 1 次提交
    • L
      i7300_idle: allow testing on i5000-series hardware w/o re-compile · 2f102607
      Len Brown 提交于
      Testing the i7300_idle driver on i5000-series hardware required
      an edit to i7300_idle.h to "#define SUPPORT_I5000 1" and a re-build
      of both i7300_idle and ioat_dma.
      
      Replace that build-time scheme with a load-time module parameter:
      "7300_idle.forceload=1" to make it easier to test the driver
      on hardware that while not officially validated, works fine
      and is much more commonly available.
      
      By default (no modparam) the driver will continue to load
      only on the i7300.
      
      Note that ioat_dma runs a copy of i7300_idle's probe routine
      to know to reserve an IOAT channel for i7300_idle.
      This change makes ioat_dma do that always on the i5000,
      just like it does on the i7300.
      Signed-off-by: NLen Brown <len.brown@intel.com>
      Acked-by: NAndrew Henroid <andrew.d.henroid@intel.com>
      2f102607
  6. 28 5月, 2009 1 次提交
    • K
      fsldma: Fix compile warnings · b787f2e2
      Kumar Gala 提交于
      We we build with dma_addr_t as a 64-bit quantity we get:
      
      drivers/dma/fsldma.c: In function 'fsl_chan_xfer_ld_queue':
      drivers/dma/fsldma.c:625: warning: cast to pointer from integer of different size
      drivers/dma/fsldma.c: In function 'fsl_dma_chan_do_interrupt':
      drivers/dma/fsldma.c:737: warning: cast to pointer from integer of different size
      drivers/dma/fsldma.c:737: warning: cast to pointer from integer of different size
      drivers/dma/fsldma.c: In function 'of_fsl_dma_probe':
      drivers/dma/fsldma.c:927: warning: cast to pointer from integer of different
      Signed-off-by: NKumar Gala <galak@kernel.crashing.org>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      b787f2e2
  7. 22 5月, 2009 5 次提交
    • I
      fsldma: fix memory leak on error path in fsl_dma_prep_memcpy() · 2e077f8e
      Ira Snyder 提交于
      When preparing a memcpy operation, if the kernel fails to allocate memory
      for a link descriptor after the first link descriptor has already been
      allocated, then some memory will never be released. Fix the problem by
      walking the list of allocated descriptors backwards, and freeing the
      allocated descriptors back into the DMA pool.
      Signed-off-by: NIra W. Snyder <iws@ovro.caltech.edu>
      Signed-off-by: NLi Yang <leoli@freescale.com>
      2e077f8e
    • I
      fsldma: snooping is not enabled for last entry in descriptor chain · 776c8943
      Ira Snyder 提交于
      On the 83xx controller, snooping is necessary for the DMA controller to
      ensure cache coherence with the CPU when transferring to/from RAM.
      
      The last descriptor in a chain will always have the End-of-Chain interrupt
      bit set, so we can set the snoop bit while adding the End-of-Chain
      interrupt bit.
      Signed-off-by: NIra W. Snyder <iws@ovro.caltech.edu>
      Signed-off-by: NLi Yang <leoli@freescale.com>
      776c8943
    • I
      fsldma: fix infinite loop on multi-descriptor DMA chain completion · bcfb7465
      Ira Snyder 提交于
      When creating a DMA transaction with multiple descriptors, the async_tx
      cookie is set to 0 for each descriptor in the chain, excluding the last
      descriptor, whose cookie is set to -EBUSY.
      
      When fsl_dma_tx_submit() is run, it only assigns a cookie to the first
      descriptor. All of the remaining descriptors keep their original value,
      including the last descriptor, which is set to -EBUSY.
      
      After the DMA completes, the driver will update the last completed cookie
      to be -EBUSY, which is an error code instead of a valid cookie. This causes
      dma_async_is_complete() to always return DMA_IN_PROGRESS.
      
      This causes the fsldma driver to never cleanup the queue of link
      descriptors, and the driver will re-run the DMA transaction on the hardware
      each time it receives the End-of-Chain interrupt. This causes an infinite
      loop.
      
      With this patch, fsl_dma_tx_submit() is changed to assign a cookie to every
      descriptor in the chain. The rest of the code then works without problems.
      Signed-off-by: NIra W. Snyder <iws@ovro.caltech.edu>
      Signed-off-by: NLi Yang <leoli@freescale.com>
      bcfb7465
    • I
      fsldma: fix "DMA halt timeout!" errors · 138ef018
      Ira Snyder 提交于
      When using the DMA controller from multiple threads at the same time, it is
      possible to get lots of "DMA halt timeout!" errors printed to the kernel
      log.
      
      This occurs due to a race between fsl_dma_memcpy_issue_pending() and the
      interrupt handler, fsl_dma_chan_do_interrupt(). Both call the
      fsl_chan_xfer_ld_queue() function, which does not protect against
      concurrent accesses to dma_halt() and dma_start().
      
      The existing spinlock is moved to cover the dma_halt() and dma_start()
      functions. Testing shows that the "DMA halt timeout!" errors disappear.
      Signed-off-by: NIra W. Snyder <iws@ovro.caltech.edu>
      Signed-off-by: NLi Yang <leoli@freescale.com>
      138ef018
    • R
      fsldma: fix check on potential fdev->chan[] overflow · f47edc6d
      Roel Kluin 提交于
      Fix the check of potential array overflow when using corrupted channel
      device tree nodes.
      Signed-off-by: NRoel Kluin <roel.kluin@gmail.com>
      Signed-off-by: NLi Yang <leoli@freescale.com>
      f47edc6d